<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:yt="http://gdata.youtube.com/schemas/2007" version="2.0">
   <channel>
      <title>Improving Blogs</title>
      <description>A mashup of blogs by the employees of Improving Enterprises</description>
      <link>http://pipes.yahoo.com/pipes/pipe.info?_id=wmOSkp7n3BGZxq0K8jxBKg</link>
      <pubDate>Fri, 13 Nov 2009 14:56:42 -0800</pubDate>
      <generator>http://pipes.yahoo.com/pipes/</generator>
      <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/ImprovingBlogs" type="application/rss+xml" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">ImprovingBlogs</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
         <title>Advice from G.K. Chesterton</title>
         <link>http://door64.com/blog/n/13744</link>
         <description>&lt;p&gt;Two common situations: an organization has all sorts of bureaucratic procedures, a legacy code base includes lots of ugly old code. Both seemingly serve no purpose.&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://door64.com/blog/n/13744"&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
         <author>Jane Prusakova</author>
         <guid isPermaLink="false">http://door64.com/blog/n/13744</guid>
         <pubDate>Wed, 11 Nov 2009 10:00:06 -0800</pubDate>
      </item>
      <item>
         <title>The Economics Of Productivity Tools In Software Development</title>
         <link>http://mentalpandiculation.com/?p=194</link>
         <description>David O&amp;#8217;Hara, one of my colleagues at Improving Enterprises, posted the following to Twitter today:
