<?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-28462179</id><updated>2012-01-29T01:57:09.806+11:00</updated><category term='Personal'/><category term='C#'/><category term='EDI'/><category term='Book Reviews'/><category term='Food and Drink'/><category term='Technical'/><category term='Wing Chun'/><category term='English'/><category term='Travel'/><category term='Music'/><category term='Brewing'/><category term='Soft Skills and Mind Hacks'/><category term='Design'/><category term='Windows'/><category term='Ruby / Rails'/><category term='Fiction'/><category term='ThoughtWorks'/><category term='Java'/><category term='Finance'/><title type='text'>James Crisp</title><subtitle type='html'>Ruby on Rails, C#, .NET, book reviews, film reviews, mind hacks, Wing Chun and the occasional personal bit.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>61</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-28462179.post-4205364084629607458</id><published>2007-07-30T23:10:00.000+10:00</published><updated>2007-07-30T23:34:53.938+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><title type='text'>This Blog Has Moved!</title><content type='html'>After more than a year on Blogger, I've bitten the bullet, bought myself a domain and installed WordPress. It's been good so far. Please update your feeds and links. Hope you like the new site and feel free to send me some feedback - the new site even has a contact form :-)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;New Address&lt;/span&gt;&lt;br /&gt;My blog is now to be found at:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jamescrisp.org/"&gt;http://jamescrisp.org&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;New Feeds&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://jamescrisp.org/feed"&gt;Full &lt;/a&gt;(http://jamescrisp.org/feed)&lt;/li&gt;&lt;li&gt;&lt;a href="http://jamescrisp.org/category/technical/feed"&gt;Technical&lt;/a&gt; (http://jamescrisp.org/category/technical/feed)&lt;/li&gt;&lt;li&gt;&lt;a href="http://jamescrisp.org/category/personal/feed"&gt;Personal&lt;/a&gt; (http://jamescrisp.org/category/personal/feed)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;This Address&lt;/span&gt;&lt;br /&gt;My previous posts will still be hosted on Blogger, but any new posts will be at the new address (&lt;a href="http://jamescrisp.org/"&gt;http://jamescrisp.org&lt;/a&gt;).&lt;br /&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-4205364084629607458?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://jamescrisp.org' title='This Blog Has Moved!'/><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/4205364084629607458/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=4205364084629607458' title='198 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/4205364084629607458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/4205364084629607458'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2007/07/this-blog-has-moved.html' title='This Blog Has Moved!'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>198</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-7867948852521008740</id><published>2007-07-24T20:54:00.001+10:00</published><updated>2007-07-24T21:01:01.316+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><title type='text'>Ultimate Laptop Protection</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/RqXbg7dtCCI/AAAAAAAAAXc/o_DxH1PHsSg/s1600-h/IMG_2514.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_TlhwVaDeyBE/RqXbg7dtCCI/AAAAAAAAAXc/o_DxH1PHsSg/s400/IMG_2514.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5090716312576788514" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/RqXbhLdtCDI/AAAAAAAAAXk/vUuEhSUuKV0/s1600-h/IMG_2516.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_TlhwVaDeyBE/RqXbhLdtCDI/AAAAAAAAAXk/vUuEhSUuKV0/s400/IMG_2516.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5090716316871755826" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Better than money can buy.&lt;br /&gt;&lt;br /&gt;Made by my dad :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-7867948852521008740?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/7867948852521008740/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=7867948852521008740' title='203 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/7867948852521008740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/7867948852521008740'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2007/07/ultimate-laptop-protection.html' title='Ultimate Laptop Protection'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_TlhwVaDeyBE/RqXbg7dtCCI/AAAAAAAAAXc/o_DxH1PHsSg/s72-c/IMG_2514.JPG' height='72' width='72'/><thr:total>203</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-1845676735013508505</id><published>2007-07-15T23:58:00.000+10:00</published><updated>2007-07-16T00:08:40.271+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><title type='text'>Consulting</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/RpoorqYxdTI/AAAAAAAAAXU/cstBI9Tp2W8/s1600-h/consulting-sm.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_TlhwVaDeyBE/RpoorqYxdTI/AAAAAAAAAXU/cstBI9Tp2W8/s400/consulting-sm.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5087423459646076210" /&gt;&lt;/a&gt;&lt;br /&gt;A present from my &lt;a href="http://ohsoosun.blogspot.com"&gt;adorable fiancée&lt;/a&gt; :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-1845676735013508505?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/1845676735013508505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=1845676735013508505' title='174 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/1845676735013508505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/1845676735013508505'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2007/07/consulting.html' title='Consulting'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_TlhwVaDeyBE/RpoorqYxdTI/AAAAAAAAAXU/cstBI9Tp2W8/s72-c/consulting-sm.gif' height='72' width='72'/><thr:total>174</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-461235340406809545</id><published>2007-07-02T09:21:00.000+10:00</published><updated>2007-07-02T10:22:01.472+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby / Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><title type='text'>Adding a New Rails Project under Subversion</title><content type='html'>I generally use &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; for source control when given the choice. In day to day usage, I like to use &lt;a href="http://tortoisesvn.tigris.org/"&gt;Tortoise SVN&lt;/a&gt; as it gives you a GUI with tick boxes for files to check in. However, it's handy to use the command line tool for project setup and automation.&lt;br /&gt;&lt;br /&gt;Often, there is a subversion repository already set up and running on another machine. In this situation, I generally:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Check out the repository at the top level into a temporary directory through Tortoise, add a new directory ([appname]) for the new project, and check it in.&lt;/li&gt;&lt;li&gt;Generate the new rails app (rails [appname]).&lt;/li&gt;&lt;li&gt;Check out [appname] from the repository into the local directory [appname] which contains the Rails project.&lt;/appname&gt;&lt;/li&gt;&lt;li&gt;Add and check in all files through Tortoise.&lt;/li&gt;&lt;li&gt;Run the following commands from the command line to remove logs and tmp from the repository:&lt;/li&gt;&lt;/ol&gt;&lt;pre&gt;&lt;br /&gt;svn remove log/*&lt;br /&gt;svn commit -m "removing all log files from subversion"&lt;br /&gt;svn propset svn:ignore "*.log" log/&lt;br /&gt;svn update log/&lt;br /&gt;svn commit -m "Ignoring all files in /log/ ending in .log"&lt;br /&gt;svn remove tmp/*&lt;br /&gt;svn propset svn:ignore "*" tmp/&lt;br /&gt;svn update tmp/&lt;br /&gt;svn commit -m "Ignoring all files in /tmp/"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;There's more Rails/Subversion info to be found on the &lt;a href="http://wiki.rubyonrails.org/rails/pages/HowtoUseRailsWithSubversion"&gt;Rails wiki&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-461235340406809545?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/461235340406809545/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=461235340406809545' title='201 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/461235340406809545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/461235340406809545'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2007/07/adding-new-rails-project-under.html' title='Adding a New Rails Project under Subversion'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>201</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-3786862980973634494</id><published>2007-06-12T23:26:00.000+10:00</published><updated>2007-06-13T00:09:19.634+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby / Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>The Castle Project - Rails for .NET</title><content type='html'>&lt;a href="http://www.castleproject.org/"&gt;The Castle Project&lt;/a&gt; is an interesting open source alternative to ASP.NET / ADO.NET. Among other things, the Castle Project provides a &lt;a href="http://www.rubyonrails.org/"&gt;Rails&lt;/a&gt;-like development framework for .NET. It has an ActiveRecord implementation built on top of &lt;a href="http://www.nhibernate.org/"&gt;NHibernate&lt;/a&gt;, a very Rails-like MVC setup called MonoRail, and uses &lt;a href="http://nvelocity.sourceforge.net/"&gt;NVelocity&lt;/a&gt; for template style views. It's worth checking out. This &lt;a href="http://hammett.castleproject.org/wp-content/uploads/2007/01/mr%20formvalidation.html"&gt;screencast&lt;/a&gt; gives a bit of an overview.&lt;br /&gt;&lt;br /&gt;There's tough competition around the corner though, with &lt;a href="http://msdn2.microsoft.com/en-us/vstudio/aa700831.aspx"&gt;Orcas already in beta&lt;/a&gt;, providing XAML, LINQ and O-R mapping.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-3786862980973634494?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/3786862980973634494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=3786862980973634494' title='90 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/3786862980973634494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/3786862980973634494'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2007/06/castle-project-rails-for-net.html' title='The Castle Project - Rails for .NET'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>90</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-7813548510705374092</id><published>2007-06-05T19:52:00.000+10:00</published><updated>2007-06-05T19:49:18.842+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby / Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Is .NET or Java dying?</title><content type='html'>Are C# and .NET losing ground as &lt;a href="http://martinfowler.com/bliki/RubyMicrosoft.html"&gt;Martin Fowler&lt;/a&gt; suggests? Or is &lt;a href="http://www.businessweek.com/technology/content/dec2005/tc20051213_042973.htm"&gt;Java's market share dropping&lt;/a&gt;? What about Ruby? And what about the Australian market in particular?&lt;br /&gt;&lt;br /&gt;Here's what I've been able to find.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Job Trends&lt;/span&gt;&lt;br /&gt;Which technologies have the most demand for people?&lt;br /&gt;&lt;br /&gt;From &lt;a href="http://www.indeed.com/jobtrends?q=.net%2C+java%2C+c%23%2C+ruby&amp;l="&gt;Indeed.com&lt;/a&gt;, which claims to search "millions of jobs from thousands of job sites", but I suspect may have a USA focus:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/RmTGdLuuu0I/AAAAAAAAAW8/Z5uOqrnvNJk/s1600-h/indeed.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_TlhwVaDeyBE/RmTGdLuuu0I/AAAAAAAAAW8/Z5uOqrnvNJk/s400/indeed.png" alt="" id="BLOGGER_PHOTO_ID_5072397284993317698" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.vision6.com.au/ch/dx8s7z/236720/f5785zrx3.pdf"&gt;"Best Talent Index May 2007"&lt;/a&gt; from &lt;a href="http://best-international.com.au/"&gt;Best People Solutions&lt;/a&gt;  gives an Australian perspective:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TlhwVaDeyBE/RmTpGruuu1I/AAAAAAAAAXE/OxDKaQ4KZfY/s1600-h/best.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_TlhwVaDeyBE/RmTpGruuu1I/AAAAAAAAAXE/OxDKaQ4KZfY/s400/best.JPG" alt="" id="BLOGGER_PHOTO_ID_5072435381353233234" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here's job counts from the (largest?) primarily Australian job search site &lt;a href="http://www.seek.com.au/"&gt;Seek&lt;/a&gt; on 5 June 2007, 3pm (today):&lt;br /&gt;&lt;table class="ttable" bordercolordark="#003366" bordercolorlight="#c0c0c0" id="Table2" align="center" border="1"&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Keyword(s)&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Number of positions found&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Java&lt;/td&gt;&lt;td&gt;3,414&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;".NET" or "dot net"&lt;/td&gt;&lt;td&gt;2,744&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;"c#" or "c sharp"&lt;/td&gt;&lt;td&gt;1,722&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ruby&lt;/td&gt;&lt;td&gt;100&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;As an aside, I remember doing a search on Seek for "ruby" about 6 months ago, and getting under 20 jobs mentioning it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Search Engine Number of Hits&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Extract from the &lt;a href="http://www.tiobe.com/tiobe_index/index.htm"&gt;TIOBE Programming Community Index for June 2007&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;table class="ttable" bordercolordark="#003366" bordercolorlight="#c0c0c0" id="Table2" align="center" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th align="center"&gt; Position&lt;br /&gt;Jun 2007&lt;/th&gt;&lt;th align="center" &gt;Position&lt;br /&gt;Jun 2006&lt;/th&gt;&lt;th align="center" &gt;Delta in Position&lt;/th&gt;&lt;th align="center" &gt;Programming Language&lt;/th&gt;&lt;th align="center" &gt;Ratings&lt;br /&gt;Jun 2007&lt;/th&gt;&lt;th align="center" &gt;Delta&lt;br /&gt;Jun 2006&lt;/th&gt;&lt;th align="center" &gt;Status&lt;/th&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td align="center"&gt;1&lt;/td&gt; &lt;td align="center"&gt;1&lt;/td&gt; &lt;td align="center"&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Same.gif" border="0" /&gt;&lt;/td&gt; &lt;td&gt;&lt;a href="http://www.tiobe.com/tiobe_index/Java.html"&gt;Java&lt;/a&gt;&lt;/td&gt; &lt;td align="center"&gt;20.025%&lt;/td&gt; &lt;td align="center"&gt;-1.10%&lt;/td&gt; &lt;td align="left"&gt;  A&lt;/td&gt; &lt;/tr&gt; &lt;tr height="25"&gt; &lt;td align="center"&gt;2&lt;/td&gt; &lt;td align="center"&gt;2&lt;/td&gt; &lt;td align="center"&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Same.gif" border="0" /&gt;&lt;/td&gt; &lt;td&gt;&lt;a href="http://www.tiobe.com/tiobe_index/C.html"&gt;C&lt;/a&gt;&lt;/td&gt; &lt;td align="center"&gt;15.967%&lt;/td&gt; &lt;td align="center"&gt;-2.29%&lt;/td&gt; &lt;td align="left"&gt;  A&lt;/td&gt; &lt;/tr&gt; &lt;tr height="25"&gt; &lt;td align="center"&gt;3&lt;/td&gt; &lt;td align="center"&gt;3&lt;/td&gt; &lt;td align="center"&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Same.gif" border="0" /&gt;&lt;/td&gt; &lt;td&gt;&lt;a href="http://www.tiobe.com/tiobe_index/C__.html"&gt;C++&lt;/a&gt;&lt;/td&gt; &lt;td align="center"&gt;11.118%&lt;/td&gt; &lt;td align="center"&gt;+0.45%&lt;/td&gt; &lt;td align="left"&gt;  A&lt;/td&gt; &lt;/tr&gt; &lt;tr height="25"&gt; &lt;td align="center"&gt;4&lt;/td&gt; &lt;td align="center"&gt;4&lt;/td&gt; &lt;td align="center"&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Same.gif" border="0" /&gt;&lt;/td&gt; &lt;td&gt;&lt;a href="http://www.tiobe.com/tiobe_index/%28Visual%29_Basic.html"&gt;(Visual) Basic&lt;/a&gt;&lt;/td&gt; &lt;td align="center"&gt;9.332%&lt;/td&gt; &lt;td align="center"&gt;-0.85%&lt;/td&gt; &lt;td align="left"&gt;  A&lt;/td&gt; &lt;/tr&gt; &lt;tr height="25"&gt; &lt;td align="center"&gt;5&lt;/td&gt; &lt;td align="center"&gt;5&lt;/td&gt; &lt;td align="center"&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Same.gif" border="0" /&gt;&lt;/td&gt; &lt;td&gt;&lt;a href="http://www.tiobe.com/tiobe_index/PHP.html"&gt;PHP&lt;/a&gt;&lt;/td&gt; &lt;td align="center"&gt;8.871%&lt;/td&gt; &lt;td align="center"&gt;-0.72%&lt;/td&gt; &lt;td align="left"&gt;  A&lt;/td&gt; &lt;/tr&gt; &lt;tr height="25"&gt; &lt;td align="center"&gt;6&lt;/td&gt; &lt;td align="center"&gt;6&lt;/td&gt; &lt;td align="center"&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Same.gif" border="0" /&gt;&lt;/td&gt; &lt;td&gt;&lt;a href="http://www.tiobe.com/tiobe_index/Perl.html"&gt;Perl&lt;/a&gt;&lt;/td&gt; &lt;td align="center"&gt;6.177%&lt;/td&gt; &lt;td align="center"&gt;+0.17%&lt;/td&gt; &lt;td align="left"&gt;  A&lt;/td&gt; &lt;/tr&gt; &lt;tr height="25"&gt; &lt;td align="center"&gt;7&lt;/td&gt; &lt;td align="center"&gt;8&lt;/td&gt; &lt;td align="center"&gt; &lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt; &lt;/td&gt; &lt;td&gt;&lt;a href="http://www.tiobe.com/tiobe_index/C_.html"&gt;C#&lt;/a&gt;&lt;/td&gt; &lt;td align="center"&gt;3.483%&lt;/td&gt; &lt;td align="center"&gt;+0.25%&lt;/td&gt; &lt;td align="left"&gt;  A&lt;/td&gt; &lt;/tr&gt; &lt;tr height="25"&gt; &lt;td align="center"&gt;8&lt;/td&gt; &lt;td align="center"&gt;7&lt;/td&gt; &lt;td align="center"&gt; &lt;img src="http://www.tiobe.com/tiobe_index/images/Down.gif" border="0" /&gt; &lt;/td&gt; &lt;td&gt;&lt;a href="http://www.tiobe.com/tiobe_index/Python.html"&gt;Python&lt;/a&gt;&lt;/td&gt; &lt;td align="center"&gt;3.161%&lt;/td&gt; &lt;td align="center"&gt;-0.30%&lt;/td&gt; &lt;td align="left"&gt;  A&lt;/td&gt; &lt;/tr&gt; &lt;tr height="25"&gt; &lt;td align="center"&gt;9&lt;/td&gt; &lt;td align="center"&gt;10&lt;/td&gt; &lt;td align="center"&gt; &lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt; &lt;/td&gt; &lt;td&gt;&lt;a href="http://www.tiobe.com/tiobe_index/JavaScript.html"&gt;JavaScript&lt;/a&gt;&lt;/td&gt; &lt;td align="center"&gt;2.616%&lt;/td&gt; &lt;td align="center"&gt;+1.16%&lt;/td&gt; &lt;td align="left"&gt;  A&lt;/td&gt; &lt;/tr&gt; &lt;tr height="25"&gt; &lt;td align="center"&gt;10&lt;/td&gt; &lt;td align="center"&gt;19&lt;/td&gt; &lt;td align="center"&gt; &lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt; &lt;/td&gt; &lt;td&gt;&lt;a href="http://www.tiobe.com/tiobe_index/Ruby.html"&gt;Ruby&lt;/a&gt;&lt;/td&gt; &lt;td align="center"&gt;2.132%&lt;/td&gt; &lt;td align="center"&gt;+1.65%&lt;/td&gt; &lt;td align="left"&gt;  A&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/RmTxsLuuu2I/AAAAAAAAAXM/Klu2QZtQmEw/s1600-h/tpci_trends.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_TlhwVaDeyBE/RmTxsLuuu2I/AAAAAAAAAXM/Klu2QZtQmEw/s400/tpci_trends.png" alt="" id="BLOGGER_PHOTO_ID_5072444821691349858" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I think this gives a good idea of web buzz, but suggest that most non-IT companies do not publish information about their projects and chosen technologies and languages on the web.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;The data collected suggests that:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Both .NET and Java are major players in the job market with thousands of positions advertised, implying wide industry adoption of both.&lt;/li&gt;&lt;li&gt;Neither .NET nor Java seem to be undergoing any significant decline in jobs.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Java has much more information about it on the internet, although .NET is slowing gaining ground and Java slowly losing it.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Ruby is comparatively tiny but growing rapidly in terms of jobs and information on the internet.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Thanks&lt;/span&gt;&lt;br /&gt;Thanks to &lt;a href="http://jchyip.blogspot.com/"&gt;Jason Yip&lt;/a&gt; and &lt;a href="http://binkysilhouette.blogspot.com/"&gt;Suzi Edwards&lt;/a&gt; for their help finding/sourcing information.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-7813548510705374092?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/7813548510705374092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=7813548510705374092' title='194 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/7813548510705374092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/7813548510705374092'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2007/06/is-net-or-java-dying.html' title='Is .NET or Java dying?'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_TlhwVaDeyBE/RmTGdLuuu0I/AAAAAAAAAW8/Z5uOqrnvNJk/s72-c/indeed.png' height='72' width='72'/><thr:total>194</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-2994156700514922625</id><published>2007-05-20T17:04:00.000+10:00</published><updated>2007-05-20T17:39:27.325+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby / Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><title type='text'>Can you spot the bug?</title><content type='html'>In a model class which has 'quantity', 'quantity_already_taken' and 'quantity_requested' properties, I add the following:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; def before_save&lt;br /&gt;   quantity = 1 if quantity == 0&lt;br /&gt;   if quantity + quantity_already_taken &gt; quantity_requested&lt;br /&gt;   ......&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Tests blow up everywhere with:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  TypeError: nil can't be coerced into Fixnum &lt;br /&gt;  (on the line with the addition)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Why?&lt;br /&gt;&lt;br /&gt;After a little more debugging, it is clear that 'quantity' is nil. How could that happen? &lt;br /&gt;&lt;br /&gt;The answer lies in the fact that Ruby requires an explicit self reference when using attribute writers (aka, property setters) within the class itself. This feels clunky to me, but for your information, here's a &lt;a href="http://www.rubyfleebie.com/use-self-explicitly/"&gt;rationalisation of the explicit self requirement&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So, in case you're wondering, what happened above is that the 'if' line created a nil local variable called 'quantity'! This local variable then had higher scope precedence than the class attribute with the same name. The addition line was then using the local 'quantity' rather than the class attribute and hence failed with the nil error.&lt;br /&gt;&lt;br /&gt;All fixed by explicity referencing self:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; def before_save&lt;br /&gt;   self.quantity = 1 if (quantity == 0)&lt;br /&gt;   if quantity + quantity_already_taken &gt; quantity_requested&lt;br /&gt;   ......&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-2994156700514922625?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/2994156700514922625/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=2994156700514922625' title='35 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/2994156700514922625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/2994156700514922625'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2007/05/can-you-spot-bug.html' title='Can you spot the bug?'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>35</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-1798283737337425964</id><published>2007-05-18T22:07:00.000+10:00</published><updated>2007-05-18T22:18:41.398+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><title type='text'>Fixing a Palm Treo's Digitizer (Touch Screen)</title><content type='html'>Let me tell you a sad tale. One day, out of the blue, the digitizer on my palm started to drift. Every hour, it got worse. This meant that when you tried to click a button like 'Add' the Palm thought you clicked 'Delete' - no fun at all! It was possible to temporarily improve the situation by running the re-calibration program built into the system, but within a few hours, where you clicked again had very little relation to where the Palm thought you had clicked. After about a week, it was not possible to run the re-calibration program, as the digitizer was so far out (program just looped forever so I had to reboot the Palm). I discovered that there are actually keyboard shortcuts for just about everything, and that the 4-way &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;nav&lt;/span&gt; button gets you most places, so the device wasn't a total write off. However, it was slow and cumbersome to use.&lt;br /&gt;&lt;br /&gt;Now, one month later, I'm sure you'll be thrilled to know that things are better, the sorry tale has had a happy ending (touch wood!). Much googling led to many suggested approaches to fixing the problem including:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Various auto-calibration programs (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;AutoDigi&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;DigiFix&lt;/span&gt;, etc).&lt;/li&gt;&lt;li&gt;Running paper around the screen under the casing to remove gunk.&lt;/li&gt;&lt;li&gt;Cleaning the insides by putting a vacuum cleaner to all openings.&lt;/li&gt;&lt;/ul&gt;However, all of these approaches ended with disappointment and no noticeable improvement.&lt;br /&gt;&lt;br /&gt;Finally, near buying myself a new device (aside: it is a shame that Palm has not managed to produce a device significantly better than my several year old &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Treo&lt;/span&gt; 600), I came across a &lt;a href="http://www.pdaparts.com/"&gt;site&lt;/a&gt; selling replacement &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;Treo&lt;/span&gt; 600 digitizer/screen modules. They kindly provide a very useful &lt;a href="http://www.youtube.com/v/a5LQKzMi9pI"&gt;movie&lt;/a&gt; on pulling your &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Treo&lt;/span&gt; apart to help you replace your digitizer/screen module. With little to lose, I decided to open up the case of my &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Treo&lt;/span&gt; and see if there was anything I could fix.&lt;br /&gt;&lt;br /&gt;Following the instructions in the movie was not too difficult. I didn't have a small star &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;alan&lt;/span&gt; key myself (required for opening the case), but I borrowed one from my dear dad, who has an amazing tool collection. Also, lacking a plastic case opening tool, I used a butter knife - this worked OK, but did damage the plastic of the case a little. If you have something made from thin and strong plastic, like the case opener in the movie, it would be a better tool for the job. I had a great time pulling everything apart and finally had all the components spread out before me. I cleaned the screen carefully (there was a fair bit of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;grot&lt;/span&gt; around the edges), fixed the buckled taping on the side of the screen, and put everything back together, carefully re-seating the various cables.&lt;br /&gt;&lt;br /&gt;And now, almost a month later, the digitizer still seems to be working fine! Hurrah! So if you are contemplating what to do about your Palm's broken or drifting digitizer, I recommend pull it apart, clean it all and re-seat cables and then hope for the best!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-1798283737337425964?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/1798283737337425964/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=1798283737337425964' title='57 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/1798283737337425964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/1798283737337425964'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2007/05/fixing-palm-treos-digitizer-touch.html' title='Fixing a Palm Treo&apos;s Digitizer (Touch Screen)'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>57</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-7560973618952830129</id><published>2007-04-19T10:02:00.000+10:00</published><updated>2007-04-29T15:07:22.751+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><title type='text'>Experience of an International Amazon Virgin</title><content type='html'>Recently I ordered 12 books from Amazon. It was my first time.&lt;br /&gt;&lt;br /&gt;The process started really well - quite easy and pleasant to find the books I was after. Not to mention that amazing range and the great option of getting cheaper second hand books. Adding to the shopping cart was also a breeze.&lt;br /&gt;&lt;br /&gt;I was pretty impressed, good prices, nice process. But then the honeymoon was over. Time to check out - stream of consciousness. First, I need to enter address details. Fine, as expected. Then I get a message (from memory) "There is a slight problem with your order. Some of the books you have chosen cannot be shipped to your address. Change your delivery address or change the quantity to 0 on these books.". Not happy! One third of my books (second hand ones) cannot be sent. That means I need to cancel the check out process, remove 4 books from my cart and then try and find the same books from other more expensive suppliers which can be shipped international. So I try again, adding the same book from multiple suppliers to my cart, in the hope of finding one which can deliver to Australia. Then it's back to the checkout process again.. Problem - I missed one book and have to cancel the process and go back to basket process again. Great, all books are OK, finally time to complete the order. So I get to review my order, and it says at the top something like "With an Amazon credit card, this order would be $324 rather than $368". No other total including postage is provided. So is my order $368? Maybe? Further screens finally confirm that this is the case. Nowhere is it possible to see how much postage is per book - you have to work it out yourself doing best guesses and following the Amazon formula. Maybe it would have been better to get a new book rather than a second hand book, as second hand books have twice the postage charge.. ah well, too late now, I'm not going to go through the whole process yet another time! So finally I can check out and my credit card is charged. However, since my credit card is hit by a multitude of different vendors that use Amazon as a front, within seconds of each other, some transactions are rejected as my credit card does not allow too many transactions in too short a time (some sort of security feature?). Finally, after getting a few emails from Amazon saying the card could not be charged, and then telling Amazon to retry, my order is at last paid for and on the way.&lt;br /&gt;&lt;br /&gt;Okay, so what could be done to make this better?&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Allow buyers to filter their results so they only see books that can be delivered to their addresses.&lt;/li&gt;&lt;li&gt;Do not use patronising messages like "there is a slight problem".&lt;/li&gt;&lt;li&gt;Do not suggest that people change their delivery address to another country.. that is clearly not going to happen!&lt;/li&gt;&lt;li&gt;Show the cost of postage all throughout the process. Book buyers know they are going to have to pay postage and want to optimise their orders taking it into account.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Do not show the order total including postage for the first time as a confusing advertisement ("With an Amazon credit card, this order would be $324 rather than $368"). Instead, provide a simple breakdown in a table, including postage on each book.&lt;/li&gt;&lt;li&gt;Hit the credit card once per order, and divvy up the money at Amazon internally, rather than allowing each book vendor to do it and having credit card rejections as a result.&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;UPDATE:&lt;/span&gt; My books arrived about two weeks after I ordered them. Delivery was smooth and on time. Unfortunately, one of the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;CDs&lt;/span&gt; that came with a book was broken. Amazon has kindly agreed to replace it and the book.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/RiiAOfUwAAI/AAAAAAAAAW0/9Jx_WNvCA0Y/s1600-h/IMG_1941.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/RiiAOfUwAAI/AAAAAAAAAW0/9Jx_WNvCA0Y/s400/IMG_1941.JPG" alt="" id="BLOGGER_PHOTO_ID_5055431568138436610" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-7560973618952830129?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/7560973618952830129/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=7560973618952830129' title='46 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/7560973618952830129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/7560973618952830129'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2007/04/experience-of-international-amazon.html' title='Experience of an International Amazon Virgin'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_TlhwVaDeyBE/RiiAOfUwAAI/AAAAAAAAAW0/9Jx_WNvCA0Y/s72-c/IMG_1941.JPG' height='72' width='72'/><thr:total>46</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-6785653037583206334</id><published>2007-04-12T14:32:00.000+10:00</published><updated>2007-04-12T14:44:53.471+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby / Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><title type='text'>Tips for Developing Mephisto Plugins with Liquid and Rails</title><content type='html'>&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;When I was writing a &lt;a href="http://jamescrisp.blogspot.com/2007/03/contact-feedback-form-plugin-for.html"&gt;contact form plugin&lt;/a&gt; for &lt;a href="http://mephistoblog.com/"&gt;Mephisto&lt;/a&gt;, I had a lot of trouble finding documentation and ended up reading lots of code and experimenting. That was fun, but fairly slow, so I hope this post can save future plugin developers time, and help them avoid some of the gotchas I stumbled over.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Repository Directory Structure&lt;/span&gt;&lt;br /&gt;At the most macro level, your repository needs to have a 'plugins' directory, and then a directory named after your plugin. Eg,&lt;br /&gt;.../plugins/my_new_plugin/...&lt;br /&gt;If this is not set up correctly, your plugin will not be able to be installed via 'ruby script/install plugin &lt;repository&gt;' method.&lt;br /&gt;&lt;br /&gt;&lt;/repository&gt;&lt;span style="font-weight: bold;"&gt;Liquid Plugins Directory and Init.rb&lt;/span&gt;&lt;br /&gt;As you probably know, Mephisto uses &lt;a href="http://home.leetsoft.com/liquid"&gt;Liquid&lt;/a&gt; for page templates. Liquid can be extended with new tags/blocks. The way to do this in a plugin is to set up a 'mephisto/liquid' directory with your extensions in it. See &lt;a href="http://mephisto-contact-form-plugin.googlecode.com/svn/plugins/mephisto_contact_form/lib/mephisto/liquid/"&gt;example here&lt;/a&gt;. So that's great, but you also need to register it in init.rb. Here's the contact form's &lt;a href="http://mephisto-contact-form-plugin.googlecode.com/svn/plugins/mephisto_contact_form/init.rb"&gt;init.rb&lt;/a&gt; - check out the line about 'register_tag'.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Mephisto Plugin Class&lt;/span&gt;&lt;br /&gt;Mephisto trunk now has a base class for plugins - Mephisto::Plugin. Inheriting from this allows you to set up routes to brand new controllers you create. See &lt;a href="http://mephisto-contact-form-plugin.googlecode.com/svn/plugins/mephisto_contact_form/lib/plugin.rb"&gt;contact form example here&lt;/a&gt;.  This opens the door to writing Mephisto plugins which do postback and processing. It is also possible to add in tabs and forms in the administration interface. &lt;a href="http://techno-weenie.net/"&gt;Rick&lt;/a&gt;'s &lt;a href="http://svn.techno-weenie.net/projects/mephisto/plugins/mephisto_feedback/lib/plugin.rb"&gt;feedback plugin&lt;/a&gt; shows how to do this.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Using Liquid Templates from Your Plugin&lt;/span&gt;&lt;br /&gt;One of the trickiest bits was getting the plug-in controller to render a liquid template. This is important if you want your additions to Mephisto to have the same layout and colours as the rest of the site. The way I'll outline below works fine, but it is not ideal. Hopefully there is a better way to do this (eg, some sort of Liquid API for Mephisto plugins).. if you know how a better way, please let me know!&lt;br /&gt;&lt;br /&gt;I had my plugin controller inherit from the Mephisto ApplicationController to gain access to the method 'render_liquid_template_for'. You can see the &lt;a href="http://mephisto-contact-form-plugin.googlecode.com/svn/plugins/mephisto_contact_form/lib/controllers/contact_form_controller.rb"&gt;code here&lt;/a&gt;. However, this led to thorny problems where the plug-in classes were getting loaded only once when the server started, but Mephisto (and the ApplicationController) were getting reloaded for every request. First request worked fine, but nasty errors were spat out on the second and subsequent requests. To resolve this, I removed the plug-in from the 'load_once_paths'. You can see how to do this in the &lt;a href="http://mephisto-contact-form-plugin.googlecode.com/svn/plugins/mephisto_contact_form/init.rb"&gt;init.rb&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Models, Views &amp; Controllers Directories and Init.rb&lt;/span&gt;&lt;br /&gt;Okay, this is open to personal taste. I like to have similar directories in my plugin to a normal app. Eg, separate directories for controllers, model, etc. This causes a bit more work, as you need to add the extra directories to various global path variables. For an example of how to do this, take a look at 'models_path' and 'controllers_path' in this &lt;a href="http://mephisto-contact-form-plugin.googlecode.com/svn/plugins/mephisto_contact_form/init.rb"&gt;init.rb&lt;/a&gt; and the physical directory structure of the &lt;a href="http://mephisto-contact-form-plugin.googlecode.com/svn/plugins/mephisto_contact_form/lib/"&gt;contact form's lib directory&lt;/a&gt;.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-6785653037583206334?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/6785653037583206334/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=6785653037583206334' title='185 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/6785653037583206334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/6785653037583206334'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2007/04/tips-for-developing-mephisto-plugins.html' title='Tips for Developing Mephisto Plugins with Liquid and Rails'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>185</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-9135267944902067221</id><published>2007-04-03T23:11:00.000+10:00</published><updated>2007-04-04T00:24:38.062+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby / Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><title type='text'>Improve Rails Performance Through Eternal Browser Caching of Assets</title><content type='html'>I've been working on a rails app which has got quite a number of pages that share the same two &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;css&lt;/span&gt; files and 3 javascript files. However, every time I visited any page of the app, all of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;javascripts&lt;/span&gt; and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;css&lt;/span&gt; files were being loaded from the server. Not good - site was very slow. Mucking around with 'about:cache' command in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Firefox&lt;/span&gt; revealed that the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;css&lt;/span&gt; and javascript files had expiry dates set in the past - &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;ie&lt;/span&gt;, no caching of them at all. Also, all the links to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;sylesheets&lt;/span&gt; and javascript files generated by rails had ?&lt;long&gt;[some long number] after them. Some &lt;a href="http://www.endikos.com/2007/2/23/rails-asset-id-and-seo"&gt;research on the web&lt;/a&gt; revealed that this is a new rails feature for caching - the long number is a timestamp for when the asset was last modified.&lt;br /&gt;&lt;br /&gt;Okay, so why were these assets not being cached? A quick check with &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;wget&lt;/span&gt; --save-headers revealed that the web server was sending a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;nocache&lt;/span&gt; directive to the browser. This seems to be the default setup for &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;webrick&lt;/span&gt; and also for my shared &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;apache&lt;/span&gt; hosting on &lt;a href="http://railsplayground.com/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;railsplayground&lt;/span&gt;&lt;/a&gt;. Considering the new rails asset &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;management&lt;/span&gt; system with the ?&lt;last&gt;[last modified timestamp] in the URLs, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;nocache&lt;/span&gt; seems wrong. The browser should never expire the cache since rails will handle cache invalidation by updating the asset &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;url&lt;/span&gt; with a new timestamp.&lt;br /&gt;&lt;br /&gt;So, how can we implement no/very long cache expiry? In &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;apache&lt;/span&gt;, you can use mod_expires or mod_headers to do this. My shared hosting does not support mod_expires, so I went for mod_headers in my .&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;htaccess&lt;/span&gt; file.&lt;br /&gt;&lt;br /&gt;Using mod_headers:&lt;br /&gt;&lt;filesmatch&gt;&amp;lt;FilesMatch "\.*$"&amp;gt;&lt;br /&gt;Header set Cache-Control "max-age=29030400"&lt;br /&gt;&amp;lt;/FilesMatch&amp;gt;&lt;/filesmatch&gt;&lt;br /&gt;&lt;br /&gt;OR using mod_expires:&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;ExpiresActive&lt;/span&gt; On&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;ExpiresDefault&lt;/span&gt; "access plus 1 year"&lt;br /&gt;&lt;br /&gt;Either of the the above will set up a cache expiry time of one year for all content (best you only do this for your rails app directories).&lt;br /&gt;&lt;br /&gt;With a cache expiry time of one year in place, my rails apps run much much faster.&lt;/last&gt;&lt;/long&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-9135267944902067221?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/9135267944902067221/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=9135267944902067221' title='41 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/9135267944902067221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/9135267944902067221'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2007/04/improve-rails-performance-through.html' title='Improve Rails Performance Through Eternal Browser Caching of Assets'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>41</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-4847727676347335563</id><published>2007-04-03T21:19:00.000+10:00</published><updated>2007-04-03T23:08:49.634+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><category scheme='http://www.blogger.com/atom/ns#' term='Finance'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Reviews'/><title type='text'>Naked Economics by Charles Wheelan</title><content type='html'>Just finished reading 'Naked Economics: Undressing the dismal science'. It was a present from a friend, and I've been meaning to read it for a while. Glad I finally got around to it.&lt;br /&gt;&lt;br /&gt;From the title, I assumed the book aimed to point out the failures of economics as a science. Not so at all - it was written by an economist and provides a high level overview of capitalism in layman's terms.&lt;br /&gt;&lt;br /&gt;Here's some interesting questions and explanations from the book:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Why do we have money? So that we can indirectly swap our labour or goods for the things we want, even if the person with the things we want is not interested in our labour or goods. Without money, we would need to barter. That's fine if you're swapping chickens for rice. But what happens if you do web design, and you want meat for dinner, and the butcher does not want a website?&lt;/li&gt;&lt;li&gt;Money has value only because we all believe it does. We have faith that if we sell something (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;ie&lt;/span&gt;, convert it to the common value unit), we will then be able to swap that money for something we want.&lt;/li&gt;&lt;li&gt;Why have markets anyway? Markets produce what people want - &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;ie&lt;/span&gt;, what people are willing to pay for (or at least what we are convinced into wanting through advertising etc).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Why not set the price of everything rather than letting it get worked out in a market? Well, it would be an enormous job, and things would not reflect the cost of production. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Eg&lt;/span&gt;, bird flu wipes out half of the chickens in the world. There are now less chickens to go around so chicken becomes more expensive. People who really want chicken can still get it, but it costs them more. People who don't care as much or can't afford it eat fish or beef instead. If the cost of chicken was a constant mandated by the state, chicken distribution would need to be mandated in some other way. If there's not enough chicken for everyone who wants it, who should get it? First come first served? Political clout? Personal connections?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Markets destroy. A new way to mechanize weaving may make thousands unemployed and destroy towns and communities. But according to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Wheelan&lt;/span&gt;, the country as a whole is better off as we are able to produce more for less cost, hence increasing our standard of living. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;Ie&lt;/span&gt;, as a consumer, you may now be able to buy a shirt for half the price.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;In politics, small motivated groups often drive policy. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Eg&lt;/span&gt;, the general population does not care much one way or other on a subsidy on growing alfalfa. It might cost each person in Australia 0.01c per year. However, if the subsidy was to be removed,  and the alfalfa farmers would care a lot. It may well mean their livelihoods so they would demonstrate, make campaign donations, vote as a block and generally make as much fuss as possible to make sure the subsidy was not removed.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Why do people work in sweatshops? According to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Wheelan&lt;/span&gt;, the pay is generally better than for other jobs available - &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;ie&lt;/span&gt;, sweatshops are not the cause of the problem, rather a symptom of the general poverty and lack of opportunity in the area.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Why is free trade good? So that everyone can do what they do best - &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;ie&lt;/span&gt;, specialise to the max. The idea being that if everyone works on what they are most good at, then productivity overall is higher.&lt;/li&gt;&lt;li&gt;Why are tariffs bad? Because they support local industries that are not viable - &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;ie&lt;/span&gt;, a poor uses of resources.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Why do we need governments? To provide the rails for capitalism. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;Eg&lt;/span&gt;, to enforce laws (so you can't just kill me and take my stuff), to regulate the excesses of the free market and to provide goods and services that people need but that free markets will never provide. Also, to do things that individuals cannot do alone, but are in the interest of the population as a whole - &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;eg&lt;/span&gt;, build infrastructure.&lt;/li&gt;&lt;li&gt;Care for the environment is a luxury good - &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;ie&lt;/span&gt;, if you and your family are starving, cutting down trees to sell for food seems like a pretty good idea.&lt;/li&gt;&lt;li&gt;Companies destroy the environment because the current monetary cost of environmental destruction is usually minimal. If the full cost of environmental destruction was factored into the market (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;eg&lt;/span&gt;, companies have to pay for pollution and destruction), then environmental destruction would slow dramatically.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Who can create new money? The reserve bank, and it does it by buying bonds from banks with money that did not previously exist.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;How can the reserve bank change interest rates? It can sell government bonds at its target rate and it can buy bonds (with brand new money) or sell bonds from/to trading banks to influence the amount of cash the banks have to lend. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;Eg&lt;/span&gt;, lots of cash at a trading bank means they'll lower the interest rates so as to rent out the money.&lt;/li&gt;&lt;li&gt;How come the economy can go into recession for no real reason? If people are worried, they don't spend. If people don't spend, then companies can't afford new/current investment. People get sacked and then can spend even less. People get more worried and the cycle continues.&lt;/li&gt;&lt;li&gt;Why is the level of savings in a country important? Money in the bank means it can be &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_15"&gt;lent&lt;/span&gt; out to people who want to use it to create new businesses or expand current businesses. Access to capital allows growth.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I wouldn't take these on face value, and I would certainly question some of the assumptions on which they are based. However, they provide some interesting areas for further thought.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-4847727676347335563?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/4847727676347335563/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=4847727676347335563' title='22 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/4847727676347335563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/4847727676347335563'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2007/04/naked-economics-by-charles-wheelan.html' title='Naked Economics by Charles Wheelan'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>22</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-8376378579193152145</id><published>2007-03-31T23:44:00.000+10:00</published><updated>2007-03-31T23:57:43.859+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><category scheme='http://www.blogger.com/atom/ns#' term='Brewing'/><title type='text'>Mango Liqueur - Fruition</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/Rg5mwOkgC8I/AAAAAAAAAWs/LLHQhieDfVw/s1600-h/IMG_1832.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_TlhwVaDeyBE/Rg5mwOkgC8I/AAAAAAAAAWs/LLHQhieDfVw/s400/IMG_1832.JPG" alt="" id="BLOGGER_PHOTO_ID_5048085211059850178" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The &lt;a href="http://jamescrisp.blogspot.com/2007/03/mango-liqueur.html"&gt;mango liqueur started about a month ago&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;/a&gt; has now reached fruition. After filtering with cheese cloth, and adding a little sugar (much less than a cup), it is quite tasty. It should improve further as it ages over the next month or so, assuming it lasts that long :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-8376378579193152145?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/8376378579193152145/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=8376378579193152145' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/8376378579193152145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/8376378579193152145'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2007/03/mango-liqueur_31.html' title='Mango Liqueur - Fruition'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_TlhwVaDeyBE/Rg5mwOkgC8I/AAAAAAAAAWs/LLHQhieDfVw/s72-c/IMG_1832.JPG' height='72' width='72'/><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-2577506803462017517</id><published>2007-03-27T14:11:00.000+10:00</published><updated>2007-03-27T17:00:07.468+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby / Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><category scheme='http://www.blogger.com/atom/ns#' term='ThoughtWorks'/><title type='text'>Starting at ThoughtWorks: First Five Weeks</title><content type='html'>Well, I've been with &lt;a href="http://www.thoughtworks.com/"&gt;ThoughtWorks&lt;/a&gt; for just over 5 weeks now, and I thought I'd write down some thoughts before the hiring and joining process got lost in the misty swamp of my memory.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Hiring process&lt;/span&gt;&lt;br /&gt;To cut a long story short, I did a phone screen with HR, a coding test and then some fairly quick aptitude and personality tests and finally 3 interviews. You have something like a week to do the coding test and then submit your code for review. I had the other tests and interviews on a single day. Although this sounds pretty horrendous, it actually wasn't too bad. Tests were pretty quick and the interviewers were astoundingly friendly. I finished by something like 3pm in the afternoon, including a lunch break, and surprisingly didn't feel too bad or stressed afterwards.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Induction&lt;/span&gt;&lt;br /&gt;As a fairly impressive start, I had 2 days of induction in Melbourne (I live in Sydney). ThoughtWorks arranged drivers, hotel and flight so it was all very smooth. This was lucky as I was pretty jet lagged and confused - I'd just flown back from an &lt;a href="http://jamescrisp.blogspot.com/search/label/Travel"&gt;overseas holiday&lt;/a&gt; not long before. Induction was largely getting a company provided laptop, meeting people and getting an introduction to various internal systems and procedures. As an aside, I've heard that there is now an "immersion" process where you get sent to India for a week or two for induction but can't comment on that.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A few weeks on the beach&lt;/span&gt;&lt;br /&gt;When you're not assigned to a client project, you are "on the beach". This means you go into your local office with your laptop. It's really great - there's no particular tasks assigned to you, but the opportunity is there to get involved in a lot of interesting stuff. To give you some examples, here's some of the stuff I've had the chance to do:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Write an &lt;a href="http://jamescrisp.blogspot.com/2007/03/contact-feedback-form-plugin-for.html"&gt;open source plug-in for Mephisto&lt;/a&gt; for &lt;a href="http://studios.thoughtworks.com/"&gt;ThoughtWorks Studios&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Be involved in scoping out and estimating for a RFI from a new client&lt;/li&gt;&lt;li&gt;Pair with another developer to do code reviews of potential new recruits&lt;/li&gt;&lt;li&gt;Help out briefly with a fun project to develop a &lt;a href="http://sourceforge.net/projects/jcruisemonitor/"&gt;driver for a USB build light&lt;/a&gt; for continuous integration servers (red for broken build, green for good build, etc)&lt;/li&gt;&lt;li&gt;Help out on client projects - I was asked to whip up a little proof of concept for JRuby and Java integration and &lt;a href="http://jamescrisp.blogspot.com/2007/02/jruby-setup.html"&gt;learnt a bit&lt;/a&gt; getting this set up&lt;/li&gt;&lt;li&gt;Do a little bit of Google Maps integration&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Meet colleagues and learn more about procedures etc&lt;/li&gt;&lt;li&gt;Get invited to lunch with the managing director - this is something that happens for all new hires and I think it's really great&lt;/li&gt;&lt;li&gt;Almost go out on a pre-sales call (I've got to go back to Melbourne and will miss this unfortunately)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Catch up on tech reading such as blogs, books etc&lt;/li&gt;&lt;li&gt;Go to a swanky &lt;a href="http://www.thoughtworks.com.au/tech-briefing.html"&gt;talk&lt;/a&gt; given by Martin Fowler and  Kristan Vingrys&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Eat lots of free lunches (usually twice a week) and attend various talks at the office given by other consultants&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Drink lots of free coffee (ThoughtWorks has a coffee tab with a local cafe)&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;First project&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;Much fun as it is on the beach, after a few weeks, I was itching to join the big boys and go on a project. Getting assigned to a project is the purview of your professional services manager, and can be pretty changeable. The saying is that "you don't really know what project you're on till you walk in the door of the client site" and I've even heard "you don't really know what project you're on till you're on the plane home". There's a grain of truth in these - it can look like you are going to go on a project and then it doesn't come through, or some other project becomes more important or whatever. I almost went on several different projects before finally ending up on quite a cool Ruby / Rails project with a startup in Melbourne. So, I got to join the jet set and have been flying down to Melbourne during the week, and back for the weekends. This is a bit tiring, but ThoughtWorks does its best to make things comfortable. I'm staying in a really nice corporate apartment in Melbourne, flights are arranged and paid for and drivers are scheduled for pickup and drop off to the airport. There's also a generous per diem allowance for food. The project is really cool, and I'm enjoying it, but can't say more as it is under a NDA.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Back on the beach.. but only for two days!&lt;br /&gt;&lt;/span&gt;My first project was two weeks, so after that I returned to the beach. Today is my second day on the beach. However, it turns out that the client was very happy with our first two weeks work and they've invited us back again until Easter. This means I need to fly back to Melbourne tomorrow.  This won't continue indefinitely though - when I was discussing the project with my professional services manager, we agreed that I would not need to stay on a Melbourne project for more than 6 weeks. And clearly this is in ThoughtWorks interest as well - it costs a lot more to fly somebody in from Sydney every week and provide accommodation etc. I'm going to be transitioning off the project by Easter and a Melbourne based consultant is going to take over from me if the project continues further. It'll be good to be on a Sydney based project again but I feel it would be unfair not to say that ThoughtWorks has done a really good job in making working in another city as convenient and pleasant as possible.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Various benefits&lt;br /&gt;&lt;/span&gt;ThoughtWorks is pretty generous in the expenses department. They cover your mobile phone, home internet, per diem when away, give an allowance for training courses and books, etc. There's also lots of free lunches, food, coffee and catered events.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Transparency and knowing what's going on&lt;br /&gt;&lt;/span&gt;I've been quite impressed to get a monthly update email that talks about ThoughtWorks plans, goals and financials, headcount etc in significant detail. There's also various update meeting where you get to hear how projects are going and what's happening with various clients. Personally I'm really glad to see this type of thing, as at previous jobs, this has been privileged information, and most of the time, I have not really had any idea how well the company is doing financially as a whole, or what the future plans and directions are.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Variety and Unpredictability&lt;br /&gt;&lt;/span&gt;These are really two faces of the same coin, and depending on your character and experience, I think you might either love or hate this. You really don't know what project you're going to be working on, what your role will be, what industry the client is in, what type of development they need or for what platform or in what language. In fact, you don't even know what city you're going to be in during a given week. I'm enjoying this at this point as my last job was always in the same office, with the same technologies etc. However, I can see it may be trying in the long term, and it does make it difficult to do the shopping or organise things with friends during the week. On the other hand, I have heard that most of the work in Sydney is for big companies like banks and telcos in the city CBD within walking distance to the office, and the majority in Java. So perhaps my short experience so far is not the norm.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;In conclusion...&lt;br /&gt;&lt;/span&gt;So far, I can honestly say that it's been really great working at ThoughtWorks. I've had a chance to do some of the stuff I've wanted to do for ages like work on a bit of open source and do some commercial Ruby on Rails work. My colleagues have been friendly and welcoming, and I've been wowed by the level of care that ThoughtWorks takes of its employees.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-2577506803462017517?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/2577506803462017517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=2577506803462017517' title='53 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/2577506803462017517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/2577506803462017517'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2007/03/starting-at-thoughtworks-first-five.html' title='Starting at ThoughtWorks: First Five Weeks'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>53</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-1775746025307370288</id><published>2007-03-26T23:29:00.000+10:00</published><updated>2007-03-27T00:21:31.755+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Book Reviews'/><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><category scheme='http://www.blogger.com/atom/ns#' term='Fiction'/><title type='text'>A few choice quotes from "The Unbearable Lightness Of Being" by Milan Kundera</title><content type='html'>Starts slowly with quite a philosophical bent, but becomes really compelling once the main characters are introduced. Some memorable quotes:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Happiness&lt;/span&gt;&lt;br /&gt;"If &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Kerenin&lt;/span&gt; had been a person instead of a dog, he would surely have long since said to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Tereza&lt;/span&gt;, 'Look, I'm sick and tired of carrying that roll in my mouth every day. Can't you come up with something different?' And therein lies the whole of man's plight. Human time does not turn in a circle; it runs ahead in a straight line. That is why man cannot be happy: happiness is the longing for repetition."&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Love&lt;/span&gt;&lt;br /&gt;"The brain appears to possess a special area which we might call &lt;span style="font-style: italic;"&gt;poetic memory&lt;/span&gt; and which records everything that charms or touches us, that makes our lives beautiful... Their love story did not begin until afterwards: she fell ill and he was unable to send her home as he had the others. Kneeling by her as she lay sleeping in his bed, he realized that someone had sent her downstream in a bulrush basket. I have said before that metaphors are dangerous. Love begins with a metaphor. Which is to say, love begins at the point when a woman enters her first word into our poetic memory."&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A feeling of importance&lt;/span&gt;&lt;br /&gt;"We all need somebody to look at us. We can be divided into four categories according to the kind of look we wish to live under. The first category longs for the look of an infinite number of anonymous eyes, in other words, for the look of the public...&lt;br /&gt;The second category is made up of people who have a vital need to be looked at by many known eyes. They are the tireless hosts of cocktail parties and dinners...&lt;br /&gt;Then there is the third category, the category of people who need to be constantly before the eyes of the person they love. Their situation is as dangerous as the situation of people in the first category. One day the eyes of their beloved will close, and the room will go dark..&lt;br /&gt;And finally there is the fourth category, the rarest, the category of people who live in the imaginary eyes of those who are not present. They are the dreamers."&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Kitsch&lt;br /&gt;&lt;/span&gt;"Kitsch is the absolute denial of shit, in both the literal and the figurative senses of the word; kitsch excludes everything from its purview which is essentially unacceptable in human &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;existence&lt;/span&gt;...&lt;br /&gt;Kitsch causes two tears to flow in quick succession. The first tear says: How nice to see children running on the grass! The second tear says: How nice to be moved, together with all mankind, by children running on the grass! It is the second tear that makes kitsch kitsch. The brotherhood of man on earth will be possible only on a basis of kitsch...&lt;br /&gt;And no one knows this better than politicians. Whenever a camera is in the offing, they immediately run to the nearest child, lift it into the air, kiss it on the cheek. Kitsch is the aesthetic ideal of all politicians and all &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_3"&gt;political&lt;/span&gt; parties and movements...&lt;br /&gt;In the realm of totalitarian kitsch, all answers are given in advance and preclude any questions. It follows, then that the true opponent of totalitarian kitsch is the person who asks questions...&lt;br /&gt;From that time on, she [Sabina] began to insert &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_4"&gt;mystifications&lt;/span&gt; into her biography, and by the time she got to America she even managed to hide the fact that she was Czech. It was all merely a desperate attempt to escape the kitsch that people wanted to make of her life."&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-1775746025307370288?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/1775746025307370288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=1775746025307370288' title='36 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/1775746025307370288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/1775746025307370288'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2007/03/few-choice-quotes-from-unbearable.html' title='A few choice quotes from &quot;The Unbearable Lightness Of Being&quot; by Milan Kundera'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>36</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-4821708800232991094</id><published>2007-03-19T22:26:00.000+11:00</published><updated>2007-04-17T13:14:15.012+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby / Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><category scheme='http://www.blogger.com/atom/ns#' term='ThoughtWorks'/><title type='text'>Contact / Feedback Form Plugin for Mephisto</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TlhwVaDeyBE/Re9LzKIAXII/AAAAAAAAAWg/Ymx_wzpmPdM/s1600-h/plugin.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://bp1.blogger.com/_TlhwVaDeyBE/Re9LzKIAXII/AAAAAAAAAWg/Ymx_wzpmPdM/s200/plugin.JPG" alt="" id="BLOGGER_PHOTO_ID_5039329850314218626" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Introduction&lt;/span&gt;&lt;br /&gt;If you use &lt;a href="http://mephistoblog.com/"&gt;Mephisto&lt;/a&gt;, a content management / blogging system written in &lt;a href="http://www.rubyonrails.org/"&gt;Rails&lt;/a&gt;, you may well be interested in using this new plug-in. It provides a form that lets visitors to your site leave their contact details and send you messages or feedback via email.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;License&lt;/span&gt;&lt;br /&gt;This plug-in was developed for the new &lt;a href="http://studios.thoughtworks.com/"&gt;ThoughtWorks Studios site&lt;/a&gt;. As I wrote it at and for work, it is copyright ThoughtWorks, 2007. However, ThoughtWorks, being generous souls, is happy for me to open source it under the &lt;a href="http://www.apache.org/licenses/LICENSE-2.0.html"&gt;Apache 2.0 licence&lt;/a&gt;, which pretty much means you have free reign to use it as you want.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Requirements&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Mephisto Edge (the latest stable 0.7.3 release does not have support for Mephisto plugins)&lt;/li&gt;&lt;li&gt;Rails Edge (required by Mephisto edge)&lt;/li&gt;&lt;li&gt;ActionMailer (comes with Rails) correctly configured with SMTP server etc, so that emails can be delivered. See "Configuration" section &lt;a href="http://wiki.rubyonrails.org/rails/pages/HowToSendEmailsWithActionMailer"&gt;here&lt;/a&gt; for more details.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Installation&lt;/span&gt;&lt;br /&gt;ruby script/plugin install http://mephisto-contact-form-plugin.googlecode.com&lt;br /&gt;/svn/plugins/mephisto_contact_form&lt;br /&gt;&lt;br /&gt;or in your vendor/plugins directory for Mephisto:&lt;br /&gt;&lt;br /&gt;svn checkout http://mephisto-contact-form-plugin.googlecode.com&lt;br /&gt;/svn/plugins/mephisto_contact_form mephisto_contact_form&lt;br /&gt;&lt;br /&gt;Make sure you restart your web server at this point so that the plugin is loaded.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Setup&lt;/span&gt;&lt;br /&gt;1. Create a new template called 'contact_us.liquid' though the admin web interface (under the 'Design' tab).&lt;br /&gt;Paste in the following code:&lt;br /&gt;&lt;br /&gt;&amp;lt;H1&amp;gt;Contact Us&amp;lt;/H1&amp;gt;&lt;br /&gt;{% contactform %}&lt;br /&gt;&amp;lt;p&amp;gt;{{ form.name }}&amp;lt;label for="author"&amp;gt;&amp;lt;small&amp;gt;Your name&amp;lt;/small&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;{{ form.email }}&amp;lt;label for="email"&amp;gt;&amp;lt;small&amp;gt;Email address&amp;lt;/small&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;{{ form.phone}}&amp;lt;label for="phone"&amp;gt;&amp;lt;small&amp;gt;Phone number (optional)&amp;lt;/small&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;{{ form.subject}}&amp;lt;label for="subject"&amp;gt;&amp;lt;small&amp;gt;Subject&amp;lt;/small&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;{{ form.body }}&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;{{ form.submit }}&amp;lt;/p&amp;gt;&lt;br /&gt;{% endcontactform %}&lt;br /&gt;&lt;br /&gt;Feel free to modify labels, layout etc.&lt;br /&gt;&lt;br /&gt;2. Edit&lt;br /&gt;{MEPHISTO_ROOT}\vendor\plugins&lt;br /&gt;\mephisto_contact_form\lib\contact_notifier.rb&lt;br /&gt;and put in the email address you want contact form submissions to go to.&lt;br /&gt;&lt;br /&gt;3. Link to "/contact_form" from your site.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Any issues / questions / suggestions?&lt;/span&gt;&lt;br /&gt;Best to post comments on this blog.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Technical Info&lt;br /&gt;&lt;/span&gt;The contact form plugin is actually a combination of a rails plugin, a liquid block plugin and a Mephisto plugin. See this post about &lt;a href="http://jamescrisp.blogspot.com/2007/04/tips-for-developing-mephisto-plugins.html"&gt;developing Mephisto plugins&lt;/a&gt; for more information.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-4821708800232991094?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/4821708800232991094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=4821708800232991094' title='317 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/4821708800232991094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/4821708800232991094'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2007/03/contact-feedback-form-plugin-for.html' title='Contact / Feedback Form Plugin for Mephisto'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_TlhwVaDeyBE/Re9LzKIAXII/AAAAAAAAAWg/Ymx_wzpmPdM/s72-c/plugin.JPG' height='72' width='72'/><thr:total>317</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-5339658800304733448</id><published>2007-03-08T22:18:00.000+11:00</published><updated>2007-03-08T23:20:28.462+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Wing Chun'/><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><title type='text'>Wing Chun: Bong Sau Tips</title><content type='html'>Today my class was visited a very talented high level instructor. Although he only spent a few minutes looking at my bong sau, he gave two invaluable tips:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;When bringing your hand and arm up into bong sau, you need to be moving both upwards, forwards and inwards towards the centre simultaneously. A good way to do this is to imagine your elbow tracing an arc through the air from start to end point.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;When moving from bong sau to tan sau when rolling, move into fook sau first, and then roll your wrist over. This will stop your hand from dropping and will leave your hand on the centre line.&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-5339658800304733448?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/5339658800304733448/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=5339658800304733448' title='24 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/5339658800304733448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/5339658800304733448'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2007/03/wing-chun-bong-sau-tips.html' title='Wing Chun: Bong Sau Tips'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>24</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-8901736415513079739</id><published>2007-03-05T22:04:00.000+11:00</published><updated>2007-03-06T17:50:19.537+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><category scheme='http://www.blogger.com/atom/ns#' term='Soft Skills and Mind Hacks'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Reviews'/><title type='text'>The Secrets of Consulting by Gerald Weinberg</title><content type='html'>The Secrets of Consulting by Gerald Weinberg is one of the most entertaining (largely?) non-fiction books that I have read - a heady mix of &lt;a href="http://jamescrisp.blogspot.com/2007/01/how-to-win-friends-and-influence-people.html"&gt;How to Win Friends and Influence People&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Fear_and_Loathing_in_Las_Vegas"&gt;Fear and Loathing in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Las&lt;/span&gt; Vegas&lt;/a&gt; (just look at the illustrations!) , and the &lt;a href="http://en.wikipedia.org/wiki/Ten_Commandments"&gt;10 Commandments&lt;/a&gt;. The book provides general advice, case studies/stories and then derives general "rules" and recommendations from these.&lt;br /&gt;&lt;br /&gt;Personally, I found the chapter on the pricing of consulting to be particularly interesting. Thinking about setting a price previously, I would have suggested it should be enough to cover costs and make a bit of a profit. Weinberg points out that price is more than this - it is a big factor in the relationship and the level of respect for the consultant.&lt;br /&gt;&lt;br /&gt;The Weinberg's consulting "rules" are quite numerous - my personal favourites are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;"If you can't fix it, feature it."&lt;/li&gt;&lt;li&gt;"It may look like a crisis, but it's only the end of an illusion." &lt;/li&gt;&lt;li&gt;"You'll never accomplish anything if you care who gets the credit."&lt;/li&gt;&lt;li&gt;"If &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;something's&lt;/span&gt; faked, it must need fixing."&lt;/li&gt;&lt;li&gt;"The name of the thing [label] is not the thing."&lt;/li&gt;&lt;li&gt;"It tastes better when you add your own egg."&lt;/li&gt;&lt;li&gt;"You don't get &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;nothin&lt;/span&gt;' for &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;nothin&lt;/span&gt;'. Moving in one direction incurs a cost in the other."&lt;/li&gt;&lt;li&gt;"Whatever the client is doing, advice something else."&lt;/li&gt;&lt;li&gt;"What you don't know may not hurt you, but what you don't remember always does."&lt;/li&gt;&lt;li&gt;"Clients always know how to solve their problems and always tell the solution in the first five minutes."&lt;/li&gt;&lt;li&gt;"When change is inevitable, we struggle most to keep what we value most."&lt;/li&gt;&lt;li&gt;"The biggest and longest lasting changes usually originate in attempts to preserve the very thing ultimately changes most."&lt;/li&gt;&lt;li&gt;"Effective problem-solvers may have many problems, but rarely have a single, dominant problem."&lt;/li&gt;&lt;li&gt;"Make sure they pay you enough so they'll do what you say. The most important act in consulting is setting the right fee."&lt;/li&gt;&lt;li&gt;"The more they pay you, the more they love you. The less they pay you, the less they respect you."&lt;/li&gt;&lt;li&gt;"Spend at least one day a week getting exposure." and "Spend at least 1/4 of your time doing nothing." and make sure your fee covers this.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;"Set a price so you won't regret it either way."&lt;/li&gt;&lt;li&gt;"If they don't like your work, don't take their money."&lt;br /&gt;&lt;/li&gt;&lt;li&gt;"Cucumbers get more pickled than brine gets &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;cucumbered&lt;/span&gt;."&lt;/li&gt;&lt;li&gt;"Give away your best ideas."&lt;/li&gt;&lt;li&gt;"Look for what you like in the present situation and comment on it."&lt;/li&gt;&lt;li&gt;"Study for understanding, not for criticism."&lt;/li&gt;&lt;li&gt;"Never promise more than 10% improvement.. if you happen to achieve more than 10% improvement, make sure it isn't noticed."&lt;/li&gt;&lt;li&gt;"Consultants tend to be the most effective on the third problem you give them."&lt;/li&gt;&lt;li&gt;"The child who receives a hammer for Christmas will discover that everything needs pounding."&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/28462179-8901736415513079739?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/8901736415513079739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=8901736415513079739' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/8901736415513079739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/8901736415513079739'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2007/03/secrets-of-consulting-by-gerald.html' title='The Secrets of Consulting by Gerald Weinberg'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-2360760471559561773</id><published>2007-03-05T00:01:00.000+11:00</published><updated>2007-03-05T00:08:30.218+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Food and Drink'/><category scheme='http://www.blogger.com/atom/ns#' term='Brewing'/><title type='text'>Mango Liqueur</title><content type='html'>Started a quick mango liqueur this evening. Two large fresh &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;mangoes&lt;/span&gt; worth of pulp (approx 500ml) mixed with 500ml of vodka in a jar. Planning to shake every few days for the next few weeks, filter and then add about 1 cup of sugar, before maturing for a few months. I have high hopes, as a similar recipe worked well with bananas in the past.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-2360760471559561773?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/2360760471559561773/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=2360760471559561773' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/2360760471559561773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/2360760471559561773'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2007/03/mango-liqueur.html' title='Mango Liqueur'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-7506896702024630202</id><published>2007-03-01T22:18:00.000+11:00</published><updated>2007-03-01T22:49:59.627+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby / Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><title type='text'>_vimrc for Ruby</title><content type='html'>In the past I've used gvim for Ruby coding. It's been pretty good, especially with the new tabbed editing and omni complete (bit like intellisense in Visual Studio) introduced in vim 7. However, when I downloaded vim at work, I was missing the secret sauce - a good vimrc. Here's my usual vimrc for ruby:&lt;br /&gt;&lt;pre&gt;set nocompatible&lt;br /&gt;behave xterm&lt;br /&gt;set selectmode=mouse&lt;br /&gt;set nu&lt;br /&gt;set tabstop=2&lt;br /&gt;set shiftwidth=2&lt;br /&gt;set softtabstop=2&lt;br /&gt;set ai&lt;br /&gt;set columns=100&lt;br /&gt;set lines=70&lt;br /&gt;set guifont=Courier:h10&lt;br /&gt;set expandtab&lt;br /&gt;set smarttab&lt;br /&gt;let g:rubycomplete_rails = 1&lt;/pre&gt;Among other things, it makes the default window size bigger, uses a prettier font, sets up auto indenting ruby style, and turns on omni-complete.&lt;br /&gt;&lt;br /&gt;By the way, on windows, assuming a default install, vimrc is to be found here:&lt;br /&gt;&lt;pre&gt;C:\Program Files\Vim\_vimrc&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-7506896702024630202?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/7506896702024630202/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=7506896702024630202' title='29 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/7506896702024630202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/7506896702024630202'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2007/03/vimrc-for-ruby.html' title='_vimrc for Ruby'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>29</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-3253003792473296982</id><published>2007-02-27T15:59:00.000+11:00</published><updated>2007-02-27T22:54:23.127+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby / Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><title type='text'>JRuby Setup</title><content type='html'>Recently got a JRuby/Rails system with Java integration up and running. Unfortunately, it took quite a few hours, as most of the docs and code you find through Google are out of date.&lt;br /&gt;&lt;br /&gt;If you use JRuby 0.9.2 from Codehaus, you will get an error similar to this when you try to access a rails application:&lt;br /&gt;&lt;br /&gt;[2007-02-26 17:54:59] INFO  WEBrick::HTTPServer start: pid=22540508 port=3000&lt;br /&gt;&amp;lt;ArgumentError: Anonymous modules have no name to be referenced by&amp;gt;&lt;br /&gt;["c:/jruby-0.9.2/lib/ruby/gems/1.8/gems/activesupport-1.4.1/lib/&lt;br /&gt;active_support/dependencies.rb:402:in `to_constant_name'...&lt;br /&gt;&lt;br /&gt;If you're stuck in this rut, fear not!  &lt;a href="http://blog.nicksieger.com/"&gt;Nick Sieger&lt;/a&gt;  has written &lt;a href="http://trac.caldersphere.net/projects/main/wiki/JRubyQuickStart"&gt;very helpful instructions&lt;/a&gt; which outline how to get and set up the latest development snapshot. Please note that in addition to the instructions, you need to set your JRUBY_HOME environment variable. Under Windows, do something like this:&lt;br /&gt;&lt;br /&gt;set JRUBY_HOME=c:\jruby&lt;br /&gt;&lt;br /&gt;If you'd prefer not to use the snapshot, you can get the source code through subversion from: &lt;br /&gt;&lt;br /&gt;&lt;a href="http://svn.codehaus.org/jruby/trunk/jruby"&gt;http://svn.codehaus.org/jruby/trunk/jruby&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;but at the time of this post, you need to run svn checkout or update with "--ignore-externals" to avoid the following error:&lt;br /&gt;&lt;br /&gt;Error: URL 'svn://rubyforge.org/var/svn/bfts/bfts/trunk' doesn't exist&lt;br /&gt;&lt;br /&gt;Many thanks to &lt;a href="http://blog.nicksieger.com/"&gt;Nick Sieger&lt;/a&gt; and the &lt;a href="http://archive.jruby.codehaus.org/user"&gt;JRuby user mailing list&lt;/a&gt; for their help.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-3253003792473296982?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/3253003792473296982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=3253003792473296982' title='35 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/3253003792473296982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/3253003792473296982'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2007/02/jruby-setup.html' title='JRuby Setup'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>35</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-6205653446303531010</id><published>2007-02-26T21:20:00.000+11:00</published><updated>2007-02-26T21:46:56.660+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><category scheme='http://www.blogger.com/atom/ns#' term='Travel'/><title type='text'>Holiday 2007 - Venice and Padua</title><content type='html'>It was a sudden decision to take a sleeper train to Venice. We didn't really know what to expect.  By chance, we arrived at Carnivale (mask and costume festival), probably the busiest time of the year. Venice was filled to the rafters with tourists, prices were high and it was difficult to walk in many areas due to the number of people in the narrow streets! The solution was to take to the water - catching the ferry was fun and it got you out of the crowds.&lt;br /&gt;&lt;br /&gt;Venice is really beautiful. The Doges (ruler's) palace and nearby Cathedral in St Marco square are amazing. The palace has huge painted ceiling murals by famous artists and enormous open halls. In the Cathedral, there are golden mosaics over the whole ceiling, and even the floor is an artwork in tiles. There's also some impressive golden relics from when the Venetians sacked Constantinople during the crusades.&lt;br /&gt;&lt;br /&gt;In Venice, most streets lead to the water, and the best facades are turned towards the canals. It really is a city designed to be traversed on the water. The buildings are mainly standing on foundations made from hundreds of pine trees hammered into the silty mud under Venice. Historically, Venice's influence peaked in the 13th century or so, and from then on, it was a slow decline in power. But to make up for this, the wealthy families spent lavishly on buildings, clothes and decorations.&lt;br /&gt;&lt;br /&gt;On our last day in Italy, we went to Padua to take a look at a more typical Italian city. It was a friendly and fun place with few tourists, but good food and a nice atmosphere. Last picture is of Padua, all the rest are from Venice!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TlhwVaDeyBE/ReK6dqc3eXI/AAAAAAAAAVI/nHskHdkcRlA/s1600-h/IMG_1468.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp1.blogger.com/_TlhwVaDeyBE/ReK6dqc3eXI/AAAAAAAAAVI/nHskHdkcRlA/s400/IMG_1468.JPG" alt="" id="BLOGGER_PHOTO_ID_5035792352127973746" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/ReK6eKc3eYI/AAAAAAAAAVQ/HdE8QKJR-jg/s1600-h/IMG_1489.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/ReK6eKc3eYI/AAAAAAAAAVQ/HdE8QKJR-jg/s400/IMG_1489.JPG" alt="" id="BLOGGER_PHOTO_ID_5035792360717908354" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/ReK6eKc3eZI/AAAAAAAAAVY/sjFQFGJ1Ybs/s1600-h/IMG_1495.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/ReK6eKc3eZI/AAAAAAAAAVY/sjFQFGJ1Ybs/s400/IMG_1495.JPG" alt="" id="BLOGGER_PHOTO_ID_5035792360717908370" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/ReK6eac3eaI/AAAAAAAAAVg/GvY7Je4442c/s1600-h/IMG_1499.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_TlhwVaDeyBE/ReK6eac3eaI/AAAAAAAAAVg/GvY7Je4442c/s400/IMG_1499.JPG" alt="" id="BLOGGER_PHOTO_ID_5035792365012875682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/ReK6Oac3eSI/AAAAAAAAAUg/0w9Y06nkCiI/s1600-h/IMG_1501.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_TlhwVaDeyBE/ReK6Oac3eSI/AAAAAAAAAUg/0w9Y06nkCiI/s400/IMG_1501.JPG" alt="" id="BLOGGER_PHOTO_ID_5035792090134968610" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TlhwVaDeyBE/ReK6Oqc3eTI/AAAAAAAAAUo/SFUAUaAD-5g/s1600-h/IMG_1542.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp1.blogger.com/_TlhwVaDeyBE/ReK6Oqc3eTI/AAAAAAAAAUo/SFUAUaAD-5g/s400/IMG_1542.JPG" alt="" id="BLOGGER_PHOTO_ID_5035792094429935922" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TlhwVaDeyBE/ReK6O6c3eUI/AAAAAAAAAUw/JdA_gtzskoE/s1600-h/IMG_1546.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_TlhwVaDeyBE/ReK6O6c3eUI/AAAAAAAAAUw/JdA_gtzskoE/s400/IMG_1546.JPG" alt="" id="BLOGGER_PHOTO_ID_5035792098724903234" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/ReK6PKc3eVI/AAAAAAAAAU4/EcmbMWoIqBg/s1600-h/IMG_1558.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/ReK6PKc3eVI/AAAAAAAAAU4/EcmbMWoIqBg/s400/IMG_1558.JPG" alt="" id="BLOGGER_PHOTO_ID_5035792103019870546" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/ReK6PKc3eWI/AAAAAAAAAVA/2tEW8aWJzh8/s1600-h/IMG_1573.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/ReK6PKc3eWI/AAAAAAAAAVA/2tEW8aWJzh8/s400/IMG_1573.JPG" alt="" id="BLOGGER_PHOTO_ID_5035792103019870562" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/ReK50ac3eNI/AAAAAAAAAT4/bwfTJRJEC6o/s1600-h/IMG_1576.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_TlhwVaDeyBE/ReK50ac3eNI/AAAAAAAAAT4/bwfTJRJEC6o/s400/IMG_1576.JPG" alt="" id="BLOGGER_PHOTO_ID_5035791643458369746" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TlhwVaDeyBE/ReK50qc3eOI/AAAAAAAAAUA/nhVQOpXJ3EA/s1600-h/IMG_1598.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp1.blogger.com/_TlhwVaDeyBE/ReK50qc3eOI/AAAAAAAAAUA/nhVQOpXJ3EA/s400/IMG_1598.JPG" alt="" id="BLOGGER_PHOTO_ID_5035791647753337058" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/ReK55Kc3ePI/AAAAAAAAAUI/WKvTpV1IGts/s1600-h/IMG_1604.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/ReK55Kc3ePI/AAAAAAAAAUI/WKvTpV1IGts/s400/IMG_1604.JPG" alt="" id="BLOGGER_PHOTO_ID_5035791725062748402" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/ReK55ac3eQI/AAAAAAAAAUQ/Iob4qfFCra0/s1600-h/IMG_1622.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_TlhwVaDeyBE/ReK55ac3eQI/AAAAAAAAAUQ/Iob4qfFCra0/s400/IMG_1622.JPG" alt="" id="BLOGGER_PHOTO_ID_5035791729357715714" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TlhwVaDeyBE/ReK55qc3eRI/AAAAAAAAAUY/uifEEtzRPoA/s1600-h/IMG_1640.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp1.blogger.com/_TlhwVaDeyBE/ReK55qc3eRI/AAAAAAAAAUY/uifEEtzRPoA/s400/IMG_1640.JPG" alt="" id="BLOGGER_PHOTO_ID_5035791733652683026" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-6205653446303531010?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/6205653446303531010/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=6205653446303531010' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/6205653446303531010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/6205653446303531010'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2007/02/holiday-2007-venice-and-padua.html' title='Holiday 2007 - Venice and Padua'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_TlhwVaDeyBE/ReK6dqc3eXI/AAAAAAAAAVI/nHskHdkcRlA/s72-c/IMG_1468.JPG' height='72' width='72'/><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-1538213203417895026</id><published>2007-02-26T20:54:00.000+11:00</published><updated>2007-02-26T21:04:28.456+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><category scheme='http://www.blogger.com/atom/ns#' term='Travel'/><title type='text'>Holiday 2007 - Monaco</title><content type='html'>Monaco is easily accessible from Nice - about 1/2h by train. We spent an enjoyable afternoon and evening there, visiting the cactus "exotic" garden, castle, casino and cave. The cave was particularly interesting - it was about 18&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;degC&lt;/span&gt; inside (despite winter temperatures outside), and walkways for visitors had been made using &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_1"&gt;explosives&lt;/span&gt; and diamond drills! Despite the damage, it was still a lovely cave. Monaco was clean and tidy, and felt almost like a movie set.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/ReKwIKc3eII/AAAAAAAAAS8/Zr3uLWM9sgg/s1600-h/IMG_1727.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/ReKwIKc3eII/AAAAAAAAAS8/Zr3uLWM9sgg/s400/IMG_1727.JPG" alt="" id="BLOGGER_PHOTO_ID_5035780987644508290" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/ReKwIac3eJI/AAAAAAAAATE/RVxM9laSk6Q/s1600-h/IMG_1739.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_TlhwVaDeyBE/ReKwIac3eJI/AAAAAAAAATE/RVxM9laSk6Q/s400/IMG_1739.JPG" alt="" id="BLOGGER_PHOTO_ID_5035780991939475602" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TlhwVaDeyBE/ReKwIqc3eKI/AAAAAAAAATM/bOoLqtCplcE/s1600-h/IMG_1748.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp1.blogger.com/_TlhwVaDeyBE/ReKwIqc3eKI/AAAAAAAAATM/bOoLqtCplcE/s400/IMG_1748.JPG" alt="" id="BLOGGER_PHOTO_ID_5035780996234442914" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TlhwVaDeyBE/ReKwIqc3eLI/AAAAAAAAATU/zLZSroeC8pA/s1600-h/IMG_1751.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp1.blogger.com/_TlhwVaDeyBE/ReKwIqc3eLI/AAAAAAAAATU/zLZSroeC8pA/s400/IMG_1751.JPG" alt="" id="BLOGGER_PHOTO_ID_5035780996234442930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TlhwVaDeyBE/ReKwI6c3eMI/AAAAAAAAATc/sYc7nlTz_lg/s1600-h/IMG_1754.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_TlhwVaDeyBE/ReKwI6c3eMI/AAAAAAAAATc/sYc7nlTz_lg/s400/IMG_1754.JPG" alt="" id="BLOGGER_PHOTO_ID_5035781000529410242" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-1538213203417895026?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/1538213203417895026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=1538213203417895026' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/1538213203417895026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/1538213203417895026'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2007/02/holiday-2007-monaco.html' title='Holiday 2007 - Monaco'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_TlhwVaDeyBE/ReKwIKc3eII/AAAAAAAAAS8/Zr3uLWM9sgg/s72-c/IMG_1727.JPG' height='72' width='72'/><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-8472476664700717330</id><published>2007-02-25T21:59:00.000+11:00</published><updated>2007-02-25T22:36:48.787+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby / Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Using floating point variables to represent money =&gt; not a good idea!</title><content type='html'>I was reading through some code the other day and was surprised to find that it was using doubles to represent  dollar amounts. Reason for the alarm bells is that doubles and floats cannot accurately represent many decimal fractions (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;eg&lt;/span&gt;, 0.1), since doubles and floats internally work with powers of 2 rather than powers of 10. These inaccuracies are likely to lead to significant errors, especially when performing arithmetic (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;eg&lt;/span&gt;, adding up a table of dollar amounts). See this &lt;a href="http://www2.hursley.ibm.com/decimal/decifaq1.html#inexact"&gt;IBM article&lt;/a&gt; for a more &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;in depth&lt;/span&gt; explanation and examples. The solution is to use types that work with powers of ten internally. In C#, you can use 'decimal' and in Java or Ruby, '&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;BigDecimal&lt;/span&gt;', to avoid these problems.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-8472476664700717330?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/8472476664700717330/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=8472476664700717330' title='24 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/8472476664700717330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/8472476664700717330'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2007/02/using-floating-point-variables-to.html' title='Using floating point variables to represent money =&gt; not a good idea!'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>24</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-5083636459542152540</id><published>2007-02-25T18:19:00.000+11:00</published><updated>2007-02-25T19:46:41.409+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><category scheme='http://www.blogger.com/atom/ns#' term='Travel'/><title type='text'>Holiday 2007 - Provence &amp; Cote D'Azure in the South of France</title><content type='html'>France supposedly is the number 1 tourist destination in the world, and certainly it is one of my personal favourites! Besides the pleasure of speaking French, we had the opportunity to eat a lot of good food, and visit really pretty coastal areas, medieval towns, castles and ancient Roman remains.&lt;br /&gt;&lt;br /&gt;Our itinerary looked roughly like this:&lt;br /&gt;Marseilles -&gt; Aix En Provence -&gt; Avignon -&gt; Nimes -&gt; Arles -&gt; Tarascon -&gt; (Italy) -&gt; Nice -&gt; Antibes -&gt; (Monaco)&lt;br /&gt;&lt;br /&gt;In terms of hotels, it was very much 'get what you pay for'. We tended to stay in two star places around 40-50 euros per night. Our first hotel in Marseilles was only 37E per night, and it convinced us that the extra 10E or so was really worth it! Hotels were fairly easy to find (well sign posted), though often not too close to transport.&lt;br /&gt;&lt;br /&gt;We tried the random approach to finding good restaurants to start with, but this led to a number of disappointments. The solution was to ask our hoteliers for their favourite restaurants - this led to some really great meals :-)&lt;br /&gt;&lt;br /&gt;We had planned to rent a car for some parts of the trip.. however, make sure you learn to drive a manual before attempting this! Autos in France are horribly expensive to rent, so we ended up doing everything by public transport - bit tricky in winter time especially, but we managed. Tourist offices were generally very helpful.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TlhwVaDeyBE/ReFMcKc3eGI/AAAAAAAAAQs/MmJbE9UVHe0/s1600-h/IMG_0591.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_TlhwVaDeyBE/ReFMcKc3eGI/AAAAAAAAAQs/MmJbE9UVHe0/s400/IMG_0591.jpg" alt="" id="BLOGGER_PHOTO_ID_5035389905102403682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/ReFMcac3eHI/AAAAAAAAAQ0/dCvKjeW14ak/s1600-h/IMG_0605.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/ReFMcac3eHI/AAAAAAAAAQ0/dCvKjeW14ak/s400/IMG_0605.jpg" alt="" id="BLOGGER_PHOTO_ID_5035389909397370994" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/ReFMPqc3eBI/AAAAAAAAAQE/Rd5GBWZm4y4/s1600-h/IMG_0668.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_TlhwVaDeyBE/ReFMPqc3eBI/AAAAAAAAAQE/Rd5GBWZm4y4/s400/IMG_0668.jpg" alt="" id="BLOGGER_PHOTO_ID_5035389690354038802" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TlhwVaDeyBE/ReFMP6c3eCI/AAAAAAAAAQM/Z9q5MKvEzpU/s1600-h/IMG_0680.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp1.blogger.com/_TlhwVaDeyBE/ReFMP6c3eCI/AAAAAAAAAQM/Z9q5MKvEzpU/s400/IMG_0680.jpg" alt="" id="BLOGGER_PHOTO_ID_5035389694649006114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TlhwVaDeyBE/ReFMP6c3eDI/AAAAAAAAAQU/bYpVi2T3t_Q/s1600-h/IMG_0701.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp1.blogger.com/_TlhwVaDeyBE/ReFMP6c3eDI/AAAAAAAAAQU/bYpVi2T3t_Q/s400/IMG_0701.jpg" alt="" id="BLOGGER_PHOTO_ID_5035389694649006130" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TlhwVaDeyBE/ReFMQKc3eEI/AAAAAAAAAQc/o6GItOkyBoo/s1600-h/IMG_0703.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_TlhwVaDeyBE/ReFMQKc3eEI/AAAAAAAAAQc/o6GItOkyBoo/s400/IMG_0703.jpg" alt="" id="BLOGGER_PHOTO_ID_5035389698943973442" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TlhwVaDeyBE/ReFMQKc3eFI/AAAAAAAAAQk/Gm_kJ2lNMJc/s1600-h/IMG_0760.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_TlhwVaDeyBE/ReFMQKc3eFI/AAAAAAAAAQk/Gm_kJ2lNMJc/s400/IMG_0760.jpg" alt="" id="BLOGGER_PHOTO_ID_5035389698943973458" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/ReFL7ac3d8I/AAAAAAAAAPc/Hh7nz1awkRw/s1600-h/IMG_0765.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/ReFL7ac3d8I/AAAAAAAAAPc/Hh7nz1awkRw/s400/IMG_0765.jpg" alt="" id="BLOGGER_PHOTO_ID_5035389342461687746" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/ReFL7qc3d9I/AAAAAAAAAPk/TRWSRaDnzik/s1600-h/IMG_0783.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_TlhwVaDeyBE/ReFL7qc3d9I/AAAAAAAAAPk/TRWSRaDnzik/s400/IMG_0783.jpg" alt="" id="BLOGGER_PHOTO_ID_5035389346756655058" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/ReFL7qc3d-I/AAAAAAAAAPs/PKAhFWj60Ww/s1600-h/IMG_0822.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_TlhwVaDeyBE/ReFL7qc3d-I/AAAAAAAAAPs/PKAhFWj60Ww/s400/IMG_0822.jpg" alt="" id="BLOGGER_PHOTO_ID_5035389346756655074" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/ReFL7qc3d_I/AAAAAAAAAP0/TTiXHIsVbz0/s1600-h/IMG_0870.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_TlhwVaDeyBE/ReFL7qc3d_I/AAAAAAAAAP0/TTiXHIsVbz0/s400/IMG_0870.jpg" alt="" id="BLOGGER_PHOTO_ID_5035389346756655090" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TlhwVaDeyBE/ReFL76c3eAI/AAAAAAAAAP8/lRAAi7meCsU/s1600-h/IMG_0887.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp1.blogger.com/_TlhwVaDeyBE/ReFL76c3eAI/AAAAAAAAAP8/lRAAi7meCsU/s400/IMG_0887.jpg" alt="" id="BLOGGER_PHOTO_ID_5035389351051622402" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TlhwVaDeyBE/ReFLqKc3d3I/AAAAAAAAAO0/REp9Rbq0Tuo/s1600-h/IMG_0888.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_TlhwVaDeyBE/ReFLqKc3d3I/AAAAAAAAAO0/REp9Rbq0Tuo/s400/IMG_0888.jpg" alt="" id="BLOGGER_PHOTO_ID_5035389046108944242" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TlhwVaDeyBE/ReFLqKc3d4I/AAAAAAAAAO8/iRVaTq_WiRg/s1600-h/IMG_0892.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_TlhwVaDeyBE/ReFLqKc3d4I/AAAAAAAAAO8/iRVaTq_WiRg/s400/IMG_0892.jpg" alt="" id="BLOGGER_PHOTO_ID_5035389046108944258" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TlhwVaDeyBE/ReFLqKc3d5I/AAAAAAAAAPE/L0CLBbS7ouM/s1600-h/IMG_0901.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_TlhwVaDeyBE/ReFLqKc3d5I/AAAAAAAAAPE/L0CLBbS7ouM/s400/IMG_0901.jpg" alt="" id="BLOGGER_PHOTO_ID_5035389046108944274" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/ReFLqac3d6I/AAAAAAAAAPM/5n9hE_TKUpk/s1600-h/IMG_0904.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/ReFLqac3d6I/AAAAAAAAAPM/5n9hE_TKUpk/s400/IMG_0904.jpg" alt="" id="BLOGGER_PHOTO_ID_5035389050403911586" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/ReFLqac3d7I/AAAAAAAAAPU/FTJBl14D9CE/s1600-h/IMG_0924.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/ReFLqac3d7I/AAAAAAAAAPU/FTJBl14D9CE/s400/IMG_0924.jpg" alt="" id="BLOGGER_PHOTO_ID_5035389050403911602" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TlhwVaDeyBE/ReFLXKc3dyI/AAAAAAAAAOM/yorS5Captrg/s1600-h/IMG_0944.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_TlhwVaDeyBE/ReFLXKc3dyI/AAAAAAAAAOM/yorS5Captrg/s400/IMG_0944.jpg" alt="" id="BLOGGER_PHOTO_ID_5035388719691429666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/ReFLXac3dzI/AAAAAAAAAOU/E0smoE_NPik/s1600-h/IMG_0952.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/ReFLXac3dzI/AAAAAAAAAOU/E0smoE_NPik/s400/IMG_0952.jpg" alt="" id="BLOGGER_PHOTO_ID_5035388723986396978" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/ReFLXac3d0I/AAAAAAAAAOc/bEAfD_N4ZOM/s1600-h/IMG_0967.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/ReFLXac3d0I/AAAAAAAAAOc/bEAfD_N4ZOM/s400/IMG_0967.jpg" alt="" id="BLOGGER_PHOTO_ID_5035388723986396994" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TlhwVaDeyBE/ReFLZKc3d1I/AAAAAAAAAOk/eQhkvxq_LBA/s1600-h/IMG_0980.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_TlhwVaDeyBE/ReFLZKc3d1I/AAAAAAAAAOk/eQhkvxq_LBA/s400/IMG_0980.jpg" alt="" id="BLOGGER_PHOTO_ID_5035388754051168082" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/ReFLZac3d2I/AAAAAAAAAOs/PQMDVxXLx-M/s1600-h/IMG_0992.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/ReFLZac3d2I/AAAAAAAAAOs/PQMDVxXLx-M/s400/IMG_0992.jpg" alt="" id="BLOGGER_PHOTO_ID_5035388758346135394" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TlhwVaDeyBE/ReFLA6c3dtI/AAAAAAAAANk/agFf3hUFai8/s1600-h/IMG_0995.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp1.blogger.com/_TlhwVaDeyBE/ReFLA6c3dtI/AAAAAAAAANk/agFf3hUFai8/s400/IMG_0995.jpg" alt="" id="BLOGGER_PHOTO_ID_5035388337439340242" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TlhwVaDeyBE/ReFLA6c3duI/AAAAAAAAANs/LQD8R01ynvY/s1600-h/IMG_1000.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp1.blogger.com/_TlhwVaDeyBE/ReFLA6c3duI/AAAAAAAAANs/LQD8R01ynvY/s400/IMG_1000.jpg" alt="" id="BLOGGER_PHOTO_ID_5035388337439340258" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TlhwVaDeyBE/ReFLBKc3dvI/AAAAAAAAAN0/26GEq_QGoQg/s1600-h/IMG_1005.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_TlhwVaDeyBE/ReFLBKc3dvI/AAAAAAAAAN0/26GEq_QGoQg/s400/IMG_1005.jpg" alt="" id="BLOGGER_PHOTO_ID_5035388341734307570" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TlhwVaDeyBE/ReFLBKc3dwI/AAAAAAAAAN8/n_S_YFpbR_0/s1600-h/IMG_1010.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_TlhwVaDeyBE/ReFLBKc3dwI/AAAAAAAAAN8/n_S_YFpbR_0/s400/IMG_1010.jpg" alt="" id="BLOGGER_PHOTO_ID_5035388341734307586" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/ReFLBac3dxI/AAAAAAAAAOE/nBvwLEUdt9k/s1600-h/IMG_1023.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/ReFLBac3dxI/AAAAAAAAAOE/nBvwLEUdt9k/s400/IMG_1023.jpg" alt="" id="BLOGGER_PHOTO_ID_5035388346029274898" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TlhwVaDeyBE/ReFKt6c3doI/AAAAAAAAAM8/QtI_sxOMMSI/s1600-h/IMG_1062.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp1.blogger.com/_TlhwVaDeyBE/ReFKt6c3doI/AAAAAAAAAM8/QtI_sxOMMSI/s400/IMG_1062.jpg" alt="" id="BLOGGER_PHOTO_ID_5035388011021825666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TlhwVaDeyBE/ReFKt6c3dpI/AAAAAAAAANE/-f_vhWlzWVA/s1600-h/IMG_1064.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp1.blogger.com/_TlhwVaDeyBE/ReFKt6c3dpI/AAAAAAAAANE/-f_vhWlzWVA/s400/IMG_1064.jpg" alt="" id="BLOGGER_PHOTO_ID_5035388011021825682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TlhwVaDeyBE/ReFKuKc3dqI/AAAAAAAAANM/JV6Fv1MHuR8/s1600-h/IMG_1065.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_TlhwVaDeyBE/ReFKuKc3dqI/AAAAAAAAANM/JV6Fv1MHuR8/s400/IMG_1065.jpg" alt="" id="BLOGGER_PHOTO_ID_5035388015316792994" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TlhwVaDeyBE/ReFKuKc3drI/AAAAAAAAANU/AJIg6H-JcDU/s1600-h/IMG_1093.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_TlhwVaDeyBE/ReFKuKc3drI/AAAAAAAAANU/AJIg6H-JcDU/s400/IMG_1093.jpg" alt="" id="BLOGGER_PHOTO_ID_5035388015316793010" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TlhwVaDeyBE/ReFKuKc3dsI/AAAAAAAAANc/900EBzhAhU8/s1600-h/IMG_1097.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_TlhwVaDeyBE/ReFKuKc3dsI/AAAAAAAAANc/900EBzhAhU8/s400/IMG_1097.jpg" alt="" id="BLOGGER_PHOTO_ID_5035388015316793026" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/ReFKTac3djI/AAAAAAAAAJ0/l2SXNumV7kk/s1600-h/IMG_1103.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/ReFKTac3djI/AAAAAAAAAJ0/l2SXNumV7kk/s400/IMG_1103.jpg" alt="" id="BLOGGER_PHOTO_ID_5035387555755292210" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/ReFKTqc3dkI/AAAAAAAAAJ8/9crxV017hAo/s1600-h/IMG_1127.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_TlhwVaDeyBE/ReFKTqc3dkI/AAAAAAAAAJ8/9crxV017hAo/s400/IMG_1127.jpg" alt="" id="BLOGGER_PHOTO_ID_5035387560050259522" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/ReFKTqc3dlI/AAAAAAAAAKE/BeJ1mQ9FDO8/s1600-h/IMG_1154.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_TlhwVaDeyBE/ReFKTqc3dlI/AAAAAAAAAKE/BeJ1mQ9FDO8/s400/IMG_1154.jpg" alt="" id="BLOGGER_PHOTO_ID_5035387560050259538" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/ReFKUac3dmI/AAAAAAAAAKM/Nh1DXtVb_qE/s1600-h/IMG_1184.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/ReFKUac3dmI/AAAAAAAAAKM/Nh1DXtVb_qE/s400/IMG_1184.jpg" alt="" id="BLOGGER_PHOTO_ID_5035387572935161442" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/ReFKUac3dnI/AAAAAAAAAKU/Tu9v4lq_LUA/s1600-h/IMG_1201.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/ReFKUac3dnI/AAAAAAAAAKU/Tu9v4lq_LUA/s400/IMG_1201.jpg" alt="" id="BLOGGER_PHOTO_ID_5035387572935161458" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/ReFKAqc3deI/AAAAAAAAAJM/FYPPQwfoCu8/s1600-h/IMG_1211.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_TlhwVaDeyBE/ReFKAqc3deI/AAAAAAAAAJM/FYPPQwfoCu8/s400/IMG_1211.jpg" alt="" id="BLOGGER_PHOTO_ID_5035387233632744930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TlhwVaDeyBE/ReFKA6c3dfI/AAAAAAAAAJU/C2ueRkb4374/s1600-h/IMG_1217.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp1.blogger.com/_TlhwVaDeyBE/ReFKA6c3dfI/AAAAAAAAAJU/C2ueRkb4374/s400/IMG_1217.jpg" alt="" id="BLOGGER_PHOTO_ID_5035387237927712242" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TlhwVaDeyBE/ReFKA6c3dgI/AAAAAAAAAJc/b9D0a_cUB-E/s1600-h/IMG_1230.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp1.blogger.com/_TlhwVaDeyBE/ReFKA6c3dgI/AAAAAAAAAJc/b9D0a_cUB-E/s400/IMG_1230.jpg" alt="" id="BLOGGER_PHOTO_ID_5035387237927712258" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TlhwVaDeyBE/ReFKA6c3dhI/AAAAAAAAAJk/3ye_Ez4D8Nc/s1600-h/IMG_1260.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp1.blogger.com/_TlhwVaDeyBE/ReFKA6c3dhI/AAAAAAAAAJk/3ye_Ez4D8Nc/s400/IMG_1260.jpg" alt="" id="BLOGGER_PHOTO_ID_5035387237927712274" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TlhwVaDeyBE/ReFKBKc3diI/AAAAAAAAAJs/AmDrIagUF90/s1600-h/IMG_1263.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_TlhwVaDeyBE/ReFKBKc3diI/AAAAAAAAAJs/AmDrIagUF90/s400/IMG_1263.jpg" alt="" id="BLOGGER_PHOTO_ID_5035387242222679586" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/ReFJsqc3dZI/AAAAAAAAAIk/ev8Bu4iFjj4/s1600-h/IMG_1267.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_TlhwVaDeyBE/ReFJsqc3dZI/AAAAAAAAAIk/ev8Bu4iFjj4/s400/IMG_1267.jpg" alt="" id="BLOGGER_PHOTO_ID_5035386890035361170" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/ReFJsqc3daI/AAAAAAAAAIs/f1YHK_AP2Sk/s1600-h/IMG_1277.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_TlhwVaDeyBE/ReFJsqc3daI/AAAAAAAAAIs/f1YHK_AP2Sk/s400/IMG_1277.jpg" alt="" id="BLOGGER_PHOTO_ID_5035386890035361186" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TlhwVaDeyBE/ReFJs6c3dbI/AAAAAAAAAI0/ax4BoQWHO3s/s1600-h/IMG_1287.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp1.blogger.com/_TlhwVaDeyBE/ReFJs6c3dbI/AAAAAAAAAI0/ax4BoQWHO3s/s400/IMG_1287.jpg" alt="" id="BLOGGER_PHOTO_ID_5035386894330328498" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TlhwVaDeyBE/ReFJs6c3dcI/AAAAAAAAAI8/qCM1VFgh-xg/s1600-h/IMG_1308.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp1.blogger.com/_TlhwVaDeyBE/ReFJs6c3dcI/AAAAAAAAAI8/qCM1VFgh-xg/s400/IMG_1308.jpg" alt="" id="BLOGGER_PHOTO_ID_5035386894330328514" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TlhwVaDeyBE/ReFJtKc3ddI/AAAAAAAAAJE/FlHPPE3YezU/s1600-h/IMG_1330.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_TlhwVaDeyBE/ReFJtKc3ddI/AAAAAAAAAJE/FlHPPE3YezU/s400/IMG_1330.jpg" alt="" id="BLOGGER_PHOTO_ID_5035386898625295826" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TlhwVaDeyBE/ReFI06c3dUI/AAAAAAAAAH8/Yg6uEp4DDY8/s1600-h/IMG_1359.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp1.blogger.com/_TlhwVaDeyBE/ReFI06c3dUI/AAAAAAAAAH8/Yg6uEp4DDY8/s400/IMG_1359.jpg" alt="" id="BLOGGER_PHOTO_ID_5035385932257654082" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TlhwVaDeyBE/ReFI1Kc3dVI/AAAAAAAAAIE/62lSOBmCWKk/s1600-h/IMG_1366.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_TlhwVaDeyBE/ReFI1Kc3dVI/AAAAAAAAAIE/62lSOBmCWKk/s400/IMG_1366.jpg" alt="" id="BLOGGER_PHOTO_ID_5035385936552621394" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TlhwVaDeyBE/ReFI1Kc3dWI/AAAAAAAAAIM/dUSIJkPeOZY/s1600-h/IMG_1370.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_TlhwVaDeyBE/ReFI1Kc3dWI/AAAAAAAAAIM/dUSIJkPeOZY/s400/IMG_1370.jpg" alt="" id="BLOGGER_PHOTO_ID_5035385936552621410" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/ReFI1ac3dXI/AAAAAAAAAIU/v47q_m4rl7o/s1600-h/IMG_1397.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/ReFI1ac3dXI/AAAAAAAAAIU/v47q_m4rl7o/s400/IMG_1397.jpg" alt="" id="BLOGGER_PHOTO_ID_5035385940847588722" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/ReFI1ac3dYI/AAAAAAAAAIc/jMzR8T1tSu0/s1600-h/IMG_1403.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/ReFI1ac3dYI/AAAAAAAAAIc/jMzR8T1tSu0/s400/IMG_1403.jpg" alt="" id="BLOGGER_PHOTO_ID_5035385940847588738" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TlhwVaDeyBE/ReFIbKc3dPI/AAAAAAAAAHU/WQefyu5epOw/s1600-h/IMG_1407.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_TlhwVaDeyBE/ReFIbKc3dPI/AAAAAAAAAHU/WQefyu5epOw/s400/IMG_1407.jpg" alt="" id="BLOGGER_PHOTO_ID_5035385489876022514" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/ReFIbac3dQI/AAAAAAAAAHc/fODMGgVodhw/s1600-h/IMG_1410.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/ReFIbac3dQI/AAAAAAAAAHc/fODMGgVodhw/s400/IMG_1410.jpg" alt="" id="BLOGGER_PHOTO_ID_5035385494170989826" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/ReFIbac3dRI/AAAAAAAAAHk/k4T4zG1BzgY/s1600-h/IMG_1416.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/ReFIbac3dRI/AAAAAAAAAHk/k4T4zG1BzgY/s400/IMG_1416.JPG" alt="" id="BLOGGER_PHOTO_ID_5035385494170989842" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/ReFIbqc3dSI/AAAAAAAAAHs/yY9xuaUiFWw/s1600-h/IMG_1417.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_TlhwVaDeyBE/ReFIbqc3dSI/AAAAAAAAAHs/yY9xuaUiFWw/s400/IMG_1417.JPG" alt="" id="BLOGGER_PHOTO_ID_5035385498465957154" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/ReFIbqc3dTI/AAAAAAAAAH0/Ej3-4d3iGas/s1600-h/IMG_1419.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_TlhwVaDeyBE/ReFIbqc3dTI/AAAAAAAAAH0/Ej3-4d3iGas/s400/IMG_1419.JPG" alt="" id="BLOGGER_PHOTO_ID_5035385498465957170" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TlhwVaDeyBE/ReFIBKc3dKI/AAAAAAAAAGs/jKGCe4o9oKA/s1600-h/IMG_1421.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_TlhwVaDeyBE/ReFIBKc3dKI/AAAAAAAAAGs/jKGCe4o9oKA/s400/IMG_1421.JPG" alt="" id="BLOGGER_PHOTO_ID_5035385043199423650" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/ReFIBac3dLI/AAAAAAAAAG0/JBZhj3xrNGg/s1600-h/IMG_1436.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/ReFIBac3dLI/AAAAAAAAAG0/JBZhj3xrNGg/s400/IMG_1436.JPG" alt="" id="BLOGGER_PHOTO_ID_5035385047494390962" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/ReFIBac3dMI/AAAAAAAAAG8/UcDQDjjcK_k/s1600-h/IMG_1440.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/ReFIBac3dMI/AAAAAAAAAG8/UcDQDjjcK_k/s400/IMG_1440.JPG" alt="" id="BLOGGER_PHOTO_ID_5035385047494390978" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/ReFIBac3dNI/AAAAAAAAAHE/IWkH7j91hnQ/s1600-h/IMG_1457.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/ReFIBac3dNI/AAAAAAAAAHE/IWkH7j91hnQ/s400/IMG_1457.JPG" alt="" id="BLOGGER_PHOTO_ID_5035385047494390994" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/ReFIBqc3dOI/AAAAAAAAAHM/5PJN643tL_M/s1600-h/IMG_1651.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_TlhwVaDeyBE/ReFIBqc3dOI/AAAAAAAAAHM/5PJN643tL_M/s400/IMG_1651.JPG" alt="" id="BLOGGER_PHOTO_ID_5035385051789358306" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/ReFHkac3dFI/AAAAAAAAAGE/QPNBCe5Mmlk/s1600-h/IMG_1653.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/ReFHkac3dFI/AAAAAAAAAGE/QPNBCe5Mmlk/s400/IMG_1653.JPG" alt="" id="BLOGGER_PHOTO_ID_5035384549278184530" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/ReFHkqc3dGI/AAAAAAAAAGM/1okS_XdGELg/s1600-h/IMG_1660.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_TlhwVaDeyBE/ReFHkqc3dGI/AAAAAAAAAGM/1okS_XdGELg/s400/IMG_1660.JPG" alt="" id="BLOGGER_PHOTO_ID_5035384553573151842" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/ReFHkqc3dHI/AAAAAAAAAGU/5x5dJj4-Kto/s1600-h/IMG_1662.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_TlhwVaDeyBE/ReFHkqc3dHI/AAAAAAAAAGU/5x5dJj4-Kto/s400/IMG_1662.JPG" alt="" id="BLOGGER_PHOTO_ID_5035384553573151858" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TlhwVaDeyBE/ReFHk6c3dII/AAAAAAAAAGc/jdJPLPh5R50/s1600-h/IMG_1664.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp1.blogger.com/_TlhwVaDeyBE/ReFHk6c3dII/AAAAAAAAAGc/jdJPLPh5R50/s400/IMG_1664.JPG" alt="" id="BLOGGER_PHOTO_ID_5035384557868119170" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TlhwVaDeyBE/ReFHk6c3dJI/AAAAAAAAAGk/BQKR39YVz8Q/s1600-h/IMG_1670.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp1.blogger.com/_TlhwVaDeyBE/ReFHk6c3dJI/AAAAAAAAAGk/BQKR39YVz8Q/s400/IMG_1670.JPG" alt="" id="BLOGGER_PHOTO_ID_5035384557868119186" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TlhwVaDeyBE/ReFHOKc3dAI/AAAAAAAAAFc/7o7sJMAmnAU/s1600-h/IMG_1674.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_TlhwVaDeyBE/ReFHOKc3dAI/AAAAAAAAAFc/7o7sJMAmnAU/s400/IMG_1674.JPG" alt="" id="BLOGGER_PHOTO_ID_5035384167026095106" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/ReFHOac3dBI/AAAAAAAAAFk/36BQnxdOhEI/s1600-h/IMG_1694.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/ReFHOac3dBI/AAAAAAAAAFk/36BQnxdOhEI/s400/IMG_1694.JPG" alt="" id="BLOGGER_PHOTO_ID_5035384171321062418" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/ReFHOac3dCI/AAAAAAAAAFs/wOVVYerfygs/s1600-h/IMG_1708.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/ReFHOac3dCI/AAAAAAAAAFs/wOVVYerfygs/s400/IMG_1708.JPG" alt="" id="BLOGGER_PHOTO_ID_5035384171321062434" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/ReFHOqc3dDI/AAAAAAAAAF0/MjdSUsxKlTw/s1600-h/IMG_1713.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_TlhwVaDeyBE/ReFHOqc3dDI/AAAAAAAAAF0/MjdSUsxKlTw/s400/IMG_1713.JPG" alt="" id="BLOGGER_PHOTO_ID_5035384175616029746" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/ReFHOqc3dEI/AAAAAAAAAF8/WF7YfYo4GJU/s1600-h/IMG_1758.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_TlhwVaDeyBE/ReFHOqc3dEI/AAAAAAAAAF8/WF7YfYo4GJU/s400/IMG_1758.JPG" alt="" id="BLOGGER_PHOTO_ID_5035384175616029762" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-5083636459542152540?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/5083636459542152540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=5083636459542152540' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/5083636459542152540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/5083636459542152540'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2007/02/holiday-2007-provence-cote-dazure-in.html' title='Holiday 2007 - Provence &amp; Cote D&apos;Azure in the South of France'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_TlhwVaDeyBE/ReFMcKc3eGI/AAAAAAAAAQs/MmJbE9UVHe0/s72-c/IMG_0591.jpg' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-6736361704697996873</id><published>2007-02-25T17:26:00.000+11:00</published><updated>2007-02-25T21:01:09.737+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><category scheme='http://www.blogger.com/atom/ns#' term='Travel'/><title type='text'>Holiday 2007 - South Korea</title><content type='html'>South Korea is a great place to visit. People tend to be very friendly, the alphabet is &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;phonetic&lt;/span&gt;, food is good and everything is excitingly foreign! Don't forget your phrase book though.. English is not widely spoken. This was my 3rd trip to Korea, and it was an opportunity to catch up with &lt;a href="http://ohsoosun.blogspot.com/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Soosun&lt;/span&gt;&lt;/a&gt;'s relatives, improve my pitiful Korean and see some interesting areas.&lt;br /&gt;&lt;br /&gt;Should you happen to go to Korea with a partner, I would recommend staying in 'motels'. They are around 30,000-40,000 WON in most places per night, are conveniently located near transport and generally have nice rooms. Despite their reputation as love hotels, they are often more &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;comfortable&lt;/span&gt; and cheaper than other alternatives. Don't be surprised, however, if they don't ask for your name, and require payment in cash!&lt;br /&gt;&lt;br /&gt;Also, visiting the local &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;jim&lt;/span&gt;-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;jil&lt;/span&gt;-bung (sauna) is an experience not to miss. They are generally open 24h and provide showers, sauna rooms, hot and cold pools, massage and general sleeping and relaxing areas, as well as funny coloured clothes to wear while you are there :-)&lt;br /&gt;&lt;br /&gt;Some of the fun stuff I did this trip was catching up with friends and relatives, walking around fortresses, going to a hot spring spa, doing a little caving, taking in some amazing scenery and going skiing.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TlhwVaDeyBE/ReE1v6c3cwI/AAAAAAAAACc/ySWUuZVq81k/s1600-h/IMG_0204.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp1.blogger.com/_TlhwVaDeyBE/ReE1v6c3cwI/AAAAAAAAACc/ySWUuZVq81k/s400/IMG_0204.JPG" alt="" id="BLOGGER_PHOTO_ID_5035364955637379842" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TlhwVaDeyBE/ReE2KKc3cxI/AAAAAAAAACk/6BYoJtYLzt4/s1600-h/IMG_0220.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_TlhwVaDeyBE/ReE2KKc3cxI/AAAAAAAAACk/6BYoJtYLzt4/s400/IMG_0220.JPG" alt="" id="BLOGGER_PHOTO_ID_5035365406608945938" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/ReE2Kac3cyI/AAAAAAAAACs/2zhtOCT1c2Y/s1600-h/IMG_0249.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/ReE2Kac3cyI/AAAAAAAAACs/2zhtOCT1c2Y/s400/IMG_0249.JPG" alt="" id="BLOGGER_PHOTO_ID_5035365410903913250" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/ReE2Kqc3czI/AAAAAAAAAC0/PI3lS2ww9lI/s1600-h/IMG_0253.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_TlhwVaDeyBE/ReE2Kqc3czI/AAAAAAAAAC0/PI3lS2ww9lI/s400/IMG_0253.JPG" alt="" id="BLOGGER_PHOTO_ID_5035365415198880562" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/ReE2Kqc3c0I/AAAAAAAAAC8/NqM1NheQp_0/s1600-h/IMG_0296.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_TlhwVaDeyBE/ReE2Kqc3c0I/AAAAAAAAAC8/NqM1NheQp_0/s400/IMG_0296.JPG" alt="" id="BLOGGER_PHOTO_ID_5035365415198880578" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TlhwVaDeyBE/ReE2K6c3c1I/AAAAAAAAADE/1vhnY-VOD28/s1600-h/IMG_0299.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp1.blogger.com/_TlhwVaDeyBE/ReE2K6c3c1I/AAAAAAAAADE/1vhnY-VOD28/s400/IMG_0299.JPG" alt="" id="BLOGGER_PHOTO_ID_5035365419493847890" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TlhwVaDeyBE/ReE2tKc3c2I/AAAAAAAAADM/4kXYyfuJ214/s1600-h/IMG_0305.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_TlhwVaDeyBE/ReE2tKc3c2I/AAAAAAAAADM/4kXYyfuJ214/s400/IMG_0305.JPG" alt="" id="BLOGGER_PHOTO_ID_5035366007904367458" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/ReE2tac3c3I/AAAAAAAAADU/dN_pZclMc28/s1600-h/IMG_0308.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/ReE2tac3c3I/AAAAAAAAADU/dN_pZclMc28/s400/IMG_0308.JPG" alt="" id="BLOGGER_PHOTO_ID_5035366012199334770" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/ReE2tac3c4I/AAAAAAAAADc/sI6YJLsPX8o/s1600-h/IMG_0349.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/ReE2tac3c4I/AAAAAAAAADc/sI6YJLsPX8o/s400/IMG_0349.JPG" alt="" id="BLOGGER_PHOTO_ID_5035366012199334786" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/ReE2tqc3c5I/AAAAAAAAADk/8ooJWVmPyaw/s1600-h/IMG_0357.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_TlhwVaDeyBE/ReE2tqc3c5I/AAAAAAAAADk/8ooJWVmPyaw/s400/IMG_0357.JPG" alt="" id="BLOGGER_PHOTO_ID_5035366016494302098" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/ReE2tqc3c6I/AAAAAAAAADs/Khxq3PMsW7U/s1600-h/IMG_0385.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_TlhwVaDeyBE/ReE2tqc3c6I/AAAAAAAAADs/Khxq3PMsW7U/s400/IMG_0385.JPG" alt="" id="BLOGGER_PHOTO_ID_5035366016494302114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/ReE3Cqc3c7I/AAAAAAAAAD0/dmFDP-5m6CY/s1600-h/IMG_0508.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_TlhwVaDeyBE/ReE3Cqc3c7I/AAAAAAAAAD0/dmFDP-5m6CY/s400/IMG_0508.JPG" alt="" id="BLOGGER_PHOTO_ID_5035366377271554994" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TlhwVaDeyBE/ReE3C6c3c8I/AAAAAAAAAD8/ympLJkc6bj8/s1600-h/IMG_0512.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp1.blogger.com/_TlhwVaDeyBE/ReE3C6c3c8I/AAAAAAAAAD8/ympLJkc6bj8/s400/IMG_0512.JPG" alt="" id="BLOGGER_PHOTO_ID_5035366381566522306" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TlhwVaDeyBE/ReE3C6c3c9I/AAAAAAAAAEE/lCnf7qN0nUI/s1600-h/IMG_0519.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp1.blogger.com/_TlhwVaDeyBE/ReE3C6c3c9I/AAAAAAAAAEE/lCnf7qN0nUI/s400/IMG_0519.JPG" alt="" id="BLOGGER_PHOTO_ID_5035366381566522322" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TlhwVaDeyBE/ReE3DKc3c-I/AAAAAAAAAEM/cF20dH6ZYgs/s1600-h/IMG_0528.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_TlhwVaDeyBE/ReE3DKc3c-I/AAAAAAAAAEM/cF20dH6ZYgs/s400/IMG_0528.JPG" alt="" id="BLOGGER_PHOTO_ID_5035366385861489634" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TlhwVaDeyBE/ReE3DKc3c_I/AAAAAAAAAEU/XKznhHlZ7dE/s1600-h/IMG_0547.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_TlhwVaDeyBE/ReE3DKc3c_I/AAAAAAAAAEU/XKznhHlZ7dE/s400/IMG_0547.JPG" alt="" id="BLOGGER_PHOTO_ID_5035366385861489650" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-6736361704697996873?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/6736361704697996873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=6736361704697996873' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/6736361704697996873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/6736361704697996873'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2007/02/holiday-2007-south-korea.html' title='Holiday 2007 - South Korea'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_TlhwVaDeyBE/ReE1v6c3cwI/AAAAAAAAACc/ySWUuZVq81k/s72-c/IMG_0204.JPG' height='72' width='72'/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-3776873591204861313</id><published>2007-02-25T16:50:00.000+11:00</published><updated>2007-02-25T17:26:08.806+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><category scheme='http://www.blogger.com/atom/ns#' term='Travel'/><title type='text'>Back from Holidays</title><content type='html'>Back to Sydney after a very enjoyable holiday! &lt;a href="http://ohsoosun.blogspot.com"&gt;Soosun &lt;/a&gt;and I were away for a bit over a month, and spent time in South Korea, France (Provence, Cote D'Azure), Monaco and Italy (Venice and Padua). The next few posts are going to give a little taste of these places  :-)&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-3776873591204861313?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/3776873591204861313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=3776873591204861313' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/3776873591204861313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/3776873591204861313'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2007/02/back-from-holidays.html' title='Back from Holidays'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-3995398001290353553</id><published>2007-01-14T10:13:00.000+11:00</published><updated>2007-01-14T18:22:43.810+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><title type='text'>My Sister's Indian (Red) Wedding</title><content type='html'>Yesterday was Mia's second wedding. This one was a Hindu, Fiji-Indian, red wedding and quite different to the first, although it had some similarities in terms of having vows and speeches (and yes, the same husband!). The red wedding included a lot of reading by the Pundit (the Hindu minister) in Sanskrit, many prayers with rice and petals held in hands, and various things put in a mango-wood fire. There were also various prayers with coloured powders, stuff to put on the forehead, water, gee, milk and bananas in front of statuettes. Male members of the bride and groom families wore turbans. Food was all vegetarian, but nice, and alcohol was forbidden. We danced a little at the end of the night. All in all, it was a lot of fun :-)&lt;br /&gt;&lt;br /&gt;As the brother of the bride, I had quite a lot to do in terms of prayers and ceremonies. On the Tuesday before, the Pundit visited my place to bless a bundle of clothes and other things for Neeraj (Mia's husband) with water and a banana leaf. We then went to the Neeraj residence where we did a ceremony for about an hour, with all the ingredients mentioned above. Before the wedding, I was also responsible for making some popped rice - similar to popcorn but made from rice in the husk. I needed to give this to Neeraj and Mia several times from a yellow cloth sling the Pundit wrapped around me during the wedding, as the couple walked around the fire 9 times. Also there were various points where I needed to pour water for foot washing and similar.&lt;br /&gt;&lt;br /&gt;To give you more of an idea, here's some pictures!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/RanaKOdppmI/AAAAAAAAACQ/yN6MNlLrmB0/s1600-h/IMG_3924.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_TlhwVaDeyBE/RanaKOdppmI/AAAAAAAAACQ/yN6MNlLrmB0/s400/IMG_3924.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5019783128897136226" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/RalupOdpplI/AAAAAAAAABs/MMvJxphF6vA/s1600-h/IMG_0123.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_TlhwVaDeyBE/RalupOdpplI/AAAAAAAAABs/MMvJxphF6vA/s400/IMG_0123.JPG" alt="" id="BLOGGER_PHOTO_ID_5019664914217281106" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/Ralug-dppkI/AAAAAAAAABk/yUjRZhbXvhc/s1600-h/IMG_0127.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/Ralug-dppkI/AAAAAAAAABk/yUjRZhbXvhc/s400/IMG_0127.JPG" alt="" id="BLOGGER_PHOTO_ID_5019664772483360322" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/RaluZ-dppjI/AAAAAAAAABc/q9GKtTU4Xq4/s1600-h/IMG_0129.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/RaluZ-dppjI/AAAAAAAAABc/q9GKtTU4Xq4/s400/IMG_0129.JPG" alt="" id="BLOGGER_PHOTO_ID_5019664652224276018" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TlhwVaDeyBE/RaluRedppiI/AAAAAAAAABU/TPLavYlr870/s1600-h/IMG_0134.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp1.blogger.com/_TlhwVaDeyBE/RaluRedppiI/AAAAAAAAABU/TPLavYlr870/s400/IMG_0134.JPG" alt="" id="BLOGGER_PHOTO_ID_5019664506195387938" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TlhwVaDeyBE/RaluHudpphI/AAAAAAAAABM/NeX-jEW2-IQ/s1600-h/IMG_0138.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_TlhwVaDeyBE/RaluHudpphI/AAAAAAAAABM/NeX-jEW2-IQ/s400/IMG_0138.JPG" alt="" id="BLOGGER_PHOTO_ID_5019664338691663378" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/Ralt_OdppgI/AAAAAAAAABE/AOKg42BFaWs/s1600-h/IMG_0144.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_TlhwVaDeyBE/Ralt_OdppgI/AAAAAAAAABE/AOKg42BFaWs/s400/IMG_0144.JPG" alt="" id="BLOGGER_PHOTO_ID_5019664192662775298" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/Raltw-dppfI/AAAAAAAAAA8/07qYLu5R9fM/s1600-h/IMG_0160.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/Raltw-dppfI/AAAAAAAAAA8/07qYLu5R9fM/s400/IMG_0160.JPG" alt="" id="BLOGGER_PHOTO_ID_5019663947849639410" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-3995398001290353553?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/3995398001290353553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=3995398001290353553' title='19 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/3995398001290353553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/3995398001290353553'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2007/01/my-sisters-indian-red-wedding.html' title='My Sister&apos;s Indian (Red) Wedding'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_TlhwVaDeyBE/RanaKOdppmI/AAAAAAAAACQ/yN6MNlLrmB0/s72-c/IMG_3924.jpg' height='72' width='72'/><thr:total>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-8556356865429666691</id><published>2007-01-12T11:51:00.000+11:00</published><updated>2007-02-25T22:59:39.651+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>AntiPattern: BusinessObjects in the driving seat</title><content type='html'>When you have a rich domain model with a business object centric design, and a Windows forms GUI, it can be very tempting to start putting significant process logic in the business objects. After continuing along this path a little further, you may realise that the process needs some sort of user input, and you use events or some sort of notifier pattern to gain user input required by the process, while still maintaining layering in terms of referencing. Then additionally you may need to access some sort of external service.&lt;br /&gt;&lt;br /&gt;Here is an example:&lt;pre&gt;class Order : BusinessObject&lt;br /&gt;{&lt;br /&gt; public void SendOrder(INotifier notifier)&lt;br /&gt; {&lt;br /&gt;   if (ReadyForDelivery ||&lt;br /&gt;       Confirm("Are you sure you want to send order lines?"&lt;br /&gt;             + " They are not ready for delivery."))&lt;br /&gt;   {&lt;br /&gt;     OrderLine[] orders = GetLinesToSend();&lt;br /&gt;     foreach(OrderLine line in Lines)&lt;br /&gt;     {&lt;br /&gt;       SendLine(line); // send line using a web service?&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     Notify("Lines sent successfully.");&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;interface INotifier&lt;br /&gt;{&lt;br /&gt; void Notify(string msg);&lt;br /&gt; bool Confirm(string msg);&lt;br /&gt; OrderLine[] GetLinesToSend();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;I would like to suggest that this is an anti-pattern and a trap. Although there is no direct reference from the Business Layer to the GUI layer (INotifier is implemented in GUI and passed down), the Business Layer now requires the ability to stay instantiated, pause while waiting for responses from the notifier, and then continue execution. This will work for rich client applications, but not in a stateless web environment. The ideal of being able to swap in/out the GUI layers on top of the Business layer is now compromised.&lt;br /&gt;&lt;br /&gt;Instead, it would be possible to drive form the GUI layer, and call a service to send the Order Lines. In pseudo code below:&lt;pre&gt;void SendMenu_Click(...)&lt;br /&gt;{&lt;br /&gt; if (Order.ReadyForDelivery ||&lt;br /&gt;     MessageBox.Show(...) == DialogResult.Yes)&lt;br /&gt; {&lt;br /&gt;   using (ChooseLineForm chooseLineForm =&lt;br /&gt;            new ChooseLineForm(Order))&lt;br /&gt;   {&lt;br /&gt;     chooseLineForm.ShowDialog()&lt;br /&gt;   }&lt;br /&gt;   SendingSevice.SendLines(chooseLineForm.selectedLines);&lt;br /&gt;   ...&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;If the logic in the GUI layer became much more complex, it may be a good idea to pull it out into its own class (eg, LineSender). This class would be a type of GUI level controller, responsible for orchestrating the send process.&lt;br /&gt;&lt;br /&gt;Using this approach, there are a number of benefits:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;BusinessObjects have no reliance on GUI implementation, so can be used for Rich Client and Web Client indiscriminately.&lt;/li&gt;&lt;li&gt;Web developers are free to implement the user input process in stateless way more appropriate to their platform.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Functionality for sending Order lines (some sort of integration with a web service?) is pulled out into a service class which can be reused elsewhere (potentially sending other types of objects?) and unclutters the Order business object and removes its dependency  on  an external service.&lt;/li&gt;&lt;li&gt;Code is simpler and easier to follow.&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/28462179-8556356865429666691?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/8556356865429666691/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=8556356865429666691' title='32 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/8556356865429666691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/8556356865429666691'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2007/01/antipattern-businessobjects-in-driving.html' title='AntiPattern: BusinessObjects in the driving seat'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>32</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-5346095401238900960</id><published>2007-01-11T09:56:00.000+11:00</published><updated>2007-01-11T09:59:32.191+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>In Defense of Simplicity AND Complexity</title><content type='html'>&lt;a href="http://www.scottberkun.com/blog/?p=502"&gt;Simplicity&lt;/a&gt; and &lt;a href="http://www.joelonsoftware.com/items/2006/12/09.html"&gt;complexity&lt;/a&gt; seem to have become hot topics for some of my favourite technical bloggers of late. These fine people have taken the view that things should be either simple or complex. Right, seems logical, these are opposites. However, I would like to suggest that in a well designed appliance which addresses a complex process, it should have both a simple AND a complex interface.&lt;br /&gt;&lt;br /&gt;A couple of years ago, I bought a LG "Fuzzy Logic" washing machine. It has lots of buttons and settings on the front and one big button that says something like "Start". 97% of the time, I throw in my washing, some detergent and press the big start button, and the washing machine works out all the settings, displays them and then starts. In the 3% of the time when I want to do something different (eg, just a rinse), I use the more complex part of the interface to change the 'cycle' settings.&lt;br /&gt;&lt;br /&gt;Recently, I bought an IXUS 65. It's a lovely digital camera, and it provides both a complex and a simple interface. As soon as I put in the battery, I was able to take pretty nice pictures by just clicking the big button on the top. No problem, I was very happy. Over the next few days, I glanced through the manual and fiddled with more complex settings for ISO, colour etc. However, in 95% of shots, I simply want to click the one big button that takes a nice auto-everything picture. It's only occasionally that I want to change the settings to achieve a particular effect or to override a mistake in the auto settings.&lt;br /&gt;&lt;br /&gt;To conclude, I think that my talented fellow bloggers are all right. People like complex interfaces and simple interfaces, just at different times, for different tasks. The best gadgets and appliances offer both.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-5346095401238900960?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/5346095401238900960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=5346095401238900960' title='34 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/5346095401238900960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/5346095401238900960'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2007/01/in-defense-of-simplicity-and-complexity.html' title='In Defense of Simplicity AND Complexity'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>34</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-1137624519546198624</id><published>2007-01-06T13:27:00.000+11:00</published><updated>2007-01-06T13:34:01.552+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Music'/><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><title type='text'>Pandora - Streaming music</title><content type='html'>I'd like to point my readers to &lt;a href="http://www.pandora.com"&gt;Pandora&lt;/a&gt;, a streaming music service which lets you define multiple channels for the different types of music that you like. You start each channel with a seed, which is a song or &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;artist&lt;/span&gt; that you like. The service &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-corrected" id="SPELLING_ERROR_1"&gt;chooses&lt;/span&gt; songs similar to this and you then mark them as thumbs up or thumbs down, thus refining the channel more towards your musical taste. It is Flash and browser based, no downloads necessary. Sign up is easy, and the service is free, though add supported. Highly recommended!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-1137624519546198624?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/1137624519546198624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=1137624519546198624' title='28 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/1137624519546198624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/1137624519546198624'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2007/01/pandora-streaming-music.html' title='Pandora - Streaming music'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>28</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-7310415970656134968</id><published>2007-01-06T12:20:00.000+11:00</published><updated>2007-02-21T13:07:55.745+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Soft Skills and Mind Hacks'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Reviews'/><title type='text'>How to Win Friends and Influence People</title><content type='html'>"How to Win Friends and Influence People" by Dale Carnegie is a very interesting and practical book. Of the personal/professional development books that I have read, this one is probably the most valuable.&lt;br /&gt;&lt;br /&gt;Carnegie summaries each chapter in one sentence as a "principle". Here they are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Don't criticise, condemn or complain.&lt;/li&gt;&lt;li&gt;Give honest and sincere appreciation.&lt;/li&gt;&lt;li&gt;Arouse in the other person an eager want.&lt;/li&gt;&lt;li&gt;Become genuinely interested in other people.&lt;/li&gt;&lt;li&gt;Smile.&lt;/li&gt;&lt;li&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;Remember&lt;/span&gt; that a person's name is to that person the sweetest and most important sound in any language.&lt;/li&gt;&lt;li&gt;Be a good listener. Encourage others to talk about themselves.&lt;/li&gt;&lt;li&gt;Talk in terms of the other person's interests.&lt;/li&gt;&lt;li&gt;Make the other person feel important - and do it sincerely.&lt;/li&gt;&lt;li&gt;The only way to get the best of an argument is to avoid it.&lt;/li&gt;&lt;li&gt;Show respect for the other person's opinions. Never say, "You're wrong.".&lt;/li&gt;&lt;li&gt;If you are wrong, admit it quickly and emphatically.&lt;/li&gt;&lt;li&gt;Begin in a friendly way.&lt;/li&gt;&lt;li&gt;Get the other person saying "yes, yes" immediately.&lt;/li&gt;&lt;li&gt;Let the other person do a great deal of the talking.&lt;/li&gt;&lt;li&gt;Let the other person feel that the idea is his or hers.&lt;/li&gt;&lt;li&gt;Try honestly to see things from the other person's point of view.&lt;/li&gt;&lt;li&gt;Be sympathetic with the other person's ideas and desires.&lt;/li&gt;&lt;li&gt;Appeal to the nobler motives.&lt;/li&gt;&lt;li&gt;Dramatise your ideas.&lt;/li&gt;&lt;li&gt;Throw down a challenge.&lt;/li&gt;&lt;li&gt;Begin with praise and honest appreciation.&lt;/li&gt;&lt;li&gt;Call attention to people's mistakes indirectly.&lt;/li&gt;&lt;li&gt;Talk about your own mistakes before criticising the other person.&lt;/li&gt;&lt;li&gt;Ask questions instead of giving direct orders.&lt;/li&gt;&lt;li&gt;Let the other person save face.&lt;/li&gt;&lt;li&gt;Praise the slightest improvement and praise every improvement. Be "hearty in your approbation and lavish in your praise."&lt;/li&gt;&lt;li&gt;Give the other person a fine reputation to live up to.&lt;/li&gt;&lt;li&gt;Use encouragement. Make the fault seem easy to correct.&lt;/li&gt;&lt;li&gt;Make the other person happy about doing the thing you suggest.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Although these points give a bit of an idea what &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Cargnegie&lt;/span&gt; is advocating, I'd highly recommend reading the book. Each chapter is filled with stories - they are the valuable part as they provide  examples of speeches, letters and conversations.&lt;br /&gt;&lt;br /&gt;People have criticised the book as coldly manipulative. From reading the table of contents and the title of the book, I would be inclined to agree. Personally, from the content of chapters themselves, I find that a different story emerges. My reading is that Carnegie suggests that most people are fundamentally nice, and if they enjoy your company and you make them feel good they will reciprocate by looking out for your interests. &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;Similarly&lt;/span&gt;, people will feel guilty if they are in the wrong, and will resolve their mistakes, as long as they are not angry from hurt pride or similar. Carnegie paints people as highly emotional beings, driven by pride and ego, but with huge untapped potential and happy to help others.&lt;br /&gt;&lt;br /&gt;If I had to choose the 3 most important points from the book, I'd say:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;People desire a sense of importance. Anyone will be pleased to have their opinion sought, talk about something of interest to them or have their achievements recognised and praised.&lt;/li&gt;&lt;li&gt;Use a light and indirect touch when trying to change people. Rather than &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-corrected" id="SPELLING_ERROR_3"&gt;criticising&lt;/span&gt; directly, explain a how you made a similar mistake in the past and the consequences, or give the person a good reputation to live up to.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;When you make a mistake, don't hide it or argue. Instead, admit it straight out and blame yourself in the strongest terms.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I borrowed the book from the library, but am planning to buy my very own copy. It is worth having on the bookshelf and re-reading.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-7310415970656134968?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/7310415970656134968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=7310415970656134968' title='23 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/7310415970656134968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/7310415970656134968'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2007/01/how-to-win-friends-and-influence-people.html' title='How to Win Friends and Influence People'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>23</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-6634792207500587058</id><published>2006-12-28T12:45:00.000+11:00</published><updated>2006-12-28T13:20:35.165+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Windows Crash: multiple_irp_complete_requests Stop: 0x00000044</title><content type='html'>Thought I'd do a bit of a &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;defrag&lt;/span&gt; on my old Windows 2000 box. A few minutes in, I got a blue screen:&lt;br /&gt;&lt;br /&gt;multiple_&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;irp&lt;/span&gt;_complete_requests&lt;br /&gt;stop: 0x00000044 (0x852&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;CCE&lt;/span&gt;68, 0x00000D39, 0x00000000, 0x00000000)&lt;br /&gt;&lt;br /&gt;Tried a &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;chkdsk&lt;/span&gt; but got the same error, even when running it on boot in console mode.&lt;br /&gt;&lt;br /&gt;After some web trawling, found this &lt;a href="http://answers.google.com/answers/threadview?id=552945"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;google&lt;/span&gt; answer&lt;/a&gt;, which suggested that the problem was caused by 'Intel Application Accelerator' conflicting with recent service packs.&lt;br /&gt;&lt;br /&gt;After &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;uninstalling&lt;/span&gt; the 'Intel Application Accelerator' my &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;chkdsk&lt;/span&gt; finished successfully and &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;defrag&lt;/span&gt; seems to be going fine.&lt;br /&gt;&lt;br /&gt;Thank goodness for the &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;internet&lt;/span&gt; and its wealth of technical solutions!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-6634792207500587058?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/6634792207500587058/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=6634792207500587058' title='52 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/6634792207500587058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/6634792207500587058'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2006/12/windows-crash-multipleirpcompletereques.html' title='Windows Crash: multiple_irp_complete_requests Stop: 0x00000044'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>52</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-256537071253806671</id><published>2006-12-26T17:03:00.000+11:00</published><updated>2006-12-26T17:45:20.058+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><category scheme='http://www.blogger.com/atom/ns#' term='ThoughtWorks'/><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><category scheme='http://www.blogger.com/atom/ns#' term='EDI'/><title type='text'>Bye Bye EDI... Hello ThoughtWorks</title><content type='html'>Well, after almost four years at &lt;a href="http://www.edi.com.au/"&gt;EDI&lt;/a&gt; (now called &lt;a href="http://www.cargowise.com/"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;CargoWise&lt;/span&gt; &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;edi&lt;/span&gt;&lt;/a&gt;) I am leaving. I finish in the middle of January next year. It has been an interesting time, and I have learnt a lot working with very talented people and from building the framework for a &lt;a href="http://www.cargowise.com/solutions/enterprise-overview.shtml"&gt;big solution suite&lt;/a&gt; (around 4 million lines of C# code). I've also had the opportunity to experience the very different joys and pitfalls of product management.&lt;br /&gt;&lt;br /&gt;I will be starting at &lt;a href="http://www.thoughtworks.com/"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;ThoughtWorks&lt;/span&gt;&lt;/a&gt; (of &lt;a href="http://nunit.org/"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;NUnit&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://jim.webber.name/"&gt;Jim Webber&lt;/a&gt; and &lt;a href="http://www.martinfowler.com/"&gt;Martin Fowler&lt;/a&gt; fame) in the middle of February in the new year. I'm expecting that there will be a lot of new exciting stuff to learn, and a lot of variety in terms of clients and technologies.  &lt;a href="http://www.thoughtworks.com/"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;ThoughtWorks&lt;/span&gt;&lt;/a&gt; are strongly &lt;a href="http://en.wikipedia.org/wiki/Extreme_Programming"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;XP&lt;/span&gt;&lt;/a&gt;, do a lot of development on client sites and even have some &lt;a href="http://www.rubyonrails.org/"&gt;Rails&lt;/a&gt; projects. The people I have met from &lt;a href="http://www.thoughtworks.com/"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;ThoughtWorks&lt;/span&gt;&lt;/a&gt; have all been very friendly and I look &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-corrected" id="SPELLING_ERROR_7"&gt;forward&lt;/span&gt; to starting there soon :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-256537071253806671?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/256537071253806671/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=256537071253806671' title='39 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/256537071253806671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/256537071253806671'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2006/12/bye-bye-edi-hello-thoughtworks.html' title='Bye Bye EDI... Hello ThoughtWorks'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>39</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-3014995455785588896</id><published>2006-12-24T10:18:00.001+11:00</published><updated>2006-12-24T10:48:35.298+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><title type='text'>Our Christmas Party '06</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TlhwVaDeyBE/RY28XUGIbHI/AAAAAAAAAAU/7UGUsJteUCQ/s1600-h/xmas2.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_TlhwVaDeyBE/RY28XUGIbHI/AAAAAAAAAAU/7UGUsJteUCQ/s320/xmas2.jpg" alt="" id="BLOGGER_PHOTO_ID_5011869069050670194" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TlhwVaDeyBE/RY28M0GIbGI/AAAAAAAAAAM/Vox1neTy6-o/s1600-h/xmas1.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_TlhwVaDeyBE/RY28M0GIbGI/AAAAAAAAAAM/Vox1neTy6-o/s320/xmas1.jpg" alt="" id="BLOGGER_PHOTO_ID_5011868888662043746" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Last Saturday, we had a Christmas party at our place. It went really well. Many thanks to Anh and Neeraj for doing such an excellent job with the BBQ.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TlhwVaDeyBE/RY29P0GIbII/AAAAAAAAAAc/vxf1PFhU8gY/s1600-h/CIMG0915.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_TlhwVaDeyBE/RY29P0GIbII/AAAAAAAAAAc/vxf1PFhU8gY/s320/CIMG0915.JPG" alt="" id="BLOGGER_PHOTO_ID_5011870039713279106" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TlhwVaDeyBE/RY2-oEGIbJI/AAAAAAAAAAw/VqWYS4hlAAQ/s1600-h/IMGP1147.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_TlhwVaDeyBE/RY2-oEGIbJI/AAAAAAAAAAw/VqWYS4hlAAQ/s320/IMGP1147.JPG" alt="" id="BLOGGER_PHOTO_ID_5011871555836734610" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-3014995455785588896?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/3014995455785588896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=3014995455785588896' title='31 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/3014995455785588896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/3014995455785588896'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2006/12/our-christmas-party-06.html' title='Our Christmas Party &apos;06'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_TlhwVaDeyBE/RY28XUGIbHI/AAAAAAAAAAU/7UGUsJteUCQ/s72-c/xmas2.jpg' height='72' width='72'/><thr:total>31</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-2931313714745664827</id><published>2006-12-12T22:21:00.000+11:00</published><updated>2006-12-12T23:02:46.232+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Wing Chun'/><title type='text'>Chark Jong - The Calm in the Eye of the Storm</title><content type='html'>Doing Chark Jong (breaking of the guard) today, my instructor pointed out that I was tensing up too much, and comitting myself to a big forward rush, when I should have been simply walking forward in my correct stance. After this and some more demonstation, I had an ephinany and things suddenly clicked. Here is my summary of how to do the technique more correctly:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Put on a correct stance.&lt;/li&gt;&lt;li&gt;Imagine yourself being sucked up towards the ceiling head first, or that your body is suspended from a thread going from the top of your head to the ceiling. This will straighten your back and neck and relax your spine.&lt;/li&gt;&lt;li&gt;Mirror your oponent's guard with your guard.&lt;/li&gt;&lt;li&gt;Imagine your arms are very heavy, and relax all the muscles in your arms and shoulders. Your arms should be rotated up and forward by your shoulder ball joint, holding the ultimate angle, but otherwise completely relaxed. Your elbows should feel as though they are pointing towards the floor.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Step forward naturally from your waist.&lt;/li&gt;&lt;li&gt;As you close with your opponent's guard (preferably a bit above it), allow your arms to drop down under their own weight, while focusing strongly on a point (eg, on the centre of your oponent's chest). Don't stop walking as your do this. The combined forward movement of your body and downward fall of your arms will mean that you collapse your oponents guard and hit through to their chest.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Pull back both hands with a circular movement driven from your elbow, like in the form. This will catch the remains of your oponent's guard and further disrupt their stance. If this move isn't working for you, don't overdo it - be careful not to come out of your stance.&lt;/li&gt;&lt;li&gt;Finish by stepping foward from the waist (imagine your belly button is leading the way) and drive your arms forward in a double palm strike.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;When it clicks, it feels like the calmness in the eye of a storm. You are relaxed, in control and uncomitted, with time respond to any counters your oponent may choose to do.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-2931313714745664827?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/2931313714745664827/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=2931313714745664827' title='29 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/2931313714745664827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/2931313714745664827'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2006/12/chark-jong-calm-in-eye-of-storm.html' title='Chark Jong - The Calm in the Eye of the Storm'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>29</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-8465811840353149342</id><published>2006-11-30T22:31:00.000+11:00</published><updated>2007-03-29T18:58:00.935+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby / Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><title type='text'>Thai Ordering and Development Mode vs Production Mode for Rails Apps</title><content type='html'>A while back, I wrote a little rails app for Thai food ordering at my work. My colleagues place orders using the system and then bring money to the nominated &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;orderer&lt;/span&gt; of the week. Once all orders are in and paid for (this is also tracked in the app), the &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;orderer&lt;/span&gt; rings up our favourite Thai restaurant (&lt;a href="http://www.laddas.com.au/"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Laddas&lt;/span&gt;&lt;/a&gt;) and places the order.&lt;br /&gt;&lt;br /&gt;I have the app running from fairly cheap shared hosting. At peak times during the ordering, I guess that they'd be 15 or so people simultaneously using the app. We've used it many times without problems. Thus, I was quite surprised and displeased (as were my colleagues), when my hosting account was suspended and we couldn't see what had been ordered this morning. A hasty email to my hosting provider revealed that my account had been suspended due to high load and "ruby flooding". They were kind enough to &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;un&lt;/span&gt;-suspend my account and we completed the ordering process.&lt;br /&gt;&lt;br /&gt;I remembered seeing something about production mode in 'environment.&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;rb&lt;/span&gt;'. Some googling confirmed my hunch - in development mode, rails apps are much more resource intensive. Caching is not used, and every single file needs to be reloaded every time it is required. After changing my app to production mode, it seemed to run &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-corrected" id="SPELLING_ERROR_6"&gt;noticeably&lt;/span&gt; faster. &lt;a href="http://here.the.ycros.be/"&gt;Michael&lt;/a&gt; and I ran 'top' and it looked like each request used less CPU.&lt;br /&gt;&lt;br /&gt;So, should you be in a similar situation, this is how to change your app to production mode on fast-&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;cgi&lt;/span&gt; Apache shared hosting:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Confirm that 'database.&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;yml&lt;/span&gt;' in your &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;app's&lt;/span&gt; '&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;config&lt;/span&gt;' directory has a section for production mode, and that it has up to date database connection details.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Edit 'environment.&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;rb&lt;/span&gt;' in your &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;app's&lt;/span&gt; '&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;config&lt;/span&gt;' directory.&lt;/li&gt;&lt;li&gt;Add this line:&lt;br /&gt;&lt;pre&gt;     &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;ENV&lt;/span&gt;['RAILS_&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;ENV&lt;/span&gt;'] ||= 'production'&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Run '&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;ps&lt;/span&gt; -u [your_user_name]' to find if you have any 'dispatch.&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;fgi&lt;/span&gt;' processes running.&lt;/li&gt;&lt;li&gt;If so, kill all of them (they'll restart and use your new &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;config&lt;/span&gt; settings).&lt;/li&gt;&lt;li&gt;Browse to your app, it should now run faster.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-8465811840353149342?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/8465811840353149342/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=8465811840353149342' title='37 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/8465811840353149342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/8465811840353149342'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2006/11/thai-ordering-and-development-mode-vs.html' title='Thai Ordering and Development Mode vs Production Mode for Rails Apps'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>37</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-4406433595532156003</id><published>2006-11-27T22:04:00.000+11:00</published><updated>2006-11-27T23:01:23.448+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Soft Skills and Mind Hacks'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Reviews'/><title type='text'>Neuro Linguistic Programming - Part 2</title><content type='html'>This is the second part of my post on &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;NLP&lt;/span&gt;. &lt;a href="http://jamescrisp.blogspot.com/2006/11/neuro-linguistic-programming-part-1.html"&gt;Part 1 is available here.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Building Rapport&lt;/span&gt;&lt;br /&gt;To build rapport, the book recommends that you pay careful attention to the person you are speaking with and match their physical posture, expressions, breathing, movements, voice and language patterns. Whole body listening is important - this means you are curious and &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-corrected" id="SPELLING_ERROR_1"&gt;focused&lt;/span&gt; on the person you are speaking with and your language is 'you' &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;focused&lt;/span&gt;, rather than 'I/me' centered.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Perceptual Positions&lt;/span&gt;&lt;br /&gt;Perceptual positions are a way of appreciating situations from different standpoints and gaining different perspectives. 1st position is when you are in your own body - this position is good for concentrating on what you want and being assertive. 2&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;nd&lt;/span&gt; position is when you imagine yourself in somebody &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;else's&lt;/span&gt; shoes - good for trying to understand their perspective/actions. 3rd position is when you imagine yourself as a fly on the wall looking at the scene - good for detaching yourself emotionally and considering things logically.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Setting Anchors&lt;/span&gt;&lt;br /&gt;Anchors are particular &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-corrected" id="SPELLING_ERROR_5"&gt;stimuli&lt;/span&gt; (&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;eg&lt;/span&gt;, a touch, smell or taste) that automatically trigger a linked memory or emotion. Everyone has &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-corrected" id="SPELLING_ERROR_7"&gt;unconscious&lt;/span&gt; anchors - &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;eg&lt;/span&gt;, smell of food makes you feel hungry and think of eating. However, you can set anchors for yourself which you can then call up at will to change your emotional state:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Choose a state/feeling that you have experienced in your life that you want to be able to access whenever you choose.&lt;/li&gt;&lt;li&gt;Choose an anchor - &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;eg&lt;/span&gt;, touching index finger to thumb on your left hand.&lt;/li&gt;&lt;li&gt;Recall the time when the feeling was it its strongest for you. Make sure you are seeing the memory out of your own eyes (1st position). Think about the time - what colours do you see, what do you hear, what do you feel etc.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Just before your emotions peak, set the anchor and then remove it at the peak of your emotions.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Shake yourself to break state, and then repeat the process several times.&lt;/li&gt;&lt;li&gt;Test the anchor - think of something else and trigger the anchor. You should feel the emotions/state you associated with the anchor.&lt;/li&gt;&lt;/ol&gt;I had a little bit of a play with anchoring emotions.  The technique seems to work at least to some extent for me. I intend to play around with it a bit more.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-4406433595532156003?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/4406433595532156003/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=4406433595532156003' title='18 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/4406433595532156003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/4406433595532156003'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2006/11/neuro-linguistic-programming-part-2.html' title='Neuro Linguistic Programming - Part 2'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>18</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-2529809290583668153</id><published>2006-11-24T20:28:00.000+11:00</published><updated>2006-11-27T22:59:58.514+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Soft Skills and Mind Hacks'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Reviews'/><title type='text'>Neuro Linguistic Programming - Part 1</title><content type='html'>I recently finished reading "NLP at Work" by Sue Night. It was quite a nice introduction to the topic. Here's some of the more interesting bits through the filter of my interpretation.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Styles of Thought&lt;br /&gt;&lt;/span&gt;Visual/Auditory/Feelings - from the way people speak (eg, "that sounds good"), you can guess what style of thought they prefer.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Eye Movements&lt;/span&gt;&lt;br /&gt;The way you move your eyes is meant to reflect your thought patterns:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Looking up (or straight ahead defocussed) =&gt; remembering/constructing images&lt;/li&gt;&lt;li&gt;Looking sideways =&gt; remembering/constructing sounds&lt;/li&gt;&lt;li&gt;Looking down =&gt; feelings/internal dialogue&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;As an aside, if you're talking and somebody looks away, they are probably thinking, and you should wait till they meet your eyes again before continuing.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Empowerment thought Word Choice and Questions&lt;br /&gt;&lt;/span&gt;Empowerment means you take responsiblity for your own experience. Resolve ambiguity and abdication of responsiblity though challenging your thoughts with questions.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Deletions: "They overlooked me in the recent promotions" - who are they?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Vague actions: "We are going to develop Joe's ability to learn"  - how are we going to do that, and when?&lt;/li&gt;&lt;li&gt;Baseless comparisons: "The company is doing well" - compared to what?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Abstraction: "It was a difficult conversation" - who was involved, and what made it difficult?&lt;/li&gt;&lt;li&gt;Hidden opinion: "This is the right way to do it" - according to who? The speaker?&lt;/li&gt;&lt;li&gt;Generalisations: "She never listens to me" - how do you know that? Has there ever been a time when she listened to you?&lt;/li&gt;&lt;li&gt;Blame: "the company demotivates me" - how does the company demotivate you?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Drivers: "I want to see my friend" vs "I should see my friend". The former (driven by you) empowers and motivates, the latter (forced on you) triggers opposite feelings.&lt;/li&gt;&lt;li&gt;Assumptions: "he is fiddling with his pen =&gt; he is bored" - how does fiddling with his mean mean that he is bored? Maybe it is just his habit.&lt;/li&gt;&lt;/ul&gt;With this approach, you can untangle your beliefs. Eg,&lt;br /&gt;"These presentations never go well" - Never? Has there ever been a time when one did go well? How do you determine if it went well?&lt;br /&gt;"Giving these talks makes me feel stressed" - How exactly does giving the talks cause you to feel stressed? How do you want to feel?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;The power of imagination&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;If you imagine something sufficiently strongly and sensually (when, where, sight, smell, touch, taste, sound, etc), your feelings will be similar to what they would be if it was really happening. Ie, your feeling do not differentiate between what is really happening, and what you imagine.&lt;br /&gt;&lt;br /&gt;Hence, if you want to know how you would feel if you did X, simply imagine it in great detail and you'll find out. Similarly, if you want to achieve something, imagine what it would be like in detail and it will be as though you have already achieved it. Believe it is true, and you will act as though it is true, and then it will be easier for it to become true!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;No negatives&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;The unconscious mind does not understand negatives. Hence, if you say "Don't worry" to yourself, you are in effect triggering the "worry" emotion.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Rewriting Memories / Modifying Perception&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;Bring up a memory in detail, and bring in as many senses as you can. Try changing the lighting, the background sound, the relative size of objects etc and see how you feel. If you do this enough, you can change how you feel in the memory, and how you will feel when something similar arises.&lt;br /&gt;&lt;br /&gt;I think that this could be done mentally in real time in real situations as well by changing your perception. Eg, somebody is screaming at you. If mentally imagine yourself to be larger, and the screamer to be smaller and imagine a glass between you, you could avoid feeling overwhelmed or getting angry yourself. You could then respond in a better manner.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Beliefs of Excellence&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;What you believe will influence how you act. Hence, if you take on positive beliefs, you can become more friendly, productive and motivated. Similarly, negative beliefs (eg, "I can't do it") are often self-fulfilling. According to the book, the important beliefs for excellence are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Each person is unique&lt;/li&gt;&lt;li&gt;Everyone makes the best choice available to them at the time&lt;/li&gt;&lt;li&gt;There is no failure, only feedback&lt;/li&gt;&lt;li&gt;Behind every behaviour is a positive intention&lt;/li&gt;&lt;li&gt;The meaning of the communication is its effect&lt;/li&gt;&lt;li&gt;There is a solution to every problem&lt;/li&gt;&lt;li&gt;The person with the most flexibility in thinking and behaviour has the best chance of succeeding&lt;/li&gt;&lt;li&gt;Mind and body are part of the same system&lt;/li&gt;&lt;li&gt;Knowledge, thought, memory and imagination are the result of sequences and combinations of ways of filtering and storing information&lt;/li&gt;&lt;/ul&gt;Presuppose that these beliefs are true for you - try them out :-)&lt;br /&gt;Or go back into memory and imagine how you would have behaved differently had you had these beliefs.&lt;br /&gt;Practice should make the belief become more fixed in you, and change your automatic behaviour.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Outcomes and Goals&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;What do I really want to achieve in 3 months/6m/1yr/3yrs, beyond..&lt;br /&gt;List, prioritise and choose top 3. For each goal,&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Imagine it with all senses - how does it feel/look/sound&lt;/li&gt;&lt;li&gt;When, where and with whom?&lt;/li&gt;&lt;li&gt;What have you got now you'd need to give up?&lt;/li&gt;&lt;li&gt;Is it worth the risk/pain? If not, chose another goal and start again.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;If not self-maintained, chunk up ("recession to ease", ask "what's important about that?") to find the higher level need (eg, "security")&lt;/li&gt;&lt;li&gt;Ensure the outcome fits with who you are and who you want to be&lt;/li&gt;&lt;li&gt;What alternative ways are there to satisfy this need that will allow you to move towards the outcome?&lt;/li&gt;&lt;li&gt;How does having the outcome fit with the other people who are important in your life?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Act by dividing what you need to do into many small steps that you can work through in a real way every day or every week, potentially with time frames.&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://jamescrisp.blogspot.com/2006/11/neuro-linguistic-programming-part-2.html"&gt;This topic is continued in Part 2.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-2529809290583668153?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/2529809290583668153/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=2529809290583668153' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/2529809290583668153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/2529809290583668153'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2006/11/neuro-linguistic-programming-part-1.html' title='Neuro Linguistic Programming - Part 1'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-116382929661686845</id><published>2006-11-18T16:50:00.000+11:00</published><updated>2006-11-25T17:25:09.490+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Wing Chun'/><title type='text'>Wing Chun Grading</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3136/3016/1600/P1010098.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3136/3016/320/P1010098.jpg" alt="" border="0" /&gt;&lt;/a&gt;This morning I went for a grading to move from grade 3 to grade 4. I did better than I could have hoped - both passed and got a good score! New and exciting Grade 4 techniques shall be revealed to me next training :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-116382929661686845?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/116382929661686845/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=116382929661686845' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/116382929661686845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/116382929661686845'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2006/11/wing-chun-grading.html' title='Wing Chun Grading'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-116099950018814150</id><published>2006-10-16T21:40:00.000+10:00</published><updated>2006-11-25T17:26:15.032+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Food and Drink'/><title type='text'>Mocha, office style</title><content type='html'>I'd like to share with you an easy recipe for Mocha, made using only the commodities found in your average office kitchen. I learnt this from a colleague the other day, and it makes a nice change from one's  usual tea or coffee in the morning.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ingredients&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;2 tsp milo&lt;/li&gt;   &lt;li&gt;1/2 tsp instant coffee&lt;/li&gt;   &lt;li&gt;1/2 tsp brown sugar&lt;/li&gt;   &lt;li&gt;milk&lt;/li&gt;   &lt;li&gt;hot water&lt;/li&gt; &lt;/ul&gt; Mix all ingredients and stir :-)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Interestingly, tea and milo is not a bad combination...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-116099950018814150?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/116099950018814150/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=116099950018814150' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/116099950018814150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/116099950018814150'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2006/10/mocha-office-style.html' title='Mocha, office style'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-116043346150544154</id><published>2006-10-10T08:18:00.000+10:00</published><updated>2006-11-25T18:34:26.487+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Soft Skills and Mind Hacks'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Reviews'/><title type='text'>Successful Negotiating</title><content type='html'>Recently, I read "Successful Negotiating" by Julia Tipler. It's a pretty quick read (just under 100 pages) but has some interesting info. Here's some titbits from the book:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Relationships&lt;/span&gt;&lt;br /&gt;Try to build long term relationships based on win-win deals rather than scoring points / grinding down opposition.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Language&lt;/span&gt;&lt;br /&gt;Use precise language with dates rather than "ASAP" or "when you have time". Use simple language, and do not assume both sides hold the same assumptions and clarify often with questions.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Preparation&lt;/span&gt;&lt;br /&gt;Prepare well by deciding your objectives (needs &amp; wants), non-negotiables, what you can compromise on and limits. Research your opposite number - what do they need and do they have power to sign off?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Agenda&lt;/span&gt;&lt;br /&gt;Create agenda and send to other party in advance of the meeting, emphasising that it is a draft and they can add items to it (aim to create a climate of agreement even before discussion begins). Place items that you think will be easy to reach agreement at the top to get momentum.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Place&lt;/span&gt;&lt;br /&gt;If you are selling, you should go to the customer as you are making the most effort and people feel more comfortable/polite on their "home ground". Second meeting could be on "your territory". If there's a history of conflict, "neutral ground" may be best.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Time&lt;/span&gt;&lt;br /&gt;Make sure you've had time to prepare. On the phone, check that now is a convenient time for the other person.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Exploration&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;If person says they need or want something, ask why and encourage them to explain.&lt;/li&gt;   &lt;li&gt;"If I can't meet that condition, is there something else that would make this deal work for you?"&lt;/li&gt;&lt;li&gt;Identify mutual interest.&lt;/li&gt;&lt;li&gt;Chunk down to find out the details of what people want and also chunk up to find out the big picture of why/when. With this understanding, you can then negotiate solutions which meet the needs of both partieis.&lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Show you understand the reasons that lie behind wants/needs as this may reduce resistance to alternative suggestions.&lt;/li&gt;   &lt;li&gt;Once understanding is reached, move to middle ground of bidding and proposing. Both sides will need to compromise to some extent. At this point, you are asking the other party to consider what a good deal is, rather than firm agreement.&lt;br /&gt;&lt;/li&gt;   &lt;li&gt;Ask "what if" questions (eg, "what if I could offer you slower delivery but lower costs"?) and ask "why not" if they do not agree. Ask direct questions if this fails (eg, "what is the minimum delivery size you would agree to?").&lt;/li&gt;   &lt;li&gt;Aim to uncover variables in the negotiations and come up with possibilities based on these.&lt;/li&gt;   &lt;li&gt;Don't concede, exchange - doesn't need to be of equal value however.&lt;/li&gt; &lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Reaching Agreement&lt;/span&gt;&lt;br /&gt;&lt;ul&gt; &lt;li&gt;Summarise and restate after each point is agreed on. Eg, "We've agreed on W, X and Y. That only leaves Z to be decided".&lt;/li&gt;&lt;li&gt;Ask series of questions which are closed/leading, where the answer to each is yes, leading to the final question which closes the deal.&lt;br /&gt;&lt;/li&gt; &lt;/ul&gt; &lt;span style="font-weight: bold;"&gt;Closing&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;Always put agreement in writing (start with a draft framework for discussion).&lt;br /&gt;&lt;/li&gt;   &lt;li&gt;Agree on review and complaint handling processes.&lt;/li&gt;   &lt;li&gt;Agreement should be specific, measurable, agreed, realistic and time-bound.&lt;br /&gt;&lt;/li&gt; &lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Body Language&lt;/span&gt;&lt;br /&gt;When interpreting somebody’s body language (or projecting your own), consider these aspects in decreasing order of importance:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;Eye contact (around 70% of the time ideal, too little suggests disagreement or disinterest, too much suggests aggression, looking up suggests thinking, looking down suggests discomfort)&lt;/li&gt;   &lt;li&gt;Facial expression (smile, make sure you show what you are feeling, don’t be deadpan, that’s unnerving)&lt;/li&gt;   &lt;li&gt;Posture (Relaxed and upright, leaning forwarding slightly, crossing legs are all signs of interest. Folding arms or turning body away suggests discomfort with the proceedings. Mirroring other person suggests agreement.)&lt;/li&gt;   &lt;li&gt;Hand gestures (open hand gestures suggest open mind, fiddling or doodling suggests disinterest or nervousness)&lt;/li&gt; &lt;/ul&gt; If body language is unclear, clarify. Eg, “Is this still all right with you?”&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Listening&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;Do make listening noises such as "uhuh" and "mmm".&lt;/li&gt;   &lt;li&gt;Do not finish other people's sentences for them, as they may find this irritating.&lt;/li&gt;   &lt;li&gt;Take notes to show you're interested and to help you summarise the agreement as you approach the close.&lt;/li&gt; &lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Respond&lt;/span&gt;&lt;br /&gt;&lt;ul&gt; &lt;li&gt;Keep cool and respond, rather than react. Stay adult and detached and offer time out if the opposite part is losing it.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Show respect at all times.&lt;/li&gt; &lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-116043346150544154?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/116043346150544154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=116043346150544154' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/116043346150544154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/116043346150544154'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2006/10/successful-negotiating.html' title='Successful Negotiating'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-116030731450450254</id><published>2006-10-08T20:46:00.000+10:00</published><updated>2006-11-25T17:26:47.843+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><title type='text'>My Sister's Wedding</title><content type='html'>Today was Mia and Neeraj's wedding. It went really well, and the newly weds looked awesome :-) After so much planning, everything was very smooth. Neeraj and Mia made their vows and danced very nicely and the speeches were all good.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3136/3016/1600/P1010035.1.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://photos1.blogger.com/blogger/3136/3016/320/P1010035.0.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3136/3016/1600/P1010044.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://photos1.blogger.com/blogger/3136/3016/320/P1010044.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I got to sit at the top table facing all the other guests for the wedding ceremony, as I was doing a reading of a poem. Afterwards, I joined Soosun on the family table for the reception.&lt;br /&gt;&lt;br /&gt;After the reception, Mia and Neeraj left for their honeymoon, we went back to Neeraj's family's place. We dressed up in our Bangladeshi clothes (many thanks to our flatmate Asif and his family for these!) and ate far too much tasty curry.&lt;br /&gt;A wonderful day was had by all :-)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3136/3016/1600/P1010048.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://photos1.blogger.com/blogger/3136/3016/320/P1010048.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-116030731450450254?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/116030731450450254/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=116030731450450254' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/116030731450450254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/116030731450450254'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2006/10/my-sisters-wedding.html' title='My Sister&apos;s Wedding'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-116018615926468071</id><published>2006-10-07T11:38:00.000+10:00</published><updated>2006-11-25T18:34:43.623+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Book Reviews'/><category scheme='http://www.blogger.com/atom/ns#' term='Fiction'/><title type='text'>Dance Dance Dance</title><content type='html'>Just finished reading Dance Dance Dance by Haruki Murakami. Amazing novel. Not exciting, but totally gripping. I couldn't put the thing down. The plot is a little unconventional to say the least, but my empathy with the narrator was overridingly strong and it is really this that made the novel so gripping.&lt;br /&gt;&lt;br /&gt;Our narrator is 34, and in many ways, leads a normal and boring life. The boring parts of his life are described in detail. If you counted the pages devoted to descriptions of his every day life such as cooking, eating etc, I think you'd count about 1/3 of the novel. Rather than making the novel boring, as you would expect, it instead makes our narrator more real and human. And since he is so real, and so like you and me, even the  "boring" parts of his life are interesting and enjoyable. For example, having a good meal and reading a book are nothing "exciting" in the traditional sense. However, since the narrator is so real, and so human, you can easily remember your own feelings when doing a similar thing.&lt;br /&gt;&lt;br /&gt;There is something so real in the mediocrity of our narrator that strikes a chord with me. Our narrator is a good, fair guy, playing his part in an "advanced capitalist society". He's not amazingly talented at anything, he doesn't fit in and he's not very socially ept. He "shovels cultural snow" writing pieces for magazines. He has a few friends and romantic interests. He tries not to hurt people but doesn't know where his life is going or what he really wants. When you look at him, and think about him, it forces you to look at yourself, in a very similar advanced capitalist society, shovelling virtual snow, or whatever you do. At the end of the day though, he's the best of the bunch. He's responsible and he cares. Maybe that's cause for hope.&lt;br /&gt;&lt;br /&gt;Dance Dance Dance follows on from A Wild Sheep Chase, although you could probably get by without reading the earlier novel. It's a great book, go forth and read it :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-116018615926468071?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/116018615926468071/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=116018615926468071' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/116018615926468071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/116018615926468071'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2006/10/dance-dance-dance.html' title='Dance Dance Dance'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-115789688016653964</id><published>2006-09-10T23:43:00.000+10:00</published><updated>2006-11-25T17:29:00.338+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby / Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><title type='text'>Rails and the initialize() method</title><content type='html'>I spent a bit of time this weekend on a pet rails project. I came across a strange error when trying to create new records through the application. Editing was working just fine, but creating a new record just seemed to hang.&lt;br /&gt;&lt;br /&gt;Breakpoints came to my rescue. In Ruby, they're really handy. You can put a 'breakpoint' call anywhere in your code, and if you have a breakpointer process running (start this with the command 'ruby script/breakpointer'), you jump straight into an interactive ruby console debug session when the breakpoint is hit.&lt;br /&gt;&lt;br /&gt;Using the development log and a few breakpoints, I found the that the error was:&lt;br /&gt;&lt;pre&gt;ArgumentError: wrong number of arguments (1 for 0)&lt;/pre&gt;And that it was caused by a line similar to this:&lt;br /&gt;&lt;pre&gt;@order = order.new(params[:order])&lt;/pre&gt;Ie, the controller was creating a new order from the post parameters.&lt;br /&gt;&lt;br /&gt;Then all became clear - some time earlier, I'd overridden the initialize() method in the order to default some dates. My code was similar to this:&lt;br /&gt;&lt;pre&gt;def initialize&lt;br /&gt;super()&lt;br /&gt;&lt;br /&gt;if (@new_record)&lt;br /&gt;  self.validFrom = Date.today&lt;br /&gt;  self.validTo = 1.year.from_now.to_date&lt;br /&gt;end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Great for creating new objects in my tests and console sessions where I always just created the object and then set properties. However, the controller was relying on passing in the post parameters in the constructor.&lt;br /&gt;&lt;br /&gt;The solution is to accept any number of params and pass these to the base class:&lt;br /&gt;&lt;pre&gt;def initialize(*params)&lt;br /&gt;super(*params)&lt;br /&gt;&lt;br /&gt;if (@new_record)&lt;br /&gt;  self.validFrom = Date.today&lt;br /&gt;  self.validTo = 1.year.from_now.to_date&lt;br /&gt;end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;That way, the order can accept the post parameters in its constructor.&lt;br /&gt;&lt;br /&gt;I'm very pleased to say that I can now create new records again!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-115789688016653964?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/115789688016653964/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=115789688016653964' title='45 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/115789688016653964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/115789688016653964'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2006/09/rails-and-initialize-method.html' title='Rails and the initialize() method'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>45</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-115754732519824425</id><published>2006-09-06T22:39:00.000+10:00</published><updated>2006-11-25T17:29:17.458+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Finance'/><title type='text'>How to do Tax Deductions for an Investment Property in NSW, Australia</title><content type='html'>Last year I bought a house. Recently, I've been doing my tax. It is much more complex this year with the property, but there are a lot more deductions. Here's some tips:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Renting a out part of your property&lt;br /&gt;&lt;/span&gt;If you rent some of your property, you are eligible for tax deductions for a proportion of your expenses. This proportion is based on the floor area that is rented, compared with the floor area which is not rented. Make sure you include common areas in your calculation.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Keep receipts and record all expenses&lt;br /&gt;&lt;/span&gt;They then need to be classified into areas such as:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;Interest on loan&lt;/li&gt;   &lt;li&gt;Advertising&lt;/li&gt;   &lt;li&gt;Insurance&lt;/li&gt;   &lt;li&gt;Rates&lt;/li&gt;   &lt;li&gt;Repairs&lt;/li&gt;   &lt;li&gt;Postage&lt;/li&gt;   &lt;li&gt;Cleaning&lt;/li&gt;   &lt;li&gt;Garden&lt;/li&gt;   &lt;li&gt;Borrowing expenses&lt;/li&gt;   &lt;li&gt;Legal Expenses&lt;br /&gt;&lt;/li&gt;   &lt;li&gt;Depreciation&lt;/li&gt;   &lt;li&gt;Capital Works&lt;/li&gt; &lt;/ul&gt; &lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;Most of these are straight forward, and immediate write offs in the year they are incurred.&lt;br /&gt;I'll go into more detail on the complex ones below.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Borrowing Expenses&lt;/span&gt;&lt;br /&gt;Generally, you will need to spread these over 5 years, or the length of your loan, whichever is shorter. In most cases, this will mean you'll tax deduct 1/5 of them each year for the first 5 years of your loan. They include things like government stamp duty on the loan and bank charges.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Legal Costs&lt;/span&gt;&lt;br /&gt;Unfortunately, these do not include the cost of legal fees in acquiring your property. They are for when you need to fight with tenants in court and similar. Hopefully you won't have any of these.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Depreciation and Capital Works&lt;/span&gt;&lt;br /&gt;This is the most complex area. First, download the &lt;a href="http://www.ato.gov.au/content/downloads/NAT1729-06.pdf"&gt;Rental Properties Guide 06 (NAT1729-06)&lt;/a&gt; from the ATO. This document is invaluable. I'd recommend you at least skim read it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Capital Works&lt;/span&gt;&lt;br /&gt;Okay, now, if your house has been built or had any significant renovations since 1979, you may well have capital works deductions. The conditions on these vary. Have at look at the guide mentioned above, page 23 of the PDF. In most cases, you will be able to claim construction costs at 2.5% for 40 years. If there was a couple of hundred thousand dollars of construction costs, 2.5% could be quite a bit of money every year. If you know the cost of the construction, this is easy to calculate. If not, you will need to get this estimated - you can't do this yourself. I used &lt;a href="http://www.depreciator.com.au/"&gt;Depreciator.&lt;/a&gt; They employ quantity surveyors and meet ATO requirements. I was quite happy with them - see my &lt;a href="http://www.somersoft.com/forums/showthread.php?p=233164#post233164"&gt;post&lt;/a&gt; on the Somersoft investment forum for more details. They also estimate costs of assets such as hot water systems, stoves, blinds etc.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Deductions&lt;br /&gt;&lt;/span&gt;You need to classify all your assets according to their cost and depreciate accordingly:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt; $1-300:  write off straight away in the current tax year&lt;/li&gt;   &lt;li&gt; $301-1000: put in low value pool (deduct at 18.5% for the first year when adding to the pool, 37% for assets already in the pool)&lt;/li&gt;   &lt;li&gt; $1001 or more: depreciate with straight line or curved line methods over effective life set out by ATO. You can find these in the rental guide from the ATO mentioned above.&lt;br /&gt;&lt;/li&gt; &lt;/ul&gt; &lt;span style="font-style: italic;"&gt;What is a asset (can be depreciated) and what is a capital work&lt;/span&gt;&lt;br /&gt;There is a reasonably arbitrary seeming classification of items between capital works and deductions. A hot water system, for example, is a depreciable asset but a kitchen cupboard is a capital work. Check all your items with the rental guide mentioned above. If an item is an asset, you can estimate its market value, and you can depreciate it over the effective life in the guide. If it is a capital work, then you cannot depreciate it. It is part of construction costs - see above section on capital works for more details on claiming these.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Disclaimer&lt;br /&gt;&lt;/span&gt;I'm not a tax professional. This post is my personal opinion and interpretation. No responsibility taken for an errors or omissions. Use at your own risk.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-115754732519824425?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/115754732519824425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=115754732519824425' title='18 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/115754732519824425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/115754732519824425'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2006/09/how-to-do-tax-deductions-for.html' title='How to do Tax Deductions for an Investment Property in NSW, Australia'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>18</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-115728780654537779</id><published>2006-09-03T22:33:00.000+10:00</published><updated>2006-11-25T18:32:49.370+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><category scheme='http://www.blogger.com/atom/ns#' term='English'/><title type='text'>Learn English using a Blog and Programming Tools!</title><content type='html'>&lt;a href="http://ohsoosun.blogspot.com/"&gt;&lt;/a&gt;My fiancee, Soosun, is brushing up on her English skills before going to uni next year. As part of the plan to improve her writing, she's started a &lt;a href="http://ohsoosun.blogspot.com/"&gt;blog&lt;/a&gt;. Friends and family can write comments on her posts to help improve her written English.&lt;br /&gt;&lt;br /&gt;She just wrote a nice article on making kimchi, and I posted a comment containing a copy of her article with English improvements. But how can she tell what I've suggested? The solution we decided to use is kdiff3, a tool I use at work for comparing and merging source code. You can download it &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=58666"&gt;here&lt;/a&gt;. If you turn word wrap on, it is great for comparing English - shows up the differences beautifully.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-115728780654537779?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/115728780654537779/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=115728780654537779' title='21 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/115728780654537779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/115728780654537779'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2006/09/learn-english-using-blog-and.html' title='Learn English using a Blog and Programming Tools!'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>21</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-115726983534961645</id><published>2006-09-03T17:44:00.000+10:00</published><updated>2006-11-25T17:29:45.406+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fiction'/><title type='text'>From "A Wild Sheep Chase" by Haruki Murakami</title><content type='html'>"Nor do you know where you stand. Now listen, I thought it over last night. And it struck me. What have I got to feel threatened about? Next to nothing. I broke up with my wife, I plan to quit my job today, my apartment is rented, and I have no furnishings worth worrying about. By way of holdings, I've got maybe two million yen in savings, a used car, and a cat who's getting on in years. My clothes are all out of fashion, and my records are ancient. I've made no name for myself, have no social credibility, no sex appeal, no talent. I'm not so young anymore, and I'm always saying dumb things that I later regret. In a word, to borrow your turn of phrase, I am an utterly mediocre person. What have I got to lose? If you can think of anything, clue me in, why don't you?"&lt;br /&gt;&lt;br /&gt;Great passage, ya?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-115726983534961645?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/115726983534961645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=115726983534961645' title='29 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/115726983534961645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/115726983534961645'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2006/09/from-wild-sheep-chase-by-haruki.html' title='From &quot;A Wild Sheep Chase&quot; by Haruki Murakami'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>29</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-115717978578168131</id><published>2006-09-02T16:47:00.000+10:00</published><updated>2006-11-25T17:30:02.299+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><title type='text'>Engagement Party Photos</title><content type='html'>See them here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://gallery.maebmij.org/jamesc/EngagementParty/"&gt;http://gallery.maebmij.org/jamesc/EngagementParty/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(thanks Jim for the hosting :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-115717978578168131?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/115717978578168131/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=115717978578168131' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/115717978578168131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/115717978578168131'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2006/09/engagement-party-photos.html' title='Engagement Party Photos'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-115666061214502363</id><published>2006-08-27T16:07:00.000+10:00</published><updated>2006-11-25T17:31:06.430+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Soft Skills and Mind Hacks'/><category scheme='http://www.blogger.com/atom/ns#' term='Fiction'/><title type='text'>Litost in Le Petit Prince</title><content type='html'>I was reading a &lt;a href="http://dirtsimple.org/2006/08/how-to-decide-what-you-want.html"&gt;post&lt;/a&gt; on Phillip Eby's blog recently which quoted a little of "Le Petit Prince" by Antoine de Saint-Exupéry ("The Little Prince" in English). It's been a long time since I read it (I studied it in French class at school), so I got hold of my old copy and have been re-reading it. It's really great - both funny and serious, and I've been enjoying exercising my atrophied French muscles a bit. If you haven't read it, I recommend you get it and have a read in either French or English. Wikipedia has got some more information on the novel &lt;a href="http://en.wikipedia.org/wiki/The_Little_Prince"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Anyway, I came across an interesting passage that seems to dove tail very well with &lt;a href="http://jamescrisp.blogspot.com/2006/08/litost.html"&gt;my recent post on Litost&lt;/a&gt;. Here we go:&lt;br /&gt;&lt;br /&gt;"Elle serait bien vexée, se dit-il, si elle voyait ça... elle tousserait énormément et ferait semblant de mourir pour échapper au ridicule. Et je serais bien obligé de faire semblant de la soigner, car, sinon, pour m'humilier moi aussi, elle se laisserait vraiment mourir..."&lt;br /&gt;&lt;br /&gt;And here's my rough translation into English:&lt;br /&gt;&lt;br /&gt;"She would be very vexed, he said to himself, if she could see that... she would cough violently and pretend to die to escape being laughed at. And I would be obliged to pretend to heal her, so that I could humiliate myself as well, otherwise, she would really let herself die."&lt;br /&gt;&lt;br /&gt;PS - Found the &lt;a href="http://korczak.com/Exupery/englisch/0.html"&gt;full-text available online&lt;/a&gt; in English, French and some other languages!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-115666061214502363?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/115666061214502363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=115666061214502363' title='21 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/115666061214502363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/115666061214502363'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2006/08/litost-in-le-petit-prince.html' title='Litost in Le Petit Prince'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>21</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-115665836851422990</id><published>2006-08-27T15:39:00.000+10:00</published><updated>2006-11-25T17:32:37.389+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><title type='text'>Engagement Party!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3136/3016/1600/P1010031.0.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3136/3016/200/P1010031.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3136/3016/1600/P1010035.0.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3136/3016/200/P1010035.jpg" alt="" border="0" /&gt;&lt;/a&gt;Last night was our engagement party! It went really well :-)&lt;br /&gt;&lt;br /&gt;We had it at the Royal Exchange Hotel in Marrickville. The weather was great, and the venue was really nice, and our guests were awesome!&lt;br /&gt;&lt;br /&gt;Many thanks to my mum and grandma for the cakes, my family for being so helpful on the night, to Dennis Building for the drinks tab, and to everyone for coming along to celebrate our engagement with us. We had a really great time and I hope everyone else did too :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-115665836851422990?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/115665836851422990/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=115665836851422990' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/115665836851422990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/115665836851422990'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2006/08/engagement-party.html' title='Engagement Party!'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-115616746312890342</id><published>2006-08-21T23:17:00.000+10:00</published><updated>2006-11-25T17:31:32.230+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Soft Skills and Mind Hacks'/><category scheme='http://www.blogger.com/atom/ns#' term='Fiction'/><title type='text'>Litost</title><content type='html'>For some reason, while doing the washing up today, my mind was wandering and I remembered reading "The Book of Laughter and Forgetting" by Milan Kundera. A colleague and friend of mine gave me the book for my 24th birthday. It was a fun and interesting read with a good story. The passage I was day dreaming about was "What is Litost?". I was thinking I might take a stab at explaining it in my own words, but having read the passage again, I'm sure Milan Kundera has done a better job than I could hope to achieve. Hence I give you the passage verbatim:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What is Litost?&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;    Litost&lt;/span&gt; is an untranslatable Czech word. Its first syllable, which is long and stressed, sounds like the wail of an abandoned dog. As for the meaning of this word, I have looked in vain in other languages for an equivalent, though I find it difficult to imagine how anyone can understand the human soul without it.&lt;br /&gt;&lt;br /&gt;Let me give an example: The student went swimming in the river one day with his girlfriend, a fellow student. She was athletic, but he was a very poor swimmer. He could not time his breathing properly and swam slowly, his head held tensely high above the surface. She was madly in love with him and tactfully swam as slowly as he did. But when their swim was coming to an end, she wanted to give her athletic instincts a few moments' free rein and headed for the opposite bank at a rapid crawl. The student made an effort to swim faster too and swallowed water. Feeling humbled, his physical inferiority laid bare, he felt &lt;span style="font-style: italic;"&gt;litost&lt;/span&gt;. He recalled his sickly childhood, lacking in physical exercise and friends and spent under the constant gaze of his mother's overfond eye, and fell into despair about himself and his life. They walked back to the city together in silence on a country lane. Wounded and humiliated, he felt an irresistible desire to hit her. "What's the matter with you?" she asked him, and he started to reproach her: she knew about the current near the other bank, and that he had forbidden her to swim there because of the risk of drowning - and then he slapped her face. The girl began to cry, and when he saw the tears on her cheeks, he took pity on her and put his arms around her, and his litost melted away.&lt;br /&gt;&lt;br /&gt;Or take an instance from the student's childhood: His parents made him take violin lessons. He was not very gifted and his teacher would interrupt him to criticize his mistakes in a cold, unbearable voice. He felt humiliated, and he wanted to cry. But instead of trying to play in tune and not make mistakes, he would deliberately play wrong notes, the teacher's voice would become still more unbearable and harsh, and he himself would sink deeper and deeper into his &lt;span style="font-style: italic;"&gt;litost&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;What then is &lt;span style="font-style: italic;"&gt;litost&lt;/span&gt;?&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;Litost&lt;/span&gt; is a state of torment created by the sudden sight of one's own misery.&lt;br /&gt;&lt;br /&gt;One of the customary remedies for misery is love. Because someone loved absolutely cannot be miserable. All his faults are redeemed by love's magical gaze, under which even inept swimming, with the head held high above the surface, can become charming.&lt;br /&gt;&lt;br /&gt;Love's absolute is actually a desire for absolute identity: the woman we love ought to swim as slowly as we do, she ought to have no past of her own to look back on happily. But when the illusion of absolute identity vanishes (the girl looks back happily on her past or swims faster), love becomes a permanent source of the great torment we call &lt;span style="font-style: italic;"&gt;litost&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Anyone with wide experience of the common imperfection of mankind is relatively sheltered from the shocks of &lt;span style="font-style: italic;"&gt;litost&lt;/span&gt;. For him, the sight of his own misery is ordinary and uninteresting. &lt;span style="font-style: italic;"&gt;Litost&lt;/span&gt;, therefore, is characteristic of the age of inexperience. It is one of the ornaments of youth.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Litost&lt;/span&gt; works like a two-stroke engine. Torment is followed by the desire for revenge. The goal of revenge is to make one's partner look as miserable as oneself. The man cannot swim, but the slapped woman cries. It makes them feel equal and keeps their love going.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-115616746312890342?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/115616746312890342/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=115616746312890342' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/115616746312890342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/115616746312890342'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2006/08/litost.html' title='Litost'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-115597716859719189</id><published>2006-08-19T18:18:00.000+10:00</published><updated>2007-03-29T18:55:09.417+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby / Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><title type='text'>Ruby on Rails Hosting, Setup And Migration</title><content type='html'>I've been doing a little rails of late.. Here's a summary of the stuff that I've learnt.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What hosting should I use in Australia for rails?&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;NOT &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;JUMBA&lt;/span&gt; - SEE UPDATED REVIEW BELOW&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;I'm using &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;jumba&lt;/span&gt; (http://www.jumba.com.au). &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Jumba&lt;/span&gt; is very cheap (~$30&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;AUD&lt;/span&gt;/year), and they give you shell access, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;mysql&lt;/span&gt; etc. However, there was a period of several weeks when they moved me to some server without an install of rails and kept promising to install rails and never did. I finally got them to move me back to their main server which has rails installed. It was a painful process, so I'm not sure if I would recommend them. That being said, things are going OK at the moment, and I've got a few development apps up and running on their service.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;span style="font-weight: bold;"&gt;UPDATE 29 March 2006: &lt;/span&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Jumba&lt;/span&gt; summarily stopped rails support without notice and was rude when I contacted them about it. I would not recommend &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Jumba&lt;/span&gt; for web hosting anything - they have frequent down time, server switches and reboots and their low price is made up for by the amount of time you waste. They used to be OK, but no longer. I'm in the market for a new host, will post on how it goes.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;How to set up rails applications in your home directory (in public_html) under a UNIX/Apache/&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;cgi&lt;/span&gt;/&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;fcgi&lt;/span&gt; environment&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;   &lt;li&gt;Upload or create your application in your home directory. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;Eg&lt;/span&gt;, ~/&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;MyRailsApp&lt;/span&gt;/&lt;/li&gt;    &lt;li&gt;In your public_html directory, create a soft link to the public directory of your app. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;Eg&lt;/span&gt;,&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;ln&lt;/span&gt; -s ~/&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;MyRailsApp&lt;/span&gt;/public ~/public_html/&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;MyRailsApp&lt;/span&gt;&lt;/li&gt;   &lt;li&gt;Make sure dispatch.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;fcgi&lt;/span&gt; in the ~/&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;MyRailsApp&lt;/span&gt;/public directory is executable. If not, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;chmod&lt;/span&gt; it a+x.&lt;/li&gt;   &lt;li&gt;Confirm that dispatch.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;fcgi&lt;/span&gt; has a valid path to ruby on the first line. If you've created this project on another machine, you'll quite possibly need to update the path. The path is often something like '#!/&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;usr&lt;/span&gt;/local/bin/ruby', but check what it is under your system with 'which ruby'. Special note for &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;InstantRails&lt;/span&gt; users - you'll always need to update the path when uploading to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;unix&lt;/span&gt; hosting, as instant rails uses a windows style path with the slashes the other way around.&lt;/li&gt;   &lt;li&gt;Update your 'database.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;yml&lt;/span&gt;' file (in the '&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;config&lt;/span&gt;' directory of your app) with correct database names, user names and passwords.&lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Run 'dispatch.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;fcgi&lt;/span&gt;' (in the 'public' directory of your app). If you see an 'Internal Server Error' message, you know things are going OK. If you've got the path to ruby wrong on the first line, or some other similar problem, you'll find out about it here, where as if you run through the web, you don't get these sorts of problems reported in an easy to understand way.&lt;br /&gt;&lt;/li&gt;   &lt;li&gt;Check out your running system in the browser (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;eg&lt;/span&gt;, browse to http://myhostingcompany.com/MyRailsApp/)&lt;/li&gt; &lt;/ol&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Tips for trouble shooting rails errors&lt;br /&gt;&lt;/span&gt; &lt;ol&gt;   &lt;li&gt;A good place to start is by reading your logs in the 'log' directory of your rails app. If you're running a development configuration, have a read of 'development.log'.&lt;br /&gt;&lt;/li&gt;   &lt;li&gt;Try manually running 'dispatch.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;fcgi&lt;/span&gt;' in the 'public' directory of your app. If you get an 'Internal Server Error' message printed out on the console, it's probably working &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;ok&lt;/span&gt;. Alternatives to this are reports of missing files and unable to find ruby - often these aren't shown when browsing to your web site.&lt;/li&gt;  &lt;/ol&gt; &lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Rails problems and solutions&lt;/span&gt;&lt;span style=""&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;1. Browser and logs show: Application Error - Rails app failed to start properly &lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;" &lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;I got this after my app was moved from one &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;unix&lt;/span&gt; host to another by my hosting company. I tried heaps of stuff to try and resolve this. Eventually I created a brand new dummy project on the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_29"&gt;unix&lt;/span&gt; host called 'Test' and Test worked fine from the browser. I then tried my original project again and suddenly it worked fine! It has been working fine since. I can only imagine that there was some sort of problem in temporary files or similar which got flushed. No good explanation for this currently.&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;2. in `start_engine': undefined method `add_path' for Controllers:Module (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_30"&gt;NoMethodError&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;I got this one when migrating a project from rails 1.1 to a later version of rails. The solution is to force update your rails engines:&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;script/&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_31"&gt;plugin&lt;/span&gt; source http://svn.rails-engines.org/plugins&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;script/&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_32"&gt;plugin&lt;/span&gt; install engines --force&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;script/&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_33"&gt;plugin&lt;/span&gt; install &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_34"&gt;login&lt;/span&gt;_engine --force&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;3. My app works fine if there is a trailing slash on the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_35"&gt;url&lt;/span&gt;. Otherwise, I get a 'Bad Request' error page. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_36"&gt;Eg&lt;/span&gt;, 'http://myhost.com/myapp/' works, but 'http://myhost.com/myapp' does not work.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Add a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_37"&gt;RewriteRule&lt;/span&gt; to the .&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_38"&gt;htaccess&lt;/span&gt; file in your application's public folder:&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_39"&gt;RewriteRule&lt;/span&gt; ^.*&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_40"&gt;myapp&lt;/span&gt;$    http://%{HTTP_HOST}/myapp/ [R=301,L]&lt;br /&gt;&lt;br /&gt;My basic .&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_41"&gt;htaccess&lt;/span&gt; rewrites are as follows:&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_42"&gt;RewriteEngine&lt;/span&gt; On&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_43"&gt;RewriteRule&lt;/span&gt; ^.*&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_44"&gt;myapp&lt;/span&gt;$ http://%{HTTP_HOST}/myapp/ [R=301,L]&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_45"&gt;RewriteCond&lt;/span&gt; %{REQUEST_&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_46"&gt;FILENAME&lt;/span&gt;} !-f&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_47"&gt;RewriteRule&lt;/span&gt; ^(.*)$ dispatch.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_48"&gt;fcgi&lt;/span&gt; [&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_49"&gt;QSA&lt;/span&gt;,L]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I tried removing the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_50"&gt;RewriteCond&lt;/span&gt; !-f, and my pages lost their styles. I think the condition allows the rails framework to load .&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_51"&gt;css&lt;/span&gt; files directly without having the requests go through dispatch.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_52"&gt;fcgi&lt;/span&gt;.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-115597716859719189?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/115597716859719189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=115597716859719189' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/115597716859719189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/115597716859719189'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2006/08/ruby-on-rails-hosting-setup-and.html' title='Ruby on Rails Hosting, Setup And Migration'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-115534831651168329</id><published>2006-08-12T11:55:00.000+10:00</published><updated>2006-11-25T17:25:49.182+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Wing Chun'/><title type='text'>What is Wing Chun About?</title><content type='html'>For those of you who haven't heard of it, Wing Chun is a type of Kung Fu which was developed by a nun in China, a couple of hundred years ago. It focuses on technique rather than strength and, as such, is designed so that a smaller person can successfully fight a much larger person, and not get too tired out in the process. There's no messing around in Wing Chun, it's not like the movies where fights go on for ages. The aim is to take out your opponent rapidly and effectively.&lt;br /&gt;&lt;br /&gt;Here are the principles of Wing Chun, according to the masters:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;Economy of movement&lt;/li&gt;   &lt;li&gt;Directness&lt;/li&gt;   &lt;li&gt;Practicality&lt;/li&gt; &lt;/ul&gt;&lt;br /&gt;As a Wing Chun student of about 3 years (ie, by no means an expert), I think this means:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;Carefully angling legs and arms (the ultimate angle) at which point they are very strong and take very little energy to resist force applied by an adversary.&lt;/li&gt;   &lt;li&gt;Applying full body weight in every movement (eg, force going from shoulder, to elbow, to wrist in each movement). &lt;/li&gt;   &lt;li&gt;Relaxation of muscles to increase speed, decrease energy use and make it very difficult for your adversary to grab you.&lt;/li&gt;   &lt;li&gt;Redirection of strikes rather than blocking.&lt;/li&gt;   &lt;li&gt;Increasing force of your strikes through pivoting and stepping forward.&lt;/li&gt;   &lt;li&gt;Simplicity. Movements are simple with no adornments.&lt;/li&gt;   &lt;li&gt;Ruthlessness. Nowhere is off bounds to a strike when you're fighting for your life.&lt;/li&gt;   &lt;li&gt;Keeping your pelvic floor muscles lightly tensed so that your body works as a single unit.&lt;/li&gt;   &lt;li&gt;Every defence is also an attack.&lt;/li&gt;   &lt;li&gt;Stance is very important. From a strong stance, your blows have much more force as you do not move backwards when you strike. All your force goes into your opponent, rather than rocking you backwards.&lt;/li&gt;   &lt;li&gt;Upsetting the stance and breaking the guard of your opponent is a major goal. Once that's done, they are at your mercy, you can keep them off balance by constantly moving forward.&lt;/li&gt; &lt;/ul&gt;I really enjoy Wing Chun. Also, it keeps me fit, and I think I'm much better equipped to deal with any sort of physical aggression as a result of my training. I haven't tried any other school, but I'm happy with my current one, the &lt;a href="http://www.wingchun.com.au/"&gt;International Wing Chun Academy.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-115534831651168329?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/115534831651168329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=115534831651168329' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/115534831651168329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/115534831651168329'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2006/08/what-is-wing-chun-about.html' title='What is Wing Chun About?'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-115504636983820961</id><published>2006-08-08T23:36:00.000+10:00</published><updated>2006-11-25T18:33:35.023+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Book Reviews'/><category scheme='http://www.blogger.com/atom/ns#' term='Fiction'/><title type='text'>"Norwegian Wood" by Haruki Murakami</title><content type='html'>Norwegian Wood is an excellent novel. I finished reading it at lunch today, and haven't stopped thinking about it since. The novel is really subtle, and at the start, I wasn't immediately interested. However, once I got into it, I couldn't put it down. Toru, the narrator is so well developed in the novel that he seems almost like somebody I have met in real life. If you haven't read it, don't hesitate - start reading it right away! And don't read any more of this post.&lt;br /&gt;&lt;br /&gt;If you have read it, what do you think of the ending? I've read people suggesting that Toru committed suicide or similar, but I don't believe that that is the case. For one thing, he's got to live to 37 and catch a plane, as described at the start of the novel. I think the "dead centre" reference is due to Toru being dead centre of the "countless shapes of people walking by to nowhere", rather than having died. I think the ending is happy. Or maybe I just want it to be. Here's my interpretation. Toru is lost in the middle of nowhere. His old life was based around Naoko and Kizuki (plus Reiko as a link to them). They have all died or left. He is in the middle of nowhere. But Midori can rescue him from this. She is his anchor to reality and a new life. She will give his life direction and meaning - that's why he calls out to her again. If anyone in the novel is a symbol of life, it is Midori, and by calling out to her, I can only understand that Toru has chosen to keep living and to pursue happiness. Midori's silence is "the silence of all the misty rain in the world falling on all the new-mown lawns of the world". That's a positive image for me at least, pregnant with possibility.&lt;br /&gt;&lt;br /&gt;If only I could read Japanese, perhaps I would understand better.&lt;br /&gt;&lt;br /&gt;PS - Many thanks to my friend &lt;a href="http://maebmij.org/blog"&gt;Jim&lt;/a&gt; for lending this most excellent book to me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-115504636983820961?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/115504636983820961/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=115504636983820961' title='21 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/115504636983820961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/115504636983820961'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2006/08/norwegian-wood-by-haruki-murakami.html' title='&quot;Norwegian Wood&quot; by Haruki Murakami'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>21</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-115477152591427590</id><published>2006-08-05T19:50:00.000+10:00</published><updated>2006-11-25T17:33:21.352+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fiction'/><title type='text'>Some Random Writing</title><content type='html'>You've heard the expression 'All men are the same'? That's obviously not true. However, there are some things that most heterosexual men share. One of them is an inbuilt, natural response to stimuli, a certain bond that eats cultural differences for lunch, and that applies across all ages and languages. No matter what they pretend, a visit to a womans' clothing warehouse is a daunting experience for a man.&lt;br /&gt;&lt;br /&gt;Just look around. Sure, there are one or two women who look like they find shopping for clothes a chore. But the majority, see their rapt attention and concentration, circling the racks of clothes, looking, holding, touching, and cradling the cascading cloth against their bodies.&lt;br /&gt;&lt;br /&gt;Now, for the men. You can see four sitting around the room - two are reading newspapers, one is operating a PDA and the last is just staring at his legs, spacing out. Only men sit in the chairs. They are the loved ones and drivers. Their opinion is sometimes sought, but generally only out of politeness. The women already know what suits them best.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-115477152591427590?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/115477152591427590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=115477152591427590' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/115477152591427590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/115477152591427590'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2006/08/some-random-writing.html' title='Some Random Writing'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-115400545091334726</id><published>2006-07-27T22:53:00.000+10:00</published><updated>2006-11-25T17:33:44.805+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Soft Skills and Mind Hacks'/><category scheme='http://www.blogger.com/atom/ns#' term='Fiction'/><title type='text'>Some Interesting Quotes</title><content type='html'>"Imagine, Paul said to me once, that the present is simply a reflection of the future. Imagine that we spend our whole lives staring into a mirror with the future at our backs, seeing it only in the reflection of what is here and now. Some of us would begin to believe that we could see tomorrow better by turning around to look at it directly. But those who did, without realising it, would've lost the key to the perspective they once had. For the one thing they would never be able to see in it was themselves. By turning their backs on the mirror, they would become the one element of the future their eyes could never find...&lt;br /&gt;For years I've been determined to get on with my life by doggedly hunting down the future... It's a blind way to face life, a stance that lets the world pass you by, just as you think you're coming to grips with it."&lt;br /&gt;-- Extract from "The Rule of Four" by Ian Caldwell and Dustin Thomason&lt;br /&gt;&lt;br /&gt;"You know, for the longest time, I kept trying to make my life &lt;em&gt;easier&lt;/em&gt;. It wasn't until a month or so ago that I started to realize just how unbelievably fucking stupid that was. We're not here to have an &lt;strong&gt;easy life&lt;/strong&gt;.  We're not even here to do the things that we &lt;strong&gt;have to&lt;/strong&gt; do.  We are here to do the things we &lt;em&gt;choose&lt;/em&gt; to do, and sometimes we choose to do them &lt;em&gt;because&lt;/em&gt; they are challenging, not in spite of it.  Would you keep playing a video game that was trivial to beat?"&lt;br /&gt; -- &lt;a href="http://www.dirtsimple.org/"&gt;Phillip J. Eby&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;"Don't feel sorry for yourself. Only arseholes do that." (Nagasawa)&lt;br /&gt;"You try too hard to make life fit your way of doing things. If you don't want to spend time in an insane asylum, you have to open up a little more and let yourself go with life's natural flow... So stop what you're doing this minute and get happy. &lt;span style="font-style: italic;"&gt;Work&lt;/span&gt; at making yourself happy." (Reiko)&lt;br /&gt;-- from "Norwegian Wood" by Haruki Murakami&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-115400545091334726?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/115400545091334726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=115400545091334726' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/115400545091334726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/115400545091334726'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2006/07/some-interesting-quotes.html' title='Some Interesting Quotes'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-115400452444613201</id><published>2006-07-27T22:42:00.000+10:00</published><updated>2007-05-21T21:41:28.844+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><title type='text'>Engaged!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3136/3016/1600/DSCF0035.1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/3136/3016/200/DSCF0035.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Haven't had a chance to write on the blog for a little while, but Soosun and I are now engaged! We went away about two months ago to Palm Beach for a long weekend, and I proposed there... and she said yes :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-115400452444613201?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/115400452444613201/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=115400452444613201' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/115400452444613201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/115400452444613201'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2006/07/engaged.html' title='Engaged!'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-114843437548547256</id><published>2006-05-24T11:30:00.000+10:00</published><updated>2006-11-30T23:33:42.107+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Reviews'/><title type='text'>Book Review: UML Distilled</title><content type='html'>UML Distilled: A brief guide to the standard object modelling language&lt;br /&gt;(3rd Edition)&lt;br /&gt;by Martin Fowler&lt;br /&gt;&lt;br /&gt;UML Distilled is good. It is written carefully and concisely and has been heavily revised to cover UML 2. It is a opinionated book - it presents Martin Fowler's view of UML. This is a good thing. Fowler concentrates on the parts of UML that he has found widely used in the industry, and the most useful in his own work. Fowler is not bound by the UML specification, he also describes "non-normative" diagrams (ie, variations on UML which are not standard but widely used). Fowler often provides his own view on a particular diagram or component. For example, I've often wondered when to use aggregation rather than association in a class diagram. Fowler cleared this up for me:&lt;br /&gt;&lt;br /&gt;"Aggregation is strictly meaningless; as a result, I recommend that you ignore it in your own diagrams. If you see it in other people's diagrams, you'll need to dig deeper to find out what they mean by it. Different authors and teams use it for very different purposes."&lt;br /&gt;&lt;br /&gt;UML Distilled starts with an introduction about UML's history and aims, and then a rapid look at different development methodologies and where to fit UML into them.&lt;br /&gt;&lt;br /&gt;The core of the book covers the following diagrams/specs:&lt;br /&gt;&lt;br /&gt;Class Diagrams&lt;br /&gt;Sequence Diagrams&lt;br /&gt;Object Diagrams&lt;br /&gt;Package Diagrams&lt;br /&gt;Deployment Diagrams&lt;br /&gt;Use Cases&lt;br /&gt;State Machine Diagrams&lt;br /&gt;Activity Diagrams&lt;br /&gt;Communication Diagrams&lt;br /&gt;Composite Structures&lt;br /&gt;Component Diagrams&lt;br /&gt;Collaborations&lt;br /&gt;Interaction Overview Diagrams&lt;br /&gt;Timing Diagrams&lt;br /&gt;&lt;br /&gt;Class diagrams and sequence diagrams are covered in detail, the other diagrams more briefly. The book is quite short, but gives enough information on each topic to allow you to understand and draw the diagrams. At the end of each chapter, there is a helpful "where to find out more" section and a "when to use this type of diagram" section.&lt;br /&gt;&lt;br /&gt;There is also an appendix at the end of the book on changes between various versions of UML.&lt;br /&gt;&lt;br /&gt;The book is surprisingly easy to read. Fowler's style is clear and friendly and examples are well chosen.&lt;br /&gt;&lt;br /&gt;My only complaint is that perhaps the book could have been a little longer to allow a bit more detail on some of the diagram types. I would have liked to have read a little bit more on object diagrams in particular.&lt;br /&gt;&lt;br /&gt;I'd recommend the book to anyone who wants a rapid and concise introduction to or revision of UML 2.&lt;br /&gt;&lt;br /&gt;Rating: 9/10&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-114843437548547256?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/114843437548547256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=114843437548547256' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/114843437548547256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/114843437548547256'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2006/05/book-review-uml-distilled.html' title='Book Review: UML Distilled'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-114821163019873872</id><published>2006-05-21T21:03:00.000+10:00</published><updated>2006-11-25T17:27:28.641+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Soft Skills and Mind Hacks'/><title type='text'>Happiness</title><content type='html'>&lt;span style="font-size:100%;"&gt;A few weeks ago, I read an interesting article in the Sydney Morning Herald about happiness and also listened to a talk by the abbess of the &lt;/span&gt;&lt;span style="font-size:100%;"&gt;Nan Tien Buddhist temple near Wollongong. These have merged together in my mind as they covered a lot of the same ground. I'm going to summarise the points that seemed important to me, and also include my own take on some of the ideas.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A mental approach&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;* If you're happy, and your emotions are generally well balanced, you enjoy life more, other people enjoy your company more, and you're more productive.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;* Happiness is only in the mind.&lt;br /&gt;* In your life, there's a lot of things that happen to you. Some of these improve your life and some of them negatively effect you. &lt;/span&gt;&lt;span style="font-size:100%;"&gt;There's a lot of chance involved that you can't control.&lt;br /&gt;* Therefore, if you want to be happy, you can't rely on external events to make you happy.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;* However, your mind is your own, and it is the organ through which you interpret everything.&lt;br /&gt;* Since you are in control of your mind, you are in control of your interpretation of the events that happen to you.&lt;br /&gt;* Therefore, by actively shaping your own interpretation and view of the events that happen to you in your life, you can choose to achieve happiness.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;Completing goals&lt;/span&gt;&lt;br /&gt;Completing goals makes you feel good.. for a little while. But there is always more to achieve. This means that you spend almost all your time trying to achieve, and the actual time after achieving is in fact very short before you need to rush on to the next task. Therefore, you've got to enjoy the path, not just the goal. Thus, see the mental approach above.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;Ways that don't work&lt;/span&gt;&lt;br /&gt;* Achieving happiness through possessing things never works. No matter how much you have, you always get used to that amount, and want more. This means you're always seeking, and the achievement is almost an anti-climax.&lt;br /&gt;* No use comparing yourself with others to feel superior. Even if you are the "best" in your circle of acquaintances, it won't be long before you find someone who is "better". They'll always be people who are richer, faster, smarter or better than you in a particular area, so this approach will only lead to disappointment.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;Other Thoughts&lt;br /&gt;&lt;/span&gt;Since happiness is only in the mind, the reality of your situation is completely irrelevant. If you feel like you are in control of your life, you think you are achieving your goals and you think you are doing well, then you are.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-114821163019873872?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/114821163019873872/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=114821163019873872' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/114821163019873872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/114821163019873872'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2006/05/happiness.html' title='Happiness'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28462179.post-114817286633396513</id><published>2006-05-21T10:36:00.000+10:00</published><updated>2006-11-25T18:35:18.740+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><category scheme='http://www.blogger.com/atom/ns#' term='Soft Skills and Mind Hacks'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Reviews'/><title type='text'>Book Review: My Job Went to India, 52 Ways to Save Your Job</title><content type='html'>Full Title: My Job Went to India (And All I Got Was This Lousy Book), 52 Ways to Save your Job&lt;br /&gt;&lt;br /&gt;Author: Chad Fowler of the Pragmatic Programmers&lt;br /&gt;&lt;br /&gt;185 pages, Paperback&lt;br /&gt;&lt;br /&gt;An interesting book written by Chad Fowler, who spent 1.5 years in India hiring and managing an outsourced team of developers. The book's main focus is on how you can make yourself as, a developer, more valuable to your company / community so that your job is not outsourced. There are quite a lot of valuable and interesting ideas in the book for professional development, and "getting your name out there". The book also gives the reader some idea of what development is like in India, some tips and the pluses and minuses of outsourcing.&lt;br /&gt;&lt;br /&gt;The style of the book is conversational, and easy to read. I finished it in 2 days. I'd recommend it to developers wondering about outsourcing and looking for some tips on professional development.&lt;br /&gt;&lt;br /&gt;Rating: 8/10&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28462179-114817286633396513?l=jamescrisp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamescrisp.blogspot.com/feeds/114817286633396513/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28462179&amp;postID=114817286633396513' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/114817286633396513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28462179/posts/default/114817286633396513'/><link rel='alternate' type='text/html' href='http://jamescrisp.blogspot.com/2006/05/book-review-my-job-went-to-india-52_21.html' title='Book Review: My Job Went to India, 52 Ways to Save Your Job'/><author><name>James Crisp</name><uri>http://www.blogger.com/profile/00769345740252337538</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://crispdesign.net/img/blogimage.jpg'/></author><thr:total>8</thr:total></entry></feed>
