<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>my spinning plates</title>
	<atom:link href="http://trulsjor.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://trulsjor.wordpress.com</link>
	<description></description>
	<lastBuildDate>Sat, 03 Sep 2011 15:23:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='trulsjor.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/c76b7f95062151131e6ad2ca40c15b4e?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>my spinning plates</title>
		<link>http://trulsjor.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://trulsjor.wordpress.com/osd.xml" title="my spinning plates" />
	<atom:link rel='hub' href='http://trulsjor.wordpress.com/?pushpress=hub'/>
		<item>
		<title>JSR-310: A specification request to free Java from the date handling nightmare</title>
		<link>http://trulsjor.wordpress.com/2010/01/31/jsr-310-a-specification-request-to-free-java-from-the-date-handling-nightmare/</link>
		<comments>http://trulsjor.wordpress.com/2010/01/31/jsr-310-a-specification-request-to-free-java-from-the-date-handling-nightmare/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 18:16:10 +0000</pubDate>
		<dc:creator>trulsjor</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JSR-310]]></category>
		<category><![CDATA[rant]]></category>

		<guid isPermaLink="false">http://trulsjor.wordpress.com/?p=205</guid>
		<description><![CDATA[JSR-310 is important. A JSR isn&#8217;t that sexy, I know, but this one is worth fighting for. In order to set the context, here&#8217;s an old news flash: The date implementation in Java is a piece of crap. The Java community has ranted about this madness since JDK 1.0. Java doesn&#8217;t distinguish between date and [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trulsjor.wordpress.com&amp;blog=7882231&amp;post=205&amp;subd=trulsjor&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>JSR-310 is important. A JSR isn&#8217;t that sexy, I know, but this one is worth fighting for. </p>
<p>In order to set the context, here&#8217;s an old news flash:  The date implementation in Java is a <strong>piece of crap</strong>. <span id="more-205"></span></p>
<p>The Java community has ranted about this madness since JDK 1.0.  Java doesn&#8217;t distinguish between date and time, and manipulating dates is cumbersome and error-prone. The solution, introduced in JDK 1.1, was not to rewrite Date, but in order to ensure backward compatibility, simply wrap a Calendar around the Date object. Calendar itself introduced several more serious problems and consequently &#8211; even more frustration.  There is simply no concept of points in time, intervals, or durations. Even calculating the days between two dates <a href="http://forums.sun.com/thread.jspa?threadID=488668&amp;start=15&amp;tstart=0">is not trivial</a>.  It should be. Not the least, Calendar forces you into a random integer jungle when manipulating dates. Take your pick, you have lots to choose from: <code>HOUR_OF_DAY, HOUR, DAY_OF_MONTH, DATE, DAY_OF_WEEK, DAY_OF_WEEK_IN_MONTH</code>.</p>
<p>If that is not enough, the guilty parties responsible for designing the calendar has taken <a href="http://en.wikipedia.org/wiki/Edsger_W._Dijkstra">Edsger W. Dijkstra</a> perhaps a little too literally.</p>
<p><code>cal.set(Calendar.MONTH, 0)</code></p>
<p>&#8230;yields January. Yep, Calendar refers to months using a zero-based index. A long time ago, Dijkstra told all programmers to <a href="http://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html">count from zero</a>. While this is both true and important for counting and holding track of your internal indexing, it&#8217;s NOT for every single concept imaginable holding a number. The numeric representation of January is 1, and not 0. What internal index Calendar stores January at is not relevant. The offered solution is priceless. Let&#8217;s just provide yet MORE constants to choose from: <code>cal.set(Calendar.MONTH, Calendar.JANUARY)</code>. The int possibilities are endless. This sums up to:<br />
<code>cal.add/set/roll(Calendar.WELCOME_TO_THE_INT_JUNGLE, Calendar.WELCOME_TO_YET_ANOTHER_INT_JUNGLE);</code></p>
<p>To make matters even worse, Calendar has proved broken as well. For instance:</p>
<ul>
<li>Calendar is <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6178997">not thread safe or immutable</a>.</li>
<li>Leap seconds <a href="http://forum.java.sun.com/thread.jsp?thread=464726&amp;forum=4&amp;message=2345623">can change the date represented by a serialized object</a></li>
<li>Calendar method after doesn&#8217;t complain if you pass it a Date (or any other object&#8230;)  This <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6609391">bug report</a> is related to how before() and after() is broken. The bug is interesting enough, but the pure gold is found in the rejecting answer: &#8220;<em>It&#8217;s hard to change the implementation at this point.</em>&#8220;.</li>
</ul>
<p>What about the Date object? We are looking at a class having 4 out of its 6 constructors, and 20 of its 28 methods deprecated. Consequently, Date should be regarded as a deprecated class. The fact that it&#8217;s not, and to some extent <a href="http://www.xmission.com/~goodhill/dates/datedeprecation.htm">still necessary</a> is a clear indication that something is horribly wrong in the date handling department.  Ok, I guess I could go on and on about ranting about this. Do a quick search on <a href="http://www.google.com/search?client=opera&amp;rls=en&amp;q=java+calendar+date+broken&amp;sourceid=opera&amp;ie=utf-8&amp;oe=utf-8">java+calendar+date+broken</a>, and you&#8217;ll have enough reading material to keep busy for a while.</p>
<p>Along comes Joda Time. An early <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4340168">bug report</a> from 2000 asks for a replacement, but is rejected by Sun. The replacement the bug reporter asks for is <a href="http://joda-time.sourceforge.net/index.html">Joda Time</a>. Originating from <del datetime="2010-03-24T17:04:20+00:00">Google</del> SITA ATS Ltd (thanks, Ben!), Joda Time seeks to solve all challenges related to date manipulation encountered with the infamous Date and Calendar constructs.  Whereas there has been some criticism of Joda Time being too complicated, introducing around 100 new classes with several levels of inheritance and so on, Joda Time  has matured into a date and time API that forms the basis for JSR-310.</p>
<p>At JavaOne 2008, JSR-310 was <a href="http://developers.sun.com/learning/javaoneonline/j1sessn.jsp?sessn=TS-6578&amp;yr=2008&amp;track=javase">presented in detail</a>. Although no commitments  about inclusion was made, JSR-310 was suggested to be included in Java 7.  JSR-310 continues several of the same concepts introduced by Joda Time, instants, durations and intervals. In addition, the JSR-310 lead, Stephen Colebourne, is obviously the right man for the job. His previous project was, you guessed it &#8211;  JodaTime. Everything is not in its right place, however. In December 2008, Colebourne<a href="https://jsr-310.dev.java.net/servlets/ReadMsg?list=dev&amp;msgNo=1389"> announces a delay</a>. But Java 7 is delayed as well, and at <a href="http://devoxx.com/display/DV09/Home)">Devoxx 2009</a>, Sun announced the delay of Java 7 until Q4 2010 at the earliest. Stephen Colebourne noted November 30, 2009 that this delay could be <a href="https://jsr-310.dev.java.net/servlets/ReadMsg?list=dev&amp;msgNo=1835">the last opportunity for getting JSR-310 into Java 7</a>.</p>
<p>Someone should pay this guy to get this done. Right now, the future of date handling in Java 7 is dependent on Colebourne&#8217;s development in evenings and weekends. But everybody can help out &#8211;  read more <a href="https://jsr-310.dev.java.net/">here</a>.</p>
<p>JSR-310 is a specification request worth fighting for.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trulsjor.wordpress.com/205/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trulsjor.wordpress.com/205/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/trulsjor.wordpress.com/205/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/trulsjor.wordpress.com/205/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/trulsjor.wordpress.com/205/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/trulsjor.wordpress.com/205/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/trulsjor.wordpress.com/205/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/trulsjor.wordpress.com/205/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/trulsjor.wordpress.com/205/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/trulsjor.wordpress.com/205/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/trulsjor.wordpress.com/205/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/trulsjor.wordpress.com/205/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/trulsjor.wordpress.com/205/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/trulsjor.wordpress.com/205/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trulsjor.wordpress.com&amp;blog=7882231&amp;post=205&amp;subd=trulsjor&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trulsjor.wordpress.com/2010/01/31/jsr-310-a-specification-request-to-free-java-from-the-date-handling-nightmare/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a2b2cd729db70626b90eb49f3955fe59?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">trulsjor</media:title>
		</media:content>
	</item>
		<item>
		<title>Productive programmers bag of candy</title>
		<link>http://trulsjor.wordpress.com/2009/10/23/candy/</link>
		<comments>http://trulsjor.wordpress.com/2009/10/23/candy/#comments</comments>
		<pubDate>Fri, 23 Oct 2009 15:50:48 +0000</pubDate>
		<dc:creator>trulsjor</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[productive programmer]]></category>
		<category><![CDATA[smidig2009]]></category>

		<guid isPermaLink="false">http://trulsjor.wordpress.com/?p=183</guid>
		<description><![CDATA[The bag of candy is up for grabs! You can either get these tools by following the links below yourself, or as a single zipfile right here. Enjoy! The zipfile is identical to the one Jan-Erik and I handed out on a stick during the end of our lightning talk at the wonderful Smidig2009 conference [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trulsjor.wordpress.com&amp;blog=7882231&amp;post=183&amp;subd=trulsjor&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>The bag of candy is up for grabs! </strong></p>
<p>You can either get these tools by following the links below yourself, or as a single zipfile right  <a href="http://bit.ly/2Tmn35">here</a>. Enjoy! </p>
<p>The zipfile is identical to the one Jan-Erik and I handed out on a stick during the end of our lightning talk at the wonderful <a href="http://smidig2009.no/">Smidig2009 </a> conference earlier today. Thanks for a great conference!</p>
<p>Now, for the contents. Divided into categories,  the bag of candy consists of the following:<br />
<span id="more-183"></span><br />
<em>Category 0: Bread &amp; Butter</em><br />
Bread &amp; Butter is basically the stuff you need to get around. We didn&#8217;t originally intend to include any bread &amp; butter in the bag of candy, as much of the infrastructure essentials such as continuous integration (we would have chosen <a href="https://hudson.dev.java.net/">Hudson</a>) and version control (we would probably have chosen <a href="http://subversion.tigris.org/">Subversion</a>, or <a href="http://git-scm.com/">GIT </a>) is already given in our project.  However, we decided to include some of the smaller utils that, albeit not being <em>candy</em>, should be part of every productive programmers toolkit.</p>
<ul>
<li><a href="http://technet.microsoft.com/en-us/sysinternals/bb842062.aspx">SysInternalsSuite </a>-  a Swiss Army Knife that lets you manage, troubleshoot and diagnose your Windows systems and applications</li>
<li><a href="http://winscp.net/">WinSCP </a>- the best SCP and SFTP client for Windows. Works well with <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html">Putty</a>.</li>
<li><a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=c26efa36-98e0-4ee9-a7c5-98d0592d8c52&amp;DisplayLang=en">SyncToy </a>- Synching content between folders just got easy</li>
<li><a href="http://notepad-plus.sourceforge.net/">Notepad++</a> &#8211; Just a decent, free text editor.</li>
<li><a href="http://www.portablefreeware.com/?id=775">FSCapture </a>- Powerful, simple util for creating screen captures in a snap</li>
</ul>
<p><em>Category 1:  Structure your thoughts</em></p>
<ul>
<li><a href="http://freemind.sourceforge.net/wiki/index.php/Main_Page">FreeMind </a>- A great mind mapping tool. Is better aligned with the brain than a traditional todo-list</li>
</ul>
<p><em>Category 2: Effective launching and indexing</em></p>
<ul>
<li><a href="http://www.launchy.net/">Launchy </a>- A lot of competitors here, but Launchy is a nice one. A document or wiki page is no longer than a few keystrokes away.</li>
</ul>
<p><em>Category 3: Stay in the zone</em></p>
<ul>
<li><a href="http://download.microsoft.com/download/f/c/a/fca6767b-9ed9-45a6-b352-839afb2a2679/TweakUIPowertoySetup_ia64.exe">Tweak UI</a>- should have been included by default in Windows, but isn&#8217;t. No more annoying balloon tips!</li>
<li><a href="http://download.microsoft.com/download/whistler/Install/2/WXP/EN-US/CmdHerePowertoySetup.exe">Command window here</a>- another MS Powertoy that does pretty much what it says on the tin. Adds an option to the explorer context menu: Open Command Prompt Here.</li>
<li><a href="http://bluemars.org/clipx/">ClipX </a>- Unlimited clipboard and a visual representation of both text and images. Tip: Change the paste shortcut to Alt+v (Mac-like!)</li>
<li><a href="http://appsapps.info/instantboss.php">Instant Boss</a> &#8211; A neat timeboxing tool</li>
<li><a href="http://www.manictime.com/">Manic Time</a> &#8211; Monitor what you actually spend your time on</li>
<li><a href="http://www.donationcoder.com/Software/Skrommel/#Ghoster">Ghoster </a>- focuses the active window and dims everything else.</li>
</ul>
<p><em>Category 4: Automate what you do often</em></p>
<ul>
<li><a href="http://www.autohotkey.com/">AutoHotKey </a>- a great all purpose tool for writing powerful macros real easy</li>
<li><a href="http://www.cygwin.com/">Cygwin </a>- Almost bread and butter, a Linux like environment to Windows.</li>
<li><a href="http://seleniumhq.org/projects/ide/">Selenium IDE</a> &#8211;  Firefox plugin that provides an integrated development environment for Selenium tests.</li>
</ul>
<p><em>Category 5: Effective developer tools</em></p>
<ul>
<li><a href="http://getfirebug.com/">Firebug </a>- A FireFox plugin that lets you inspect CSS, DOM, javascript  and more</li>
<li><a href="http://jadclipse.sourceforge.net/wiki/index.php/Main_Page">JADClipse </a>- A Eclipse plugin that decompiles class files, seamlessly integrated in Eclipse</li>
<li><a href="http://www.mousefeed.com/">Mousefeed </a>- Theres a keyboard shortcut for everything in Eclipse. Mousefeed forces you to learn and use them.</li>
<li><a href="http://javadiff.sourceforge.net/">JDiff </a>- Ever needed to compare two versions of an API? JDiff presents the diff in a Javadoc-ish style</li>
<li><a href="http://logging.apache.org/chainsaw/index.html">Apache Chainsaw</a> &#8211; A GUI based log viewer &#8211;  gives structure to that gigantic logfile, and live logging too!</li>
</ul>
<p><strong>The slides from Smidig2009</strong><br />
Bare in mind, these are in Norwegian!</p>
<iframe src='http://www.slideshare.net/slideshow/embed_code/2319731' width='600' height='492'></iframe>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trulsjor.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trulsjor.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/trulsjor.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/trulsjor.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/trulsjor.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/trulsjor.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/trulsjor.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/trulsjor.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/trulsjor.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/trulsjor.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/trulsjor.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/trulsjor.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/trulsjor.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/trulsjor.wordpress.com/183/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trulsjor.wordpress.com&amp;blog=7882231&amp;post=183&amp;subd=trulsjor&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trulsjor.wordpress.com/2009/10/23/candy/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a2b2cd729db70626b90eb49f3955fe59?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">trulsjor</media:title>
		</media:content>
	</item>
		<item>
		<title>Calling all productive programmers &#8211; present your weapons of choice!</title>
		<link>http://trulsjor.wordpress.com/2009/09/14/calling-all-productive-programmers/</link>
		<comments>http://trulsjor.wordpress.com/2009/09/14/calling-all-productive-programmers/#comments</comments>
		<pubDate>Mon, 14 Sep 2009 19:36:16 +0000</pubDate>
		<dc:creator>trulsjor</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[free software]]></category>
		<category><![CDATA[JavaZone]]></category>
		<category><![CDATA[productive programmer]]></category>

		<guid isPermaLink="false">http://trulsjor.wordpress.com/?p=134</guid>
		<description><![CDATA[As a consequence of attending  Neal Fords presentation &#8220;The productive programmer&#8221; at JavaZone, Audun wrote an excellent summary (in Norwegian) at the Capgemini technology blog. Then, Audun, Jan-Erik and I decided to assemble a productive-tuned collection of free software, in order to help our project to be more efficient. (Of course, all team members could [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trulsjor.wordpress.com&amp;blog=7882231&amp;post=134&amp;subd=trulsjor&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>As a consequence of attending  <a href="http://nealford.com">Neal Fords</a> presentation  <a href="http://nealford.com/downloads/presentations/The_Productive_Programmer_-_Mechanics_(Neal_Ford).pdf">&#8220;The productive programmer&#8221; </a> at <a href="http://jz09.java.no/">JavaZone</a>, <a href="http://twitter.com/audunw">Audun</a> wrote an <a href="http://www.no.capgemini.com/teknologiblogg/2009/09/javazone_the_productive_progra.php">excellent summary</a> (in Norwegian) at the <a href="http://www.no.capgemini.com/teknologiblogg/">Capgemini technology blog</a>. Then, Audun, <a href="http://twitter.com/janerikcarlsen">Jan-Erik</a> and I decided to assemble a productive-tuned collection of free software, in order to help our project to be more efficient. (Of course, all team members could have done this exercise by themselves, but it would have been a rather cumbersome one, because we don&#8217;t have access to internet from our dev machines.)</p>
<p>Therefore, we are calling out for help with assembling a candy bag for productive programmers, using Eclipse on Windows XP. So far, we have this list:<br />
<span id="more-134"></span></p>
<table style="height:63px;" border="0" width="506">
<thead>
<tr>
<th>Program</th>
<th>Description</th>
<th>Status</th>
<th>Kudos to</th>
</tr>
</thead>
<tbody></tbody>
<tbody>
<tr>
<td><a href="http://www.nakka.com/soft/clcl/index_eng.html">CLCL</a></td>
<td>Unlimited clipboard</td>
<td>Suggested</td>
<td><a href="http://nealford.com/downloads/presentations/The_Productive_Programmer_-_Mechanics_(Neal_Ford).pdf">The productive programmer presentation </a></td>
</tr>
<tr>
<td><a href="http://www.anappaday.com/downloads/DAY10-JediConcentrate/JediConcentrate.zip">Jedi Concentrate</a></td>
<td>Screen dimming</td>
<td>Suggested</td>
<td><a href="http://nealford.com/downloads/presentations/The_Productive_Programmer_-_Mechanics_(Neal_Ford).pdf">The productive programmer presentation</a></td>
</tr>
<tr>
<td><a href="http://download.microsoft.com/download/whistler/Install/2/WXP/EN-US/CmdHerePowertoySetup.exe">Command window here</a></td>
<td><a href="http://www.microsoft.com/windowsxp/downloads/powertoys/xppowertoys.mspx">Win XP Powertoys</a></td>
<td>Suggested</td>
<td><a href="http://nealford.com/downloads/presentations/The_Productive_Programmer_-_Mechanics_(Neal_Ford).pdf">The productive programmer presentation </a></td>
</tr>
<tr>
<td><a href="http://download.microsoft.com/download/f/c/a/fca6767b-9ed9-45a6-b352-839afb2a2679/TweakUIPowertoySetup_ia64.exe">Tweak UI</a></td>
<td>Yet another <a href="http://www.microsoft.com/windowsxp/downloads/powertoys/xppowertoys.mspx">powertoy</a>, allowing for disabling those annoying ballon tips and more</td>
<td>Suggested</td>
<td><a href="http://nealford.com/downloads/presentations/The_Productive_Programmer_-_Mechanics_(Neal_Ford).pdf">The productive programmer presentation </a></td>
</tr>
<tr>
<td><a href="http://www.mousefeed.com/">Mousefeed</a> for Eclipse</td>
<td>Helps/forces you to prefer keyboard shortcuts over mouse point and click.</td>
<td>Suggested</td>
<td><a href="http://nealford.com/downloads/presentations/The_Productive_Programmer_-_Mechanics_(Neal_Ford).pdf">The productive programmer presentation </a></td>
</tr>
<tr>
<td><a href="http://seleniumhq.org/projects/ide/">Selenium IDE</a></td>
<td>An integrated development environment for Selenium tests.</td>
<td>Suggested</td>
<td>Janne Antonsen</td>
</tr>
<tr>
<td><a href="http://www.launchy.net/">Launchy</a></td>
<td>App launching</td>
<td>Suggested</td>
<td><a href="http://blog.f12.no/wp/">Anders Sveen</a></td>
</tr>
<tr>
<td><a href="http://appsapps.info/instantboss.php">Instant Boss</a></td>
<td>Utilizing Merlin Mann’s (10+2)*5 system (thanks April!)</td>
<td>Suggested</td>
<td><a href="http://blog.f12.no/wp/">Anders Sveen</a> , <a href="http://cranialsoup.blogspot.com/">April Russo</a> (developer!)</td>
</tr>
<tr>
<td><a href="http://www.manictime.com/">Manic Time</a></td>
<td>For monitoring what we are actually spending our time on.</td>
<td>Suggested</td>
<td><a href="http://blog.f12.no/wp/">Anders Sveen</a></td>
</tr>
<tr>
<td><a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=c26efa36-98e0-4ee9-a7c5-98d0592d8c52&amp;DisplayLang=en">Sync Toy</a></td>
<td>For all our synching needs</td>
<td>Suggested</td>
<td><a href="http://blog.f12.no/wp/">Anders Sveen</a></td>
</tr>
<tr>
<td><a href="http://www.cygwin.com/">Cygwin</a></td>
<td>For all our grep, sed, find++ needs on Windows.</td>
<td>In place</td>
<td>N/A</td>
</tr>
<tr>
<td><a href="http://notepad-plus.sourceforge.net/uk/site.htm">Notepad++</a></td>
<td>A decent, capable, open source and free text editor</td>
<td>In place</td>
<td>N/A</td>
</tr>
<tr>
<td><a href="http://winscp.net/">WinSCP</a></td>
<td>For all our SSH and FTP needs</td>
<td>In place</td>
<td>N/A</td>
</tr>
<tr>
<td>Neural network</td>
<td>Usually the thing supported on top of your shoulders</td>
<td>Usually underrepresented in software development</td>
<td>The creator</td>
</tr>
<tr>
<td><a href="http://winmerge.org/">WinMerge</a></td>
<td>Visual and colored diff, useful for comparing stuff on the fly</td>
<td>Suggested</td>
<td>Christian Larsen</td>
</tr>
<tr>
<td><a href="http://freemind.sourceforge.net/wiki/index.php/Main_Page">FreeMind</a></td>
<td>Free mind mapping software</td>
<td>Suggested</td>
<td><a href="http://www.no.capgemini.com/teknologiblogg/">Steinar Årdal</a></td>
</tr>
<tr>
<td><a href="https://hudson.dev.java.net/">Hudson</a></td>
<td>Continuous integration</td>
<td>Suggested</td>
<td><a href="http://www.no.capgemini.com/teknologiblogg/">Bent Are Melsom</a></td>
</tr>
<tr>
<td><a href="http://wiki.hudson-ci.org/display/HUDSON/Status+Monitor+Plugin">Hudson Status Monitor Plugin</a></td>
<td>Shows the state of selected jobs visually</td>
<td>Suggested</td>
<td><a href="http://www.no.capgemini.com/teknologiblogg/">Bent Are Melsom</a></td>
</tr>
<tr>
<td><a href="http://www.hyperionics.com/files/index.asp">Filebox Extender</a></td>
<td>Custom menu Explorer windows (see comment#5)</td>
<td>Suggested</td>
<td><a href="http://cranialsoup.blogspot.com/">April Russo</a></td>
</tr>
<tr>
<td><a href="http://cybernetnews.com/cybernotes-our-best-freeware-find-yet-taskbarex/">TaskBarEx</a></td>
<td>Drag buttons off the taskbar and drop them anywhere, right on your desktop (see comment#5)</td>
<td>Suggested</td>
<td><a href="http://cranialsoup.blogspot.com/">April Russo</a></td>
</tr>
<tr>
<td><a href="http://hp.vector.co.jp/authors/VA013430/program/taskbarpp/main.html">Taskbar++</a></td>
<td>Rearrange the open application buttons on your taskbar (Japanese link, see comment#5 for instructions)</td>
<td>Suggested</td>
<td><a href="http://cranialsoup.blogspot.com/">April Russo</a></td>
</tr>
<tr>
<td><a href="http://www.donationcoder.com/Software/Mouser/findrun/index.html">Find and run Robot</a></td>
<td>A more capable app launcher than Launchy (see comment#5)</td>
<td>Suggested</td>
<td><a href="http://cranialsoup.blogspot.com/">April Russo</a></td>
</tr>
<tr>
<td><a href="http://appsapps.info/lacunalauncher.php">LacunaLauncher</a></td>
<td>Application  launcher controller(see comment#5)</td>
<td>Suggested</td>
<td><a href="http://cranialsoup.blogspot.com/">April Russo</a> (developer!)</td>
</tr>
<tr>
<td><a href="http://appsapps.info/todolist.php">ToDoList</a></td>
<td>ToDo list &#8211; useful and productive!(see comment#5)</td>
<td>Suggested</td>
<td><a href="http://cranialsoup.blogspot.com/">April Russo</a>(developer!)</td>
</tr>
<tr>
<td><a href="http://technet.microsoft.com/en-us/sysinternals/bb842062.aspx">SysInternalsSuite</a></td>
<td>Swiss Army Knife that lets you manage, troubleshoot and diagnose your Windows systems and applications</td>
<td>Suggested</td>
<td><a href="http://www.twitter.com/pnyheim">Paul Nyheim</a></td>
</tr>
<tr>
<td><a href="http://www.jdiff.org/">JDiff</a></td>
<td>A very handy tool for comparing Java API’s between different versions!</td>
<td>Suggested</td>
<td><a href="http://twitter.com/janerikcarlsen">Jan-Erik Carlsen</a></td>
</tr>
<tr>
<td><a href="http://jadclipse.sourceforge.net/wiki/index.php/Main_Page">JadClipse</a></td>
<td>Eclipse plugin for <a href="http://www.varaneckas.com/jad">JAD</a> (Java Decompiler) &#8211; useful for investigating what that class file is all about.</td>
<td>Suggested</td>
<td>Truls</td>
</tr>
<tr>
<td><a href="http://moreunit.sourceforge.net/">MoreUnit Eclipse plugin</a></td>
<td>Eclipse plugin  to simplify creation of JUnit tests and switching between test and implementation</td>
<td>Suggested</td>
<td><a href="http://twitter.com/oyvindma">Øyvind M.A</a></td>
</tr>
<tr>
<td><a href="http://subclipse.tigris.org/">Subclipse</a></td>
<td>Subversion plugin for Eclipse </td>
<td>Suggested</td>
<td><a href="http://oyvindhauge.com/">Øyvind Hauge</a></td>
</tr>
</tbody>
</table>
<p><strong>Productive programmers out there:</strong> Present your weapons of choice <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trulsjor.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trulsjor.wordpress.com/134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/trulsjor.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/trulsjor.wordpress.com/134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/trulsjor.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/trulsjor.wordpress.com/134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/trulsjor.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/trulsjor.wordpress.com/134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/trulsjor.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/trulsjor.wordpress.com/134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/trulsjor.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/trulsjor.wordpress.com/134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/trulsjor.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/trulsjor.wordpress.com/134/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trulsjor.wordpress.com&amp;blog=7882231&amp;post=134&amp;subd=trulsjor&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trulsjor.wordpress.com/2009/09/14/calling-all-productive-programmers/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a2b2cd729db70626b90eb49f3955fe59?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">trulsjor</media:title>
		</media:content>
	</item>
		<item>
		<title>There&#8217;s a gap in between, there&#8217;s a gap where we meet</title>
		<link>http://trulsjor.wordpress.com/2009/09/12/theres-a-gap-in-between-theres-a-gap-where-we-meet/</link>
		<comments>http://trulsjor.wordpress.com/2009/09/12/theres-a-gap-in-between-theres-a-gap-where-we-meet/#comments</comments>
		<pubDate>Fri, 11 Sep 2009 23:36:27 +0000</pubDate>
		<dc:creator>trulsjor</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JavaZone]]></category>

		<guid isPermaLink="false">http://trulsjor.wordpress.com/?p=124</guid>
		<description><![CDATA[I&#8217;ve already sent kudos to JavaBin for putting on a fantastic JavaZone this year on Twitter, but the 140 character limit is sometimes just a few characters too few. I mean, JavaZone is always great, but this year there was just something special to it. It was the high quality of the presentations, with a [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trulsjor.wordpress.com&amp;blog=7882231&amp;post=124&amp;subd=trulsjor&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p> I&#8217;ve already sent kudos to <a href="http://www.java.no">JavaBin</a> for putting on a fantastic <a href="http://jz09.java.no/">JavaZone</a> this year on <a href="http://twitter.com/trulsjor">Twitter</a>, but the <a href="http://arewold.wordpress.com/2009/04/21/twitter-the-good-and-bad/">140 character limit is sometimes just a few characters too few</a>.  </p>
<p>I mean, JavaZone is always great, but this year there was just something special to it.  It was the high quality of the presentations, with a mix of <a href="http://javazone.no/incogito09/events/JavaZone%202009/sessions/Strategic%20Design%20&amp;%20Responsibility%20Traps">world</a> <a href="http://javazone.no/incogito09/events/JavaZone%202009/sessions/What's%20new%20in%20Spring%203.0">famous</a> and <a href="http://javazone.no/incogito09/events/JavaZone%202009/sessions/Rules%20engines%20vs%20domain%20logic">home</a> <a href="http://javazone.no/incogito09/events/JavaZone%202009/sessions/Agile%20Application%20Management">grown</a>  <a href="http://javazone.no/incogito09/events/JavaZone%202009/sessions/Pomodoro-teknikken%20for%20softwareutvikling">speakers</a>. It was the wave of optimism that rolled across the conference,  despite the crappy 2009 economy. It was the amount of beer floating around at night.  It was seeing all those really great people again that I meet far too seldom. Luckily, JavaZone is this gap in between all things. So, once again, thanks!</p>
<p>There are different places on the net to go look for JavaZone material. Tandberg recorded most of the presentations, and made them available <a href="http://tcs.java.no/">here</a> . The foil sets of the Capgemini presentations  can be found  <a href="http://www.slideshare.net/anderssv/javazone2009-rules-engine-vs-domain-logic">here</a> and <a href="http://www.slideshare.net/anderssv/javazone2009-smidig-utrulling">here</a> (Anders has written some follow ups at his <a href="http://blog.f12.no/wp/2009/09/11/javazone-2009-over/">blog</a> on the latter). </p>
<p>Oh, and we have summarized some of the presentations at the <a href="http://www.no.capgemini.com/teknologiblogg/">Capgemini technology blog</a> as well!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trulsjor.wordpress.com/124/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trulsjor.wordpress.com/124/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/trulsjor.wordpress.com/124/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/trulsjor.wordpress.com/124/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/trulsjor.wordpress.com/124/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/trulsjor.wordpress.com/124/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/trulsjor.wordpress.com/124/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/trulsjor.wordpress.com/124/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/trulsjor.wordpress.com/124/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/trulsjor.wordpress.com/124/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/trulsjor.wordpress.com/124/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/trulsjor.wordpress.com/124/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/trulsjor.wordpress.com/124/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/trulsjor.wordpress.com/124/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trulsjor.wordpress.com&amp;blog=7882231&amp;post=124&amp;subd=trulsjor&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trulsjor.wordpress.com/2009/09/12/theres-a-gap-in-between-theres-a-gap-where-we-meet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a2b2cd729db70626b90eb49f3955fe59?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">trulsjor</media:title>
		</media:content>
	</item>
		<item>
		<title>Spring AOP &#8211; the silver bullet for all our cross-cutting concerns?</title>
		<link>http://trulsjor.wordpress.com/2009/08/10/spring-aop-the-silver-bullet/</link>
		<comments>http://trulsjor.wordpress.com/2009/08/10/spring-aop-the-silver-bullet/#comments</comments>
		<pubDate>Mon, 10 Aug 2009 13:08:12 +0000</pubDate>
		<dc:creator>trulsjor</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Aspects]]></category>
		<category><![CDATA[Dynamic proxy]]></category>
		<category><![CDATA[Spring AOP]]></category>

		<guid isPermaLink="false">http://trulsjor.wordpress.com/?p=12</guid>
		<description><![CDATA[Last week, I got the following challenge at work: How to monitor the average response time of every service call? There are several cool monitoring tools out there, such as JAMon, but for now, it is OK to only use some sort of logging mechanism. What is not OK, however, is to clutter the code [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trulsjor.wordpress.com&amp;blog=7882231&amp;post=12&amp;subd=trulsjor&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Last week, I got the following challenge at work: <em>How to monitor the average response time of every service call? There are several cool monitoring tools out there, such as <a href="http://jamonapi.sourceforge.net/">JAMon</a>, but for now, it is OK to only use some sort of logging mechanism. What is not OK, however, is to clutter the code base with logging statements scattered around every service call.</em></p>
<p><em><span id="more-12"></span></em><strong>The motivation for AOP</strong></p>
<p>The application I&#8217;m working on shares many of the characteristics of a traditionally designed object oriented system. When designing such a system, an early, crucial step is to decompose that system into smaller components. The motivation for this decomposition is to separate concerns, encapsulating and modulating the design, as well as identify the layers of the application. Our application has a typical outcome of that process: A presentation layer, a business logic layer (where the domain model resides) and a data access / data base layer.</p>
<p>Back to the challenge: If the code for handling logging the average response time for every service call is to be included in all components executing service calls, the logging code will typically be tangled with other code in those components. Such a logging mechanism cannot be decomposed to a single object or component &#8211; it is a concern that cannot be separated. Logging is a typical cross-cutting concern, a concern that span multiple objects or components in different layers. Other examples of cross cutting concerns include transaction management and performance profiling. All of which are possible to do in the object oriented programming paradigm, albeit not straight forward. And not to forget, in the traditional OOP way of thinking, we are looking at a significant amount of work writing that ugly code. Wouldn&#8217;t it be neat if there was possible to modularize those cross-cutting concerns?</p>
<p>As it turns out, it is. Everybody stand back, aspects to the rescue! Aspect Oriented Programming (AOP) is designed to do just that &#8211; letting you modularize cross cutting concerns and weave them into the application at a later point, either compile-time or run-time. Compile time weaving is perhaps the most powerful of the two approaches. This approach manipulates the byte-code, meaning in effect that what you see in your files is not exactly what you get. Your compiled class file is a slightly altered version of your java source file, because the aspect are weaved with your code when compiled. Because compile time weaving alters the compile process, the run-time weaving approach has emerged as a desirable alternative. This will not alter the compile process, but instead put a proxy before the code that is to be advised runtime.</p>
<p>My current project relies on <a title="Spring" href="http://www.springsource.org/">Spring</a>, and luckily for us (and me!), Spring has a built in AOP infrastructure out of the box.<br />
<strong></strong></p>
<p><strong>Spring AOP</strong></p>
<p>Like all Spring things, it is very well <a title="documented" href="http://static.springsource.org/spring/docs/2.0.x/reference/index.html">documented</a>. Most of the following content can be found in this documentation. As just stated, Spring AOP takes the run-time weaving approach to AOP. Like most Spring things, it is pretty easy to set up, but remember, what happens under the hood is that Spring generates some kind of proxy for you runtime. (As already mentioned, transaction management is a typical example of a cross-cutting concern. If your application is using the transaction management offered by Spring your application will in fact already be using dynamic AOP proxies behind the scenes.)</p>
<p>The proxy generated by Spring is either a dynamic Java proxy or a <a title="CGLib" href="http://cglib.sourceforge.net/">CGLib</a> proxy.  So what&#8217;s the difference? The dynamic Java Proxy approach is the default choice. The proxy generated run time by Spring implements the same interface that the advised service implements. This approach is listed by Spring as the preferred one, because it encourages coding against interfaces. But that implies that there is only possible to advise the methods defined in the interface implemented by the service.</p>
<p>What if you want to intercept a method that is not listed in this interface, or even worse, what if your class doesn&#8217;t implement an interface at all? Not to worry though,  just tell Spring to unleash it’s CGLib abilities!<br />
Just set the <tt>proxy-target-class="true"</tt> to true in the aop config, and you&#8217;re ready to go. Spring will in this case create a proxy that is an extension of your advised class, NOT an implementation of the same interface that your service implements. In effect, all methods, including those methods not defined in any interface to be intercepted.</p>
<p>Either way, Spring AOP will behave along the lines I have sketched here:</p>
<p><a href="http://trulsjor.files.wordpress.com/2009/07/aop-002.png"><img src="http://trulsjor.files.wordpress.com/2009/07/aop-002.png?w=510&#038;h=382" alt="Spring AOP Proxy example" width="510" height="382" /></a></p>
<p>In the sketch, I have a instance of <em>FooService</em> somewhere, called <em>fooService</em>. When I invoke <em>foo()</em> on that instance, I expect foo behaviour from <em>FooService</em>. Which, fortunately, I will get also in the Spring AOP world, albeit not straight away; Spring will create a proxy of the FooService at runtime, so that when I invoke foo on <em>fooService</em>, the bean loaded is actually a proxy. The Spring generated proxy provides hooks for the advice. Pretty neat. The most general advice to create in Spring AOP is an around advice, allowing for doing something both before and after proceeding. Yet there exists several <a href="http://static.springsource.org/spring/docs/2.0.x/reference/aop.html#aop-advice">others</a>, and for the record, the Spring team recommends to use the least powerful advice type that solves your task. </p>
<p>But back to the challenge: The around advice fits like a glove for monitoring the average time of service calls! Before proceeding with the <em>foo()</em> call, just grab the current timestamp. And after <em>foo() </em>has completed, take yet another timestamp, and log the difference between the two timestamps.</p>
<p><strong>Limitations of the proxy-based approach?</strong></p>
<p>At this time, Spring AOP looked like a proper silver bullet to target all our cross cutting concerns. Then another challenge emerged: Let&#8217;s monitor the execution time of <em>every</em> method! This seemed trivial at first, being able to solve the challenge of logging response time for service calls.</p>
<p>It turned out to be quite a big difference between the two however &#8211; they differ in how the advised methods are invoked. In the first challenge, the advised methods are always called from an external caller, so that a proxy could be placed ahead of the advised method. In the second challenge, the advised method could be called internally. Consult the sketch, and imagine that we wanted to monitor the execution of a method bar() that is called from foo():</p>
<p><a href="http://trulsjor.files.wordpress.com/2009/07/fooservice-003.png"><img src="http://trulsjor.files.wordpress.com/2009/07/fooservice-003.png?w=510&#038;h=382" alt="fooservice" width="510" height="382" /></a></p>
<p>The <em>fooService</em> instance holds a reference to a FooService proxy. The call <em>fooService.foo() </em>will be intercepted by the advice, but when the target object, the real <em>FooService</em>, is reached, any further method calls cannot be intercepted. The reason is that these calls are not invoked on the proxy, but on the <em>this</em> reference. In short, calls to self cannot be intercepted by a proxy.</p>
<p>Spring AOP offers another AOP syntax &#8211; @AspectJ annotations. This allows for more options for advising, but because Spring is still in charge of things, the weaving is still not done compile-time, but run-time. Meaning, we are still dealing with proxies. Meaning, we still cannot monitor such internal method invocations.</p>
<p>The only solution  I&#8217;ve found to this challenge is to introduce an aspect weaver that can weave compile time. But AspectJ is a stranger to me and the rest of the project, and the project is not to happy about taking the risk of introducing something that alters the compile process.  Do you have a solution for for advising class internal method calls without introducing an compile-time aspect weaver such as AspectJ?</p>
<p>Please let me know!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trulsjor.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trulsjor.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/trulsjor.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/trulsjor.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/trulsjor.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/trulsjor.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/trulsjor.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/trulsjor.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/trulsjor.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/trulsjor.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/trulsjor.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/trulsjor.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/trulsjor.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/trulsjor.wordpress.com/12/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trulsjor.wordpress.com&amp;blog=7882231&amp;post=12&amp;subd=trulsjor&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trulsjor.wordpress.com/2009/08/10/spring-aop-the-silver-bullet/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a2b2cd729db70626b90eb49f3955fe59?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">trulsjor</media:title>
		</media:content>

		<media:content url="http://trulsjor.files.wordpress.com/2009/07/aop-002.png" medium="image">
			<media:title type="html">Spring AOP Proxy example</media:title>
		</media:content>

		<media:content url="http://trulsjor.files.wordpress.com/2009/07/fooservice-003.png" medium="image">
			<media:title type="html">fooservice</media:title>
		</media:content>
	</item>
		<item>
		<title>A profession specific vocabulary built by metaphors</title>
		<link>http://trulsjor.wordpress.com/2009/08/02/metaphors/</link>
		<comments>http://trulsjor.wordpress.com/2009/08/02/metaphors/#comments</comments>
		<pubDate>Sun, 02 Aug 2009 18:43:33 +0000</pubDate>
		<dc:creator>trulsjor</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Golden hammer]]></category>
		<category><![CDATA[Metaphor]]></category>
		<category><![CDATA[Silver bullet]]></category>
		<category><![CDATA[Technical debt]]></category>

		<guid isPermaLink="false">http://trulsjor.wordpress.com/?p=43</guid>
		<description><![CDATA[When a physician diagnose a patient with a certain condition, that condition has a formally defined name. The Latin words used to describe a medical condition is unfeasible to understand for most people (and I suspect physicians is quite happy with that), but the physician&#8217;s colleagues will quickly understand. The reason is of course that [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trulsjor.wordpress.com&amp;blog=7882231&amp;post=43&amp;subd=trulsjor&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>When a physician diagnose a patient with a certain condition, that condition has a formally defined name. The Latin words used to describe a medical condition is unfeasible to understand for most people (and I suspect physicians is quite happy with that), but the physician&#8217;s colleagues will quickly understand. The reason is of course that they share the same vocabulary. The need to be able to communicate effectively is perhaps the biggest motivation for creating a such  <em> profession specific vocabulary</em>, but it also comes in handy when building profession culture. Your own tribal language makes you look cool.<br />
<span id="more-43"></span><br />
Information technology has of course also developed a profession specific vocabulary. We don&#8217;t have a formal language to describe conditions in the same manner as physicians, and problems and their proposed solutions are, with the exception of <a href="http://en.wikipedia.org/wiki/Design_pattern_(computer_science)">design patterns</a>,  seldom formalized.  Instead we enjoy to use cool buzzwords and even cooler metaphors to describe them. Perhaps not very surprising &#8211; taking into account the abstract nature of the the product we deliver.  A program doesn&#8217;t have any physical weight (unless printed, that is!) . Yet, we talk about <a href="http://www.springsource.org/">lightweight</a> (as opposed to <a href="http://java.sun.com/products/ejb/">heavyweight</a>) frameworks. A program is also of course odorless, yet we talk about <a href="http://c2.com/cgi/wiki?CodeSmell">code smell.</a> Because we work almost entirely with abstractions, metaphors is of great use when it comes to talk (or write) about them. Our metaphors serves the same purpose to us as Latin definitions does to physicians &#8211;  when everyone in your tribe knows what the Latin definition/metaphor means, we can communicate and work more effectively. Plus, it makes us look cool.</p>
<p><strong>Golden hammers and silver bullets</strong></p>
<p>I have noted some amusing challenges with our metaphors, however. The first comes to play is when there exists two <em>almost</em> identical metaphors that describe <em>almost</em> the same problem. For example, we talk about <a href="http://en.wikipedia.org/wiki/Golden_hammer">golden hammers</a> and <a href="http://en.wikipedia.org/wiki/Silver_bullet">silver bullets</a>, two metaphors that are frequently used to describe the same scenario: There is a problem. Do we have already have a technology/tool that we know and love, and looks pretty suitable to solved this problem? Or what about this new, cool technology/tool that probably can solve all such problems? The latter question maps to the silver bullet metaphor. It&#8217;s used to describe the <em>expectation</em> of a technology/tool to solve all problems related to a long, prevailing problem domain. The first question maps to the golden hammer metaphor &#8211; it&#8217;s used to the describe the overuse of an already known technology/tool to solve problems the tool was not designed to solve. Or quoting Abraham Harold Maslow from his book  <a href="http://books.google.com/books?id=3_40fK8PW6QC&amp;printsec=frontcover#PPT7,M1">The Psychology of Science</a>: <em>&#8220;When the only tool you have is a hammer, it is tempting to treat everything as if it were a nail&#8221;</em>. The difference between the two is not hard to spot when compared this way, but in real life, these metaphors are often mixed together. I even heard about a silver hammer once.</p>
<p><strong>Technical debt interpretation 1</strong></p>
<p>The other challenge becomes apparent when one metaphor describes two different things. A famous metaphor is developed by <a href="http://c2.com/~ward/">Ward Cunningham</a> and called “<em>Technical debt</em>”. When talking about technical debt, most people talk about the cost associated with choosing a quick and dirty solution over a cleaner one. In my current project, for example, something must frequently be added to, or fixed in the application. Let&#8217;s say there are two ways to do it: The first lets us solve the problem quick, but we must cut some corners here and there. The second results in a better, cleaner design, but takes a bit longer. Which one to choose?</p>
<p>Of course, the latter is the better way, but in real life, it all depends. The first way is for instance reasonable if our team is struggling to meet an important deadline. However, quick and dirty comes with a price called <em>technical debt</em>. It&#8217;s like borrowing money &#8211; there are interests attached to it. The longer we wait before we pay our debt, the more effort is required because we must pay interest. In the technical debt metaphor, the effort grows over time because the quick and dirty design choice makes further changes harder, and until we take the cost of refactoring (and pay that debt), we will continue to pay interest.</p>
<p>When the debt increases, the velocity of the team will decrease until we&#8217;ll be using most of our time paying interests, instead of developing that new, cool functionality. The problem is not to raise technical debt &#8211; as there are situations where it is sensible to borrow money, there are situations where it is sensible to cut corners as well. The problem is to ignore what we are doing.</p>
<p><strong>Technical debt interpretation 2</strong></p>
<p>However, this interpretation of the technical debt metaphor was not exactly what Ward Cunningham intended, as he explains in the YouTube video &#8211; he never meant that technical debt occurs as a consequence of choosing quick and dirty. Not to worry too much, even Martin Fowler seems to have <a href="http://martinfowler.com/bliki/TechnicalDebt.html">misinterpreted</a> it to some extent <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<span class='embed-youtube' style='text-align:center; display: block;'><iframe class='youtube-player' type='text/html' width='600' height='368' src='http://www.youtube.com/embed/pqeJFYwnkjE?version=3&amp;rel=0&amp;fs=1&amp;showsearch=0&amp;showinfo=1&amp;iv_load_policy=1&amp;wmode=window' frameborder='0'></iframe></span>
<p>What I interpret as Ward Cunningham&#8217;s intention behind the technical debt metaphor, is this: Technical debt increase over time quite naturally if not frequently refactored. The premise is that our code model something, and that something will change over time. If the code is not adapted accordingly to the changes, the code will diverge from the problem domain and fail to meet the (now changed) requirements. As a consequence, the fact that the code once modeled the problem domain perfectly doesn&#8217;t mean it can&#8217;t get you into some serious technical debt over time. As Fredrik Kalseth notes in his excellent <a href="http://iridescence.no/post/Technical-Debt.aspx">blog</a>, paying back technical debt is really about keeping your code clean.</p>
<p>Note that the first interpretations of the debt metaphor is only a simplification of the latter. Choosing quick and dirty will certainly get you into technical debt, but so will clean code that isn&#8217;t refactored to align with its requirements over time. Despite what the technical debt metaphor was originally intended to depict, interpretation variations such as these makes the information technology specific vocabulary both confusing and amusing at the same time!</p>
<p><strong>Metaphors are all around</strong></p>
<p>Metaphors are not as accurate as Latin, but they are probably more fun. And, as Lakoff and Johnson suggest in their famous book &#8220;Metaphors we live by&#8221;,  metaphors are present everywhere, giving structure to our perception and understanding. I haven&#8217;t read the whole book, but the first four chapters can be found <a href="http://theliterarylink.com/metaphors.html">here</a>. Good reading, highly recommended!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trulsjor.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trulsjor.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/trulsjor.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/trulsjor.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/trulsjor.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/trulsjor.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/trulsjor.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/trulsjor.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/trulsjor.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/trulsjor.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/trulsjor.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/trulsjor.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/trulsjor.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/trulsjor.wordpress.com/43/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trulsjor.wordpress.com&amp;blog=7882231&amp;post=43&amp;subd=trulsjor&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trulsjor.wordpress.com/2009/08/02/metaphors/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a2b2cd729db70626b90eb49f3955fe59?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">trulsjor</media:title>
		</media:content>
	</item>
		<item>
		<title>How to send text to the display on your Squeezebox</title>
		<link>http://trulsjor.wordpress.com/2009/07/31/how-to-send-text-to-the-display-on-squeezebox/</link>
		<comments>http://trulsjor.wordpress.com/2009/07/31/how-to-send-text-to-the-display-on-squeezebox/#comments</comments>
		<pubDate>Fri, 31 Jul 2009 20:51:17 +0000</pubDate>
		<dc:creator>trulsjor</dc:creator>
				<category><![CDATA[Random noise]]></category>
		<category><![CDATA[CLI]]></category>
		<category><![CDATA[Squeezebox]]></category>
		<category><![CDATA[telnet]]></category>

		<guid isPermaLink="false">http://trulsjor.wordpress.com/?p=54</guid>
		<description><![CDATA[Did you know that you can send custom messages to your Squeezebox? I don&#8217;t recommend this to be your primary communication channel, but despite being useless, it&#8217;s still kinda cool. SqueezeCenter provides a command line interface (called CLI, of course:), allowing you to communicate with your precious Squeezebox over good, ol&#8217; telnet. Lets write something&#8230;. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trulsjor.wordpress.com&amp;blog=7882231&amp;post=54&amp;subd=trulsjor&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Did you know that you can send custom messages to your <a href="http://www.logitechsqueezebox.com/products/squeezebox-classic.html">Squeezebox?</a>  I don&#8217;t recommend this to be your primary communication channel, but despite being useless, it&#8217;s still kinda cool. SqueezeCenter provides a command line interface (called <a href="http://wiki.slimdevices.com/index.php/CLI">CLI</a>, of course:), allowing you to communicate with your precious Squeezebox over good, ol&#8217; telnet.<br />
<span id="more-54"></span></p>
<p>Lets write something&#8230;.<br />
<a href="http://trulsjor.files.wordpress.com/2009/07/picture-2.png"><img src="http://trulsjor.files.wordpress.com/2009/07/picture-2.png?w=570&#038;h=177" alt="Picture 2" title="Picture 2" width="570" height="177" class="aligncenter size-full wp-image-64" /></a></p>
<p>&#8230;that outputs nicely on the Squeezebox!</p>
<p><a href="http://trulsjor.files.wordpress.com/2009/08/timeforcoffee.jpg"><img src="http://trulsjor.files.wordpress.com/2009/08/timeforcoffee.jpg?w=600&#038;h=326" alt="TimeForCoffee" title="TimeForCoffee" width="600" height="326" class="aligncenter size-full wp-image-59" /></a></p>
<p>I&#8217;m no expert at shell scripting, and I&#8217;m sure there is several more elegant way of achieving the same result. Do you know of another way? I resorted to some dirty piping. Note the <tt>sleep 1</tt> there&#8230; I also needed (I think!) to do some substitution in order to get the whitespaces right, and  <tt>sed</tt> helped me out. Here goes. </p>
<p><code><br />
#!/bin/sh<br />
#<br />
MSG=$1<br />
if [ $# -lt 1 ] ; then<br />
echo Skriv en melding<br />
read MSG<br />
fi<br />
MSG=$(echo $MSG|sed 's/ /%20/g')<br />
(<br />
echo show line2:$MSG font:huge centered:1<br />
sleep 1<br />
echo exit<br />
) | telnet 127.0.0.1 9090<br />
clear<br />
exit<br />
</code></p>
<p>The text is centered and huge, and placed on line2 (the main line). More documentation on CLI is available from the SqueezeCenter web interface. It is somewhat hidden, but it&#8217;s there. Have fun!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trulsjor.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trulsjor.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/trulsjor.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/trulsjor.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/trulsjor.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/trulsjor.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/trulsjor.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/trulsjor.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/trulsjor.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/trulsjor.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/trulsjor.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/trulsjor.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/trulsjor.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/trulsjor.wordpress.com/54/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trulsjor.wordpress.com&amp;blog=7882231&amp;post=54&amp;subd=trulsjor&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trulsjor.wordpress.com/2009/07/31/how-to-send-text-to-the-display-on-squeezebox/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a2b2cd729db70626b90eb49f3955fe59?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">trulsjor</media:title>
		</media:content>

		<media:content url="http://trulsjor.files.wordpress.com/2009/07/picture-2.png" medium="image">
			<media:title type="html">Picture 2</media:title>
		</media:content>

		<media:content url="http://trulsjor.files.wordpress.com/2009/08/timeforcoffee.jpg" medium="image">
			<media:title type="html">TimeForCoffee</media:title>
		</media:content>
	</item>
		<item>
		<title>Oh, the irony.</title>
		<link>http://trulsjor.wordpress.com/2009/06/24/oh-the-irony/</link>
		<comments>http://trulsjor.wordpress.com/2009/06/24/oh-the-irony/#comments</comments>
		<pubDate>Wed, 24 Jun 2009 17:05:30 +0000</pubDate>
		<dc:creator>trulsjor</dc:creator>
				<category><![CDATA[Random noise]]></category>

		<guid isPermaLink="false">http://trulsjor.wordpress.com/?p=5</guid>
		<description><![CDATA[I never thought it would come to this &#8211; my very own blog. More than once have I quoted the infamous demotivational poster: &#8220;Blogging &#8211; never before have so many people with so little to say said so much to so few.&#8221; Despite this &#8211; my very own shiny new blog. Oh, the irony. I [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trulsjor.wordpress.com&amp;blog=7882231&amp;post=5&amp;subd=trulsjor&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I never thought it would come to this &#8211; my very own blog. More than once have I quoted the infamous <a title="demotivational" href="http://despair.com/blogging.html" target="_blank">demotivational</a> poster: &#8220;<em>Blogging &#8211; never before have so many people with so little to say said so much to so few.&#8221;</em></p>
<p>Despite this &#8211; my very own shiny new blog. Oh, the irony. <span id="more-5"></span>I feel I have to justify this by writing a meta post on the matter. The motivation for invalidating my criticism for blogging by blogging is threefold. First, I have always enjoyed writing. At some point, I stopped to write. No reason. I recently realized that I want to start writing again. Second,  the need to consolidate. I have bits and pieces floating around the net. This could be a good place to gather them.</p>
<p>Third, I&#8217;m inspired by my good friend, <a title="Are" href="http://arewold.wordpress.com/" target="_blank">Are</a>, who frequently writes stuff that proves useful or amusing for other people.  My shiny, new blog will therefore be written in English &#8211; the potential for a text being <em>useful for someone, somewhere</em> (quoting Are)  is probably bigger when written in English than in Norwegian.</p>
<p>So there you have it. I hope you will enjoy my upcoming posts!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trulsjor.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trulsjor.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/trulsjor.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/trulsjor.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/trulsjor.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/trulsjor.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/trulsjor.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/trulsjor.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/trulsjor.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/trulsjor.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/trulsjor.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/trulsjor.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/trulsjor.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/trulsjor.wordpress.com/5/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trulsjor.wordpress.com&amp;blog=7882231&amp;post=5&amp;subd=trulsjor&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trulsjor.wordpress.com/2009/06/24/oh-the-irony/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a2b2cd729db70626b90eb49f3955fe59?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">trulsjor</media:title>
		</media:content>
	</item>
	</channel>
</rss>