Folks, if you&amp;#8217;re not willing to buy tools to get your job done faster/better &amp;#8211; please do us all a favor&amp;#8230;
He and I had the related Twitter discussion which you can follow, as well as a chat offline to further clarify [...]</description>
         <author>Niklaus Wirth's Ghost</author>
         <guid isPermaLink="false">http://mentalpandiculation.com/?p=194</guid>
         <pubDate>Tue, 10 Nov 2009 06:55:27 -0800</pubDate>
         <content:encoded><![CDATA[<p>David O&#8217;Hara, one of my colleagues at <a rel="nofollow" target="_blank" href="http://improvingenterprises.com/">Improving Enterprises</a>, <a rel="nofollow" target="_blank" href="http://twitter.com/davidmohara/status/5564660505">posted</a> the following to Twitter today:</p>
<blockquote><p>Folks, if you&#8217;re not willing to buy tools to get your job done faster/better &#8211; please do us all a favor&#8230;</p></blockquote>
<p>He and I had the related Twitter discussion which you can follow, as well as a chat offline to further clarify what we meant. However, I thought it was a subject rich enough to deserve more than 140 characters in explanation. It&#8217;s my stance that the quote above at first read is essentially saying if you aren&#8217;t willing to buy productivity tools, then we&#8217;d be better off without you. David has since explained that he was really targeting people who complained about built in tool support or the lack thereof and that if you weren&#8217;t willing to buy the tools, stop complaining and just do your job. However, several other people agreed with Dave&#8217;s quote as written and I fairly strongly disagree so let&#8217;s look at the quote as it is.</p>
<p>My stance is that this is a purely economic decision at its most core, one that if taken at face value, expects developers to take a financial risk, e.g. pay for a yearly subscription to Code Rush or Resharper, and accept in return a non-financial reward, e.g. greater productivity which we&#8217;ll assume leads to greater happiness. Additionally, an employer who can convince all his employees to buy their own subscription reaps almost immediate rewards while taking on none of the risk. This is a bad economic decision for an employee to take. There is an edge case which nearly everyone brought up in their agreement with David and that is a craftsman. We&#8217;ll discuss that in a minute.</p>
<p>One point that&#8217;s critical here is that we&#8217;re talking about salaried employees and not independent contractors of any kind. When I first objected to Dave&#8217;s remark, I questioned what other profession expects the employees to buy their own productivity tools. I don&#8217;t think there are any outside of independent contractors. This is an important distinction because contractors can pass the cost of their increased productivity on to the consumer through either higher prices or longer engagements if they choose not to use the productivity tools. Salaried employees do not have that option. Several people argued that employees who were more productive would be rewarded in the long run but again, this is not a good economic bargain since future returns on my economic risk today are inherently, well, risky. Maybe the employer lays me off or pays me less than my productivity cost me. </p>
<p>Looking at it from another angle, by convincing me either implicitly or explicitly to pay for tools to increase my productivity, my employer has also lowered his salary costs while gaining in output. Again, in an economic agreement, this is a big loss for me. Of course, David didn&#8217;t mention the employer in all this but the assumption is that if I have to pay for my productivity tools, it&#8217;s because my employer refuses to do so for whatever reason. </p>
<p>Granted, I may have a choice in the matter. I may choose not to work with the tools. I may choose to get another job. But all of these come with associated costs, costs that must be weighed when making a decision. </p>
<p>In the end, the <a rel="nofollow" target="_blank" href="http://joelonsoftware.com/articles/fog0000000043.html">best employers</a> ought to provide the best tools for their developers in an attempt to get the very best employees. The best employers do this because they know it&#8217;s in their best interest to focus on the long term return of having the very best employees while the worst employers focus on the near term return of the cutting costs. This is true across many fields, not just software development.</p>
<p>What about that edge case? Here&#8217;s where my thinking converges with David&#8217;s sentiment. Craftsmen always work with the best tools because their work is qualitatively different than that of the average software developer. They want to operate at the highest level of efficiency in order to achieve the quality of work that their internal motivation demands. Of course, the irony in this is that typically craftsmen refuse to work for employers who expect them to buy their own tools because that is a sign of the type of work or environment they can expect. </p>
<p>Overall, I don&#8217;t think it should be the employee&#8217;s obligation to provide themselves with productivity tools. They agree to do a job to the best of their abilities when they join a company. If there are tools that enhance their abilities, the employer should provide them as an investment in the long term gain of more productive and ultimately happier employees.</p>
<p>Of course, all this said, I choose to buy my own tools. I do this in part because I want to have them after I leave a given company but also so that I can use them in my own personal development as a software developer. I&#8217;m light years away from being a craftsman but I suppose striving to be one is the next best thing.</p>]]></content:encoded>
         <category>Programming</category>
      </item>
      <item>
         <title>A sign that slaps you in the face…</title>
         <link>http://agilist.net/?p=357</link>
         <description>Often, traditional communication approaches are overlooked. Over time, signage and other messaging becomes part of the noise that is intentionally ignored. Innovators find new ways to slap you in the face and take notice. Check out this approach to &amp;#8220;Go Green&amp;#8221; posted in a dorm in Claremont McKenna college. Thanks to Jason [...]</description>
         <guid isPermaLink="false">http://agilist.net/?p=357</guid>
         <pubDate>Wed, 04 Nov 2009 12:27:01 -0800</pubDate>
         <content:encoded><![CDATA[<div class="mceTemp">
<dl id="attachment_356" class="wp-caption alignright" style="width:310px;">
<dt class="wp-caption-dt"><img class="size-medium wp-image-356 " title="solldorm" src="http://agilist.net/wp-content/uploads/2009/11/solldorm-300x225.jpg" alt="Flick Off" width="300" height="225"/></dt>
</dl>
</div>
<p>Often, traditional communication approaches are overlooked. Over time, signage and other messaging becomes part of the noise that is intentionally ignored. Innovators find new ways to slap you in the face and take notice. Check out this approach to &#8220;Go Green&#8221; posted in a dorm in Claremont McKenna college. Thanks to Jason Soll and Daniel Pink from TED&#8230;</p>]]></content:encoded>
      </item>
      <item>
         <title>Ep. 11 – Naked Planning</title>
         <link>http://improvingpodcasts.com/2009/11/ep-11-naked-planning/</link>
         <description>In episode 11, a fully clothed Mike and Allen talk Naked Planning with fellow Improver Ben Rady.
Topics covered:
- The value of value-based planning
- The what&amp;#8217;s and why&amp;#8217;s of Naked Planning
&amp;#160;&amp;#160; &amp;#8211; Requirements waste
&amp;#160;&amp;#160; &amp;#8211; Queues and flow
&amp;#160;&amp;#160; &amp;#8211; Minimum marketable features
&amp;#160;&amp;#160; &amp;#8211; The ultimate definition of done
- We don&amp;#8217;t need no stinking iterations
- How to [...]</description>
         <author>Allen</author>
         <guid isPermaLink="false">http://improvingpodcasts.com/?p=106</guid>
         <pubDate>Tue, 03 Nov 2009 11:29:42 -0800</pubDate>
         <content:encoded><![CDATA[<p>In episode 11, a fully clothed Mike and Allen talk Naked Planning with fellow Improver Ben Rady.</p>
<p>Topics covered:<br />
- The value of value-based planning<br />
- The what&#8217;s and why&#8217;s of Naked Planning<br />
&nbsp;&nbsp; &#8211; Requirements waste<br />
&nbsp;&nbsp; &#8211; Queues and flow<br />
&nbsp;&nbsp; &#8211; Minimum marketable features<br />
&nbsp;&nbsp; &#8211; The ultimate definition of done<br />
- We don&#8217;t need no stinking iterations<br />
- How to handle releases<br />
- Naked Planning vs. kanban<br />
- Naked Planning and estimation<br />
- MMFs that require architectural change<br />
- Handling emergencies<br />
- Continuous flow, Software Craftsmanship and the evolution of agile</p>
<p>References:<br />
- Arlo Belshee on the Agile Toolkit Podcast: <a rel="nofollow" title="Agile Toolkit Podcast" target="_blank" href="http://bit.ly/jz0V9">http://bit.ly/jz0V9</a><br />
- Tom DeMarco &#8211; Controlling Software Projects &#8211; <a rel="nofollow" title="Controlling Software Projects on Amazon.com" target="_blank" href="http://bit.ly/1Q4gTC">http://bit.ly/1Q4gTC</a><br />
- Steve McConnell &#8211; Software Estimation &#8211; <a rel="nofollow" title="Software Estimation on Amazon.com" target="_blank" href="http://bit.ly/gZjYX">http://bit.ly/gZjYX</a><br />
- Software Craftsmanship Manifesto <a rel="nofollow" title="Software Craftsmanship Manifesto" target="_blank" href="http://manifesto.softwarecraftsmanship.org">http://manifesto.softwarecraftsmanship.org</a><br />
- Ben Rady&#8217;s Blog &#8211; <a rel="nofollow" title="Ben Rady's Blog" target="_blank" href="http://feedbackjunkies.com">feedbackjunkies.com</a></p>]]></content:encoded>
         <enclosure length="25680814" url="http://improvingpodcasts.com/podcasts/011_NakedPlanning.mp3" type="audio/mpeg" />
      </item>
      <item>
         <title>Have your cake and eat it too</title>
         <link>http://feedproxy.google.com/~r/travisisaacs/~3/0mb8P-xrwaM/</link>
         <description>I don't need all the functionality provide by Visual Studio and other Microsoft developer tools. So why deal with all the overhead (and remembering to alt-tab instead of cmd-tab)?</description>
         <author>Travis Isaacs</author>
         <guid isPermaLink="false">http://travisisaacs.com/?p=765</guid>
         <pubDate>Mon, 02 Nov 2009 20:54:09 -0800</pubDate>
         <content:encoded><![CDATA[<p>I was recently accused of &#8220;getting work done on a Mac.&#8221; As a Mac user in a mostly Windows work environment, I took that as quite a&nbsp;compliment. </p>
<p>If you work on the web long enough, sooner or later you&#8217;ll cross paths with a Microsoft .<span class="caps">NET</span> project and all of the tooling changes that come with it. Visual Studio, <span class="caps">IIS</span>, Internet Explorer, and God help you - <span class="caps">TFS</span>. The Microsoft development stack is flexible, capable, and powerful. However, they are a 180&deg; shift from the lightweight tools that most Mac developers have come to <a rel="nofollow" target="_blank" href="http://www.randsinrepose.com/archives/2009/11/02/the_foamy_rules_for_rabid_tools.html">fiercely&nbsp;love</a>. </p>
<p>When working on projects at <a rel="nofollow" target="_blank" href="http://improvingenterprises.com">Improving</a>, I consider myself a fully integrated (web) developer with a few&nbsp;exceptions:</p>
<ul>
<li>I don&#8217;t use the debugger (in Visual&nbsp;Studio)</li>
<li>I rarely need to&nbsp;compile</li>
<li>I never touch a&nbsp;database</li>
<li>I don&#8217;t need IntelliSense or other <span class="caps">IDE</span>&nbsp;helpers</li>
<li>I test against <span class="caps">IE</span>, but don&#8217;t use it&nbsp;otherwise</li>
</ul>
<p>I don&#8217;t need all the functionality provide by Visual Studio and other Microsoft developer tools. So why deal with all the overhead (and remembering to alt-tab instead of&nbsp;cmd-tab)? </p>
<p>Recently I discovered (with the help of my team) the perfect environment for me. It eliminates (most of) the need to fumble around in Visual Studio and puts me back in front of my go-to tool: Textmate. (<a rel="nofollow" target="_blank" href="http://twitter.com/tbisaacs/status/1231617286">Click here for some of my favorite TextMate&nbsp;features</a>).</p>
<h2>Maximum&nbsp;Cake</h2>
<p><img src="http://travisisaacs.com/wp-content/uploads/2009/11/do-work-son.png" alt="do-work-son" title="do-work-son" width="636" height="296" class="alignnone size-full wp-image-780"/></p>
<p>This configuration looks a bit complicated, but it&#8217;s&nbsp;not. </p>
<ul>
<li>All of the project source code lives inside of a Windows 7 virtual machine and is managed via&nbsp;Subversion</li>
<li><span class="caps">IIS</span> is pointed at my source directory and serves up the web project via <span class="caps">HTTP</span>, making it accessible via <code>localhost</code> <em>and</em> outside of the virtual&nbsp;machine</li>
<li>My source directory is mounted in <span class="caps">OSX</span> via an <span class="caps">SMB</span> share and pulled into&nbsp;TextMate</li>
</ul>
<p>Essentially, I use Windows as web server, a file server, and as an occasional compiler. That&#8217;s&nbsp;it.</p>
<p>This is <a rel="nofollow" target="_blank" href="http://twitter.com/tbisaacs/status/2295072902">nirvana for&nbsp;me</a>.</p>]]></content:encoded>
         <category>Work</category>
      </item>
      <item>
         <title>UML Use Case Diagrams in VSTS 2010</title>
         <link>http://www.tmgirvin.com/2009/11/uml-use-case-diagrams-in-vsts2010.html</link>
         <description>The new Microsoft Visual Studio 2010 Ultimate Edition has support for UML diagrams. I just whipped together this Use Case diagram for the sample project Chris and I are demonstrating at our PDC 2009 pre-con on Developing Quality Software using...</description>
         <author>Todd Girvin</author>
         <guid isPermaLink="false">http://www.tmgirvin.com/2009/11/uml-use-case-diagrams-in-vsts2010.html</guid>
         <pubDate>Sun, 01 Nov 2009 13:19:31 -0800</pubDate>
         <content:encoded><![CDATA[<p>The new <a rel="nofollow" target="_blank" href="http://www.microsoft.com/visualstudio/en-us/products/2010">Microsoft Visual Studio 2010</a> Ultimate Edition has support for UML diagrams.&#160; I just whipped together this Use Case diagram for the sample project <a rel="nofollow" target="_blank" href="http://www.tmgirvin.com/2009/08/developing-quality-software-using-visual-studio-team-system-2010.html">Chris and I are demonstrating</a> at our <a rel="nofollow" target="_blank" href="http://microsoftpdc.com/">PDC 2009</a> pre-con on <a rel="nofollow" target="_blank" href="http://microsoftpdc.com/Sessions/Developing-Quality-Software-using-Visual-Studio-Team-System-2010">Developing Quality Software using Microsoft Visual Studio 2010</a>.&#160; Visual Studio is really intuitive for UML diagramming – much simpler than Visio.&#160; Plus, you can easily create TFS work items from the Use Cases.&#160; Come see how it’s all done at our <a rel="nofollow" target="_blank" href="http://microsoftpdc.com/Sessions/Developing-Quality-Software-using-Visual-Studio-Team-System-2010">PDC pre-con</a>.&#160; </p> <p><a rel="nofollow" target="_blank" href="http://integralpath.blogs.com/.a/6a00d83451806669e20120a69d8fcd970c-pi"><img style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" title="VS2010-Use-Case-diagram" border="0" alt="VS2010-Use-Case-diagram" src="http://integralpath.blogs.com/.a/6a00d83451806669e20120a69d8fea970c-pi" width="470" height="455"/></a></p> <p>BTW, did you know that all MSDN subscribers with a Dev edition of VSTS 2008 get an automatic upgrade to VSTS 2010 Ultimate? Make sure your MSDN license is up-to-date so you get all the new stuff in 2010. :)&#160; </p>]]></content:encoded>
      </item>
      <item>
         <title>Project Euler, Python, F# and Clojure</title>
         <link>http://mentalpandiculation.com/?p=185</link>
         <description>A rather ambitious title but apropos of what I&amp;#8217;ve been playing around with this morning. At this month&amp;#8217;s Dallas Hack Club, several of us got together and essentially toyed around with problem #1 on Project Euler, learning new things as we went. I ripped through it in Python pretty quickly mostly because I [...]</description>
         <author>Niklaus Wirth's Ghost</author>
         <guid isPermaLink="false">http://mentalpandiculation.com/?p=185</guid>
         <pubDate>Sat, 31 Oct 2009 09:52:26 -0700</pubDate>
         <content:encoded><![CDATA[<p>A rather ambitious title but apropos of what I&#8217;ve been playing around with this morning. At this month&#8217;s<a rel="nofollow" target="_blank" href="http://dallashackclub.com/"> Dallas Hack Club</a>, several of us got together and essentially toyed around with problem #1 on <a rel="nofollow" target="_blank" href="http://projecteuler.net/">Project Euler</a>, learning new things as we went. I ripped through it in <a rel="nofollow" target="_blank" href="http://python.org/">Python</a> pretty quickly mostly because I had done it before but partially because Python makes things so easy. After that, I started trying to do it in <a rel="nofollow" target="_blank" href="http://clojure.org/">Clojure</a>, a language I&#8217;m interested in but can&#8217;t seem to find the time to truly concentrate on.</p>
<p>My initial solution in Clojure was both ugly and uncompilable making it reasonably useless. I&#8217;ve been struggling with getting my head truly around functional programming and I finally figured that the solution to that was to do more of it. This summer, in another fit of ADHD and boredom, I bought the electronic version of <a rel="nofollow" target="_blank" href="http://oreilly.com/catalog/9780596153656">Chris Smith&#8217;s Programming F#</a>. Like most of my projects, little came of it until last night when I decided to work really hard on it for 30 minutes. I figured out Euler&#8217;s problem 1 in about 20 minutes and that made me think I should be able to handle Clojure as well.</p>
<p>It took a lot longer than 30 minutes but I finally figured it out in a way that didn&#8217;t require 85 lines of Clojure. I think the functional style is starting to sink in. Doing both F# and Clojure seems to hammer home the concepts because I can develop a solution in F# in a medium I&#8217;m comfortable in (.Net and Visual Studio) and then move to Clojure with a little more background to build from. The solutions are provided below as a reference.</p>
<pre class="python">
def main(): sum = 0 for x in range(1, 1000): if x%3==0 or x%5==0: sum+= x print sum
</pre>
<p>This was the original solution in Python. After doing the F# and Clojure work, I came up with something shorter if slightly more obtuse:</p>
<pre class="python">
reduce(lambda x, y: x+y, filter(lambda x: x%3==0 or x%5==0, range(1, 1000)))
</pre>
<p>Those two lambdas are not good for long term maintenance and aren&#8217;t that readable. A list comprehension in place of the filter would be a good deal clearer.</p>
<pre class="python">
reduce(lambda x, y: x+y, [num for num in range(1, 1000) if x%3==0 or x%5==0])
</pre>
<p>So we&#8217;re down from 5 lines to 1 while retaining a good deal of readability. Maybe there really is something to this &#8220;Functional programming makes you a better programmer&#8221; stuff.</p>
<p>In unimproved F# (I&#8217;m open to suggestions):</p>
<pre class="csharp">
let result (acc : int) x = if x % 3 = 0 || x % 5 = 0 then acc + x else acc
List.reduce result [0..999];;
</pre>
<p>And finally, in what I think is decent Clojure:</p>
<pre>
(defn isdiv [x] (or (= (rem x 3) 0) (= (rem x 5) 0)))
(reduce + (filter isdiv (range 1 1000)))
</pre>
<p>Sorry for not having syntax highlighting for the Clojure or F# code, they would both be a great deal more readable. However, it&#8217;s interesting to see in Clojure how all functions are first class, e.g. I can pass the + operator to the reduce function instead of having to define a lambda as I did in Python.</p>
<p>I have a feeling the Clojure code could be more succinct but for a first working cut, I&#8217;m pretty pleased with it. It&#8217;s clean and easy to read, even for someone like me with little exposure to the prefix notation and all the parens. </p>
<p>Overall, I feel less dumb than I did when I woke up this morning. I&#8217;m guessing the beer I drink at tonight&#8217;s Halloween party will fix that though.</p>]]></content:encoded>
         <category>Programming</category>
      </item>
      <item>
         <title>SpringOne/2GX: A Retrospective</title>
         <link>http://www.jroller.com/habuma/entry/springone_2gx_a_retrospective</link>
         <description>&lt;p&gt;SpringOne/2GX is now over and most everyone has made their way back to the real world. Rather than write a long-winded review of the conference, I decided to summarize my thoughts in the form of a retrospective. That is, what went well, what didn't go so well, and what I'd improve upon next time around.&lt;/p&gt; &lt;p&gt;Feel free to contribute to this retrospective with your own comments.&lt;/p&gt; &lt;h3&gt;What went well&lt;/h3&gt;
&lt;dl&gt; &lt;dt&gt;&lt;b&gt;The Day 1 Keynote&lt;/b&gt;&lt;/dt&gt; &lt;dd&gt;The keynote on Monday night was quite interesting with SpringSource tcServer Developer Edition stealing the show. But also hearing about all of the different facets of the Spring ecosystem and seeing how they are evolving was great.&lt;/dd&gt; &lt;dt&gt;&lt;b&gt;Adrian Colyer's comedic bit to start the Day 2 Keynote&lt;/b&gt;&lt;/dt&gt; &lt;dd&gt;Funny stuff. Adrian's quite the story teller. Wish I could find this on YouTube.&lt;/dd&gt; &lt;dt&gt;&lt;b&gt;My talk on SpEL went well&lt;/b&gt;&lt;/dt&gt; &lt;dd&gt;I had given this talk twice before with less-than-desirable results. This time it worked out. It may have been the best talk I've ever given.&lt;/dd&gt; &lt;dt&gt;&lt;b&gt;The people&lt;/b&gt;&lt;/dt&gt; &lt;dd&gt;It was great meeting and chatting with so many people who are also interested in Spring and Groovy/Grails. Also fun to catch up with my friends in SpringSource who I only get to see once per year.&lt;/dd&gt; &lt;dt&gt;&lt;b&gt;Rod Johnson's duet&lt;/b&gt;&lt;/dt&gt; &lt;dd&gt;Rod played piano while another attendee played clarinet. Very entertaining.&lt;/dd&gt; &lt;dt&gt;&lt;b&gt;Roo and tcServer Dev Edition&lt;/b&gt;&lt;/dt&gt; &lt;dd&gt;The darlings of the show. Almost everyone was talking about them. Both are awesome and you should check them out.&lt;/dd&gt; &lt;dt&gt;&lt;b&gt;The Roosevelt New Orleans&lt;/b&gt;&lt;/dt&gt; &lt;dd&gt;This was hands-down one of the nicest hotels that I've ever stayed in. Very comfortable and luxurious. Highly recommended.&lt;/dd&gt; &lt;dt&gt;&lt;b&gt;The food&lt;/b&gt;&lt;/dt&gt; &lt;dd&gt;The food served at lunch and dinner during the conference was outstanding.&lt;/dd&gt;
&lt;/dl&gt; &lt;h3&gt;When didn't go so well&lt;/h3&gt;
&lt;dl&gt; &lt;dt&gt;&lt;b&gt;The Day 2 Keynote&lt;/b&gt;&lt;/dt&gt; &lt;dd&gt;Don't get me wrong...I think the VMWare stuff is cool and interesting. But this is a developer conference and the parade of VMWare products would have better suited an IT crowd. It was interesting, but not valuable to me. I did find Chris Richardson's demo of CloudFoundry very interesting, though.&lt;/dd&gt; &lt;dt&gt;&lt;b&gt;The constant pinging sound in Salon 5&lt;/b&gt;&lt;/dt&gt; &lt;dd&gt;What the heck was that?&lt;/dd&gt; &lt;dt&gt;&lt;b&gt;My failure to schedule appropriately&lt;/b&gt;&lt;/dt&gt; &lt;dd&gt;I think that my strategy for choosing which sessions to attend was flawed. All of the sessions were great, but I think I could've learned more by attending a different mix of sessions. I'm especially regretful that I didn't attend more Groovy-oriented sessions.&lt;/dd&gt; &lt;dt&gt;&lt;b&gt;The size of the desserts&lt;/b&gt;&lt;/dt&gt; &lt;dd&gt;Last year's desserts were much bigger...slices of cake the size of your head. This year they were more petite. But, if you smash several of them together...&lt;/dd&gt;
&lt;/dl&gt; &lt;h3&gt;Things to improve upon next year&lt;/h3&gt; &lt;dl&gt; &lt;dt&gt;&lt;b&gt;Personal session selection&lt;/b&gt;&lt;/dt&gt; &lt;dd&gt;I should try to attend more sessions on topics that I don't know as well.&lt;/dd&gt; &lt;dt&gt;&lt;b&gt;More audience interaction&lt;/b&gt;&lt;/dt&gt; &lt;dd&gt;The best part of my talk was where the audience chimed in with things to try in SpEL. I should purposefully set aside time to "take requests" from the crowd in my talks.&lt;/dd&gt; &lt;dt&gt;&lt;b&gt;Get more sleep&lt;/b&gt;&lt;/dt&gt; &lt;dd&gt;I missed out on a few things because I was exhausted. Should plan my sleep better so that I can attend and see more stuff.&lt;/dd&gt; &lt;dt&gt;&lt;b&gt;Bigger desserts&lt;/b&gt;&lt;/dt&gt; &lt;dd&gt;'Nuff said.&lt;/dd&gt;
&lt;/dl&gt;</description>
         <author>Craig Walls</author>
         <guid isPermaLink="false">http://www.jroller.com/habuma/entry/springone_2gx_a_retrospective</guid>
         <pubDate>Fri, 23 Oct 2009 15:30:00 -0700</pubDate>
         <category>General</category>
      </item>
      <item>
         <title>Happy Windows 7 Launch Day</title>
         <link>http://www.tmgirvin.com/2009/10/happy-windows-7-launch-day.html</link>
         <description>Even if you haven’t been using it yet, you’ve probably heard a lot about Windows 7. Many people have been using it through the long beta phase and even in it’s released form if they work for a Microsoft partner...</description>
         <author>Todd Girvin</author>
         <guid isPermaLink="false">http://www.tmgirvin.com/2009/10/happy-windows-7-launch-day.html</guid>
         <pubDate>Thu, 22 Oct 2009 16:30:37 -0700</pubDate>
         <content:encoded><![CDATA[<p>Even if you haven’t been using it yet, <a rel="nofollow" target="_blank" href="http://integralpath.blogs.com/.a/6a00d83451806669e20120a66cf504970c-pi"><img style="border-right-width:0px;margin:5px 0px 5px 5px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Windows 7" border="0" alt="Windows 7" align="right" src="http://integralpath.blogs.com/.a/6a00d83451806669e20120a6159a22970b-pi" width="196" height="123"/></a> you’ve probably heard a lot about Windows 7.&#160; Many people have been using it through the long beta phase and even in it’s released form if they work for a Microsoft partner like <a rel="nofollow" target="_blank" href="http://improvingenterprises.com/">Improving</a>. There are a lot of cool new features and basic improvements to the fundamental operations of the system.&#160; Recently, my colleagues Allen and Mike invited me to talk about some of the new hotness in the latest of <a rel="nofollow" target="_blank" href="http://improvingpodcasts.com/">Improving Podcasts</a> on the <a rel="nofollow" target="_blank" href="http://improvingpodcasts.com/2009/10/ep-10-windows-7-experience/">Windows 7 experience</a>.&#160; </p> <p>BTW, some of the shortcut keys I love the most I forgot to mention and they aren’t listed on the <a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Features_new_to_Windows_7#Keyboard_shortcuts">Wikipedia on Windows 7 features</a>.&#160; Those keys are the Win + &lt;a number&gt; keys, which correspond to taskbar buttons you have in your task tray.&#160; For me, pressing the Windows Key plus the number 1 (aka Win + 1), launches Internet Explorer.&#160; Win + 2 launches the Folder Explorer.&#160; They work all the way up to Win + 0 for the 10th application in the tray.&#160; If your application is already open, the key just brings the window to the front.&#160; If you really want a new instance, add in the shift key.&#160; For example, Shift + Win + 1 opens a new Internet Explorer window, even if you have one open – just like shift-clicking on the application icon.&#160; As far as I know, all of the shortcuts that I mention in the podcast and here are documented on <a rel="nofollow" target="_blank" href="http://windows.microsoft.com/en-us/Windows7/Keyboard-shortcuts">Microsoft’s Windows 7 page on Keyboard Shortcuts</a>. </p> <p>If you want to see some examples of themes that I mentioned in the podcast, check out this page of <a rel="nofollow" target="_blank" href="http://windows.microsoft.com/en-us/windows/downloads/personalize?T1=themes">Windows 7 additional themes</a>.&#160; And if you’ve just installed Windows 7, make sure you also get <a rel="nofollow" target="_blank" href="http://download.live.com">Windows Live Essentials</a> with Live Messenger and it’s friends, as well as the new <a rel="nofollow" target="_blank" href="http://www.microsoft.com/security_essentials/">Windows Security Essentials</a> for FREE anti-virus and anti-spyware protection.&#160; </p> <p>Happy Windows 7 launch day!</p>]]></content:encoded>
      </item>
      <item>
         <title>Curing ADD with Roo, Blueprints, and Karaf</title>
         <link>http://www.jroller.com/habuma/entry/curing_add_with_roo_blueprints</link>
         <description>&lt;p&gt;Yesterday was a big day for me at &lt;a rel="nofollow" target="_blank" href="http://www.springone2gx.com"&gt;SpringOne/2GX&lt;/a&gt;. It was the day that I gave my talk on the Spring Expression Language (SpEL). I've been excited about giving that talk, but also excited about attending so many of the great sessions by other speakers. So, I started the day by attending a session presented by Stefan Schmidt on web productivity with Roo.&lt;/p&gt; &lt;p&gt;Unfortunately, due to lack of sleep and anxiety for my own presentation, I was unable to focus well on Stefan's talk. He was doing a great job presenting Roo, but my brain just couldn't focus. So to entertain my brain with something that at least was close to the topic at hand, I decided to tinker a bit with Roo's support for SpringSource's &lt;a rel="nofollow" target="_blank" href="http://www.springsource.org/bundlor"&gt;Bundlor&lt;/a&gt; to generate OSGi manifests for Roo artifacts.&lt;/p&gt; &lt;p&gt;The first thing I did was to start up the Roo shell and issue the &lt;code&gt;project&lt;/code&gt; command:&lt;/p&gt; &lt;pre class="code"&gt;
roobundle% roo ____ ____ ____ / __ &amp;#92;/ __ &amp;#92;/ __ &amp;#92; / /_/ / / / / / / / / _, _/ /_/ / /_/ / /_/ |_|&amp;#92;____/&amp;#92;____/ 1.0.0.RC2 [rev 321] Welcome to Spring Roo. For assistance press TAB or type "hint" then hit ENTER.
roo&amp;gt; project --topLevelPackage com.habuma.numbers
Created /Users/wallsc/Projects/roofun/roobundle/pom.xml
Created SRC_MAIN_JAVA
Created SRC_MAIN_RESOURCES
Created SRC_TEST_JAVA
Created SRC_TEST_RESOURCES
Created SRC_MAIN_WEBAPP
Created SRC_MAIN_RESOURCES/META-INF/spring
Created SRC_MAIN_RESOURCES/META-INF/spring/applicationContext.xml
roo&amp;gt; &lt;/pre&gt; &lt;p&gt;From here it looks like Roo has created the basic project structure. Nothing special so far. But what I want to do with Roo is build a simple OSGi bundle that publishes a service to the OSGi service registry. So, let's start by creating the service's interface. There's lots of ways I could do this, but as long as I'm in Roo...&lt;/p&gt; &lt;pre class="code"&gt;
roo&amp;gt; interface --name NumberToEnglishService
Created SRC_MAIN_JAVA/com/habuma/numbers
Created SRC_MAIN_JAVA/com/habuma/numbers/NumberToEnglishService.java
roo&amp;gt; &lt;/pre&gt; &lt;p&gt;Notice that Roo's &lt;code&gt;interface&lt;/code&gt; command creates the interface in the base directory without me having to explicitly specify that package. If we dig around in the project directory, you'll see that Roo has created NumberToEnglishService.java in src/main/com/habuma/numbers. But it's empty, so let's give it something to do. I could find no way to do this directly in Roo (and I can't imagine how that'd work anyway), so I hopped out of Roo and opened up NumberToEnglishService.java in my text editor and made it look like this:&lt;/p&gt; &lt;pre class="code_java"&gt;
package com.habuma.numbers; public interface NumberToEnglishService { String translate(int number);
}
&lt;/pre&gt; &lt;p&gt;The idea behind &lt;code&gt;NumberToEnglishService&lt;/code&gt; is to take a number as an &lt;code&gt;int&lt;/code&gt; and to return a &lt;code&gt;String&lt;/code&gt; that spells it out in English. For example, given 6, the &lt;code&gt;translate()&lt;/code&gt; method should return "six". Simple enough. Now we need an implementation. So, trying to do as much work in Roo as possible, I issue the &lt;code&gt;class&lt;/code&gt; command in the Roo shell:&lt;/p&gt; &lt;pre class="code"&gt;
roo&amp;gt; class --name ~.internal.NumberToEnglishServiceImpl
Created SRC_MAIN_JAVA/com/habuma/numbers/internal
Created SRC_MAIN_JAVA/com/habuma/numbers/internal/NumberToEnglishServiceImpl.java
roo&amp;gt; &lt;/pre&gt; &lt;p&gt;Since I'm ultimately going to export &lt;code&gt;com.habuma.numbers&lt;/code&gt; in the OSGi manifest, I want to put the implementation of &lt;code&gt;NumberToEnglishService&lt;/code&gt; in a different package. This keeps it private to this bundle so that no other bundle will try to use it directly. In Roo, the tilde (~) is a shortcut for the project's base directory, so "~.internal" will be expanded into "com.habuma.numbers.internal"...and that's where NumberToEnglishServiceImpl.java was created.&lt;/p&gt; &lt;p&gt;We're almost ready to create our bundle, but we need to flesh out the contents of NumberToEnglishServiceImpl.java. Again I turn to my text editor to have it implement the &lt;code&gt;NumberToEnglishService&lt;/code&gt; interface as follows:&lt;/p&gt; &lt;pre class="code_java"&gt;
package com.habuma.numbers.internal;
import com.habuma.numbers.NumberToEnglishService; public class NumberToEnglishServiceImpl implements NumberToEnglishService { public String translate(int number) { if(number == 6) { return "six"; } return "unknown"; }
}
&lt;/pre&gt; &lt;p&gt;So this implementation of &lt;code&gt;NumberToEnglishService&lt;/code&gt; is a bit short-sighted, but it does satisfy the aforementioned requirement of translating 6 to "six", so it's a good start.&lt;/p&gt; &lt;p&gt;Now we have all of the code in place for our service, so let's build it. Roo produces a Maven project, so all we need to do is run Maven with the &lt;code&gt;package&lt;/code&gt; goal:&lt;/p&gt; &lt;pre class="code"&gt;
roobundle% mvn package
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building numbers
[INFO] task-segment: [package]
[INFO] ------------------------------------------------------------------------
...
[INFO] Building jar: /Users/wallsc/Projects/roofun/roobundle/target/numbers-0.1.0-SNAPSHOT-sources.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 16 seconds
[INFO] Finished at: Wed Oct 21 22:09:43 CDT 2009
[INFO] Final Memory: 19M/34M
[INFO] ------------------------------------------------------------------------
roobundle% &lt;/pre&gt; &lt;p&gt;So far, so good. Let's crack open the JAR artifact to see what its manifest looks like. Unfortunately, it looks like this:&lt;/p&gt; &lt;pre class="code"&gt;
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: wallsc
Build-Jdk: 1.5.0_20
&lt;/pre&gt; &lt;p&gt;There's no &lt;code&gt;Bundle-SymbolicName&lt;/code&gt;, &lt;code&gt;Bundle-Version&lt;/code&gt;, &lt;code&gt;Export-Package&lt;/code&gt; or any other header that would indicate that this is an OSGi bundle. This is just a plain old JAR file. We need it to be an OSGi bundle.&lt;/p&gt; &lt;p&gt;We could edit our own manifest file, but that's no fun. Fortunately, Roo has support for the Bundlor tool to automatically generate a proper OSGi manifest. All we need to do is tell Roo that we want it to use Bundlor. To do that, issue &lt;code&gt;bundlor setup&lt;/code&gt; in the Roo shell:&lt;/p&gt; &lt;pre class="code"&gt;
roo&amp;gt; bundlor setup Managed ROOT/pom.xml
Created ROOT/template.mf
roo&amp;gt; &lt;/pre&gt; &lt;p&gt;Now our Roo project is setup with Bundlor, so let's build it again and the review the manifest to see if it looks any better. This time the manifest looks like this:&lt;/p&gt; &lt;pre class="code"&gt;
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: wallsc
Created-By: Apache Maven
Import-Package: javax.sql;version="0.0.0",org.springframework.stereoty pe;version="[3.0.0,3.1.0)"
Export-Package: com.habuma.numbers;version="0.1.0.BUILD-SNAPSHOT"
Bundle-Version: 0.1.0.BUILD-SNAPSHOT
Bundle-Name: numbers
Bundle-Classpath: .
Build-Jdk: 1.5.0_20
Bundle-ManifestVersion: 2
Bundle-SymbolicName: com.habuma.numbers
Tool: Bundlor 1.0.0.M5
&lt;/pre&gt; &lt;p&gt;Now that looks like an OSGi manifest. We have a &lt;code&gt;Bundle-SymbolicName&lt;/code&gt; and a &lt;code&gt;Bundle-Version&lt;/code&gt;, among other things. And notice that the &lt;code&gt;Export-Package&lt;/code&gt; header exports our base package. It all looks good...except...&lt;/p&gt; &lt;p&gt;The &lt;code&gt;Import-Package&lt;/code&gt; header imports &lt;code&gt;javax.sql&lt;/code&gt; and &lt;code&gt;org.springframework.stereotype&lt;/code&gt;. We're not really going to use those in our bundle, so I'm not sure that we need them. So we need to tell Bundlor to not import them. If you paid close attention when doing the Bundlor setup, you saw that Roo added a file called template.mf to the project. This file contains instructions to guide Bundlor in producing a manifest. We'll need to edit this file to remove the &lt;code&gt;Import-Package&lt;/code&gt; instructions for &lt;code&gt;javax.sql&lt;/code&gt; and &lt;code&gt;org.springframework.stereotype&lt;/code&gt;. If you open up template.mf, you'll see a line that looks like this:&lt;/p&gt; &lt;pre class="code"&gt;
Import-Package: org.springframework.stereotype;version="[3.0.0,3.1.0)", javax.sql;version="0.0.0"
&lt;/pre&gt; &lt;p&gt;Just remove it and then run the build again. Then have another look at the produced bundle's manifest. It should look a little like this:&lt;/p&gt; &lt;pre class="code"&gt;
Manifest-Version: 1.0
Bundle-Name: numbers
Bundle-Classpath: .
Archiver-Version: Plexus Archiver
Build-Jdk: 1.5.0_20
Built-By: wallsc
Created-By: Apache Maven
Bundle-ManifestVersion: 2
Bundle-SymbolicName: com.habuma.numbers
Tool: Bundlor 1.0.0.M5
Export-Package: com.habuma.numbers;version="0.1.0.BUILD-SNAPSHOT"
Bundle-Version: 0.1.0.BUILD-SNAPSHOT
&lt;/pre&gt; &lt;p&gt;Much better. Now the manifest doesn't import anything we don't need. But we're not quite ready to deploy our bundle yet. Even though we have a service interface and implementation and our bundle's manifest is in shape, there's nothing that actually publishes the service to the OSGi service registry.&lt;/p&gt; &lt;p&gt;There are a lot of ways to publish services to the OSGi service registry. In &lt;a rel="nofollow" target="_blank" href="http://pragprog.com/titles/cwosg/modular-java"&gt;&lt;i&gt;Modular Java&lt;/i&gt;&lt;/a&gt; I wrote about using both the core OSGi API and Spring-DM to publish and consume OSGi services. But recently, the OSGi R4.2 specification was released including the OSGi Blueprint Services specification and I've been wanting to try it out. OSGi Blueprint Services is a formalization of the service model from Spring-DM. It's slightly different than Spring-DM, but if you've already used Spring-DM, then it should be quite easy to figure out. Even if you've not used Spring-DM before, I think that the Blueprint model is quite intuitive.&lt;/p&gt; &lt;p&gt;All we need to do to publish our service in the OSGi service registry using OSGi Blueprint Services is to add an XML file containing the blueprint specifications to the bundles OSGI-INF/blueprint folder. Since our Roo-created project is a Maven project, that means creating the blueprint XML file in src/main/resources/OSGI-INF/blueprint. This one ought to do fine:&lt;/p&gt; &lt;pre class="code"&gt;
&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt; &amp;lt;blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:ext="http://geronimo.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0" default-activation="lazy"&amp;gt; &amp;lt;bean id="numberService" class="com.habuma.numbers.internal.NumberToEnglishServiceImpl" /&amp;gt; &amp;lt;service ref="numberService" interface="com.habuma.numbers.NumberToEnglishService" /&amp;gt; &amp;lt;/blueprint&amp;gt;
&lt;/pre&gt; &lt;p&gt;I named the file numbers.xml, but the name really isn't important. Any filename with a ".xml" extension will work.&lt;/p&gt; &lt;p&gt;The root of the blueprint specification XML is &lt;code&gt;&amp;lt;blueprint&amp;gt;&lt;/code&gt;. Within that the &lt;code&gt;&amp;lt;bean&amp;gt;&lt;/code&gt; element declares the &lt;code&gt;NumberToEnglishServiceImpl&lt;/code&gt; class as a bean in the blueprint context (just like Spring). Finally, the &lt;code&gt;&amp;lt;service&amp;gt;&lt;/code&gt; element refers to that bean and publishes it in the OSGi service registry under the &lt;code&gt;com.habuma.numbers.NumberToEnglishService&lt;/code&gt; package (just like Spring-DM).&lt;/p&gt; &lt;p&gt;There's only one more bit of bookkeeping to be done before we're ready to build and deploy our bundle. When Roo first created the project, it assumed that we'd be doing some Spring stuff, so it created a Spring configuration XML file at src/main/resources/META-INF/spring/applicationContext.xml. Since we're using OSGi Blueprint Services and no plain-old Spring, we'll not need that file anymore. And, if our bundle is deployed in an OSGi framework with the Spring-DM extender installed, this file will actually keep our bundle from starting successfully because it refers to stuff in &lt;code&gt;org.springframework.stereotype&lt;/code&gt;, which we no longer import in our manifest. The simple solution to this problem is to simply remove applicationContext.xml.&lt;/p&gt; &lt;p&gt;Now after we build the project one last time, we'll have an OSGi bundle with a service that is published to the OSGi service registry using OSGi Blueprint Services. All we need now is an OSGi runtime that supports Blueprint Services.&lt;/p&gt; &lt;p&gt;Even though OSGi R4.2 is rather new, there are already a few options available for using Blueprint Services. Spring-DM 2.0.0.M1, for instance, includes support for Blueprint Services and is, in fact, the reference implementation. But I've been tinkering with &lt;a rel="nofollow" target="_blank" href="http://felix.apache.org/site/apache-felix-karaf.html"&gt;Karaf&lt;/a&gt; lately, which includes Blueprint out of the box. And just to prove that this will work even without Spring, let's deploy it to Karaf.&lt;/p&gt; &lt;p&gt;Assuming that Karaf is running, all I need to do is to copy numbers-0.1.0-SNAPSHOT.jar from our Roo project's target directory into Karaf's deploy directory. Upon arrival in Karaf's deploy directory, Karaf will install and start the bundle. Then Karaf's Blueprint deployer will pick it up and publish the service to the OSGi service registry.&lt;/p&gt; &lt;p&gt;Once it's deployed, you can verify that the service is being deployed by using the &lt;code&gt;ls&lt;/code&gt; command in the Karaf shell:&lt;/p&gt; &lt;pre class="code"&gt;
karaf@root&amp;gt; ls ... numbers (46) provides:
----------------------
com.habuma.numbers.NumberToEnglishService
org.osgi.service.blueprint.container.BlueprintContainer
karaf@root&amp;gt; &lt;/pre&gt; &lt;p&gt;The &lt;code&gt;ls&lt;/code&gt; command lists all of the bundles installed in the OSGi framework along with any services that they provide or consume. In the case of the number service bundle, we can see that it's deployed with the ID of 46 (this will vary depending on what else you've installed before) and provides two services: The &lt;code&gt;NumberToEnglishService&lt;/code&gt; and the bundle's blueprint container.&lt;/p&gt; &lt;p&gt;Karaf's &lt;code&gt;list&lt;/code&gt; command tells a similar story:&lt;/p&gt; &lt;pre class="code"&gt;
karaf@root&amp;gt; list
START LEVEL 100 ID State Blueprint Level Name
...
[ 46] [Active ] [Created ] [ 60] numbers (0.1.0.BUILD-SNAPSHOT)
karaf@root&amp;gt; &lt;/pre&gt; &lt;p&gt;From here I can see that bundle 46 has been started and that a blueprint has been created for it.&lt;/p&gt; &lt;p&gt;Clearly the Blueprint Services have published our service for us. But if you want one more bit of evidence, then we can also look in the web console. If you've not already done so, we'll need to install the web console in Karaf:&lt;/p&gt; &lt;pre class="code"&gt;
karaf@root&amp;gt; features:install webconsole
&lt;/pre&gt; &lt;p&gt;Simple enough. Now point your browser at http://localhost:8181/system/console. When prompted for a username and password, use "karaf" for both. Once in, find our bundle and drill into its details. &lt;a rel="nofollow" target="_blank" href="http://www.jroller.com/habuma/resource/karaf_webconsole.png"&gt;Click here to see what I saw in Karaf&lt;/a&gt;. I could see (among other things) that my service was published with service ID 118 and the Blueprint container was published as a service with ID 119.&lt;/p&gt; &lt;p&gt;That wraps up my excursion into Roo, Blueprints, and Karaf for today. Note that from start to finish I did all of this in just under 30 minutes, including time to stop and take notes of what I had done. It was simple work putting together this bundle. Part of the simplicity is owed to Blueprint Services--to me the Blueprint model is quite natural and straight-forward. And Roo helped out a ton at the beginning by generating the project structure and (along with Bundlor) generating the manifest.&lt;/p&gt; &lt;p&gt;In hindsight, it was fun to say that I developed an OSGi bundle using Roo. However, I'm not sure that Roo brought a lot to the table aside from the initial project creation. I still prefer &lt;a rel="nofollow" target="_blank" href="http://wiki.ops4j.org/display/paxconstruct/Pax+Construct"&gt;Pax Construct&lt;/a&gt; for rapidly creating bundle projects. Don't get me wrong, I like Roo...I like it a lot. But in this case I'm not sure that Roo offered a lot once the project was created.&lt;/p&gt; &lt;p&gt;Perhaps in a more interesting example where I'm developing a data access service, Roo would be helpful in setting up the persistence with Hibernate or EclipseLink. Or maybe if I were creating a web bundle, Roo would help out with the controllers.&lt;/p&gt; &lt;p&gt;Nevertheless, the exercise was well worth it. It helped me get comfortable with Roo (albeit in an off-beat kinda way). I got to tinker with Blueprint Services. I had fun fiddling around with Karaf. And ultimately, it gave my unfocused brain something to do that was at least somewhat related to the topic of the session I was sitting in.&lt;/p&gt; &lt;p&gt;By the way, the anxiety I was feeling for my own presentation was unnecessary. From my perspective, it was one of the best presentations that I've ever given. And I've had a few of the attendees tell me that they enjoyed it. It was a great presentation because everyone in the room learned something new. That includes me and even Andy Clement (the creator of SpEL). The crowd suggested several tricks to try with SpEL and we were all uncertain that any of them would work. As it turns out, SpEL's even more capable than any of us knew. Keep an eye on this blog, as I hope to soon post my SpEL presentation in the form of an article.&lt;/p&gt;</description>
         <author>Craig Walls</author>
         <guid isPermaLink="false">http://www.jroller.com/habuma/entry/curing_add_with_roo_blueprints</guid>
         <pubDate>Thu, 22 Oct 2009 06:00:00 -0700</pubDate>
         <category>OSGi</category>
      </item>
      <item>
         <title>SpringOne/2GX Day 2 Keynote</title>
         <link>http://www.jroller.com/habuma/entry/springone_2gx_day_2_keynote</link>
         <description>&lt;p&gt;It's almost 24 hours after the fact, but here's my writeup on the SpringOne/2GX Day 2 Keynote that was given by Adrian Colyer, Karl Rumelhart, and Chris Richardson. I won't go over it in detail as I did with Rod Johnson's keynote...instead I'll just summarize it as best as I can.&lt;/p&gt; &lt;p&gt;The keynote started with Adrian telling a rather humorous story about his luggage. He then went on to try to make sense of what has gone on in the past year with SpringSource, specifically with regard to the various acquisitions (G2One, Hyperic, CloudFoundry, and ultimately the VMWare acquisition of SpringSource).&lt;/p&gt; &lt;p&gt;To help make his point, he called Chris Richardson (founder of CloudFoundry) to the stage to provide a quick demonstration of CloudFoundry. Chris' demo involved deploying a Roo application to the cloud using CloudFoundry.&lt;/p&gt; &lt;p&gt;Adrian resumed the keynote by discussing the notion of deployment blueprints. Deployment blueprints describe the pieces that come together to make up the virtual deployment in the cloud.&lt;/p&gt; &lt;p&gt;Chris then returned to the stage to provide a demo of the new CloudFoundry plugin in SpringSource ToolSuite.&lt;/p&gt; &lt;p&gt;Finally, Kyle Rumelhart takes the stage to describe some of VMWare's products and technologies geared toward the private cloud.&lt;/p&gt; &lt;p&gt;I realize that this summary has been quite brief. To be honest, I was having a hard time following along during the keynote because (1) I was tired, (2) I was too consumed thinking about my talk that I'd be giving today, and (3) while all of it is very interesting, much of what was being shown is less development-oriented and more IT-oriented...especially the private cloud stuff.&lt;/p&gt;</description>
         <author>Craig Walls</author>
         <guid isPermaLink="false">http://www.jroller.com/habuma/entry/springone_2gx_day_2_keynote</guid>
         <pubDate>Wed, 21 Oct 2009 15:58:40 -0700</pubDate>
         <category>Spring</category>
      </item>
      <item>
         <title>SpringOne/2GX Day 2 session wrap-up</title>
         <link>http://www.jroller.com/habuma/entry/springone_2gx_day_2_session</link>
         <description>&lt;p&gt;The second day of sessions at &lt;a rel="nofollow" target="_blank" href="http://www.springone2gx.com"&gt;SpringOne/2GX&lt;/a&gt; is almost over. Soon, we'll be having dinner and then listening to Adrian Colyer give a keynote address (which I'll summarize in a later post). So I thought I'd go ahead and take a moment to report on my day and the sessions I've attended.&lt;/p&gt; &lt;p&gt;I spent the better part of the day in the "Rich Web Application Development" track, as it had a lot of topics that I find interesting. I started by hearing Keith Donald give an overview of the entire Spring Web stack, focusing on Spring 3.0 MVC. I'm already familiar with the topic, but I wanted to make sure I wasn't missing something in Spring MVC and for lack of another talk to catch my attention I decided to go for Keith's talk. It was a very informative talk. The one thing that I walked away with was a deeper understanding of how to apply Spring 3.0-style REST to my Spring MVC applications.&lt;/p&gt; &lt;p&gt;With REST fresh in my mind, I decided to spend the 2nd session of the day sitting in on Arjen Poutsma's talk that focused on using REST in Spring. Although I've been familiar with Spring 3.0's new REST support for awhile, I still learned something that I didn't already know. Specifically, I wasn't aware that &lt;code&gt;@RequestMapping&lt;/code&gt; can take URL patterns with Ant-style wildcards and regular expressions. I also got a better feel for how to divide up my RESTful resources among Spring MVC controllers.&lt;/p&gt; &lt;p&gt;After lunch, I attended Jeremy Grelle's talk on Spring Faces. I'm not a big JSF fanatic, but I decided to make myself go to this talk because I really should be more comfortable with the topic than I am. I'm glad that I went because I learned that Spring Faces offers a Spring-centric approach to JSF where JSF is really just a view technology for Spring MVC (as opposed to a JSF-centric approach where Spring is nothing but a managed bean provider). As a fan of Spring MVC, I like the Spring-centric JSF integration that Spring Faces offers. Couple that with Facelets (I hated the JSP-oriented JSF) and I think I could end up liking (or at least tolerating) JSF.&lt;/p&gt; &lt;p&gt;Next up, I listened to Ben Alex give an introduction to Roo. I've tinkered with Roo here and there before, but never have had a chance to really dig into it. I just gotta say that I think an alternate name for Spring Roo might be "Spring Wow!", because I was blown away by it. I learned some little details about Roo that I didn't realize. For instance, I've seen the .aj files in my toy Roo projects, but didn't know what purpose they served--and in fact, they made me uncomfortable thinking that my project depended on AspectJ without me understanding why. Now I know that Roo uses AspectJ at compile-time only as its magic sauce for automatically weaving in code that I don't want to write (like accessor methods). Roo has no runtime presence and thus no runtime overhead. And, I learned that if I decide to de-Roo my project, it's a very simple 3-step process. Oh, and Roo makes easy work of creating OSGi bundles with its Bundlor support.&lt;/p&gt; &lt;p&gt;Right now I'm listening (sorta...I'm also writing this) to Chris Beams and Mark Pollack talk about a variety of dependency injection styles. They've organized the styles into external DI and internal DI. Spring's XML-based configuration, for example, is external (that is, it doesn't invade your application code). But Spring's &lt;code&gt;@Component&lt;/code&gt; and &lt;code&gt;@Autowired&lt;/code&gt;-based DI is internal because it invades your Java source. A lot of this talk is old hat to me...I've presented a similar talk before. But I wanted to catch up on the latest options (JSR-330, for example) and get their take on the different DI styles.&lt;/p&gt; &lt;p&gt;As I have already mentioned, Adrian Colyer will be giving a keynote address after dinner tonight. I'll blog about that later tonight or tomorrow. Following that is a sponsor reception and then BOF sessions. Honestly, I'm a bit drained, so I may skip out on the BOF sessions so that I can do some last minute preparations for my SpEL talk tomorrow and get a good night's sleep.&lt;/p&gt;</description>
         <author>Craig Walls</author>
         <guid isPermaLink="false">http://www.jroller.com/habuma/entry/springone_2gx_day_2_session</guid>
         <pubDate>Tue, 20 Oct 2009 15:06:36 -0700</pubDate>
         <category>Spring</category>
      </item>
      <item>
         <title>Ep. 10 – Windows 7 Experience</title>
         <link>http://improvingpodcasts.com/2009/10/ep-10-windows-7-experience/</link>
         <description>Our intrepid hosts, Mike and Allen, reach double-digits via a revisit of Windows 7 with Microsoft MVP Todd Girvin who has been beta testing since early 2009. Todd provides us with experience reports on some of the features we covered in Episode 7 and fills us in on a few we missed as well.
Links:
- Virtual [...]</description>
         <author>Mike</author>
         <guid isPermaLink="false">http://improvingpodcasts.com/?p=101</guid>
         <pubDate>Tue, 20 Oct 2009 15:03:27 -0700</pubDate>
         <content:encoded><![CDATA[<p>Our intrepid hosts, Mike and Allen, reach double-digits via a revisit of Windows 7 with Microsoft MVP Todd Girvin who has been beta testing since early 2009. Todd provides us with experience reports on some of the features we covered in Episode 7 and fills us in on a few we missed as well.</p>
<p>Links:</p>
<p>- Virtual PC: <a rel="nofollow" title="Virtual PC" target="_blank" href="http://microsoft.com/virtualpc">http://microsoft.com/virtualpc</a><br />
- Booting Win 7 from a VHD: <a rel="nofollow" title="Scott Hanselman's post about booting from a VHD" target="_blank" href="http://www.hanselman.com/blog/LessVirtualMoreMachineWindows7AndTheMagicOfBootToVHD.aspx">http://www.hanselman.com/blog/LessVirtualMoreMachineWindows7AndTheMagicOfBootToVHD.aspx</a><br />
- SlySoft&#8217;s Virtual Clone Drive (was by Elaborate Bytes): <a rel="nofollow" title="Virtual Clone Drive" target="_blank" href="http://www.slysoft.com/en/virtual-clonedrive.html">http://www.slysoft.com/en/virtual-clonedrive.html</a><br />
- Wikipedia page with Windows key shortcuts: <a rel="nofollow" title="Wikipedia on the Windows Key including the shortcuts" target="_blank" href="http://en.wikipedia.org/wiki/Windows_key/">http://en.wikipedia.org/wiki/Windows_key/</a><br />
- The Dallas C# Special Interest Group: <a rel="nofollow" title="The SIG run by Todd" target="_blank" href="http://www.dallas-csharp-sig.com/">http://www.dallas-csharp-sig.com/</a><br />
- Todd and Chris Tullier&#8217;s Workshop at PDC: <a rel="nofollow" title="Todd's Workshop at the PDC pre-con" target="_blank" href="http://microsoftpdc.com/Sessions/Developing-Quality-Software-using-Visual-Studio-Team-System-2010">http://microsoftpdc.com/Sessions/Developing-Quality-Software-using-Visual-Studio-Team-System-2010</a><br />
- Todd Girvin (<a rel="nofollow" title="Todd on twitter" target="_blank" href="http://twitter.com/tmgirvin">@tmgirvin</a>): <a rel="nofollow" title="Todd's Blog" target="_blank" href="http://tmgirvin.com/">http://tmgirvin.com/</a></p>
<p>As always, please send us feedback to: feedback at improvingpodcasts.com</p>]]></content:encoded>
         <enclosure length="33781186" url="http://improvingpodcasts.com/podcasts/010_Windows7Experience.mp3" type="audio/mpeg" />
      </item>
      <item>
         <title>SpringOne/2GX Keynote notes</title>
         <link>http://www.jroller.com/habuma/entry/springone_2gx_keynote_notes</link>
         <description>&lt;p&gt;Rod started out by giving a quick overview of the Spring timeline, starting with the publication of &lt;a rel="nofollow" target="_blank" href="http://www.amazon.com/gp/product/0764543857/?tag=habumacom-20"&gt;&lt;i&gt;Expert One-on-One J2EE Design and Development&lt;/i&gt;&lt;/a&gt;, up through the formation of Interface21/SpringSource, and into the more recent acquisitions.&lt;/p&gt; &lt;p&gt;He then described Spring's core values:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;b&gt;For developers by developers&lt;/b&gt;: Speaking of SpringSource, he says that they like to code and like making it easier to write code. They avoid ivory tower solutions and their staff works with customers every day. They're about practical solutions and a solution is only valuable if it works in the real world.&lt;/li&gt; &lt;li&gt;&lt;b&gt;Simplification&lt;/b&gt;: They called the emperor's new clothes in old J2EE and drove positive change, while others were patenting J2EE patterns (remember Fast Lane Reader?) and writing about the reasons they loved EJBs. Each version of Spring has reduced the amount of code in applications based on Spring (the framework does more so you do less). Not just about the framework and runtime stack...also about application lifecycle.&lt;/li&gt; &lt;li&gt;&lt;b&gt;Community&lt;/b&gt;: Spring's strength is due to its community, which Gartner estimates is at 3 million members. The Spring community is passionate, highly-skilled, and prepared to think for themselves. They write over 1000 posts per week in the Spring forums and contribute bugs and feature requests. &lt;li&gt;&lt;b&gt;Innovation&lt;/b&gt;: Technology evolution is never done. Each advance allows others. Always new challenges to overcome.&lt;/li&gt;
&lt;/ul&gt; &lt;p&gt;With regard to community, Rod invited everyone to get involved. Ask and answer questions on the forums. Request issues and report bugs in JIRA. Participate in community events such as Spring and Java user groups and Groovy and Grails meet-ups. Join the conversation by following SpringSource developers on their blogs and on Twitter. Contribute code through Spring Extensions and by writing tests and patches to the other Spring projects.&lt;/p&gt; &lt;p&gt;[Editor's note: Spring Extensions is the new incarnation of what used to be known as Spring Modules. Spring Modules had a caching module that hasn't been moved to Spring Extensions because, as I understand it, lack of a project owner. If you're looking for an opportunity to get involved, that'd be a great place to start.]&lt;/p&gt; &lt;p&gt;Rod then went on to talk about what's new in Spring. He mentioned a few of the new features in Spring 3.0:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Simplification of configuration, especially with the Spring Expression Language&lt;/li&gt; &lt;li&gt;MVC improvements&lt;/li&gt; &lt;li&gt;Comprehensive REST support&lt;/li&gt; &lt;li&gt;Updated to take full advantage of Java 5+&lt;/li&gt; &lt;li&gt;Support for meta-annotations...annotations that can be used together to make stereotype annotations&lt;/li&gt; &lt;li&gt;@Configuration (aka, Spring JavaConfig)&lt;/li&gt;
&lt;/ul&gt; &lt;p&gt;In addition to the new stuff in the Spring Framework, Rod also mentioned some recent and upcoming releases elsewhere in the Spring portfolio:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Spring WebFlow 3.0M1&lt;/li&gt; &lt;li&gt;Spring Integration 2.0M1&lt;/li&gt; &lt;li&gt;Spring Roo 1.0 GA&lt;/li&gt; &lt;li&gt;Spring Batch 2.1&lt;/li&gt; &lt;li&gt;Spring Security 3.0 GA&lt;/li&gt; &lt;li&gt;Grails 1.2&lt;/li&gt;
&lt;/ul&gt; &lt;p&gt;Rod then highlighted two Spring portfolio projects, Spring Integration and Spring BlazeDS. With regard to Spring Integration, he said that Spring Integration is an embedded message bus that runs within any Spring ApplicationContext--no need for an ESB. All components are Spring-managed objects and can take full advantage of the Spring component model. It also serves as an application integration framework, connecting to other systems via adapters such as File, JMS, HTTP, WS, Mail, UDB/TCP, Twitter, and others.&lt;/p&gt; &lt;p&gt;As for Spring BlazeDS, it bootstraps Adobe Blaze DS within a Spring environment, allowing Spring to manage Flex server-side components. It offers direct remoting from Flex clients to Spring beans and easy integration with Spring Security using regular Flex API. Spring BlazeDS gives Flex applications access to full power of Spring.&lt;/p&gt; &lt;p&gt;At this point, Rod invited Jereme Grelle and Mark Fisher to take the stage and give a demo of Spring BlazeDS and Spring Integration. The demo involved a Flex chat application that used Spring BlazeDS to communicate with server-side objects. On the server-side, Spring Integration was used as an embedded message bus to accept and deliver messages between Flex clients. It was a very impressive demo.&lt;/p&gt; &lt;p&gt;Rod then returned to the stage and told of having tried bacon ice cream (available on the menu at the hotel) and how it reminded him of pigs, which reminded him of Grails. That's because, from the story of the 3 little pigs, he knows that pigs build houses and the Grails house is built on the bricks of the JVM, Java Server infrastructure, and Spring. At this point, he invited Graeme Rocher to speak about Grails and to demo new Grails features coming in SpringSource ToolSuite.&lt;/p&gt; &lt;p&gt;Graeme reported that Grails continues to garner interest, with 150% growth in traffic to the Grails site in the last few months. Groovy 1.7 and Grails 1.2 releases are approaching. But what was most exciting to Graeme is the explosion in the Grails plugin community; over 25 million lines of user-contributed code in over 300 plugins. If you want to do something in Grails, then there's probably a plugin for that.&lt;/p&gt; &lt;p&gt;Graeme then spoke of the challenges in IDE support before demo'ing a Grails-capable version of SpringSource ToolSuite. Coming soon, STS 2.2 will include a much improved Groovy development experience and support for working with Grails in the IDE.&lt;/p&gt; &lt;p&gt;Rod returned to the podium again to speak briefly about SpringSource tcServer, which has been focused on operational concerns. He then announced SpringSource tcServer Developer Edition, which focuses on development-time concerns. It includes the Spring Insight Dashboard which provides real-time performance insights, drill-down transaction tracing, and a view into application health. It is tightly integrated with STS and will be available as a free download.&lt;/p&gt; &lt;p&gt;John Travis, lead tcServer Developer Edition, then demoed tcServer Developer Edition. He wowed the crowd with the ability to dive into a running application in real-time and see what was going on at an amazingly low-level.&lt;/p&gt; &lt;p&gt;Rod then returned to the podium one last time to discuss what's next. He spoke of their latest acquisition...VMWare (obviously joking). But with regard to VMWare's acquisition of SpringSource, he stated that both companies share the same core values. He says that VMWare cares about developer communities, is committed to open-source, and is serious about middleware.&lt;/p&gt; &lt;p&gt;He then went on to talk about moving into the cloud and their recent acquisition of CloudFoundry. Speaking of CloudFoundry, all SpringOne/2GX attendees will receive an invitation to try CloudFoundry for free for 48 hours of server processing time. &lt;/p&gt; &lt;p&gt;Rod wrapped up by saying that it's not just about SpringSource. For the next 3 days we'll have the opportunity to learn about technologies from the source and interact with the Spring team and fellow Spring developers. He also mentioned that we've packed the Roosevelt Hotel in New Orleans, so almost everyone here is a Spring or Grails person.&lt;/p&gt; &lt;p&gt;Finally, and best of all, Rod said that this is the first conference venue that offers the opportunity to try bacon ice cream.&lt;/p&gt;</description>
         <author>Craig Walls</author>
         <guid isPermaLink="false">http://www.jroller.com/habuma/entry/springone_2gx_keynote_notes</guid>
         <pubDate>Mon, 19 Oct 2009 16:14:07 -0700</pubDate>
         <category>Spring</category>
      </item>
      <item>
         <title>Practical Tweaks: creating a Social Security Number column</title>
         <link>http://weblogs.asp.net/peterbrunone/archive/2009/10/19/practical-tweaks-creating-a-social-security-number-column.aspx</link>
         <description>&lt;p&gt;Many people find SharePoint to be somewhat limiting in its out-of-the-box functionality, but really, a creative approach can take you pretty far.&amp;nbsp; Say, for example, you need to create a column to hold Social Security numbers (assuming you've worked out all the relevant security issues).&amp;nbsp; You have a field that requires numeric validation, but it has a specific length requirement, which sounds more like string validation.&amp;nbsp; Here's what I came up with off the cuff:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Create a new Site Column.&amp;nbsp; Add it to whatever group makes sense (I picked Core Contact and Calendar Columns).&lt;/li&gt;&lt;li&gt;Give it a name and a datatype of Number.&lt;/li&gt;&lt;li&gt;Specify a maximum of 999999999 to take care of the ten-digit formatting issue.&lt;/li&gt;&lt;li&gt;Explicitly set &lt;b&gt;Number of decimal places&lt;/b&gt; to zero.&lt;img alt=""&gt;&lt;/li&gt;&lt;li&gt;Click &lt;b&gt;OK.&lt;/b&gt;&lt;br&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&amp;nbsp;That's it.&amp;nbsp; Next time we'll look at masking/validating your user's input for this field.&lt;br&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7233151" width="1" height="1"&gt;</description>
         <author>PeterBrunone</author>
         <guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7233151</guid>
         <pubDate>Mon, 19 Oct 2009 10:49:00 -0700</pubDate>
      </item>
      <item>
         <title>WriteThisNotThat.com</title>
         <link>http://caseywatson.com/2009/10/14/writethisnotthat-com/</link>
         <description>Have you checked out WriteThisNotThat.com yet? You haven&amp;#8217;t?! Alright. I see how it is. I thought we were friends.
WriteThisNotThat.com is a community-based site dedicated to building a library of good development practices by profiling the really ugly ones. By really ugly practices I mean that 700-line-long method that makes you vomit in your mouth a [...]</description>
         <author>Casey Watson</author>
         <guid isPermaLink="false">http://caseywatson.com/?p=276</guid>
         <pubDate>Wed, 14 Oct 2009 13:08:53 -0700</pubDate>
         <content:encoded><![CDATA[<p>Have you checked out <a rel="nofollow" target="_blank" href="http://writethisnotthat.com/">WriteThisNotThat.com</a> yet? You haven&#8217;t?! Alright. I see how it is. I thought we were friends.</p>
<p><a rel="nofollow" target="_blank" href="http://writethisnotthat.com/">WriteThisNotThat.com</a> is a community-based site dedicated to building a library of good development practices by profiling the really ugly ones. By really ugly practices I mean that 700-line-long method that makes you vomit in your mouth a little everytime you think about it. How about that old class that&#8217;s 90% unreachable code because it&#8217;s covered in hacked-together bandages? That&#8217;s what we want to see! This site is welcome to all developers regardless of language (even VB) or experience level. Seasoned architect? Great! Straight out of college? Even better! </p>
<p>We&#8217;re in the process of courting some sponsors so that we can spin up a monthly contest based on your votes. Post your ugly source code and there might be a little something in it for you. </p>
<p>Drop by when you get chance. If you don&#8217;t learn anything the first time around it will atleast be good for a chuckle or two. Next time you run across some especially gnarly source code, share it with us! We&#8217;d love to see it! </p>
<p>If you like the site, please don&#8217;t keep it a secret.</p>]]></content:encoded>
         <category>Uncategorized</category>
      </item>
      <item>
         <title>Fun with Fluent Interfaces</title>
         <link>http://caseywatson.com/2009/10/14/fun-with-fluent-interfaces/</link>
         <description>I&amp;#8217;ve been working on an application recently that sleeps until a specific time then checks for the existence of a particular file. While writing the application it dawned on me that I&amp;#8217;ve written very similar code before for other clients. I hate to solve the same problem twice so I decided to create a simple API [...]</description>
         <author>Casey Watson</author>
         <guid isPermaLink="false">http://caseywatson.com/?p=255</guid>
         <pubDate>Wed, 14 Oct 2009 12:42:19 -0700</pubDate>
         <content:encoded><![CDATA[<p>I&#8217;ve been working on an application recently that sleeps until a specific time then checks for the existence of a particular file. While writing the application it dawned on me that I&#8217;ve written very similar code before for other clients. I hate to solve the same problem twice so I decided to create a simple API that allows me to create a new thread, have it sleep for or until a specific time, then execute a block of code. I decided that my API would also implement a fluent interface.</p>
<p>Fluent interfaces allow developers to work with objects in a more natural and readable fashion by chaining methods together. By building a fluent interface I can make my API not only more concise but much easier to use. Take a look at the following code:</p>
<pre>
Wait.Until("1:45 PM").Then(() =&gt; DoSomethingImportant());
</pre>
<p>By chaining methods together we&#8217;re forming a sentence describing exactly what we want to happen. We want to wait until 1:45 PM and then do something important. But how do we implement this interface? <strong>Wait</strong> is actually a static class that defines the <strong>For</strong> and <strong>Until</strong> methods. Let&#8217;s take a closer look to see what&#8217;s going on under the covers:</p>
<pre>
public static class Wait
{ public static WaitContext For(TimeSpan waitFor_) { if (waitFor_ &lt;= TimeSpan.Zero) throw new ArgumentOutOfRangeException("waitFor", "The supplied time span is negative"); return new WaitContext(waitFor_); } public static WaitContext For(string waitFor_) { TimeSpan waitFor = default(TimeSpan); if (!(TimeSpan.TryParse(waitFor, out waitFor))) throw new ArgumentOutOfRangeException("waitFor", "The supplied time span is invalid."); return For(waitFor); } public static WaitContext Until(DateTime waitUntil_) { if (waitUntil_ &lt;= DateTime.Now) throw new ArgumentOutOfRangeException("waitUntil_", "The supplied date is in the past."); return new WaitContext(waitUntil_); } public static WaitContext Until(string waitUntil_) { DateTime waitUntil = default(DateTime); if (!(DateTime.TryParse(waitUntil_, out waitUntil))) throw new ArgumentOutOfRangeException("waitUntil_", "The supplied date is invalid."); return Until(waitUntil); }
}
</pre>
<p>Let&#8217;s take a second to examine this class. As you can see, we are defining overloaded versions of the <strong>Wait</strong> and <strong>For</strong> methods allowing us to supply a specific <strong>DateTime</strong> or <strong>TimeSpan</strong> or a string that can be parsed into the appropriate structure. By overloading the two key methods to allow strings we can make our interface more natural and easier to read. Each method first performs some validation logic then returns a <strong>WaitContext</strong> that defines how long we are going to wait before executing a given block of code. Let&#8217;s take a look at <strong>WaitContext</strong> so we can complete the full picture of how this is all going to work:</p>
<pre>
public class WaitContext
{ internal WaitContext(DateTime waitUntil_) { _waitUntil = waitUntil_; } internal WaitContext(TimeSpan waitFor_) { _waitFor = waitFor_; } private DateTime? _waitUntil; private TimeSpan? _waitFor; public void Then(Action toDo_) { if (toDo_ == null) throw new ArgumentNullException("toDo_"); ThreadPool.QueueUserWorkItem(new WaitCallback( new Action&lt;object&gt;(o =&gt; { Thread.Sleep( _waitUntil.HasValue ? _waitUntil.Value.Subtract(DateTime.Now) : _waitFor.Value); toDo_(); }))); }
}
</pre>
<p>The <strong>WaitContext</strong> can only be initialized within the <strong>Wait</strong> class defined earlier with a <strong>DateTime</strong> or <strong>TimeSpan</strong> structure. The <strong>Then</strong> method is the one that actually does all of the heavy lifting. After checking that the provided <strong>Action</strong> delegate is valid we then spin up a new thread. Within the thread we&#8217;re going to wait for or until the specified time then invoke the provided delegate. Since we&#8217;re potentially working with multiple threads here be sure to make the delegate that you provide thread-safe. If you&#8217;d like, it would be pretty simple to include some sort of callback mechanism within the delegate that you provide. </p>
<p>That&#8217;s pretty much all there is to it. Keep in mind that there is no one tool for every situation. Fluent interfaces just seemed to be a particularly good fit this time around. I&#8217;d like to add some additional functionality in the near future that would allow me to continuously invoke the delegate at a given interval. I don&#8217;t need that right now but I&#8217;ll probably add it later.</p>
<p>This source code is free to modify and use for whatever purpose. All that I ask is that you give a little credit where credit is due and let me know how you&#8217;re using it.</p>
<p>Happy hacking!</p>]]></content:encoded>
         <category>Uncategorized</category>
      </item>
      <item>
         <title>Spring conference time is in the air</title>
         <link>http://www.jroller.com/habuma/entry/it_s_almost_springone_2gx</link>
         <description>&lt;p&gt;As of today, it's one week until I present &lt;a rel="nofollow" target="_blank" href="http://www.springone2gx.com/conference/new_orleans/2009/10/session?id=15653"&gt;&lt;i&gt;That old Spring magic has me in its SpEL: DI Wizardy with the Spring Expression Language&lt;/i&gt;&lt;/a&gt; at &lt;a rel="nofollow" target="_blank" href="http://www.springone2gx.com"&gt;SpringOne/2GX&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;I'm really excited about giving this talk. I've already presented it twice at two different &lt;a rel="nofollow" target="_blank" href="http://www.nofluffjuststuff.com"&gt;No-Fluff/Just-Stuff&lt;/a&gt; shows, but I've had some opportunity to refine it and get it in tip-top shape for SpringOne/2GX. Even if you've heard it when I presented it in Boston or Minneapolis before, this time's going to be a bit different (and hopefully better).&lt;/p&gt; &lt;p&gt;The other thing I'm excited about is that this is the first SpringOne (or The Spring Experience) conference where I only have on presentation and I'm totally prepared for it well in advance. So, instead of skipping sessions to fix my slides and examples, I'll be able to enjoy the conference as an attendee. With all of that free time on my hands, you can count on me to blog and tweet what I hear and see. Keep an eye on this blog to experience SpringOne/2GX from my point of view.&lt;/p&gt; &lt;p&gt;Also, if you're not following me on Twitter already, here's your chance to get on my followers list before the conference. In addition to blogging, I'll be tweeting random bits here and there from both my &lt;a rel="nofollow" target="_blank" href="http://www.twitter.com/springinaction"&gt;springinaction&lt;/a&gt; and my &lt;a rel="nofollow" target="_blank" href="http://www.twitter.com/modularjava"&gt;modularjava&lt;/a&gt; Twitter identities. For you lucky folks who are both following me and are at SpringOne/2GX next week, you'll be given a handful of opportunities to pick up a few goodies...I'm going to tweet directions during the conference, so keep watch on my Twitter identities for details.&lt;/p&gt; &lt;p&gt;While I'm advertising all of the ways to follow my online identities, I should mention that I have Facebook pages for both &lt;a rel="nofollow" target="_blank" href="http://www.facebook.com/springinaction"&gt;&lt;i&gt;Spring in Action&lt;/i&gt;&lt;/a&gt; and &lt;a rel="nofollow" target="_blank" href="http://www.facebook.com/modularjava"&gt;&lt;i&gt;Modular Java&lt;/i&gt;&lt;/a&gt;. Sign up as a fan on those pages and maybe I'll toss some goodies your way, too.&lt;/p&gt; &lt;p&gt;Finally, if you're at SpringOne/2GX, I look forward to getting a chance to say "Hi". Even though I'm talking about SpEL, I'll be happy to chat with you about most anything Spring or OSGi oriented. See ya there!&lt;/p&gt;</description>
         <author>Craig Walls</author>
         <guid isPermaLink="false">http://www.jroller.com/habuma/entry/it_s_almost_springone_2gx</guid>
         <pubDate>Wed, 14 Oct 2009 06:00:00 -0700</pubDate>
         <category>General</category>
      </item>
      <item>
         <title>CHECKSTYLE:OFF comments are still apologies</title>
         <link>http://cleveralias.blogs.com/thought_spearmints/2009/10/checkstyleoff-comments-are-still-apologies.html</link>
         <description>Checkstyle is a fantastic tool to help Java development teams keep code clean and unsurprising. The feedback it gives should be treated as suggestions from a trusted advisor, not a nuisance. If I write a method that's getting a bit...</description>
         <author>Pholser</author>
         <guid isPermaLink="false">http://cleveralias.blogs.com/thought_spearmints/2009/10/checkstyleoff-comments-are-still-apologies.html</guid>
         <pubDate>Mon, 12 Oct 2009 09:22:45 -0700</pubDate>
         <content:encoded><![CDATA[<p><a rel="nofollow" target="_blank" href="http://checkstyle.sourceforge.net">Checkstyle</a> is a fantastic tool to help Java development teams keep code clean and unsurprising. The feedback it gives should be treated as suggestions from a trusted advisor, not a nuisance. If I write a method that's getting a bit long-winded or overly complex, I'd like to know, so that I have an opportunity to make it easier to understand and maintain. I don't ever want to be "that guy" on my development teams -- leaving messes for others to wade through and clean up, slowing them down in the process. (Every once in a while, to my shame, I have been.)</p> <p>Checkstyle allows you to exempt sections of code from the checks it performs by enclosing the section in special comments:</p> <p><pre><code>
// CHECKSTYLE:OFF /* mess here */
// CHECKSTYLE:ON
</code></pre></p> <p>There are times where such selective overriding of style checks is appropriate. Here's an example from something I worked on recently:</p> <p><pre><code>
abstract class ExceptionLoggingCallable&lt;V&gt; implements Callable&lt;V&gt; { // ... // CHECKSTYLE:OFF -- We advertise Exception because the method we implement does, // and because we want Exceptions in general to be rethrown. We catch Exception // and Throwable in order to log them and rethrow. public final V call() throws Exception { try { return doSomethingThatMightRaiseAnException(); } catch (Exception ex) { logger.error(ex); throw ex; } catch (Throwable ex) { logger.fatal(ex); throw new RuntimeException(ex); } } // CHECKSTYLE:ON protected abstract V doSomethingThatMightRaiseAnException();
}
</code></pre></p> <p>I specifically chose to subvert the <code>IllegalCatch</code> and <code>IllegalThrows</code> checks here for what I believed to be legitimate reasons. I gave those reasons in the <code>CHECKSTYLE:OFF</code> comments, so that readers would know it was not a lightly-taken decision.</p> <p>Now consider the following code. Do you believe the Checkstyle checks are subverted for good reason?</p> <p><pre><code> // CHECKSTYLE:OFF private void startLateCount(String localName, Attributes attributes) { if ("_LATE_COUNT".equals(localName) && currentLiability != null) { int timesThirtyDaysLate = 0; try { String thirtyDayAttr = attributes.getValue("_30Days"); timesThirtyDaysLate = timesThirtyDaysLate + Integer.parseInt(thirtyDayAttr); } catch ( NumberFormatException nfe ) { } try { String sixtyDayAttr = attributes.getValue("_60Days"); timesThirtyDaysLate = timesThirtyDaysLate + (Integer.parseInt(sixtyDayAttr) * 2); } catch ( NumberFormatException nfe ) { } try { String ninetyDayAttr = attributes.getValue("_90Days"); timesThirtyDaysLate = timesThirtyDaysLate + (Integer.parseInt(ninetyDayAttr) * 3); } catch ( NumberFormatException nfe ) { } currentLiability.setMonthsDelinquent(timesThirtyDaysLate); } } // CHECKSTYLE:ON
</code></pre></p> <p>My Checkstyle configuration caught brace-placement and empty <code>catch</code> block issues here -- but a cursory glance at the code should reveal a duplication of structure that is begging to be factored out.</p> <p>Do not use <code>CHECKSTYLE:OFF</code> as a cloaking device that allows bad code to exist in the system undetected by tools. Use it as an <a rel="nofollow" target="_blank" href="http://butunclebob.com/ArticleS.TimOttinger.ApologizeIncode">apology</a> for not being able to express the computation without breaking "the rules". If you must exempt some code from Checkstyle, explain why. If you see code snippets that are <code>CHECKSTYLE:OFF</code>'ed, ask yourself whether the reasons are legitimate, and if they aren't, refactor until the structure is improved and the intent clarified.</p> <p>Same goes for any other static analysis tools that are there to help you, not annoy you.</p>]]></content:encoded>
         <category>Programming</category>
      </item>
      <item>
         <title>Presentation Zen</title>
         <link>http://www.tmgirvin.com/2009/10/presentation-zen.html</link>
         <description>Chris Tullier and I are starting to spend a lot of time in prep for our pre-conference presentation at PDC this year. Chris highly recommended that I read the book Presentation Zen to get in the right mindset for our...</description>
         <author>Todd Girvin</author>
         <guid isPermaLink="false">http://www.tmgirvin.com/2009/10/presentation-zen.html</guid>
         <pubDate>Sun, 11 Oct 2009 11:03:05 -0700</pubDate>
         <content:encoded><![CDATA[<p><a rel="nofollow" target="_blank" href="http://improvingenterprises.com/about/team/consultants/chris-tullier/bio">Chris Tullier</a> and I are starting to spend a lot of time in prep for our pre-conference presentation at PDC this year.&#160;&#160; Chris highly recommended that I read the book <a rel="nofollow" target="_blank" href="http://www.amazon.com/Presentation-Zen-Simple-Design-Delivery/dp/0321525655">Presentation Zen</a> to get in the right mindset for our day-long talk.&#160; I picked up a copy at B&amp;N (actually had to order it because apparently it gets clepted from the shelves, filthy dishonorable thieves – but it costs less online), and have started working my way through it.&#160; So far, it’s very inspiring.&#160; So today I’m taking on a “beginners mind” as I approach the creativity of building presentations.&#160; I really liked the quote:</p> <p><font color="#004000" size="5">In the beginner’s mind there are many possibilities, <br /></font><font color="#004000" size="5">in the expert’s mind there are few. – Shunryu Suzuki</font>&#160; </p> <p>Anyway, our pre-con session at PDC is title <a rel="nofollow" target="_blank" href="http://microsoftpdc.com/Sessions/Developing-Quality-Software-using-Visual-Studio-Team-System-2010">Developing Quality Software using Visual Studio Team System 2010</a>, and will be on Monday, November 16th.&#160; Make sure you register for the pre-con when you <a rel="nofollow" target="_blank" href="http://microsoftpdc.com/Registration">register for PDC</a> to reserve your seat.</p>]]></content:encoded>
      </item>
      <item>
         <title>Forget Rugby…instead…Football!</title>
         <link>http://agilist.net/?p=350</link>
         <description>Scrum and Rugby as an analogy for project work has been around since Nonaka and Tekeuchi introduced them in a Harvard Business Review article in 1986. Since that time, Scrum has become part of the defacto vocabulary of Agile project teams.
In his blog &amp;#8220;Pagan Tuna&amp;#8221;, Herb Bowie offers a brilliant updated analogy that addresses the [...]</description>
         <guid isPermaLink="false">http://agilist.net/?p=350</guid>
         <pubDate>Fri, 09 Oct 2009 08:39:54 -0700</pubDate>
         <content:encoded><![CDATA[<p>Scrum<img class="alignright size-medium wp-image-351" title="N Iowa Iowa Football" src="http://agilist.net/wp-content/uploads/2009/10/running-back-300x237.jpg" alt="N Iowa Iowa Football" width="188" height="148"/> and Rugby as an analogy for project work has been around since Nonaka and Tekeuchi introduced them in a Harvard Business Review <a rel="nofollow" target="_blank" href="http://www.google.com/url?sa=t&amp;source=web&amp;ct=res&amp;cd=6&amp;url=http%3A%2F%2Fapln-richmond.pbworks.com%2Ff%2FNew%2BNew%2BProd%2BDevel%2BGame.pdf&amp;ei=6lrPSs6hMZPiMZD0rJQD&amp;usg=AFQjCNG7JuQ6ssXnsy8oXs5cLWpaQKVG_w&amp;sig2=70WHnaFAIJaA67kF4V2qhQ">article</a> in 1986. Since that time, Scrum has become part of the defacto vocabulary of Agile project teams.</p>
<p>In his blog &#8220;Pagan Tuna&#8221;, Herb Bowie offers a brilliant updated analogy that addresses the combined invidual and team behaviors on a project. It doesn&#8217;t hurt that his football analogy coincides with the feverish enthusiasm at the beginning of a new football season. Check it out <a rel="nofollow" target="_blank" href="http://www.pagantuna.com/broken_field_running">here</a>.</p>]]></content:encoded>
         <category>Uncategorized</category>
      </item>
      <item>
         <title>Ep. 9 – TechFest, GTD, and Streamlined Modeling</title>
         <link>http://improvingpodcasts.com/2009/10/ep-9-techfest-gtd-and-streamlined-modeling/</link>
         <description>Episode 9 finds our hosts reminiscing about the recent Houston TechFest. Allen and Mike discuss talks attended and given. Specifically, Allen reviews the content of his talk on using Getting Things Done (GTD) techniques in a development team environment. Hint: It starts to look a lot like Agile. Mike also gives an overview of Streamlined [...]</description>
         <author>Mike</author>
         <guid isPermaLink="false">http://improvingpodcasts.com/?p=91</guid>
         <pubDate>Tue, 06 Oct 2009 17:37:17 -0700</pubDate>
         <content:encoded><![CDATA[<p>Episode 9 finds our hosts reminiscing about the recent <a rel="nofollow" title="Houston TechFest site" target="_blank" href="http://www.houstontechfest.com">Houston TechFest</a>. Allen and Mike discuss talks attended and given. Specifically, Allen reviews the content of his talk on using Getting Things Done (GTD) techniques in a development team environment. Hint: It starts to look a lot like Agile. Mike also gives an overview of <a rel="nofollow" title="Streamlined Object Modeling site" target="_blank" href="http://streamlinedmodeling.com">Streamlined Object Modeling</a>. As a wrap-up, the guys talk about a work-around to an iPhone and Bluetooth problem.</p>
<p>Links:<br />
- <a rel="nofollow" title="Houston TechFest site" target="_blank" href="http://www.houstontechfest.com">http://www.houstontechfest.com</a><br />
- <a rel="nofollow" title="GTD on Wikipedia" target="_blank" href="http://en.wikipedia.org/wiki/Getting_Things_Done">http://en.wikipedia.org/wiki/Getting_Things_Done</a><br />
- <a rel="nofollow" title="Streamlined Object Modeling site" target="_blank" href="http://www.houstontechfest.com">http://streamlinedmodeling.com</a><br />
- Mike (@<a rel="nofollow" title="Mike on Twitter" target="_blank" href="http://twitter.com/mikeabney">mikeabney</a>): <a rel="nofollow" title="Mike's blog" target="_blank" href="http://practicallyagile.com">http://practicallyagile.com</a><br />
- Allen (@<a rel="nofollow" title="Allen on Twitter" target="_blank" href="http://twitter.com/allenhurst">allenhurst</a>): <a rel="nofollow" title="Allen's home on the web" target="_blank" href="http://ahurst.com">http://ahurst.com</a></p>]]></content:encoded>
         <enclosure length="34533759" url="http://improvingpodcasts.com/podcasts/009_TechFestGTDAndStreamlinedModeling.mp3" type="audio/mpeg" />
      </item>
      <item>
         <title>Backup horror stories: Rendering error in the global navigation tab</title>
         <link>http://weblogs.asp.net/peterbrunone/archive/2009/10/06/backup-horror-stories-rendering-error-in-the-global-navigation-tab.aspx</link>
         <description>&lt;p&gt;Chances are that if you're restoring a site collection from backup, something has gone seriously wrong.&amp;nbsp; Naturally, at this point, you've had just about enough of unexpected glitches, and you REALLY don't want anything to look weird once you restore and load up the site again.&amp;nbsp; Oh, but Mr. Murphy is there laying down the law, and all you see on the global nav is a big "Error" tab.&amp;nbsp; Terrified, you mouse over it with a morbid curiosity, only to discover the following error in a tooltip:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;An error occured while rendering navigation for requested URL: /.
Exception message: Object reference not set to an instance of an
object. Stack trace:&amp;nbsp;&amp;nbsp;&amp;nbsp; at
Microsoft.SharePoint.Publishing.PublishingWeb.&amp;amp;lt;&amp;gt;c__DisplayClass2d.&amp;amp;lt;CleanupInternalIDs&amp;gt;b__2c()&lt;br&gt;&amp;nbsp;&amp;nbsp; at Microsoft.SharePoint.SPSecurity.CodeToRunElevatedWrapper(Object state)&lt;br&gt;&amp;nbsp;&amp;nbsp; at Microsoft.SharePoint.SPSecurity.&amp;amp;lt;&amp;gt;c__DisplayClass4.&amp;amp;lt;RunWithElevatedPrivileges&amp;gt;b__2()&lt;br&gt;&amp;nbsp;&amp;nbsp; at Microsoft.SharePoint.Utilities.SecurityContext.RunAsProcess(CodeToRunElevated secureCode)&lt;br&gt;&amp;nbsp;&amp;nbsp; at Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(WaitCallback secureCode, Object param)&lt;br&gt;&amp;nbsp;&amp;nbsp; at Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(CodeToRunElevated secureCode)&lt;br&gt;&amp;nbsp;&amp;nbsp; at Microsoft.SharePoint.Publishing.PublishingWeb.CleanupInternalIDs(PublishingWeb pubwebToCleanUp)&lt;br&gt;&amp;nbsp;&amp;nbsp; at Microsoft.SharePoint.Publishing.PublishingWeb.get_PagesList()&lt;br&gt;&amp;nbsp;&amp;nbsp; at Microsoft.SharePoint.Publishing.CachedArea.GetChildPageIds()&lt;br&gt;&amp;nbsp;&amp;nbsp;
at
Microsoft.SharePoint.Publishing.Navigation.PortalSiteMapProvider.UserHasRightsToCachedObject(CachedObject
cachedObject, SPWeb currentContext)&lt;br&gt;&amp;nbsp;&amp;nbsp; at Microsoft.SharePoint.Publishing.Navigation.CachedObjectSiteMapNode.IsAccessibleToUser(SPWeb contextWeb)&lt;br&gt;&amp;nbsp;&amp;nbsp;
at
Microsoft.SharePoint.Publishing.Navigation.PortalSiteMapNode.GetNavigationChildren(NodeTypes
includedTypes, NodeTypes includedHiddenTypes, OrderingMethod ordering,
AutomaticSortingMethod method, Boolean ascending, Int32 lcid)&lt;br&gt;&amp;nbsp;&amp;nbsp; at Microsoft.SharePoint.Publishing.Navigation.PortalSiteMapNode.GetNavigationChildren(NodeTypes includedHiddenTypes)&lt;br&gt;&amp;nbsp;&amp;nbsp; at Microsoft.SharePoint.Publishing.Navigation.PortalSiteMapProvider.GetChildNodes(PortalSiteMapNode node, NodeTypes &lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Of course I can't speak for everyone in every situation, but this kind of thing late at night when everything else has hit the fan...&amp;nbsp; it's enough to make you want to swap careers with Old MacDonald (seriously, what kind of farm grows moss?).&lt;/p&gt;&lt;p&gt;But enough about my midnight work hallucinations.&amp;nbsp; At this point, the most helpful thing to do -- assuming you still have that backup -- is to delete the site collection entirely.&amp;nbsp; Go into Central Admin, click Application Management, and blow that site collection away.&amp;nbsp; THEN go back and restore from backup again.&lt;/p&gt;&lt;p&gt;If that doesn't work, then run the Config Wizard again; that'll usually shake something loose.&lt;br&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7223889" width="1" height="1"&gt;</description>
         <author>PeterBrunone</author>
         <guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7223889</guid>
         <pubDate>Mon, 05 Oct 2009 22:58:00 -0700</pubDate>
      </item>
      <item>
         <title>JOpt Simple 3.2-rc1 released</title>
         <link>http://cleveralias.blogs.com/thought_spearmints/2009/10/jopt-simple-32rc1-released.html</link>
         <description>JOpt Simple is my Java library for parsing command-line options. For 3.2, I've added the ability to specify a set of default values for arguments of a given option. Hopefully this will alleviate the burden of checking has() and hasArgument()...</description>
         <author>Pholser</author>
         <guid isPermaLink="false">http://cleveralias.blogs.com/thought_spearmints/2009/10/jopt-simple-32rc1-released.html</guid>
         <pubDate>Mon, 05 Oct 2009 12:45:46 -0700</pubDate>
         <content:encoded><![CDATA[<p><span style="text-decoration:none;"><a rel="nofollow" target="_blank" href="http://jopt-simple.sourceforge.net">JOpt Simple</a> is</span> my Java
library for parsing command-line options. For 3.2, I've added the ability to specify a set of default values for arguments of a given option. Hopefully this will alleviate the burden of checking has() and hasArgument() on an OptionSet when you want to use a default if the option isn't on the command line. Give it a spin and let me know what you think.</p>]]></content:encoded>
      </item>
      <item>
         <title>Don’t Be Evil A Microsoft MVP</title>
         <link>http://mentalpandiculation.com/?p=182</link>
         <description>Google has apparently advised Jon Skeet, C# guru extraordinare, that renewing his MVP status wouldn&amp;#8217;t be a good idea. This strikes me as silly for Google to do assuming there is no underlying legal reason for the move. As Google continues to get bigger, its cute little slogans and supposedly fantastic place to [...]</description>
         <author>Niklaus Wirth's Ghost</author>
         <guid isPermaLink="false">http://mentalpandiculation.com/?p=182</guid>
         <pubDate>Fri, 02 Oct 2009 17:28:20 -0700</pubDate>
         <content:encoded><![CDATA[<p>Google has apparently advised Jon Skeet, C# guru extraordinare, that renewing his MVP status wouldn&#8217;t be <a rel="nofollow" target="_blank" href="http://www.theregister.co.uk/2009/10/02/google_microsoft_mvp/">a good idea</a>. This strikes me as silly for Google to do assuming there is no underlying legal reason for the move. As Google continues to get bigger, its cute little slogans and supposedly fantastic place to work will become less and less interesting. Advising someone with the stature of Jon Skeet that he shouldn&#8217;t be an MVP doesn&#8217;t exactly jibe with that whole Don&#8217;t Be Evil thing. </p>]]></content:encoded>
         <category>Programming</category>
      </item>
      <item>
         <title>IPhone-Bluetooth Audio Skipping Problem</title>
         <link>http://practicallyagile.com/2009/10/iphone-bluetooth-audio-skipping-problem/</link>
         <description>For Father&amp;#8217;s Day this year, my family gave me the gift of a stereo Bluetooth headset. I had been asking for one since the iPhone announced support for A2DP headsets. (Basically, simple stereo headphone support.) The one I got was the Plantronics Voyager 855. I can&amp;#8217;t speak highly enough about it. There may be sets [...]</description>
         <author>Mike</author>
         <guid isPermaLink="false">http://practicallyagile.com/?p=120</guid>
         <pubDate>Fri, 02 Oct 2009 07:52:01 -0700</pubDate>
         <content:encoded><![CDATA[<p>For Father&#8217;s Day this year, my family gave me the gift of a stereo Bluetooth headset. I had been asking for one since the iPhone announced support for <a rel="nofollow" title="A2DP on the Wikepedia Bluetooth profiles (A2DP is the first one)" target="_blank" href="http://en.wikipedia.org/wiki/Bluetooth_profile#Advanced_Audio_Distribution_Profile_.28A2DP.29">A2DP</a> headsets. (Basically, simple stereo headphone support.) The one I got was the <a rel="nofollow" title="Amazon referral link (doesn't cost you anything, helps me out a little if you're buying it anyway)" target="_blank" href="http://www.amazon.com/gp/product/B000UBNFT2?ie=UTF8&amp;tag=practagile-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B000UBNFT2">Plantronics Voyager 855</a>. I can&#8217;t speak highly enough about it. There may be sets with better sound or build quality, but I haven&#8217;t had any problems with the set itself. And at just over $30 it is far cheaper than most. Listening to podcasts or music while mowing the lawn or whatever else is fantastic. The combination of in-ear buds that block out external noise and the wireless connection to the phone—I can&#8217;t believe I lived without it for so long.</p>
<p>However, the iPhone&#8217;s Bluetooth support is not the best. I have an 8GB 3G, and had a lot of trouble with the audio cutting out. Worse, the same was true when I was on a call. I could usually hear just fine, but folks on the other end would tell me that my voice was cutting out. I was starting to blame the headset and was preparing to buy a more expensive model.</p>
<p>Fortunately, I noticed two important things. First, the podcast/music audio cutting out tended to only happen when the screen locked. This was true whether or not I pressed the lock or let the phone auto-lock. Second, I noticed that Apple&#8217;s <a rel="nofollow" title="Apple's page on iPhone OS updates" target="_blank" href="http://www.apple.com/iphone/softwareupdate/">iPhone OS 3.1 update</a> mentioned attempting to fix problems with Bluetooth and wireless (Wi-Fi). In their case, they were trying to improve Wi-Fi performance.</p>
<p>Because of this, I decided to experiment a bit. I disabled the Auto-Lock feature and disabled Wi-Fi. Suddenly, I had no more skipping and cut-out problems. People said calls did not cut out either. I tested this way for about a day. I was able to get the audio to cut out by launching a CPU-intensive app, but only during the launch. Once the app was running, the audio came back with no more problems.</p>
<p>After that, I re-enabled the auto-lock. I locked and unlocked the phone. Still no cut-out problems. I then turned Wi-Fi back on. No cut-out problems. Then I locked the phone. Bingo! Audio started cutting out again. I disabled auto-lock, but the problem was still there when I locked the phone. Finally, I disabled Wi-Fi and turned auto-lock back on. No more skipping or cut-out problems.</p>
<p>It turns out that the iPhone is built such that Wi-Fi and Bluetooth <a rel="nofollow" title="The Unofficial Apple Weblog looks at this from the other direction." target="_blank" href="http://www.tuaw.com/2009/07/15/bluetooth-another-wi-fi-killer/">share an antenna</a> (presumably to share space). This causes problems when both are on. Apple seems to have found a way to manage this most of the time and even released updates to improve <em>Wi-Fi </em>performance. However, as has been true of iPhone Bluetooth support all along, they seem to have neglected to do the same for Bluetooth. Specifically, something seems to happen to the Bluetooth power (and possibly the Wi-Fi power) when the phone is locked. The combination of signal degredation from both being on <em>and </em>the phone being locked causes the problem.</p>
<p>The moral of the story? If you want to use a Bluetooth headset, disable Wi-Fi. If you want to use Wi-Fi, disable Bluetooth. That will get you the best performance. Now back to enjoying my wireless music while refactoring.</p>]]></content:encoded>
      </item>
      <item>
         <title>svn replacement for git stash</title>
         <link>http://www.benrady.com/2009/09/svn-replacement-for-git-stash.html</link>
         <description>&lt;div&gt;&lt;p&gt;I had no idea how dependent I'd become on git's stash function until I
needed it while working on a project that uses subversion. I needed to
make a quick change to a class to support a change to a schema change
to a live server (don't ask), but I was already in the middle of
working on another task. &lt;/p&gt;&lt;p&gt;Thankfully, you can approximate git stash by creating a patch file:&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier;"&gt;% svn diff &amp;gt; WorkInProgress.txt&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier;"&gt;% svn revert -R .&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier;"&gt;&amp;lt;make changes&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier;"&gt;% svn commit -m "Patched to support server schema change"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier;"&gt;
% patch -p0 -i WorkInProgress.txt&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier;"&gt;% rm WorkInProgress.txt&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;</description>
         <author>Ben Rady</author>
         <guid isPermaLink="false">tag:typepad.com,2003:post-6a00e54fb013da88340120a5af77f4970b</guid>
         <pubDate>Wed, 30 Sep 2009 13:51:40 -0700</pubDate>
      </item>
      <item>
         <title>Resharper Discount</title>
         <link>http://mentalpandiculation.com/?p=180</link>
         <description>I&amp;#8217;m in the market for Resharper and Latish pointed me to David Ridgway&amp;#8217;s blog. David has a offer for an extended trial period and 10% off the purchase of Resharper. I emailed David this morning and 13 minutes later, I had an email with the details. If you&amp;#8217;re looking to evaluate or [...]</description>
         <author>Niklaus Wirth's Ghost</author>
         <guid isPermaLink="false">http://mentalpandiculation.com/?p=180</guid>
         <pubDate>Thu, 24 Sep 2009 05:54:35 -0700</pubDate>
         <content:encoded><![CDATA[<p>I&#8217;m in the market for <a rel="nofollow" target="_blank" href="http://www.jetbrains.com/resharper/index.html">Resharper</a> and <a rel="nofollow" target="_blank" href="http://www.dotnetsurfers.com/blog/default.aspx">Latish</a> pointed me to David Ridgway&#8217;s blog. David has a offer for an <a rel="nofollow" target="_blank" href="http://web2asp.net/2009/09/resharper-discount-and-extended-trial.html ">extended trial period and 10% off the purchase</a> of Resharper. I emailed David this morning and 13 minutes later, I had an email with the details. If you&#8217;re looking to evaluate or buy Resharper, drop by David&#8217;s place and give him a buzz. </p>]]></content:encoded>
         <category>Programming</category>
      </item>
      <item>
         <title>Ep. 8 – Real Estate and Agile Team Rooms</title>
         <link>http://improvingpodcasts.com/2009/09/ep-8-real-estate-and-agile-team-rooms/</link>
         <description>What should a development company look for in real estate? What makes for a good team room? In Episode 8, Allen, Mike and Ed Grannon discuss current and past searches for office space, what to expect when negotiating a lease, and some of the requirements for good team rooms.
An article on Joel Spolsky&amp;#8217;s Fog Creek [...]</description>
         <author>Mike</author>
         <guid isPermaLink="false">http://improvingpodcasts.com/?p=86</guid>
         <pubDate>Tue, 22 Sep 2009 12:35:20 -0700</pubDate>
         <content:encoded><![CDATA[<p>What should a development company look for in real estate? What makes for a good team room? In Episode 8, Allen, Mike and Ed Grannon discuss current and past searches for office space, what to expect when negotiating a lease, and some of the requirements for good team rooms.</p>
<p>An article on Joel Spolsky&#8217;s Fog Creek office space Mike mentions: <a rel="nofollow" target="_blank" href="http://www.joelonsoftware.com/articles/BionicOffice.html">http://www.joelonsoftware.com/articles/BionicOffice.html</a></p>
<p>If you have experience designing agile team rooms or looking for real estate for software development, we would love to hear about it. You can provide feedback through comments at improvingpodcasts.com or send e-mail to feedback at improvingpodcasts.com.</p>]]></content:encoded>
         <enclosure length="24880336" url="http://improvingpodcasts.com/podcasts/008_RealEstateAndAgileTeamRooms.mp3" type="audio/mpeg" />
      </item>
      <item>
         <title>MSBuild Extension Pack Tip #1</title>
         <link>http://mentalpandiculation.com/?p=178</link>
         <description>When using the MSBuildHelper in the MSBuild Extension Pack to access particular items in a collection, the Position is zero based just like arrays are. I have no idea if this is intuitive or counter-intuitive but it&amp;#8217;s definitely not VB6tuitive.</description>
         <author>admin</author>
         <guid isPermaLink="false">http://mentalpandiculation.com/?p=178</guid>
         <pubDate>Mon, 21 Sep 2009 07:58:08 -0700</pubDate>
         <content:encoded><![CDATA[<p>When using the MSBuildHelper in the MSBuild Extension Pack to access particular items in a collection, the Position is zero based just like arrays are. I have no idea if this is intuitive or counter-intuitive but it&#8217;s definitely not VB6tuitive. </p>]]></content:encoded>
         <category>Programming</category>
      </item>
      <item>
         <title>MSBuild and the CompactFramework</title>
         <link>http://mentalpandiculation.com/?p=176</link>
         <description>If you are building Compact Framework projects using MSBuild or Team Server Build and you seem to be having exceptionally long build times, you can shorten those dramatically by turning off Platform Verification. We had a build that was running 15-20 minutes and it has been cut to 5 now. This is your [...]</description>
         <author>admin</author>
         <guid isPermaLink="false">http://mentalpandiculation.com/?p=176</guid>
         <pubDate>Mon, 21 Sep 2009 07:47:47 -0700</pubDate>
         <content:encoded><![CDATA[<p>If you are building Compact Framework projects using MSBuild or Team Server Build and you seem to be having exceptionally long build times, you can shorten those dramatically by turning off <a rel="nofollow" target="_blank" href="http://blogs.msdn.com/vsdteam/archive/2006/09/15/756400.aspx">Platform Verification</a>. We had a build that was running 15-20 minutes and it has been cut to 5 now. </p>
<p>This is your Tip of the Whenever I Get Around To It for this time period. Look for another tip whenever I get around to it. </p>]]></content:encoded>
         <category>Programming</category>
      </item>
      <item>
         <title>Canon 5D Mark II: After the Honeymoon</title>
         <link>http://feedproxy.google.com/~r/travisisaacs/~3/mzUz88eJQLQ/</link>
         <description>I've already clicked away nearly 5,000 photos (4,525 as of this post) with my Canon 5D Mark II (5D MKII) since June. Is the honeymoon between the 5D MKII and this amateur photographer (okay, serious hobbyist) over? Read on.</description>
         <author>Travis Isaacs</author>
         <guid isPermaLink="false">http://travisisaacs.com/?p=724</guid>
         <pubDate>Sun, 20 Sep 2009 22:36:33 -0700</pubDate>
         <content:encoded><![CDATA[<p>I&#8217;ve already clicked away nearly 5,000 photos (4,525 as of this post) with my Canon 5D Mark <span class="caps">II</span> (5D <span class="caps">MKII</span>) since June. Is the honeymoon between the 5D <span class="caps">MKII</span> and this amateur photographer (okay, serious hobbyist) over? Read&nbsp;on.</p>
<h2>My&nbsp;perspective:</h2>
<div class="pull_right"><a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/tbisaacs/2047477321/" title="My new camera! by Travis Isaacs, on Flickr"><img src="http://farm3.static.flickr.com/2234/2047477321_fa52dc0a39_m.jpg" width="240" height="180" alt="My new camera!"/></a><small>My 40D, just after it arrived</small>
</div>
<p>My love for photography really didn&#8217;t start until November of 2007 when <a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/tbisaacs/2047477321/">I bought a my first <span class="caps">DSLR</span>: the Canon 40D</a> (blame <a rel="nofollow" target="_blank" href="http://poetpainter.com">Stephen</a> and <a rel="nofollow" target="_blank" href="http://jeremyjohnsononline.com">Jeremy</a> for getting me hooked). The 40D was <strong>a lot</strong> of camera for a beginner, but I quickly grew into&nbsp;it.</p>
<p>I loved the 40D, so much so that I even swayed <a rel="nofollow" target="_blank" href="http://www.handcoding.com/archives/2008/01/">Alex</a>, a long time Nikon user, to make the switch to Canon. I loved the 40D&#8217;s build quality, high-speed burst (6.<span class="caps">5FPS</span>), and overall responsiveness (especially with fast&nbsp;glass). </p>
<p>My go-to lens was the <a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/tbisaacs/sets/72157607476856175/">Canon <span class="caps">EF</span>-S 17-55mm f/2.8 <span class="caps">IS</span></a>. I can&#8217;t say enough good things about this lens. It combined a fast f/2.8 aperture with built-in image stabilization (<span class="caps">IS</span>), making it damn near perfect in most occasions. I really, really miss this&nbsp;lens. </p>
<p>The did 40D had a few shortcomings, namely sensor resolution (<span class="caps">10MP</span>), ho-hum <span class="caps">LCD</span> screen, and <span class="caps">OK</span>, but not great <span class="caps">ISO</span> performance. However, my upgrade to the <span class="caps">5DMKII</span> was less about the 40D&#8217;s short-comings, and more about the allure of a full-frame sensor, <span class="caps">HD</span> 1080P video, and a (more) pro&nbsp;body. </p>
<h2>What I still&nbsp;love:</h2>
<p><strong>Full-frame, <span class="caps">21MP</span> sensor</strong><br />
Going from a <a rel="nofollow" target="_blank" href="http://digital-photography-school.com/full-frame-sensor-vs-crop-sensor-which-is-right-for-you">crop sensor</a> to full-frame is a bit of a double-edged sword. The 1.6x crop factor is great when shooting with <a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/tbisaacs/2407175368/in/set-72157605364931617/">a long telephoto</a>. You get extra reach, for&nbsp;&#8220;free.&#8221; </p>
<div class="pull_right">
<a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/tbisaacs/3604981573/" title="I really like full-frame sensors. by Travis Isaacs, on Flickr"><img src="http://farm4.static.flickr.com/3627/3604981573_fc7de548dc_m.jpg" width="240" height="160" alt="I really like full-frame sensors."/></a><small>Full-frame depth-of-field, at f/4</small></div>
<p>On the other hand, that crop factor makes your &#8220;standard&#8221; focal-length 50mm lens more like 80mm, which was a bummer in close&nbsp;quarters. </p>
<p>So, I gave up some reach. But the full-frame <span class="caps">5DMKII</span> gave me something better (in my opinion): shallower depth-of-field. Since the <span class="caps">5DMKII</span>&#8217;s sensor is nearly twice the size of the 40D, f/4 really looks like f/2.8 used to, and so&nbsp;on. </p>
<p><span class="caps">21MP</span> also gives me a lot of room for cropping. I could literally throw half an image away and still be at the 40D&#8217;s&nbsp;resolution. </p>
<p><strong><span class="caps">ISO</span>/noise&nbsp;performance</strong></p>
<div class="pull_right"><a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/tbisaacs/3173653817/" title="Hi. by Travis Isaacs, on Flickr"><img src="http://farm2.static.flickr.com/1026/3173653817_e7b3672bd9_m.jpg" width="240" height="160" alt="Hi."/></a><small><span class="caps">ISO1600</span></small></div>
<p>Due to it&#8217;s physically larger sensor size (and technology improvements, of course) the <span class="caps">ISO</span> performance is easily a stop (sometimes two) better than the 40D. <span class="caps">ISO800</span> on the <span class="caps">5DMKII</span> looked a lot like <span class="caps">ISO400</span> on my 40D, and I&#8217;m not at all afraid to push to <span class="caps">ISO1600</span> when&nbsp;needed.</p>
<p>When paired with a fast prime like the 50mm 1.4 and you can just about see in the dark.&nbsp;Literally.</p>
<p><strong><span class="caps">LCD</span> screen</strong><br />
The <span class="caps">5DMKII</span>&#8217;s <span class="caps">LCD</span> is big and bright, and actually has enough resolution to be useful for checking focus, especially when shooting in situations when the depth-of-field is very&nbsp;shallow.</p>
<h2>Not so much&nbsp;anymore</h2>
<p><strong>Dated auto-focus mechanism</strong><br />
The <span class="caps">5DMKII</span>&#8217;s auto-focus mechanism is pretty much a hold over from the original 5D (introduced in 2005). The biggest hinderance is that the 9 auto-focus points are very tightly-grouped to the center of the 5D&#8217;s enormous full-frame. There just isn&#8217;t enough frame coverage. (<span class="caps">BTW</span>, I know that Alex is saying &#8220;I told you so&#8221; right&nbsp;now). </p>
<table width="100%">
<thead>
<tr align="center">
<th>5D Mark <span class="caps">II</span> view finder</th>
<th>40D view finder</th>
</tr>
<tr valign="top" align="center">
<td><a rel="nofollow" target="_blank" href="http://www.dpreview.com/reviews/CanonEOS5DMarkII/page6.asp"><img src="http://a.img-dpreview.com/reviews/CanonEOS5DMarkII/Images/viewfinderview.jpg" alt="5D Mark II viewfinder"/></a></td>
<td><a rel="nofollow" target="_blank" href="http://www.dpreview.com/reviews/CanonEOS40D/page5.asp"><img src="http://a.img-dpreview.com/reviews/CanonEOS40D/Images/viewfinderviewdiag.jpg" alt="40D viewfinder"/></a></td>
</tr>
</table>
<p>The lack of frame coverage isn&#8217;t a problem for me in terms of framing (or getting) a shot. I&#8217;ve adjusted to that. The bigger issue for me is metering. The 40D and <span class="caps">5DMKII</span> have pretty much the same physical arrangement of auto-focus points, giving the 40D the edge on frame coverage when it comes to&nbsp;metering. </p>
<p>Because of the dispersal of auto-focus points, using &#8220;evaluative&#8221; metering on the 40D takes into account a majority of the frame, while the <span class="caps">5DMII</span> only covers a small amount. This causes the <span class="caps">5DMKII</span> to meter <strong>very</strong> differently from the 40D. Out of the box I was getting shots that were consistently 1/3 - 2/3 stops underexposed, especially when shooting with my <span class="caps">580EX</span>&nbsp;<span class="caps">II</span>.</p>
<p>My complaints about the <span class="caps">AF</span> also extend to the <span class="caps">HD</span> video operations of the camera. There is no continuous <span class="caps">AF</span>, a feature that every other video camera sold in the last 15 years (or more) has. It does have slick features like face detection, but you still have to press the <span class="caps">AF</span>-<span class="caps">ON</span> button to grab focus, which will you&#8217;ll hear in your&nbsp;video.</p>
<p><strong>Sluggish operation and response</strong><br />
The 40D is like a Ferrari when compared to the <span class="caps">5DMKII</span>. There was almost no shutter-release lag in the 40D, and the frame blackout was very short. The 40D was also seriously fast in high-speed&nbsp;mode.</p>
<p>The <span class="caps">5DMKII</span>&#8217;s shutter release feels very &#8220;squishy&#8221; to me (as did the original 5D). I suspect that it&#8217;s due to the large shutter/mirror assembly of the the <span class="caps">5DMKII</span>, more than electronics and processing&nbsp;power.</p>
<h2>Verdict?</h2>
<p>Do I regret buying the <span class="caps">5DMKII</span>? <strong>No freaking&nbsp;way.</strong> </p>
<p>It&#8217;s awesome, amazing, and astonishing. My complaints about the <span class="caps">AF</span> layout and sluggishness aren&#8217;t deal breakers, and aren&#8217;t issues in may day to day use of the camera. The quality of the images it produces continually put a smile on my face. You&#8217;ll have to drop $6,500 on a 1D Mark <span class="caps">III</span> to get (marginally) better image&nbsp;quality. </p>
<p>I do wonder why Canon made the decision not to overhaul the <span class="caps">AF</span> system on the <span class="caps">5DMKII</span>, especially when considering it&#8217;s closest competitor, the Nikon D700 is superior in just about every way (there, I said it). I spent a few minutes with <a rel="nofollow" target="_blank" href="http://parkimaging.smugmug.com/">Will&#8217;s</a> D700 a few months back and was blown away by it&#8217;s build quality, view finder, <span class="caps">AF</span> performance, and built-in wireless flash system (of which, Nikon&#8217;s have had for years). I know Canon is paying attention, just look at the new&nbsp;<a rel="nofollow" target="_blank" href="http://www.dpreview.com/news/0909/09090105canoneos7d.asp">7D.</a></p>
<h2>5D Mark <span class="caps">II</span>&nbsp;samples:</h2>
<div class="fived_samples">
<a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/tbisaacs/3687728782/" title="My Audrey. by Travis Isaacs, on Flickr"><img src="http://farm3.static.flickr.com/2523/3687728782_a7a6a6df60.jpg" width="500" height="333" alt="My Audrey."/></a>
<p><a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/tbisaacs/3709223835/" title="_MG_1509 by Travis Isaacs, on Flickr"><img src="http://farm4.static.flickr.com/3535/3709223835_7657317e90.jpg" width="500" height="333" alt="_MG_1509"/></a></p>
<p><a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/tbisaacs/3741789606/" title="Waiting for lunch by Travis Isaacs, on Flickr"><img src="http://farm4.static.flickr.com/3455/3741789606_3a7813137f.jpg" width="500" height="333" alt="Waiting for lunch"/></a></p>
<p><a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/tbisaacs/3741798018/" title="Holmes beach by Travis Isaacs, on Flickr"><img src="http://farm3.static.flickr.com/2477/3741798018_165c949f36.jpg" width="500" height="333" alt="Holmes beach"/></a></p>
<p><a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/tbisaacs/3741024175/" title="Lets head home by Travis Isaacs, on Flickr"><img src="http://farm4.static.flickr.com/3494/3741024175_69f12323de.jpg" width="500" height="333" alt="Lets head home"/></a></p>
<p><a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/tbisaacs/3741800476/" title="Grey beard the pirate by Travis Isaacs, on Flickr"><img src="http://farm4.static.flickr.com/3511/3741800476_c85ecc7e2f.jpg" width="334" height="500" alt="Grey beard the pirate"/></a></p>
<p><a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/tbisaacs/3741812180/" title="Another day past by Travis Isaacs, on Flickr"><img src="http://farm3.static.flickr.com/2657/3741812180_eec384d29f.jpg" width="500" height="333" alt="Another day past"/></a></p>
<p><a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/tbisaacs/3741807760/" title="M'Lady by Travis Isaacs, on Flickr"><img src="http://farm3.static.flickr.com/2422/3741807760_9d78e5a5e0.jpg" width="500" height="333" alt="M'Lady"/></a></p>
<p><a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/tbisaacs/3741814592/" title="My little Audrey by Travis Isaacs, on Flickr"><img src="http://farm3.static.flickr.com/2449/3741814592_05c4423280.jpg" width="500" height="333" alt="My little Audrey"/></a></p>
<p><a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/tbisaacs/3741818168/" title="A lovely mix of light by Travis Isaacs, on Flickr"><img src="http://farm3.static.flickr.com/2631/3741818168_2e5f63bf74.jpg" width="500" height="333" alt="A lovely mix of light"/></a></p>
<p><a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/tbisaacs/3815678599/" title="Untitled by Travis Isaacs, on Flickr"><img src="http://farm3.static.flickr.com/2590/3815678599_c699d3f01f.jpg" width="500" height="333" alt=""/></a></p>
<p><a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/tbisaacs/3865974345/" title="IMG_3152 copy by Travis Isaacs, on Flickr"><img src="http://farm4.static.flickr.com/3437/3865974345_af993cedc7.jpg" width="500" height="333" alt="IMG_3152 copy"/></a></p>
<p><a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/tbisaacs/3868381565/" title="Mr. Askins by Travis Isaacs, on Flickr"><img src="http://farm4.static.flickr.com/3531/3868381565_7748b4868a.jpg" width="500" height="333" alt="Mr. Askins"/></a></p>
<p><a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/tbisaacs/3894352540/" title="Me and Kristi by Travis Isaacs, on Flickr"><img src="http://farm3.static.flickr.com/2477/3894352540_62a0c6bf03.jpg" width="500" height="333" alt="Me and Kristi"/></a></p>
<p><a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/tbisaacs/3645815588/" title="She's just like me. by Travis Isaacs, on Flickr"><img src="http://farm4.static.flickr.com/3301/3645815588_62e57a2f2a.jpg" width="500" height="375" alt="She's just like me."/></a></p>
<p><a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/tbisaacs/3741793854/" title="Fun and; Sun Parasail by Travis Isaacs, on Flickr"><img src="http://farm3.static.flickr.com/2472/3741793854_2ffd199b80.jpg" width="500" height="333" alt="Fun and Sun Parasail"/></a></p>
<p><a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/tbisaacs/3912586125/" title="Tiny drops by Travis Isaacs, on Flickr"><img src="http://farm3.static.flickr.com/2564/3912586125_17f76e6f38.jpg" width="500" height="333" alt="Tiny drops"/></a></p>
<p><a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/tbisaacs/3929912745/" title="135L Glamour by Travis Isaacs, on Flickr"><img src="http://farm4.static.flickr.com/3483/3929912745_2180e426bd.jpg" width="500" height="333" alt="135L Glamour"/></a></p>
<p><a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/tbisaacs/3934557085/" title="Audrey, 15 months by Travis Isaacs, on Flickr"><img src="http://farm4.static.flickr.com/3418/3934557085_4b3810408e.jpg" width="500" height="333" alt="Audrey, 15 months"/></a></p>
<p><a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/tbisaacs/3938318857/" title="Hooligans by Travis Isaacs, on Flickr"><img src="http://farm4.static.flickr.com/3115/3938318857_1272d42274.jpg" width="500" height="333" alt="Hooligans"/></a>
</div>]]></content:encoded>
         <category>photography</category>
      </item>
      <item>
         <title>Ep. 7 – Snow Leopard and Windows 7</title>
         <link>http://improvingpodcasts.com/2009/09/ep-7-snow-leopard-and-windows-7/</link>
         <description>Episode 7 takes Allen and Mike on a bit of a detour. With Snow Leopard just released and the Windows 7 release available to partners, we take a tour of the new features of each with fellow Improver Leo Sakhvoruk. The feature lists are long and so is this episode.
Find it interesting? Have a topic [...]</description>
         <author>Mike</author>
         <guid isPermaLink="false">http://improvingpodcasts.com/?p=71</guid>
         <pubDate>Tue, 08 Sep 2009 17:38:33 -0700</pubDate>
         <content:encoded><![CDATA[<p>Episode 7 takes Allen and Mike on a bit of a detour. With Snow Leopard just released and the Windows 7 release available to partners, we take a tour of the new features of each with fellow Improver Leo Sakhvoruk. The feature lists are long and so is this episode.</p>
<p>Find it interesting? Have a topic we should be discussing? Contact us in the comments on the podcast&#8217;s web site (http://improvingpodcasts.com) or send e-mail to feedback at improvingpodcasts.com.</p>
<p>Topics:</p>
<p>- Snow Leopard Features<br />
- Snow Leopard and Win 7 compared<br />
- Windows 7 Features</p>
<p>Links to sources:</p>
<p>Snow Leopard<br />
- Photoshop problems: <a rel="nofollow" target="_blank" href="http://kb2.adobe.com/cps/512/cpsid_51229.html">http://kb2.adobe.com/cps/512/cpsid_51229.html</a><br />
- Apple&#8217;s info on SL changes: <a rel="nofollow" target="_blank" href="http://www.apple.com/macosx/refinements/">http://www.apple.com/macosx/refinements/</a><br />
- A bit of detail on the services menu changes and how to take advantage of them: <a rel="nofollow" target="_blank" href="http://www.macosxautomation.com/services/">http://www.macosxautomation.com/services/</a><br />
- A very long Ars Technica review of SL: <a rel="nofollow" target="_blank" href="http://arstechnica.com/apple/reviews/2009/08/mac-os-x-10-6.ars">http://arstechnica.com/apple/reviews/2009/08/mac-os-x-10-6.ars</a></p>
<p>Windows 7<br />
- MS&#8217;s feature list: <a rel="nofollow" target="_blank" href="http://windows.microsoft.com/en-US/windows7/products/features">http://windows.microsoft.com/en-US/windows7/products/features</a><br />
- Notes on enterprise adoption (BitLocker info): <a rel="nofollow" target="_blank" href="http://searchenterprisedesktop.techtarget.com/news/article/0,289142,sid192_gci1360566,00.html">http://searchenterprisedesktop.techtarget.com/news/article/0,289142,sid192_gci1360566,00.html</a><br />
- Info on video memory: <a rel="nofollow" target="_blank" href="http://www.techarp.com/showarticle.aspx?artno=645&amp;pgno=3">http://www.techarp.com/showarticle.aspx?artno=645&amp;pgno=3</a><br />
- A (somewhat old) article on backward compatibility promises: <a rel="nofollow" target="_blank" href="http://gizmodo.com/5070219/giz-explains-why-windows-7-will-smash-vista">http://gizmodo.com/5070219/giz-explains-why-windows-7-will-smash-vista</a></p>
<p>Contacts:</p>
<p>- Leo: <a rel="nofollow" target="_blank" href="http://improvingworks.com">http://improvingworks.com</a><br />
- Mike A. (<a rel="nofollow" target="_blank" href="http://twitter.com/mikeabney">@mikeabney</a>): <a rel="nofollow" target="_blank" href="http://practicallyagile.com">http://practicallyagile.com</a><br />
- Allen (@<a rel="nofollow" target="_blank" href="http://twitter.com/allenhurst">allenhurst</a>): <a rel="nofollow" target="_blank" href="http://ahurst.com">http://ahurst.com</a></p>]]></content:encoded>
         <enclosure length="47961756" url="http://improvingpodcasts.com/podcasts/007_SnowLeopardAndWindows7.mp3" type="audio/mpeg" />
      </item>
      <item>
         <title>Social media - how much is a &amp;lt; &amp;gt;?</title>
         <link>http://door64.com/blog/n/12594</link>
         <description>&lt;p&gt;An &lt;a rel="nofollow" target="_blank" href="http://usocial.net/"&gt;Australian company&lt;/a&gt; offers &lt;a rel="nofollow" target="_blank" href="http://www.facebook.com/"&gt;FaceBook&lt;/a&gt; friends and &lt;a rel="nofollow" target="_blank" href="http://twitter.com/"&gt;Twitter&lt;/a&gt; followers for sale.&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://door64.com/blog/n/12594"&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
         <author>Jane Prusakova</author>
         <guid isPermaLink="false">http://door64.com/blog/n/12594</guid>
         <pubDate>Tue, 08 Sep 2009 08:54:37 -0700</pubDate>
      </item>
      <item>
         <title>Handling Non Functional Requirements on an Agile Project</title>
         <link>http://agilist.net/?p=338</link>
         <description>Handling Non Functional Requirements on an Agile Project
Here are the slides from one of my presentations at Agile 2009. I&amp;#8217;m not a fan of wordy slideware, and the slides may not necessarily &amp;#8220;speak&amp;#8221; to you as they do to me. Nevertheless, let me know if you find any of this helpful. Contact me if you&amp;#8217;d [...]</description>
         <guid isPermaLink="false">http://agilist.net/?p=338</guid>
         <pubDate>Wed, 02 Sep 2009 11:35:45 -0700</pubDate>
         <content:encoded><![CDATA[<div id="__ss_1943444" style="width:425px;text-align:left;"><a rel="nofollow" style="font:14px Helvetica, Arial, Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" title="Handling Non Functional Requirements on an Agile Project">Handling Non Functional Requirements on an Agile Project</a></div>
<div style="width:425px;text-align:left;">Here are the slides from one of my presentations at <a rel="nofollow" target="_blank" href="http://www.agile2009.com/">Agile 2009</a>. I&#8217;m not a fan of wordy slideware, and the slides may not necessarily &#8220;speak&#8221; to you as they do to me. Nevertheless, let me know if you find any of this helpful. Contact me if you&#8217;d like to learn more about how to handle non-functional requirements on an Agile project. It can be tricky, but there are some very effective ways of handling them.</div>
<div style="width:425px;text-align:left;"></div>
<div id="__ss_1943444" style="width:425px;text-align:left;"><iframe class="embeddedvideo" type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=nfrpresentation-090902130524-phpapp01&amp;stripped_title=handling-non-functional-requirements-on-an-agile-project"></iframe> 
<div style="font-size:11px;font-family:tahoma, arial;height:26px;padding-top:2px;">View more <a rel="nofollow" style="text-decoration:underline;" target="_blank" href="http://www.slideshare.net/">presentations</a> from <a rel="nofollow" style="text-decoration:underline;" target="_blank" href="http://www.slideshare.net/kenhoward01">kenhoward01</a>.</div>
</div>]]></content:encoded>
         <category>Uncategorized</category>
      </item>
      <item>
         <title>Infinitest and Scala</title>
         <link>http://blog.rodcoffin.com/?p=173</link>
         <description>While at the agile 2009 conference last week Ben Rady and I sat down to figure out what we would need to do to get Infinitest working with Scala. To our delight it worked right out of the box! This is both a testament to the power of JVM based languages and the [...]</description>
         <author>rcoffin</author>
         <guid isPermaLink="false">http://blog.rodcoffin.com/?p=173</guid>
         <pubDate>Mon, 31 Aug 2009 18:21:32 -0700</pubDate>
         <content:encoded><![CDATA[<p>While at the agile 2009 conference last week <a rel="nofollow" target="_blank" href='http://feedbackjunkies.com/'>Ben Rady</a> and I sat down to figure out what we would need to do to get Infinitest working with Scala. To our delight it worked right out of the box! This is both a testament to the power of JVM based languages and the flexibility of <a rel="nofollow" target="_blank" href='http://improvingworks.com/?p=products'>Infinitest</a>. <a rel="nofollow" target="_blank" href='http://bit.ly/4ryReJ'>Here</a> is a quick screen cast I put together to show just how easy it is to use Infinitest with Scala.</p>]]></content:encoded>
      </item>
      <item>
         <title>LINQ to SQL SubmitChanges Order of Operations</title>
         <link>http://mocella.blogspot.com/2009/08/linq-to-sql-submitchanges-order-of.html</link>
         <description>&lt;p&gt;I did not realize the following is true in &lt;a rel="nofollow" target="_blank" href="http://msdn.microsoft.com/en-us/library/bb425822.aspx"&gt;LINQ to SQL&lt;/a&gt;: Calling &lt;a rel="nofollow" target="_blank" href="http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.submitchanges.aspx"&gt;SubmitChanges&lt;/a&gt; fires &lt;a rel="nofollow" target="_blank" href="http://msdn.microsoft.com/en-us/library/system.data.linq.changeset.aspx"&gt;ChangeSet&lt;/a&gt; changes in the following order:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Inserts &lt;/li&gt; &lt;li&gt;Updates &lt;/li&gt; &lt;li&gt;Deletes &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Normally, this might not be a big deal, and you might never notice it, but it was the source of some pain on my current project.&lt;/p&gt; &lt;p&gt;Consider an order-entry screen that allows the user to add/edit/delete line items on an order.&amp;#160; The order-detail records are keyed by order-number/line-number, and this is the source of the problem.&amp;#160; If the user deletes line #1 in the order, what was originally line #2 gets re-ordered as line #1.&amp;#160; When the user decides they are done editing the order, they will then hit the save button and the queued up add/edit/delete operations are committed via the LINQ to SQL SubmitChanges command.&lt;/p&gt; &lt;p&gt;Fortunately, we were able to change the primary-key on our order-detail table, but we effectively lost some automatic data-integrity since we were previously able to ensure uniqueness on order-number/line-number.&amp;#160; For teams that don’t have the luxury of changing their database keys, this design decision by the LINQ to SQL team may be cause to move away from LINQ to SQL.&amp;#160; &lt;/p&gt; &lt;p&gt;Why the LINQ to SQL team decided to not submit changes in the order of operations, or allow the user to specify a non-default order to submit changes is beyond me.&amp;#160; I’m sure they had valid reasons for this decision, but it’s a bit short-sighted in that this interaction pattern is fairly common in order-entry system.&amp;#160; &lt;/p&gt; &lt;p&gt;This could perhaps been avoided by stamping various LINQ class members as virtual and letting us developers (consumers) override behaviors as we need – and assume the risks that come with overriding the framework code.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23748967-8283755448382540245?l=mocella.blogspot.com'/&gt;&lt;/div&gt;</description>
         <author>noreply@blogger.com (Tony Mocella)</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-23748967.post-8283755448382540245</guid>
         <pubDate>Sat, 29 Aug 2009 12:25:00 -0700</pubDate>
      </item>
      <item>
         <title>Why my MOSS search doesn't work today (Reason #316)</title>
         <link>http://weblogs.asp.net/peterbrunone/archive/2009/08/27/why-my-moss-search-doesn-t-work-today-reason-316.aspx</link>
         <description>&lt;p&gt;Earlier this week a client called.&amp;nbsp; Our beautiful MOSS installation had been running beautifully, and then several days after a reboot... their Search completely stopped working.&lt;/p&gt;&lt;p&gt;Naturally, I hopped on the VPN, logged on to the server via RDP, and checked all the usual things.&amp;nbsp; Windows SharePoint Search Service was running, and the MOSS Crawl Schedule looked right, so I decided to see for myself... except the portal wouldn't authenticate me.&lt;/p&gt;&lt;p&gt;Aha.&amp;nbsp; Just after a reboot, you say?&amp;nbsp; If only I'd had the good sense to look at the crawl logs (they were full of 401.1-type "Access Denied" errors). &lt;/p&gt;&lt;p&gt;This is nothing less than the dreaded loopback check.&amp;nbsp; Apparently, Microsoft feels that it is a security risk for one to access a website from that same server (but only on port 80; all other ports appear to be wide open).&amp;nbsp; To get around this, they actually recommend a registry hack -- er, tweak -- that is detailed in &lt;a rel="nofollow" target="_blank" href="http://support.microsoft.com/kb/896861" title="KB 896861 -- disable loopback check"&gt;MS KB article 896861&lt;/a&gt;.&amp;nbsp; I'm including the procedure below on the off chance that the article goes dead someday; my preferred choice is method 2, but you may have other needs.&lt;br&gt;&lt;/p&gt;&lt;h3 id="tocHeadRef"&gt;Method 1: Specify host names&lt;/h3&gt;&lt;b&gt;Note&lt;/b&gt; We recommend that you use this method.&lt;br&gt;&lt;br&gt;To
specify the host names that are mapped to the loopback address and can
connect to Web sites on your computer, follow these steps:&lt;ol&gt;&lt;li&gt;Click &lt;strong class="uiterm"&gt;Start&lt;/strong&gt;, click &lt;strong class="uiterm"&gt;Run&lt;/strong&gt;, type &lt;span class="userInput"&gt;regedit&lt;/span&gt;, and then click &lt;strong class="uiterm"&gt;OK&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;In Registry Editor, locate and then click the following registry key: &lt;div class="indent"&gt;&lt;strong class="uiterm"&gt;HKEY_LOCAL_MACHINE&amp;#92;SYSTEM&amp;#92;CurrentControlSet&amp;#92;Control&amp;#92;Lsa&amp;#92;MSV1_0&lt;/strong&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;Right-click &lt;strong class="uiterm"&gt;MSV1_0&lt;/strong&gt;, point to &lt;strong class="uiterm"&gt;New&lt;/strong&gt;, and then click &lt;strong class="uiterm"&gt;Multi-String Value&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;Type &lt;span class="userInput"&gt;BackConnectionHostNames&lt;/span&gt;, and then press ENTER.&lt;/li&gt;&lt;li&gt;Right-click &lt;strong class="uiterm"&gt;BackConnectionHostNames&lt;/strong&gt;, and then click &lt;strong class="uiterm"&gt;Modify&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;In the &lt;strong class="uiterm"&gt;Value data&lt;/strong&gt; box, type the host name or the host names for the sites that are on the local computer, and then click &lt;strong class="uiterm"&gt;OK&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;Quit Registry Editor, and then restart the IISAdmin service.&lt;/li&gt;&lt;/ol&gt;&lt;h3 id="tocHeadRef"&gt;Method 2: Disable the loopback check &lt;/h3&gt; Follow these steps:&lt;ol&gt;&lt;li&gt;Click &lt;strong class="uiterm"&gt;Start&lt;/strong&gt;, click &lt;strong class="uiterm"&gt;Run&lt;/strong&gt;, type &lt;span class="userInput"&gt;regedit&lt;/span&gt;, and then click &lt;strong class="uiterm"&gt;OK&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;In Registry Editor, locate and then click the following registry key: &lt;div class="indent"&gt;&lt;strong class="uiterm"&gt;HKEY_LOCAL_MACHINE&amp;#92;SYSTEM&amp;#92;CurrentControlSet&amp;#92;Control&amp;#92;Lsa&lt;/strong&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;Right-click &lt;strong class="uiterm"&gt;Lsa&lt;/strong&gt;, point to &lt;strong class="uiterm"&gt;New&lt;/strong&gt;, and then click &lt;strong class="uiterm"&gt;DWORD Value&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;Type &lt;span class="userInput"&gt;DisableLoopbackCheck&lt;/span&gt;, and then press ENTER.&lt;/li&gt;&lt;li&gt;Right-click &lt;strong class="uiterm"&gt;DisableLoopbackCheck&lt;/strong&gt;, and then click &lt;strong class="uiterm"&gt;Modify&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;In the &lt;strong class="uiterm"&gt;Value data&lt;/strong&gt; box, type &lt;span class="userInput"&gt;1&lt;/span&gt;, and then click &lt;strong class="uiterm"&gt;OK&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;Quit Registry Editor, and then restart your computer.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7183660" width="1" height="1"&gt;</description>
         <author>PeterBrunone</author>
         <guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7183660</guid>
         <pubDate>Thu, 27 Aug 2009 19:12:00 -0700</pubDate>
      </item>
      <item>
         <title>Improving Enterprises</title>
         <link>http://door64.com/blog/n/12332</link>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://improvingenterprises.com/"&gt;Improving Enterprises&lt;/a&gt; is one of the hot companies on &lt;a rel="nofollow" target="_blank" href="http://www.inc.com/magazine/20090901/index.html"&gt;Inc.&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://door64.com/blog/n/12332"&gt;read more&lt;/a&gt;&lt;/p&gt;&lt;/a&gt;</description>
         <author>Jane Prusakova</author>
         <guid isPermaLink="false">http://door64.com/blog/n/12332</guid>
         <pubDate>Wed, 26 Aug 2009 21:53:01 -0700</pubDate>
      </item>
      <item>
         <title>I don't really sound like that, do I?</title>
         <link>http://www.jroller.com/habuma/entry/i_don_t_really_sound</link>
         <description>&lt;p&gt;Last week, I had the honor of participating in a podcast with Mike Abney and Leo Sakhvoruk, a few of my &lt;a rel="nofollow" target="_blank" href="http://www.improvingenterprises.com"&gt;Improving&lt;/a&gt; colleagues. That podcast went live yesterday and you can listen to it at &lt;a rel="nofollow" target="_blank" href="http://improvingpodcasts.com/2009/08/ep-6-modular-java"&gt;Improving Podcasts&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;It was a good conversation, mostly focused on my favorite topics, Spring and OSGi. This is the first time I've participated in such an event and I'm usually not that great at answering questions off-the-cuff. But after listening to it, I don't think that I sounded &lt;i&gt;too&lt;/i&gt; dumb. There are a few things I would've rephrased, but overall I think it was a good experience...I hope that you'll agree.&lt;/p&gt; &lt;p&gt;If after listening you really want to hear me talk some more, then here's just a quick reminder of where I'll be talking Spring and OSGi some more over the next few months:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://www.nofluffjuststuff.com/conference/boston/2009/09/home"&gt;New England Software Symposium&lt;/a&gt; (Sept 11-13). I'll be talking about Spring, OSGi, and testing.&lt;/li&gt; &lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://www.nofluffjuststuff.com/conference/minneapolis/2009/10/home"&gt;Twin Cities Software Symposium&lt;/a&gt; (Oct 2-4). I'll be talking about Spring, OSGi, and testing.&lt;/li&gt; &lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://springone2gx.com/conference/new_orleans/2009/10/home"&gt;SpringOne/2GX&lt;/a&gt; (Oct 19-22). I'll be talking about Spring 3.0's new Expression Language.&lt;/li&gt; &lt;li&gt;Greater Boston Chapter of the ACM in Boston, MA (Nov 14-15). Ken Sipe and I will be talking all Java, all day long.&lt;/li&gt;
&lt;/ul&gt; &lt;p&gt;Hope to see you there!&lt;/p&gt;</description>
         <author>Craig Walls</author>
         <guid isPermaLink="false">http://www.jroller.com/habuma/entry/i_don_t_really_sound</guid>
         <pubDate>Wed, 26 Aug 2009 07:00:00 -0700</pubDate>
         <category>General</category>
      </item>
      <item>
         <title>Ep. 6 – Modular Java</title>
         <link>http://improvingpodcasts.com/2009/08/ep-6-modular-java/</link>
         <description>In this episode we get a bit more technical as Mike talks modularity with Leo Sakhvoruk and Modular Java author Craig Walls. We cover OSGi and Spring-DM in some depth. Topics include:
- Defining modularity
- Publishing Modular Java
- Describing OSGi and Spring-DM
- Answering complaints about OSGi complexity
- Differences in OSGi containers
- Benefits and pitfalls of OSGi [...]</description>
         <author>Mike</author>
         <guid isPermaLink="false">http://improvingpodcasts.com/?p=53</guid>
         <pubDate>Tue, 25 Aug 2009 08:03:37 -0700</pubDate>
         <content:encoded><![CDATA[<p>In this episode we get a bit more technical as Mike talks modularity with Leo Sakhvoruk and <em>Modular Java</em> author Craig Walls. We cover OSGi and Spring-DM in some depth. Topics include:</p>
<p>- Defining modularity<br />
- Publishing <em>Modular Java</em><br />
- Describing OSGi and Spring-DM<br />
- Answering complaints about OSGi complexity<br />
- Differences in OSGi containers<br />
- Benefits and pitfalls of OSGi in practice<br />
- How Spring-DM is affecting the evolution of OSGi<br />
- What is new in Spring</p>
<p>Craig&#8217;s picks:</p>
<p>- <a rel="nofollow" target="_blank" href="http://twitter.com/veryshortstory">http://twitter.com/veryshortstory</a><br />
- Ops4J Pax Construct: <a rel="nofollow" target="_blank" href="http://wiki.ops4j.org/display/paxconstruct/Pax+Construct">http://wiki.ops4j.org/display/paxconstruct/Pax+Construct</a><br />
- Spring Expression Language: <a rel="nofollow" target="_blank" href="http://springsource.org">http://springsource.org</a></p>
<p>Leo&#8217;s pick: Google Web Toolkit: <a rel="nofollow" target="_blank" href="http://code.google.com/webtoolkit/">http://code.google.com/webtoolkit/</a></p>
<p>Mike&#8217;s pick: functional programming</p>
<p>- Introductory article: <a rel="nofollow" target="_blank" href="http://www.defmacro.org/ramblings/fp.html">http://www.defmacro.org/ramblings/fp.html</a><br />
- Scala (runs on JVM): <a rel="nofollow" target="_blank" href="http://www.scala-lang.org/">http://www.scala-lang.org/</a><br />
- Erlang: <a rel="nofollow" target="_blank" href="http://erlang.org/">http://erlang.org/</a></p>
<p>Contacts</p>
<p>- Craig (<a rel="nofollow" target="_blank" href="http://twitter.com/habuma">@habuma</a>, <a rel="nofollow" target="_blank" href="http://twitter.com/modularjava">@modularjava</a>, <a rel="nofollow" target="_blank" href="http://twitter.com/springinaction">@springinaction</a>): <a rel="nofollow" target="_blank" href="http://jroller.com/habuma">http://jroller.com/habuma</a>, <a rel="nofollow" target="_blank" href="http://modularjava.com">http://modularjava.com</a>, <a rel="nofollow" target="_blank" href="http://springinaction.com">http://springinaction.com</a><br />
- Leo: <a rel="nofollow" target="_blank" href="http://improvingworks.com">http://improvingworks.com</a><br />
- Mike (<a rel="nofollow" target="_blank" href="http://twitter.com/mikeabney">@mikeabney</a>): <a rel="nofollow" target="_blank" href="http://practicallyagile.com">http://practicallyagile.com</a></p>
<p>You can provide feedback for this and other episodes through comments at http://improvingpodcasts.com, via email to feedback at improvingpodcasts.com. Reviews and ratings in iTunes are welcome as well (especially positive ones).</p>]]></content:encoded>
         <enclosure length="28798488" url="http://improvingpodcasts.com/podcasts/006_Modular_Java.mp3" type="audio/mpeg" />
      </item>
      <item>
         <title>A bit of Modular Java errata</title>
         <link>http://www.jroller.com/habuma/entry/a_bit_of_modular_java</link>
         <description>&lt;p&gt;There has been more than one comment in the errata for &lt;a rel="nofollow" target="_blank" href="http://www.pragprog.com/titles/cwosg"&gt;&lt;i&gt;Modular Java&lt;/i&gt;&lt;/a&gt; that mention a strange &lt;code&gt;NoClassDefFoundError&lt;/code&gt; with regard to &lt;code&gt;org.compass.core.util.reflection.ReflectionMethod&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;I started to address these concerns on the errata page, but decided to talk about it here because (1) the comment button on the errata page seems to be missing right now and (2) I want to address it once instead of once for each errata item. Once I get the comment button back, I'll point the readers here for more info.&lt;/p&gt; &lt;p&gt;As it turns out, when I run my local instance of &lt;i&gt;Dude, Where's My JAR?&lt;/i&gt;, I get that very same exception. I never really noticed it before, but sure enough it's there. Why didn't I notice it? Didn't I test this? Am I, as one reviewer incorrectly suggested, asking my readers to do my QA for my book?&lt;/p&gt; &lt;p&gt;Absolutely not! Believe me when I say that I walked through the instructions for &lt;i&gt;Dude, Where's My JAR?&lt;/i&gt; no less than a half-dozen times before the book went to print. My editor will attest to the fact that I've put in far more testing time on this book's examples than for any of my previous books. I am confident that the examples in the book were working before they were published. Had they not been, I would've corrected them before they ended up in your hands. Furthermore, I know of several people who have also successfully worked through the examples.&lt;/p&gt; &lt;p&gt;Are they perfect? Probably not. I'd be shocked if I were ever able to, on my own, produce a flawless example. But I'm certain that I didn't just toss the example over the wall for the readers to sort through.&lt;/p&gt; &lt;p&gt;But the question still remains: How did I not notice the &lt;code&gt;NoClassDefFoundError&lt;/code&gt;? Well, even though I witnessed that error when I ran my own instance of &lt;i&gt;Dude, Where's My JAR?&lt;/i&gt;, the application still works. The spider crawls the repository, deposits its findings in the index, and the web lets me search for JAR files. The example works in spite of the error. The error itself happens very early in the startup of the application, so unless I'm paying very close attention, it scrolls off the screen unnoticed. Since the application works, I never felt compelled to review the log files for the error.&lt;/p&gt; &lt;p&gt;But this doesn't mean that the case is closed. I do not think such an exception should go unanswered. I will try to figure out why the error happens (I suspect it has something to do with the way OSGi class loaders work) and once I find a way to keep it from appearing, I'll let everyone know how to fix it. In the meantime, feel free to ignore that error--as far as I can tell it is innocuous.&lt;/p&gt;</description>
         <author>Craig Walls</author>
         <guid isPermaLink="false">http://www.jroller.com/habuma/entry/a_bit_of_modular_java</guid>
         <pubDate>Mon, 24 Aug 2009 18:49:41 -0700</pubDate>
         <category>OSGi</category>
      </item>
      <item>
         <title>New post on Continuous Flow</title>
         <link>http://www.benrady.com/2009/08/new-post-on-continuous-flow.html</link>
         <description>&lt;div&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.dzone.com/links/youre_already_using_continuous_flow_poorly.html"&gt;You're Already Doing Continuous Flow (poorly)&lt;/a&gt; &lt;/p&gt;&lt;p&gt;This was a fun one to write. One of those blogs that just flows out of you in one pass. &lt;/p&gt;&lt;/div&gt;</description>
         <author>Ben Rady</author>
         <guid isPermaLink="false">tag:typepad.com,2003:post-6a00e54fb013da88340120a508ea55970b</guid>
         <pubDate>Thu, 20 Aug 2009 05:09:48 -0700</pubDate>
      </item>
      <item>
         <title>The PICA technique for Java</title>
         <link>http://cleveralias.blogs.com/thought_spearmints/2009/08/the-pica-technique-for-java.html</link>
         <description>Just had an article published on DevX's Java Zone. PICA stands for Proxied Interfaces Configured with Annotations. Enjoy!</description>
         <author>Pholser</author>
         <guid isPermaLink="false">http://cleveralias.blogs.com/thought_spearmints/2009/08/the-pica-technique-for-java.html</guid>
         <pubDate>Thu, 20 Aug 2009 08:11:53 -0700</pubDate>
         <content:encoded><![CDATA[<p>Just had an <a rel="nofollow" target="_blank" href="http://www.devx.com/Java/Article/42492">article</a> published on DevX's Java Zone. PICA stands for Proxied Interfaces Configured with Annotations. Enjoy!</p>]]></content:encoded>
      </item>
      <item>
         <title>Using Interfaces for Model in ASP.NET MVC (Impl)…</title>
         <link>http://feedproxy.google.com/~r/davidoharanet/~3/NCBja8zmmqw/</link>
         <description>I mentioned in my first post that we were using interfaces to represent our models and WHY we did it. So here&amp;#8217;s the HOW of doing it.
Binding
As I mentioned, we used the model attribute to decorate our models when they are in the method signature. This attribute was based on the AbstractParameterBinderAttribute from MvcContrib (if [...]&lt;img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.davidohara.net&amp;blog=3093&amp;post=319&amp;subd=davidohara&amp;ref=&amp;feed=1"/&gt;</description>
         <author>David O'Hara</author>
         <guid isPermaLink="false">http://davidohara.wordpress.com/?p=319</guid>
         <pubDate>Tue, 18 Aug 2009 20:08:01 -0700</pubDate>
         <content:encoded><![CDATA[<div class='snap_preview'><br /><p>I mentioned in my <a rel="nofollow" target="_blank" href="http://davidohara.wordpress.com/2009/08/05/using-interfaces-for-model-in-asp-net-mvc/" title="Using Interfaces for Model in ASP.NET MVC">first post</a> that we were using interfaces to represent our models and WHY we did it. So here&#8217;s the HOW of doing it.</p>
<h3>Binding</h3>
<p>As I mentioned, we used the model attribute to decorate our models when they are in the method signature. This attribute was based on the <em>AbstractParameterBinderAttribute</em> from <a rel="nofollow" target="_blank" href="http://www.codeplex.com/MVCContrib" title="MVC Contrib">MvcContrib</a> (if you&#8217;re using ASP.NET MVC and NOT using MvcContrib, you&#8217;re probably re-inventing more than a few wheels) which is just a <em>CustomModelBinderAttribute</em> with a little bit of happy sprinkled in. Here&#8217;s what our binding looked like:</p>
<pre>
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{ ViewDataDictionary viewData = GetViewData(controllerContext.Controller); object result = null; if (viewData != null) { result = viewData.For(controllerContext, bindingContext); SetViewData(result, controllerContext, bindingContext, viewData); } return result;
}
</pre>
<p>The <em>GetViewData</em> and <em>SetViewData</em> are pretty self-explanatory but the real heavy lifting is in that extension method. Let&#8217;s take a look at it.</p>
<h3>DictionaryAdapter</h3>
<p>We know that we have a giant dictionary holding on to our data and tedious mapping using strings make me itchy, not to mention it breaking my refactoring tool, so how do we push the values without them? <a rel="nofollow" target="_blank" href="http://www.castleproject.org/components/dictionaryadapter/index.html" title="DictionaryAdapter Component :: Castle Project">DictionaryAdapter</a> from Castle. This little known, under utilized piece of work was shown to me by <a rel="nofollow" target="_blank" href="http://blogs.hibernatingrhinos.com/Craig/Default.aspx" title="Don't click this link - he NEVER actually blogs">Craig Neuwirt</a>, it&#8217;s creator, and I&#8217;m constantly amazed at it&#8217;s usefulness. Observe the following extension method for <em>ViewData</em>:</p>
<pre>
private static readonly IDictionaryAdapterFactory ViewDataFactory = new DictionaryAdapterFactory(); public static object For(this ViewDataDictionary viewData, ControllerContext controllerContext, ModelBindingContext bindingContext)
{ ViewDataAdapter data = new ViewDataAdapter(viewData); object adapter = ViewDataFactory.GetAdapter(bindingContext.ModelType, data); IDictionaryAdapter meta = adapter as IDictionaryAdapter; meta.FetchProperties(); return adapter;
}
</pre>
<p>It&#8217;s that simple. No, really. The DictionaryAdapter will match up the properties on the interface you defined with the corresponding elements in the ViewData and push their values into an instance of the model. All of that, without you even having to buy it dinner.</p>
<h3>There&#8217;s more??</h3>
<p>This approach worked great for us and gave us most of what we needed, however, this code doesn&#8217;t handle rehydrating objects from ActiveRecord &#8211; yet. But that&#8217;s a post for another night&#8230;</p>
<p>CORRECTION: Craig informed me that he did not create it originally but re-wrote it&#8217;s initial implementation to what it is now. Sorry for the misunderstanding.</p>
<hr /><span style="text-align:center;"><img src="http://davidohara.files.wordpress.com/2007/12/bullet-splat.png?w=20" title="Improving Enterprises" width="20"/>David O&#8217;Hara is a Principal with <a rel="nofollow" target="_blank" href="http://improvingenterprises.com/">Improving Enterprises</a> in Dallas, Texas.</span> <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/davidohara.wordpress.com/319/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/davidohara.wordpress.com/319/"/></a> <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/godelicious/davidohara.wordpress.com/319/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/davidohara.wordpress.com/319/"/></a> <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gostumble/davidohara.wordpress.com/319/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/davidohara.wordpress.com/319/"/></a> <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/godigg/davidohara.wordpress.com/319/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/davidohara.wordpress.com/319/"/></a> <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/goreddit/davidohara.wordpress.com/319/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/davidohara.wordpress.com/319/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.davidohara.net&blog=3093&post=319&subd=davidohara&ref=&feed=1"/></div><div class="feedflare">
<a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/davidoharanet?a=NCBja8zmmqw:7XhCbSPDx6U:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/davidoharanet?d=yIl2AUoC8zA" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/davidoharanet?a=NCBja8zmmqw:7XhCbSPDx6U:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/davidoharanet?i=NCBja8zmmqw:7XhCbSPDx6U:V_sGLiPBpWU" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/davidoharanet?a=NCBja8zmmqw:7XhCbSPDx6U:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/davidoharanet?i=NCBja8zmmqw:7XhCbSPDx6U:gIN9vFwOqvQ" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/davidoharanet?a=NCBja8zmmqw:7XhCbSPDx6U:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/davidoharanet?i=NCBja8zmmqw:7XhCbSPDx6U:F7zBnMyn0Lo" border="0"></a>
</div>]]></content:encoded>
         <media:content url="http://1.gravatar.com/avatar/9020f8af8e092bb1c4722b0deef82c8b?s=96&amp;amp;d=identicon&amp;amp;r=G" medium="image">
            <media:title>davidohara</media:title>
         </media:content>
         <media:content url="http://davidohara.files.wordpress.com/2007/12/bullet-splat.png" medium="image">
            <media:title>Improving Enterprises</media:title>
         </media:content>
      </item>
      <item>
         <title>Survey results posted on feedbackjunkies.com</title>
         <link>http://www.benrady.com/2009/08/survey-results-posted-on-feedbackjunkiescom.html</link>
         <description>&lt;div&gt;&lt;p&gt;I've started a new blog called &lt;a rel="nofollow" target="_blank" href="http://benrady.typepad.com/feedback_junkies/"&gt;Feedback
Junkies&lt;/a&gt; as a home for all
my rants on software development. I'm looking forward to
talking a lot about Improving Works and the good stuff we're doing with it. &lt;/p&gt;&lt;p&gt;As an inaugural post, I've published the results from last week's survey on
TDD and automated
testing. They were quite surprising, and I hope to do it again soon.&lt;/p&gt;&lt;/div&gt;</description>
         <author>Ben Rady</author>
         <guid isPermaLink="false">tag:typepad.com,2003:post-6a00e54fb013da88340120a5574be2970c</guid>
         <pubDate>Mon, 17 Aug 2009 17:07:55 -0700</pubDate>
      </item>
      <item>
         <title>Inc. 500 ranks Improving #120 over all, #8 in IT, #2 in D/FW</title>
         <link>http://www.tmgirvin.com/2009/08/inc-500-ranks-improving-120-over-all-8-in-it-2-in-dfw.html</link>
         <description>I had heard unofficially a while back that Improving was going to be ranked in the Inc. Magazine list of fastest growing companies in the US known at The Inc. 500. But I was pleasantly surprised this morning, as I...</description>
         <author>Todd Girvin</author>
         <guid isPermaLink="false">http://www.tmgirvin.com/2009/08/inc-500-ranks-improving-120-over-all-8-in-it-2-in-dfw.html</guid>
         <pubDate>Sun, 16 Aug 2009 10:11:05 -0700</pubDate>
         <content:encoded><![CDATA[<p><a rel="nofollow" target="_blank" href="http://www.inc.com/inc5000/2009/index.html"><img style="border-right-width:0px;margin:0px 10px 0px 0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Inc500" border="0" alt="Inc500" align="left" src="http://integralpath.blogs.com/.a/6a00d83451806669e20120a4fb1d34970b-pi" width="159" height="181"/></a>I had heard unofficially a while back that <a rel="nofollow" target="_blank" href="http://improvingenterprises.com/">Improving</a> was going to be ranked in the Inc. Magazine list of fastest growing companies in the US known at <a rel="nofollow" target="_blank" href="http://www.inc.com/inc5000/2009/index.html">The Inc. 500</a>.&#160; But I was pleasantly surprised this morning, as I was going through my considerable stack of mail from being on vacation last week, to pick up my subscription copy of Inc. Magazine and see the Inc. 500 banner on the cover.&#160; I quickly scanned the index and found the section on IT companies (page 166) and flipped to see where we ranked.</p> <p><strong><font size="5"><a rel="nofollow" target="_blank" href="http://www.inc.com/inc5000/2009/company-profile.html?id=200901200">Improving is number 120 overall and number 8 in all of IT!</a></font></strong></p> <p><font size="5"><a rel="nofollow" target="_blank" href="http://www.inc.com/inc5000/2009/lists/top-metro-regions-dallas-fort-worth-arlington--tx.html">Improving is also #2 in the Dallas/Fort Worth area</a></font><font size="5"></font>.&#160; Ironically, the #1 in DFW is my old employer, <a rel="nofollow" target="_blank" href="http://www.onetechnologies.net/">One Technologies</a>, who these days is an <a rel="nofollow" target="_blank" href="http://improvingenterprises.com/Pages/newsfullstory16_One%20Technologies%20Selects%20Improving%20to%20Enhance%20Online%20Affiliate%20Program">Improving Client</a>.&#160; They are totally rocking with a national ranking of 8.&#160; Congrats to our good friends at One Tech!&#160; It looks like <a rel="nofollow" target="_blank" href="http://www.inc.com/inc5000/2008/company-profile.html?id=200802100">last year they were #210</a>.&#160; Can they keep climbing?&#160; Maybe together we can move up the ranks.</p>]]></content:encoded>
      </item>
      <item>
         <title>Happy Birthday, Improving Enterprises</title>
         <link>http://www.tmgirvin.com/2009/08/happy-birthday-improving-enterprises.html</link>
         <description>Today is the 5th anniversary of the incorporation of Improving Enterprises. Happy birthday, Improving! To commemorate the occasion, I want to tell a little story about how Improving came to be, at least from my perspective. Everyone involved has a...</description>
         <author>Todd Girvin</author>
         <guid isPermaLink="false">http://www.tmgirvin.com/2009/08/happy-birthday-improving-enterprises.html</guid>
         <pubDate>Sat, 15 Aug 2009 13:21:59 -0700</pubDate>
         <content:encoded><![CDATA[<p><a rel="nofollow" target="_blank" href="http://improvingenterprises.com/"><img style="border-right-width:0px;margin:0px 0px 5px 10px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="improving-logo" border="0" alt="improving-logo" align="right" src="http://integralpath.blogs.com/.a/6a00d83451806669e20120a4f9a30d970b-pi" width="240" height="75"/></a>Today is the 5th anniversary of the incorporation of <a rel="nofollow" target="_blank" href="http://www.improvingenterprises.com">Improving Enterprises</a>.&#160; Happy birthday, Improving!</p> <p>To commemorate the occasion, I want to tell a little story about how Improving came to be, at least from my perspective.&#160; Everyone involved has a different angle, so hopefully others will comment or blog their own experience to add to the story.</p> <p>In 1993, I was in the contract programming business and ran across this crazy English bloke named Graham Glass who was a co-founder of ObjectSpace and ended up becoming my close friend and mentor in iterative/incremental software development using object-oriented concepts.&#160; In 1994, I joined ObjectSpace as a very young senior consultant and my first large consulting gig was with <a rel="nofollow" target="_blank" href="http://www.fundinguniverse.com/company-histories/Raytheon-Company-Company-History.html">E-Systems</a> on the Commercial Remote Sensing System (CRSS) project, building a global satellite imaging system.&#160; On that project, I worked with the best manager I’ve ever encountered, <a rel="nofollow" target="_blank" href="http://improvingenterprises.com/Pages/personDetail27FullBio_Barry%20%20Rogers">Barry Rogers</a>, and a <a rel="nofollow" target="_blank" href="http://improvingenterprises.com/Pages/personDetail28FullBio_Michael%20Rousey">few</a> <a rel="nofollow" target="_blank" href="http://improvingenterprises.com/Pages/personDetail34FullBio_Ed%20Grannan">newly</a> <a rel="nofollow" target="_blank" href="http://improvingenterprises.com/Pages/personDetail9FullBio_Susan%20Fojtasek">graduated</a> <a rel="nofollow" target="_blank" href="http://improvingenterprises.com/Pages/personDetail8FullBio_Jeff%20Dunn">software</a> <a rel="nofollow" target="_blank" href="http://improvingenterprises.com/Pages/personDetail31FullBio_John%20Woodward">developers</a>, including one who always wore a suit and was driven towards greater things named <a rel="nofollow" target="_blank" href="http://improvingenterprises.com/Pages/personDetail14FullBio_Curtis%20Hite">Curtis Hite</a>.&#160; </p> <p>In 1995 after Raytheon acquired E-Systems and I had spent a year and a half with the CRSS team, I left the project to do a variety of other things and the superior group of engineers went on to become internal consultants within Raytheon across many projects.&#160; At the same time, ObjectSpace started its bootcamp program to hire aspiring object technologists with great potential and to train them in “the ObjectSpace way”.&#160; <a rel="nofollow" target="_blank" href="http://improvingenterprises.com/Pages/personDetail32FullBio_Jef%20Newsom">Jef Newsom</a> was one of the first and most gifted students of the internal bootcamps and graduated to become an excellent instructor.&#160; In 1996, the adventurous Jef moved to Washington D.C. to be a part of ObjectSpace’s first satellite office and in 1997 I worked on a project in D.C. for about 6 mos, where Jef and I became fast friends, bonding over software &amp; skateboarding, billiards &amp; beer, and jokes about Texans.&#160; </p> <p>In 1998 the Raytheon team, frustrated with the ability-agnostic pay structures of government contractors, looked around for another place to land.&#160; ObjectSpace couldn’t hire them because they were client personnel, so they joined a newly forming company called Expeed which eventually became the North American branch of Valtech.&#160; Also in ‘98, Jef left ObjectSpace for another entrepreneurial adventure in Dallas and in 1999 I left for one in northern Virginia, as well.&#160; In 2000, ObjectSpace was facing trouble and sold its training division, with <a rel="nofollow" target="_blank" href="http://improvingenterprises.com/Pages/personDetail16FullBio_Ken%20Howard">Ken Howard</a> and <a rel="nofollow" target="_blank" href="http://improvingenterprises.com/Pages/personDetail15FullBio_Diana%20Hoogland">Diana Hoogland</a> as heads of operations and sales, respectively, to Curtis, Barry, and the gang at Valtech.&#160; </p> <p>Jumping ahead a few years to 2003, Jef was consulting on a project in the social networking space where they wanted a like-minded person to head up the development team.&#160; I took the job and moved back to Dallas to get schooled by Jef in .NET architecture and C# development.&#160; Meanwhile, Valtech was going strong with the leadership of <a rel="nofollow" target="_blank" href="http://improvingenterprises.com/Pages/personDetail14FullBio_Curtis%20Hite">Curtis</a>, <a rel="nofollow" target="_blank" href="http://improvingenterprises.com/Pages/personDetail27FullBio_Barry%20%20Rogers">Barry</a>, and <a rel="nofollow" target="_blank" href="http://improvingenterprises.com/Pages/personDetail5FullBio_Ric%20DeAnda">Ric DeAnda</a>, with many other great people in the ranks.&#160; In early 2004, my social networking company ran into financial problems just as we were growing a user base, so we shut down that line of business and I started making plans to move on.&#160; <a rel="nofollow" target="_blank" href="http://improvingenterprises.com/Pages/personDetail32FullBio_Jef%20Newsom">Jef</a> was doing independent consulting elsewhere at the time and looking for the next big thing.&#160; When I told him that I was ready to leave and start something new, he asked “Do you want to start a company together?”&#160; Without even knowing what we would do, I blurted out “Yes!”&#160; We started planning and working toward incorporation and signed the papers on August 15th, 2004 for <a rel="nofollow" target="_blank" href="http://improvingenterprises.com/">Improving Enterprises, LLC</a>.&#160; </p> <p>We began as a consulting and training firm specializing in .NET development and applying our valuable experience in object-oriented, agile development from the Java world.&#160; We started as a registered Microsoft partner, and through years of hard work and earning a long list of customer references, became Microsoft Certified and eventually a Microsoft Gold Certified Partner for both <em>Learning Solutions</em> and <em>Custom Development Solutions</em>.&#160; </p> <p>In 2006, the international leadership of Valtech, suffering an extremely severe case of rectal-cranial inversion, decided they didn’t like the profitable direction of the North American branch, and systematically pushed out the entire leadership and sales teams.&#160; The leadership team, composed of former CRSS and ObjectSpace team members, formed a new think-tank called <a rel="nofollow" target="_blank" href="http://www.theblueoceangroup.com/">The Blue Ocean Group</a>, which in early 2007 Jef and I convinced to <a rel="nofollow" target="_blank" href="http://improvingenterprises.com/Pages/newsfullstory1_Merger%20Makes%20for%20Well-equipped%20Consulting%20Firm">join forces with us</a> to form the stronger, faster, and healthier <a rel="nofollow" target="_blank" href="http://improvingenterprises.com/">Improving Enterprises, Inc.</a>&#160; We now have many people from the original Raytheon CRSS team and from ObjectSpace, as well as many other talented and excellence-focused people from the software development industry in our area.&#160; On this special occasion, thanks go to everyone for making this company more capable and self-sustaining than we dared imagine in the beginning.&#160; It’s a pleasure to work with everyone in the company and to continue to experience the <a rel="nofollow" target="_blank" href="http://improvingenterprises.com/Pages/news.aspx">great success that we have been fortunate enough to enjoy up to this point</a>.&#160; Thanks also go to our customers and partners who give us fun and challenging work to do.&#160; We plan to continue bringing great business value and the spirit of <a rel="nofollow" target="_blank" href="http://improvingenterprises.com/">improving</a> to everything we do, for many years to come.&#160; </p>]]></content:encoded>
      </item>
      <item>
         <title>Developing Quality Software using VSTS 2010</title>
         <link>http://www.tmgirvin.com/2009/08/developing-quality-software-using-visual-studio-team-system-2010.html</link>
         <description>My colleague Chris Tullier and I are presenting a one-day pre-conference workshop at the Microsoft PDC this year on Developing Quality Software using Visual Studio Team System 2010. We’re going to cover full-lifecycle development techniques for keeping quality high -...</description>
         <author>Todd Girvin</author>
         <guid isPermaLink="false">http://www.tmgirvin.com/2009/08/developing-quality-software-using-visual-studio-team-system-2010.html</guid>
         <pubDate>Fri, 14 Aug 2009 04:52:17 -0700</pubDate>
         <content:encoded><![CDATA[<p><a rel="nofollow" target="_blank" href="http://microsoftpdc.com/"><img style="border-right-width:0px;margin:0px 0px 5px 5px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="PDC09" border="0" alt="PDC09" align="right" src="http://integralpath.blogs.com/.a/6a00d83451806669e20120a54feb0a970c-pi" width="244" height="81"/></a>My colleague <a rel="nofollow" target="_blank" href="http://microsoftpdc.com/Speakers/ChrisTullier">Chris Tullier</a> and <a rel="nofollow" target="_blank" href="http://microsoftpdc.com/Speakers/ToddGirvin">I</a> are presenting a one-day pre-conference workshop at the <a rel="nofollow" target="_blank" href="http://microsoftpdc.com/">Microsoft PDC</a> this year on <a rel="nofollow" target="_blank" href="http://microsoftpdc.com/Sessions/Developing-Quality-Software-using-Visual-Studio-Team-System-2010">Developing Quality Software using Visual Studio Team System 2010</a>.&#160;&#160; We’re going to cover full-lifecycle development techniques for keeping quality high - from capturing requirements and acceptance criteria, through development and requirements traceability, on into testing and collecting project feedback.&#160; All along the way we’ll be demonstrating these best practices for quality development using <a rel="nofollow" target="_blank" href="http://www.microsoft.com/visualstudio/en-us/products/teamsystem/default.mspx">Visual Studio Team System</a> (Visual Studio team editions plus TFS) and highlighting some of the new features in VSTS 2010 that can really help a team crank out bullet-proof code.&#160; Finally, we’ll wrap up the day with a Q&amp;A session with our friends from the Microsoft VSTS product team.</p> <p>As you know, PDC is the premier conference for .NET developers in the world.&#160; We’re fortunate enough to have it two years in a row because of all the great new technologies growing around the .NET platform.&#160; So if you missed it last year, you should definitely make it this year.&#160; And, you can save $500 by registering before September 15th. Come on out for the conference and make sure you get there a day early to <a rel="nofollow" target="_blank" href="http://microsoftpdc.com/Sessions/Developing-Quality-Software-using-Visual-Studio-Team-System-2010">join us</a> on Monday for this valuable pre-con!&#160; </p>]]></content:encoded>
      </item>
      <item>
         <title>No Brown M&amp;M’s!!!</title>
         <link>http://agilist.net/?p=334</link>
         <description>The rock band Van Halen got some bad PR years ago when word spread that they demanded M&amp;#38;M’s in their dressing room, and that the brown M&amp;#38;M’s must be removed. A concert could be cancelled or delayed if the M&amp;#38;M requirement was not satisfied.
What a bunch of spoiled brats! But hold on…the terms of the [...]</description>
         <guid isPermaLink="false">http://agilist.net/?p=334</guid>
         <pubDate>Thu, 13 Aug 2009 13:14:13 -0700</pubDate>
         <content:encoded><![CDATA[<p><img class="alignright size-thumbnail wp-image-335" title="brown-mms" src="http://agilist.net/wp-content/uploads/2009/08/brown-mms-150x150.jpg" alt="brown-mms" width="150" height="150"/>The rock band Van Halen got some bad PR years ago when word spread that they demanded M&amp;M’s in their dressing room, and that the brown M&amp;M’s must be removed. A concert could be cancelled or delayed if the M&amp;M requirement was not satisfied.</p>
<p>What a bunch of spoiled brats! But hold on…the terms of the contract rider were NOT actually demanded by the band members. David Lee Roth explained that Van Halen concerts had extensive technical and engineering requirements that must be followed explicitly for safety reasons as well as to ensure that the show could go on with no surprises. All of the site preparation details were meticulously laid out in a contract rider. The rider spelled out everything that must be done to prepare the stage, sound equipment, lighting, etc.</p>
<p>Hidden way down in the nooks and crannies of all these instructions was the “No Brown M&amp;M’s” requirement. When the band showed up for a performance, if there were no M&amp;M’s, or if they were there and the brown ones weren’t removed, it set off a red flag that the contract had not been read carefully. The show would be delayed until every detail of a site preparation could be verified. When telling this story on This American Life, Ira Glass referred to this as a “Canary in the Coal Mine”.</p>
<p>This story illustrates the great challenge with written requirements. When requirements are written down, the burden of fulfillment then lies in the hands of the person reading the requirements, and it’s highly probable that requirements will be missed. The “Canary in the Coal Mine” is a clever trick to ensure that written requirements are carefully handled, but it’s not attacking the heart of the problem.</p>
<p>Effective, real time communication is the key to quality requirements handling. This is why most Agile practices emphasize high bandwidth communication over writing things down. It’s possible that the use of passive communication techniques such as filling out business requirements documents may not be avoidable, but when these techniques are used, you may want to embed a canary…</p>]]></content:encoded>
      </item>
   </channel>
</rss><!-- fe1.pipes.re3.yahoo.com uncompressed/chunked Fri Nov 13 14:56:42 PST 2009 -->
