<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>JavaWorld's Daily Brew</title>
  <subtitle>Starting conversations in the Java developer community</subtitle>
  <link rel="alternate" type="text/html" href="http://www.javaworld.com/community"/>
  <link rel="self" type="application/atom+xml" href="http://www.javaworld.com/community/atom/feed"/>
  <id>http://www.javaworld.com/community/atom/feed</id>
  <updated>2010-03-11T15:00:13-05:00</updated>
  <entry>
    <title>James Gosling isn&#039;t going anywhere</title>
    <link rel="alternate" type="text/html" href="http://www.javaworld.com/community/node/4158" />
    <id>http://www.javaworld.com/community/node/4158</id>
    <published>2010-03-17T21:06:46-04:00</published>
    <updated>2010-03-17T21:06:46-04:00</updated>
    <author>
      <name>Josh Fruhlinger</name>
    </author>
    <category term="glassfish" />
    <category term="James Gosling" />
    <category term="Java ee 6" />
    <category term="Java Store" />
    <summary type="html"><![CDATA[<!--paging_filter--><p>On Monday I talked about Simon Phipps, a Sun C-level officer who <a href="http://www.javaworld.com/community/node/4155" target="_blank">left Oracle for other things</a>, signaling at the very least a difference in opinion on how things were and will be going between Phipps and his employers.  (For hint of that, see the brief comment on that post that purports to be from Phipps, hinting that the full story of the Apache-Sun dispute has yet to be written.)  James Gosling, on the other hand, appeared today at the <a href="SERVERSIDE URL" target="_blank">ServerSide Java symposium in Las Vegas</a>; as befitted Oracle's newly minted CTO of client software, he offered what seemed like a full-throated endorsement of Oracle's future management of the platform, though perhaps with a few off-script asides.  You can find good coverage of his talk at <a href="http://www.eweek.com/c/a/Application-Development/Gosling-Claims-Java-in-Good-Hands-with-Oracle-504078/" target="_blank">eWeek</a> and <a href="http://www.infoworld.com/d/developer-world/java-founder-emphasizes-oracles-commitment-973">InfoWorld</a>, along with a <a href="http://www.networkworld.com/news/2010/031710-java-pioneer-distances-himself-from.html?hpg1=bn" target="_blank">brief interview in which InfoWorld's Paul Krill ambushed Gosling in line at his hotel</a>.      ]]></summary>
    <content type="html"><![CDATA[<!--paging_filter--><p>On Monday I talked about Simon Phipps, a Sun C-level officer who <a href="http://www.javaworld.com/community/node/4155" target="_blank">left Oracle for other things</a>, signaling at the very least a difference in opinion on how things were and will be going between Phipps and his employers.  (For hint of that, see the brief comment on that post that purports to be from Phipps, hinting that the full story of the Apache-Sun dispute has yet to be written.)  James Gosling, on the other hand, appeared today at the <a href="SERVERSIDE URL" target="_blank">ServerSide Java symposium in Las Vegas</a>; as befitted Oracle's newly minted CTO of client software, he offered what seemed like a full-throated endorsement of Oracle's future management of the platform, though perhaps with a few off-script asides.  You can find good coverage of his talk at <a href="http://www.eweek.com/c/a/Application-Development/Gosling-Claims-Java-in-Good-Hands-with-Oracle-504078/" target="_blank">eWeek</a> and <a href="http://www.infoworld.com/d/developer-world/java-founder-emphasizes-oracles-commitment-973">InfoWorld</a>, along with a <a href="http://www.networkworld.com/news/2010/031710-java-pioneer-distances-himself-from.html?hpg1=bn" target="_blank">brief interview in which InfoWorld's Paul Krill ambushed Gosling in line at his hotel</a>.  <!--break--> Some high points of his remarks:</p>

<ul>
<li><p>Java EE 6, though its integration of OSGi, is offering modularity that can make for easier programming. With the advent of the Web profile and of dependency injection, full-on Java EE can compete on ease of use with the Spring Framework. In particular, he claimed that "all the pain of EJBs has just gone away."</p></li>

<li><p>He also praised GlassFish as the first real Java EE 6 server, and in so doing perhaps undermined Oracle's attempts to cast it as a lower-level "departmental" server from which organizations will eventually graduate to WebLogic.  Though in his interview with Krill he deferred to Oracle on its future, in his talk, he said, "People run lots of large-scale sites on it. Don't think of it as toy. It is definitely not a toy."</p></li>

<li><p>The Java Store, a project that seems to be pretty near and dear to his heart, has hit a snag when it came to properly collecting sales tax revenues nationwide, but that's been ironed out and the full store should debuting "any day now."</p></li>

<li><p>He praised JavaFX, but said that it's "not about generating Web pages, it's about building rich graphical user interfaces on the desktop."  Someday maybe we'll find out what exactly it's really for, if it isn't stillborn!</p></li>

</ul>

<p>One thing Gosling has very little interest in is something of importance to a great number of Java developers: the process and institutions by which the language is developed.  He told Krill that the Java Community Process has "just gotten complicated" and that he didn't want anything to do with it; in his talk, he said that it bogged down engineers in discussion when they could be writing code. "You have to talk to people. For lots of folks, that's kind of a difficult thing," he said.  Spoken like a hard-core engineer -- and like a man who's happy to work away at engineering problems for his new employer without making a political fuss.</p>    ]]></content>
  </entry>
  <entry>
    <title>Changing the Default NetBeans License Template</title>
    <link rel="alternate" type="text/html" href="http://www.javaworld.com/community/node/4157" />
    <id>http://www.javaworld.com/community/node/4157</id>
    <published>2010-03-17T00:54:00-04:00</published>
    <updated>2010-03-18T00:00:47-04:00</updated>
    <author>
      <name>dmarx</name>
    </author>
    <category term="Dustin" />
    <category term="netbeans" />
    <summary type="html"><![CDATA[<!--paging_filter--><p>In my <a href="http://marxsoftware.blogspot.com/2010/03/dealing-with-netbeans-new-source.html">previous blog post</a>, I demonstrated how to remove the <a href="http://emilian-bold.blogspot.com/2010/03/default-netbeans-ide-java-source.html">annoying template instruction comment</a> added to all <a href="http://netbeans.org/">NetBeans</a>-generated files.</p>
    ]]></summary>
    <content type="html"><![CDATA[<!--paging_filter--><p>In my <a href="http://marxsoftware.blogspot.com/2010/03/dealing-with-netbeans-new-source.html">previous blog post</a>, I demonstrated how to remove the <a href="http://emilian-bold.blogspot.com/2010/03/default-netbeans-ide-java-source.html">annoying template instruction comment</a> added to all <a href="http://netbeans.org/">NetBeans</a>-generated files.  <a href="http://www.blogger.com/profile/17794251492475991671">Peter Hull</a> <a href="http://marxsoftware.blogspot.com/2010/03/dealing-with-netbeans-new-source.html?showComment=1268772232723#c1543882280225727962">pointed out</a> that one could also use this for a license as documented in <a href="http://blogs.sun.com/geertjan/">Geertjan's Blog</a> in the post <a href="http://blogs.sun.com/geertjan/entry/project_level_license_settings_in">Project-Level License Settings in NetBeans IDE 6.0</a>.  Although I generally don't need to include the license in the source code of software products I work on, this can be a useful feature for those that do.</p>
<p>The easiest way to apply one's own default template for licensing is to simply edit the default one that is used when you create a new NetBeans-generated source file.  This is done by using the Template Manager which is accessed in NetBeans via the Tools-&gt;Templates menu.  This is demonstrated by the next screen snapshot.</p>
<p><a href="http://3.bp.blogspot.com/_sDOe5HxTdMk/S6BkE1WNXlI/AAAAAAAABlY/Mh5bMWyzVC0/s1600-h/EditingDefaultLicenseNetBeansTemplatesManager.png"></a></p>
<p>One can select the "Default License" and click on the "Open in Editor" button.  When this is done, the initial text will include the comment that is all over the web about using of templates.  However, the next screen snapshot demonstrates how I have changed its text.</p>
<p><a href="http://1.bp.blogspot.com/_sDOe5HxTdMk/S6BlBb_FfvI/AAAAAAAABlg/HKUDBr9crLE/s1600-h/EditingDefaultLicenseNetBeansEditedWithNameBlogUrl.png"></a></p>
<p>With this template in place, I can generate a new class or interface or other source code artifact to test it out.  In this case, I generated a class via NetBeans's class generation wizard.  The generated class, with my altered license information, is demonstrated in the next screen snapshot.</p>
<p><a href="http://4.bp.blogspot.com/_sDOe5HxTdMk/S6BlaDBJEXI/AAAAAAAABlo/x20s7ok61Ko/s1600-h/GeneratedClassWithEditedDefaultLicense.png"></a></p>
<p>The above examples demonstrated changing the default comments included in each generated source file by changing the "Default License" template as opposed as to removing it altogether as I showed in my <a href="http://marxsoftware.blogspot.com/2010/03/dealing-with-netbeans-new-source.html">last blog post</a>.  Removing reference to the license altogether or changing the "Default License" are the easiest ways to deal with this.</p>
<p>As <a href="http://blogs.sun.com/geertjan/entry/project_level_license_settings_in">Geertjan's post</a> demonstrates, NetBeans has supported the ability to add custom license as well.  In the first screen snapshot in this post, there are other licenses already available (such as an <a href="http://www.apache.org/licenses/LICENSE-2.0.html">Apache 2 license</a>) and one can generate custom licenses.  Doing this involves coordination between a property called <code>project.license</code> in the <code>nbproject/project.properties</code> file and the reference to that file in the Templates Manager under the type of source file.  For example, the Templates Manager entry for a "Java Class" contains this line:</p>
<p>&lt;#include "../Licenses/license-${project.license}.txt"&gt;</p>
<p>As would be expected, the <code>${project.license}</code> placeholder is replaced by the value that the property <code>project.license</code> is set to in the <code>nbproject/project.properties</code> file.</p>
<p><strong>Caveat</strong></p>
<p>As of this writing, I am having difficulty with custom licenses.  When I set the property <code>project.license=dustin</code> and create a license template in the Template Manager named <code>license-dustin.txt</code> to match the format specified in the template for new Java class source code, the comment I get in a generated Java class file is "Error reading included file Templates/Classes/../Licenses/license-dustin.txt".  I get this whether I try to select a file from the file system or "Duplicate" an existing license template and "Rename" it.  Editing any of the pre-existing license templates provided with <a href="http://netbeans.org/community/releases/68/">NetBeans 6.8</a> seems to work fine.  This is the subject of a <a href="http://forums.netbeans.org/">NetBeans Forum</a> thread <a href="http://forums.netbeans.org/topic11600.html">Topic 11600</a>.</p>
<p>There is one significant disadvantage to simply editing the "Default License": this will affect all new source files regardless of project.  The advantage of specifying the license file via the <code>project.license</code> property is that this is set on a per-project level.  However, as I stated, I cannot get this to work properly at the moment.</p>
<p><strong>Conclusion</strong></p>
<p>I generally prefer to simply turn off the auto-generated comments at the top of my source code files either by removing reference to them altogether or by editing the "Default License" to be empty.  However, if one wants a custom comment, such as license information and/or contact information in the top of source files, NetBeans supports this through the license templates.</p>
    ]]></content>
  </entry>
  <entry>
    <title>Ex-Sun open source honcho: Sorry about that TCK license, Apache!</title>
    <link rel="alternate" type="text/html" href="http://www.javaworld.com/community/node/4155" />
    <id>http://www.javaworld.com/community/node/4155</id>
    <published>2010-03-15T23:20:04-04:00</published>
    <updated>2010-03-16T13:27:07-04:00</updated>
    <author>
      <name>Josh Fruhlinger</name>
    </author>
    <category term="Apache Foundation" />
    <category term="open source" />
    <category term="TCK" />
    <summary type="html"><![CDATA[<!--paging_filter--><p>Among the many high-level Sun people leaving the merged Oracle-Sun conglomerate is Chief Open Source Officer Simon Phipps, who <a href="http://webmink.com/2010/03/08/sundown/" target="_blank">announced his departure on his blog last week</a>. (Side note: Is Chief X Officer the new Vice President? They sure seem to be proliferating!) It was the sort of expected combo of pride and wistful regrets, and (as is probably the intent) it's not that easy to tell whether he's leaving voluntarily or not.    ]]></summary>
    <content type="html"><![CDATA[<!--paging_filter--><p>Among the many high-level Sun people leaving the merged Oracle-Sun conglomerate is Chief Open Source Officer Simon Phipps, who <a href="http://webmink.com/2010/03/08/sundown/" target="_blank">announced his departure on his blog last week</a>. (Side note: Is Chief X Officer the new Vice President? They sure seem to be proliferating!) It was the sort of expected combo of pride and wistful regrets, and (as is probably the intent) it's not that easy to tell whether he's leaving voluntarily or not. Still, the most interesting bit, as one might expect, was one of his regrets, offered in passing: "I'm sad that Apache did not get the TCK license they requested."</p>  

<p>In case you haven't been following this drama, it involves the Apache Foundation being unable to get the testing kit they need to certify their implementation of Java under open source licensing conditions they can accept.  If you want to know more about the details, check out my earlier posts <a href="http://www.javaworld.com/community/node/2595" target="_blank">here</a> and <a href="http://www.javaworld.com/community/node/2601" target="_blank">here</a> (be sure to read the comments too, as they're quite informative).  Phipps' note seems to indicate that at least <em>someone</em> within Sun was on Apache's side in this dispute.  Of course, now he's gone.  Oracle was on Apache's side too, back when it didn't own the rights to the Java trademarks; we're all still waiting to see how (and if) this develops.</p>    ]]></content>
  </entry>
  <entry>
    <title>Dealing with NetBeans New Source Template Annoyance</title>
    <link rel="alternate" type="text/html" href="http://www.javaworld.com/community/node/4147" />
    <id>http://www.javaworld.com/community/node/4147</id>
    <published>2010-03-14T19:44:00-04:00</published>
    <updated>2010-03-18T00:00:47-04:00</updated>
    <author>
      <name>dmarx</name>
    </author>
    <category term="Dustin" />
    <category term="netbeans" />
    <summary type="html"><![CDATA[<!--paging_filter--><p>Yesterday I ran across one of those blog posts that made me realize that I am not the only one with a particular <a href="http://wiki.answers.com/Q/What_is_a_pet_peeve">pet peeve</a>.  In this case, <a href="http://www.blogger.com/profile/10960978131273810766">Emilian Bold</a> addressed my <a href="http://www.kevinwilliampang.com/2008/08/28/top-10-things-that-annoy-programmers/">pet peeve</a> about developers leaving the NetBeans-generated template instruction comments in the code.</p>
    ]]></summary>
    <content type="html"><![CDATA[<!--paging_filter--><p>Yesterday I ran across one of those blog posts that made me realize that I am not the only one with a particular <a href="http://wiki.answers.com/Q/What_is_a_pet_peeve">pet peeve</a>.  In this case, <a href="http://www.blogger.com/profile/10960978131273810766">Emilian Bold</a> addressed my <a href="http://www.kevinwilliampang.com/2008/08/28/top-10-things-that-annoy-programmers/">pet peeve</a> about developers leaving the NetBeans-generated template instruction comments in the code.  In the blog post <a href="http://emilian-bold.blogspot.com/2010/03/default-netbeans-ide-java-source.html">The Default NetBeans IDE Java Source Template is Polluting the Web</a>, Emilian provides a <a href="http://www.google.com/search?q=%22To+change+this+template,+choose+Tools+|+Templates+*%22">Google query</a> that illustrates that there are over 314 thousand (occurrences of the key string he provides).  As a side note, it is interesting that 314 thousand is the number of occurrences on <a href="http://www.piday.org/">Pi Day</a>.</p>
<p><a href="http://4.bp.blogspot.com/_sDOe5HxTdMk/S51395eNYiI/AAAAAAAABlA/0imxnw9sIBM/s1600-h/GoogleSearchForNetBeansTemplateInstructionsInSourceCode.png"></a></p>
<p>The commented-out instructions that automatically appear in NetBeans-generated source code files looks like that shown in the next screen snapshot.</p>
<p><a href="http://1.bp.blogspot.com/_sDOe5HxTdMk/S52FqL4dPPI/AAAAAAAABlI/h6FoMySvZP0/s1600-h/TheActualTemplateMessageCommentedOutNB68Servlet.png"></a></p>
<p>The text states:</p>
<p>/*<br /> * To change this template, choose Tools | Templates<br /> * and open the template in the editor.<br /> */</p>
<p>I see these annoying comments checked into the source code of projects I have worked in which <a href="http://netbeans.org/">NetBeans</a> has been a heavily used IDE, but I was surprised to see how many people have made source code available on the web with these comments still there.  I dislike these so much that I will check a file out of the source code repository, remove these lines, and check the file back in.  Emilian's post points out that I'm not the only one that finds these annoying (he calls them a pollutant, which I think is a good description for them).</p>
<p>Emilian points out that NetBeans includes this in source code automatically in an effort to help developers learn how to better use the IDE and customize it, but adds: "This might sound like a great idea in practice but it's broken since most people won't change it."  It is my opinion that this is the crux of the problem for this case in particular and for this category of things in general (one of the people commenting on Emilian's blog points out that <a href="http://www.eclipse.org/">Eclipse</a> has similar features).  I don't mind so much that the IDE includes these comments, but I cannot understand why one would leave them in place when checking in the code.  Emilian suggests some alternative approaches that might be preferable to including commented text in the generated classes, but I'd be happy just to see end user developers remove these lines as an easy fix.</p>
<p>NetBeans's generation of Java servlets provides more specific automatically generated comments to help the developer working on a new piece of code.  The next screen snapshot shows a method called <code>processRequest</code> that has a simple example implementation provided in comments.  This is shown in the next screen snapshot:</p>
<p><a href="http://1.bp.blogspot.com/_sDOe5HxTdMk/S52GoTbg1HI/AAAAAAAABlQ/s4OLvjiEQp0/s1600-h/someServletProcessRequestGeneratedComments.png"></a></p>
<p>Here is the generated code shown in the above screen snapshot.</p>
<p>    /** <br />     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.<br />     * @param request servlet request<br />     * @param response servlet response<br />     * @throws ServletException if a servlet-specific error occurs<br />     * @throws IOException if an I/O error occurs<br />     */<br />    protected void processRequest(HttpServletRequest request, HttpServletResponse response)<br />    throws ServletException, IOException {<br />        response.setContentType("text/html;charset=UTF-8");<br />        PrintWriter out = response.getWriter();<br />        try {<br />            /* TODO output your page here<br />            out.println("&lt;html&gt;");<br />            out.println("&lt;head&gt;");<br />            out.println("&lt;title&gt;Servlet SomeServlet&lt;/title&gt;");  <br />            out.println("&lt;/head&gt;");<br />            out.println("&lt;body&gt;");<br />            out.println("&lt;h1&gt;Servlet SomeServlet at " + request.getContextPath () + "&lt;/h1&gt;");<br />            out.println("&lt;/body&gt;");<br />            out.println("&lt;/html&gt;");<br />            */<br />        } finally { <br />            out.close();<br />        }<br />    } </p>
<p>I don't see many developers leaving the above generated code in place.  This seems reasonable, but I wonder why this is different than the template instructions at the top of the source code which often do get left in place even as the code is checked into the source code repository.</p>
<p>Since getting serious about developing web applications with <a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm">REST</a> principles in mind, I often find myself not wanting NetBeans to automatically generate servlets that have the <code>@doPost</code> and <code>doGet</code> methods automatically call a single method (<code>processRequest</code> in <a href="http://netbeans.org/community/releases/68/">NetBeans 6.8</a> as shown above).</p>
<p>The generated servlet code contains <code>doGet</code> and <code>doPost</code> implementations as shown in the next code listing.</p>
<p>    /** <br />     * Handles the HTTP <code>GET</code> method.<br />     * @param request servlet request<br />     * @param response servlet response<br />     * @throws ServletException if a servlet-specific error occurs<br />     * @throws IOException if an I/O error occurs<br />     */<br />    @Override<br />    protected void doGet(HttpServletRequest request, HttpServletResponse response)<br />    throws ServletException, IOException {<br />        processRequest(request, response);<br />    } </p>
<p>    /** <br />     * Handles the HTTP <code>POST</code> method.<br />     * @param request servlet request<br />     * @param response servlet response<br />     * @throws ServletException if a servlet-specific error occurs<br />     * @throws IOException if an I/O error occurs<br />     */<br />    @Override<br />    protected void doPost(HttpServletRequest request, HttpServletResponse response)<br />    throws ServletException, IOException {<br />        processRequest(request, response);<br />    }</p>
<p>It's been a Java servlet tradition for several years to have these methods do the same thing, but the rising popularity of REST has reminded us that the <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html">HTTP methods</a> <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.3">GET</a> and <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.5">POST</a> are actually very different things despite what the web browser might tell you.</p>
<p>Fortunately, NetBeans makes it really easy to change these templates.  How does one do that?  That is where that comment that typically annoys me so much when left in managed source code actually comes in handy.  That comment told me how to do it: "To change this template, choose Tools | Templates and open the template in the editor."  I can change the template for the servlet under "Web" in the Tools-&gt;Templates wizard.  There I can remove the commented out text and even change the behavior of <code>doPost</code> and <code>doGet</code> so that they don't call <code>processRequest</code> anymore (and I can remove <code>processRequest</code> altogether).</p>
<p>What if you wish to <a href="http://groups.google.com/group/sjsucsclub/browse_thread/thread/caa10f6c57c95672">remove the comment about how to edit templates</a>?  That is done by changing the template of choice (such as the template for Java Class, Java Interface, or Java Servlet) and removing this line:</p>
<p>&lt;#include "../Licenses/license-${project.license}.txt"&gt;</p>
<p>Once you save the template with this line removed, that text will no longer appear in files created based on that template.</p>
<p>The longer I develop software (and more specifically the longer that I refactor and maintain existing code), the more I realize that I want my code base to be lean.  I loathe dead code and useless comments (as opposed to useful comments).  It is nice to be able to work with the NetBeans template mechanism to remove some of these automatically inserted pieces of code before they even have a chance to get saved in the code repository.</p>
    ]]></content>
  </entry>
  <entry>
    <title>SpringSource finally gets around to putting Spring into its server</title>
    <link rel="alternate" type="text/html" href="http://www.javaworld.com/community/node/4141" />
    <id>http://www.javaworld.com/community/node/4141</id>
    <published>2010-03-10T16:18:43-05:00</published>
    <updated>2010-03-10T16:18:43-05:00</updated>
    <author>
      <name>Josh Fruhlinger</name>
    </author>
    <category term="Spring" />
    <category term="Spring Framework" />
    <category term="SpringSource" />
    <category term="tc server" />
    <summary type="html"><![CDATA[<!--paging_filter--><p>SpringSource's tc Server <a href="http://www.javaworld.com/community/node/2213" target="_blank">got a bit of notice here a year ago when it came out</a>, mostly in the context of its lightweightness.  The server is based on Tomcat, and just as the Spring Framework is supposed to sort of be like Java EE, but without all the annoying heavyweight crud that makes Java EE living hell to work with, so too is tc Server supposed to be like a Java EE app server, except without all the annoying heavyweight crud that makes Java EE servers living hell to work with.    ]]></summary>
    <content type="html"><![CDATA[<!--paging_filter--><p>SpringSource's tc Server <a href="http://www.javaworld.com/community/node/2213" target="_blank">got a bit of notice here a year ago when it came out</a>, mostly in the context of its lightweightness.  The server is based on Tomcat, and just as the Spring Framework is supposed to sort of be like Java EE, but without all the annoying heavyweight crud that makes Java EE living hell to work with, so too is tc Server supposed to be like a Java EE app server, except without all the annoying heavyweight crud that makes Java EE servers living hell to work with.  The only catch, from SpringSource's point of view, is that the two servers, though they had similar goals, had no particular specific relationship to each other.  Now, soehwat more than a year later, that's been fixed, with the <a href="http://java.dzone.com/articles/springsource-announces-tc" target="_blank">release of tc Server Spring Edition</a>. The new server includes monitoring features that help you watch the inner workings of your Spring apps while they're doing whatever it is that you've set them to do.</p>

<p>Now that tc Server is finally directly relevant to SpringSource's flagship product, it's time to link it to the company's current parent, VMware!  According to <em>The Register,</em> SpringSource VP of product management Shaun Connolly says that the company intends to <a href="http://www.theregister.co.uk/2010/03/10/springsource_tc_server_update/" target="_blank">deepen the relationship with the underlying hypervisor</a>," which will ... make it work better on a virtual machine, I suppose?  The always skeptical <em>Register</em> commenters <a href="http://forums.theregister.co.uk/forum/1/2010/03/10/springsource_tc_server_update/#c_713385" target="_blank">are skeptical</a>.  Still, it fits in with the companys plan to <a href="http://searchservervirtualization.techtarget.com/news/article/0,289142,sid94_gci1417156,00.html" target="_blank">package tc Server with various VMware virtualization products</a>.    ]]></content>
  </entry>
  <entry>
    <title>Actor style messaging and honey do lists</title>
    <link rel="alternate" type="text/html" href="http://www.javaworld.com/community/node/4139" />
    <id>http://www.javaworld.com/community/node/4139</id>
    <published>2010-03-10T10:56:44-05:00</published>
    <updated>2010-03-11T15:00:12-05:00</updated>
    <author>
      <name>Andrew Glover</name>
    </author>
    <category term="Andy" />
    <category term="concurrency" />
    <category term="java" />
    <category term="kilim" />
    <category term="multicore" />
    <category term="open source" />
    <category term="programming" />
    <category term="scala" />
    <category term="Software Development" />
    <summary type="html"><![CDATA[<!--paging_filter--><p>As I previously mentioned in &#8220;<a href="http://thediscoblog.com/2010/03/03/free-lunches-mousetraps-and-the-actor-model/">Free lunches, mousetraps and the Actor model</a>&#8220;, Edward A.</p>
    ]]></summary>
    <content type="html"><![CDATA[<!--paging_filter--><p>As I previously mentioned in &#8220;<a href="http://thediscoblog.com/2010/03/03/free-lunches-mousetraps-and-the-actor-model/">Free lunches, mousetraps and the Actor model</a>&#8220;, Edward A. Lee wrote an interesting article entitled &#8220;<a href="http://www.eecs.berkeley.edu/Pubs/TechRpts/2006/EECS-2006-1.pdf">The Problem with Threads</a>&#8221; in which he advocates leveraging the actor model in popular languages (such as in Java) as opposed to adopting an entire new paradigm (like <a href="http://thediscoblog.com/2008/10/19/book-review-programming-erlang/">Erlang</a>). He states:</p>
<p>We should not replace established languages. We should instead build on them.</p>
<p>It appears that more than a few hip people agree with his line of thinking. It turns out there are quite a few options available for leveraging the actor model in Java. That is, aside from alternative languages like <a href="http://thediscoblog.com/2009/12/10/book-review-programming-scala/">Scala</a>, which supports actors and <a href="http://gpars.codehaus.org/">Groovy with GPars</a>, there&#8217;s framework&#8217;s like <a href="http://www.malhar.net/sriram/kilim/">Kilim</a>, <a href="http://osl.cs.uiuc.edu/af/">ActorFoundry</a>, <a href="http://actorsguildframework.org/">Actors Guild</a>, and <a href="http://code.google.com/p/jetlang/">jetlang</a>.  </p>
<p>I ended up employing Kilim at a client side over a year ago to replace a thread based computational model. At the time, GPars was in its early stages and I was specifically looking for a speed up in application performance. The multi-threaded application was taking roughly 5 hours to complete.  </p>
<p>In the end, the speed up attributed to Kilim (or indirectly leveraging its actor model) was hardly noticeable (some aspects of <a href="http://www.infoq.com/news/2008/06/kilim-message-passing-in-java">Kilim</a> were noticeably faster though &#8212; such as spawning a task was quite fast as opposed to spawning a normal threads) as the real performance gain was leveraged by reducing and improving database queries (as usual, performance issues were essentially IO bound); nevertheless, the prime benefit of Kilim, which at the time I had overlooked, was the notion of a mailbox. That is, in the actor model, processes can share data more safely. </p>
<p>There are quite a few different implementations and ways to facilitate message passing in various languages and platforms, but to me, the actor model&#8217;s mailbox notion is quite intuitive. In <a href="http://java.dzone.com/articles/java-actors-with-kilim">Kilim&#8217;s actor model</a>, messages are passed between processes via a <code>Mailbox</code> &#8212; in many ways, you can think of it as a queue. Processes can put items into a mailbox and also pull items from a mailbox in both a blocking and non-blocking manner (blocking of the underlying process not a thread). </p>
<p>As an example of leveraging mailboxes in Kilim, I wrote two actors (a <code>Husband</code> and a <code>Wife</code>) that extend from Kilim&#8217;s <code>Task</code> type. Previous versions of Kilim had an <code>Actor</code> type; however, as of version 0.6, <code>Task</code> is the way to go. </p>
<p>import kilim.Mailbox;<br />
import kilim.Pausable;<br />
import kilim.Task;</p>
<p>public class Husband extends Task {<br />
 private Mailbox&lt;Message&gt; mailbox;</p>
<p> public Husband(Mailbox&lt;Message&gt; mailbox) {<br />
  super();<br />
  this.mailbox = mailbox;<br />
 }</p>
<p> @Override<br />
 public void execute() throws Pausable, Exception {<br />
  while (true) {<br />
   System.out.println(&quot;Husband listening...&quot;);<br />
   Message msg = mailbox.get(); // blocks<br />
   if (msg.getReceipient() == Message.HUSBAND) {<br />
    System.out.println(&quot;Husband hears: &quot; + msg.getMessage());<br />
    Message reply = new Message(Message.WIFE, &quot;Yes, dear&quot;);<br />
    mailbox.putnb(reply);<br />
   }<br />
   Task.sleep(1000);<br />
  }<br />
 }<br />
}</p>
<p>Under the covers, Kilim works by weaving bytecode so as to control <code>Task</code> types and facilitate their safe interaction &#8212; specifically, Kilim&#8217;s weaver is looking for methods that throw the <code>Pausable</code> type (previous versions used the <code>@Pausable</code> annotation). </p>
<p>In the <code>Husband</code> class, a few things are going on &#8212; first, the instance waits for a message from a shared mailbox. In this case, I used a blocking <code>get</code> call (as in reality, a husband really doesn&#8217;t do anything else but waits for orders (I mean requests) from his wife). When a message is picked up, the instance checks to see if it was intended for it (in many cases, wife instances can communicate with children types sending messages like &#8220;clean your room&#8221; or &#8220;brush your hair&#8221;). </p>
<p>Once a <code>Message</code> type (which, in this case, is not a Kilim type) is determined to be sent to a <code>Husband</code> instance, the <code>Husband</code> type replies appropriately by creating a <code>Message</code> and placing it into the <code>mailbox</code> instance. Finally, the <code>sleep</code> call is just placed to facilitate reading console output. </p>
<p>The <code>Wife</code> class is similar (expect that she doesn&#8217;t wait to listen&#8230;). Like the <code>Husband</code> instance, this class creates a <code>Message</code> (in the form of a Honey Do) and sends it off via the shared <code>MailBox</code>; however, she doesn&#8217;t wait around &#8212; that is, the instance uses the <code>putnb</code> call, which is non-blocking. What&#8217;s more, she&#8217;ll also attempt to see if anything is in the mailbox for her, but in her case, she also uses a non-blocking call (<code>getnb</code>) like so:</p>
<p>import kilim.Mailbox;<br />
import kilim.Pausable;<br />
import kilim.Task;</p>
<p>public class Wife extends Task {</p>
<p> private Mailbox&lt;Message&gt; mailbox;</p>
<p> public Wife(Mailbox&lt;Message&gt; mailbox) {<br />
  super();<br />
  this.mailbox = mailbox;<br />
 }</p>
<p> @Override<br />
 public void execute() throws Pausable, Exception {<br />
  while (true) {<br />
   Message request = new Message(Message.HUSBAND,<br />
    &quot;Please do x, y, and z today, husband.&quot;);</p>
<p>   mailbox.putnb(request);<br />
   Task.sleep(1000);<br />
   Message msg = mailbox.getnb(); // no block</p>
<p>   if (msg != null &amp;&amp; msg.getReceipient() == Message.WIFE) {<br />
    System.out.println(&quot;Wife hears: &quot; + msg.getMessage());<br />
   }<br />
  }<br />
 }<br />
}</p>
<p>As you can see, if there is a message waiting for her, she&#8217;ll hear it, otherwise, she moves on and requests her husband to do something else.</p>
<p>Lastly, everything is coordinated by a simple driver class containing a <code>main</code> method like so:</p>
<p>import kilim.Mailbox;<br />
import kilim.Task;</p>
<p>public class HoneyDo {</p>
<p> public static void main(String[] args) {</p>
<p>  Mailbox&lt;Message&gt; sharedMailbox = new Mailbox&lt;Message&gt;();</p>
<p>  Task wife = new Wife(sharedMailbox);<br />
  Task husband = new Husband(sharedMailbox);</p>
<p>  husband.start();<br />
  wife.start();<br />
 }<br />
}</p>
<p>Note how a <code>Mailbox</code> instance is created for my custom <code>Message</code> type; what&#8217;s more, the <code>sharedMailbox</code> is then shared between both the <code>wife</code> and <code>husband</code> instances. Lastly, things are started via the <code>start</code> method. </p>
<p>Running this hip example yields the following output (remember, your exact output will most likely look different; however, the logic sequence of activities will line up. That is, the wife requests things be done and the husband responds with &#8220;yes, dear&#8221;, which the wife hears). </p>
<p> Husband listening...<br />
 Husband hears: Please do x, y, and z today, husband.<br />
 Husband says: Yes, dear<br />
 Husband listening...<br />
 Wife hears: Yes, dear<br />
 Husband hears: Please do x, y, and z today, husband.<br />
 Husband says: Yes, dear<br />
 Husband listening...<br />
 Wife hears: Yes, dear<br />
 Husband hears: Please do x, y, and z today, husband.<br />
 Husband says: Yes, dear<br />
 Wife hears: Yes, dear<br />
 Husband listening...<br />
 Husband hears: Please do x, y, and z today, husband.<br />
 Husband says: Yes, dear<br />
 Husband listening...<br />
 Wife hears: Yes, dear<br />
 Husband hears: Please do x, y, and z today, husband.<br />
 Husband says: Yes, dear<br />
 Wife hears: Yes, dear<br />
 Husband listening...<br />
 Husband hears: Please do x, y, and z today, husband.<br />
 Husband says: Yes, dear</p>
<p>The actor model facilitates <a href="http://thediscoblog.com/2008/10/19/poll-which-language-is-better-suited-for-jvm-concurrency/">concurrent programming</a> by allowing a safer mechanism for message passing between processes (or actors). Implementations of this model vary between languages and frameworks &#8212; I suggest checking out <a href="http://thediscoblog.com/2008/10/19/book-review-programming-erlang/">Erlang</a>&#8217;s actors followed by <a href="http://thediscoblog.com/2009/12/10/book-review-programming-scala/">Scala</a>&#8217;s as each implementation is quite neat given their respective syntax. </p>
<p>In the end, if you want to leverage plain Jane Java <a href="http://en.wikipedia.org/wiki/Actor_model">actors</a>, then have a look at <a href="http://www.malhar.net/sriram/kilim/">Kilim</a> (or one of the other frameworks available)  &#8212; just make sure you&#8217;ve finished your honey do list first, man.</p>
<p>Looking to spin up Continuous Integration <em>quickly</em>? Check out <a href="http://www.ciinabox.com">www.ciinabox.com</a>.</p>
    ]]></content>
  </entry>
  <entry>
    <title>Inside the Web</title>
    <link rel="alternate" type="text/html" href="http://www.javaworld.com/community/node/4137" />
    <id>http://www.javaworld.com/community/node/4137</id>
    <published>2010-03-09T12:34:57-05:00</published>
    <updated>2010-03-09T13:00:16-05:00</updated>
    <author>
      <name>Chris Oliver</name>
    </author>
    <category term="/JavaFX" />
    <category term="chrisoliver" />
    <summary type="html"><![CDATA[<!--paging_filter-->    ]]></summary>
    <content type="html"><![CDATA[<!--paging_filter-->    ]]></content>
  </entry>
  <entry>
    <title>Oracle CHR Function</title>
    <link rel="alternate" type="text/html" href="http://www.javaworld.com/community/node/4135" />
    <id>http://www.javaworld.com/community/node/4135</id>
    <published>2010-03-09T01:45:00-05:00</published>
    <updated>2010-03-18T00:00:48-04:00</updated>
    <author>
      <name>dmarx</name>
    </author>
    <category term="Dustin" />
    <category term="Oracle" />
    <summary type="html"><![CDATA[<!--paging_filter--><p>One of the presentations I enjoyed at <a href="http://rmoug.org/">Rocky Mountain Oracle Users Group</a> (RMOUG) Training Days 2010 was Stephen Jackson's presentation "Using SQL to Generate SQL."  I have used some of the techniques he discussed in his presentation to have SQL generate SQL, but one thing I had not thought of doing was to use the <a href="http://www.techonthenet.com/oracle/functions/chr.php">CHR function</a> to make scripts more readable.</p>
    ]]></summary>
    <content type="html"><![CDATA[<!--paging_filter--><p>One of the presentations I enjoyed at <a href="http://rmoug.org/">Rocky Mountain Oracle Users Group</a> (RMOUG) Training Days 2010 was Stephen Jackson's presentation "Using SQL to Generate SQL."  I have used some of the techniques he discussed in his presentation to have SQL generate SQL, but one thing I had not thought of doing was to use the <a href="http://www.techonthenet.com/oracle/functions/chr.php">CHR function</a> to make scripts more readable.  Although this post focuses on using Oracle's CHR <a href="http://www.oradev.com/oracle_string_functions.jsp">string function</a> implementation, <a href="http://www.coderecipes.net/sql-char-chr-function.aspx">other databases support the CHR (or CHAR) function</a> as well.</p>
<p>One example of the usefulness of CHR is in the creating of results that include characters that are significant in the query itself.  Using CHR appropriately allows the SQL developer to avoid the need to escape these characters with query syntax significance.  For example, to print the last names of employees in Oracle's <a href="http://marxsoftware.blogspot.com/2008/01/oracle-database-sample-schemas.html">HR sample schema</a> with single quotes surrounding the last names, one could write a query like this:</p>
<p>select '''' || last_name || '''' from employees;</p>
<p>The four single quotes successfully escape the quote mark both before and after the last name.  Unfortunately, it can become easy to get lost in the quotes, especially for more complex queries.  Because the ASCII decimal code of 39 produces a single quote when passed to CHR, the expression <code>CHR(39)</code> can be used instead as shown next:</p>
<p>select CHR(39) || last_name || CHR(39) from employees; </p>
<p>For me, this is more readable.  Similarly, even more difficult characters can be represented with the CHR function.  For example, Stephen pointed out in his presentation that CHR(10) can be used to have a new line printed in the output.</p>
<p>One of the interesting ideas that Stephen discussed was use of a simple script to display the various character representations available via the CHR function. One can always reference a resource like <a href="http://www.techonthenet.com/ascii/chart.php">Tech on the Net's ASCII Chart</a> or <a href="http://www.asciitable.com/">asciitable.com</a>, but it is interesting to simply display the representations via code:</p>
<p>-- displayCHR.sql<br />--<br />-- Display the characters associated with basic and extended ASCII codes.<br />--<br />SET head off<br />SET pagesize 0<br />SET linesize 120<br />SET trimspool on<br />SET feedback off<br />SET verify off</p>
<p>SET serveroutput on size 5000<br />BEGIN<br />   FOR i IN 32..255 loop<br />      Dbms_output.put_line(i || ' ' || chr(i));<br />   END loop;<br />END;<br />/</p>
<p>The above snippet of code, when executed in <a href="http://www.oracle.com/technology/tech/sql_plus/index.html">SQL*Plus</a>, will display a large number of the characters available in the basic and extended ASCII character set.  One can use the spool command to spool the output to a file.  On my Windows-based machine, I was even able to view these generated symbols in the spooled output file using the basic Notepad application.</p>
<p><strong>Conclusion</strong></p>
<p>As Stephen pointed out in his presentation, the CHR function can make SQL*Plus scripts more readable and maintainable.</p>
    ]]></content>
  </entry>
  <entry>
    <title>Paul Murphy predicts Java&#039;s long-term obsolescence</title>
    <link rel="alternate" type="text/html" href="http://www.javaworld.com/community/node/4134" />
    <id>http://www.javaworld.com/community/node/4134</id>
    <published>2010-03-08T19:43:12-05:00</published>
    <updated>2010-03-08T19:43:12-05:00</updated>
    <author>
      <name>Josh Fruhlinger</name>
    </author>
    <category term="Java EE" />
    <category term="open source" />
    <summary type="html"><![CDATA[<!--paging_filter--><p>Paul Murphy's one of those tech writers who's been around the industry forever, and while I don't always agree with him, I do find a lot of what he says thought-provoking.  On Saturday he posted <a href="http://blogs.zdnet.com/Murphy/?p=1784" target="_blank">an interesting and kind of grim take on Java's place in the software ecosystem</a>.  If I can sum it up quickly, it goes something like this: Java's greatest advantage, historically, was that its virtual machine shielded developers from the irritating shifts at the OS level, mostly from Microsoft.    ]]></summary>
    <content type="html"><![CDATA[<!--paging_filter--><p>Paul Murphy's one of those tech writers who's been around the industry forever, and while I don't always agree with him, I do find a lot of what he says thought-provoking.  On Saturday he posted <a href="http://blogs.zdnet.com/Murphy/?p=1784" target="_blank">an interesting and kind of grim take on Java's place in the software ecosystem</a>.  If I can sum it up quickly, it goes something like this: Java's greatest advantage, historically, was that its virtual machine shielded developers from the irritating shifts at the OS level, mostly from Microsoft.  The original aim was to realize this advantage on the desktop, in practice that happened almost entirely on the server.  Java became so good at that, in fact, that it survived despite being "an almost perfect reflection of the problem it set out to solve in the form of the most absurdly over complicated and generally unmanageable code metastasis outside Microsoft’s own Windows source."</p>

<p>Murphy's argument is that Oracle's long-term plans as stated will tend to devalue Java -- not because they hold specific malice towards the platform, but because, as they work to standardize and improve the OS/hardware combo they're acquired, that layer of abstraction becomes less and less necessary.  Personally, it's not that convincing to me -- I think Java as an ecosystem (both of programming skills and available code modules) has become to pervasive for there to be some kind of headlong rush back to C even on Oracle's perfectly tuned appliances -- but it's an interesting look at what exactly Java is good for from someone outside the community.</p>

<p>Speaking of provocative things posted on ZDNet, last week also so an <a href="http://blogs.zdnet.com/BTL/?p=31418" target="_blank">interesting piece from Jeremy Allison</a> (of SAMBA fame) on Sun's (ultimately bad) attitude towards open source.  Most of what he discusses is his personal experience with Linux kernel hacking for SPARC, but much of the same vibe might be attached to the company's schizophrenic, yes-we-will-no-we-won't-OK-we'll-do-it-in-this-convoluted-way road to open sourcing Java.</p>    ]]></content>
  </entry>
  <entry>
    <title>Why and how to use Jetty in mission-critical production</title>
    <link rel="alternate" type="text/html" href="http://www.javaworld.com/community/node/4133" />
    <id>http://www.javaworld.com/community/node/4133</id>
    <published>2010-03-08T19:00:41-05:00</published>
    <updated>2010-03-08T19:00:41-05:00</updated>
    <author>
      <name>jhannes</name>
    </author>
    <category term="English" />
    <category term="java" />
    <category term="Meeting Summary" />
    <summary type="html"><![CDATA[<!--paging_filter--><p>This article is a summary of a seminar I had on the topic. If it seems like it&#8217;s a continuation of an existing discussion that&#8217;s because, to some extent, it is. If you haven&#8217;t been discussing exchanging your app server, this article probably isn&#8217;t very interesting to you.</p>
<p>By putting the application server inside my application instead of the other way around, I was able to leap tall buildings in a single bound.</p>
    ]]></summary>
    <content type="html"><![CDATA[<!--paging_filter--><p>This article is a summary of a seminar I had on the topic. If it seems like it&#8217;s a continuation of an existing discussion that&#8217;s because, to some extent, it is. If you haven&#8217;t been discussing exchanging your app server, this article probably isn&#8217;t very interesting to you.</p>
<p>By putting the application server inside my application instead of the other way around, I was able to leap tall buildings in a single bound.</p>
<p>The embedded application server</p>
<p>This is how I deploy <a href="http://svn.brodwall.com/demo/embedded-container/">my sample application</a> to a new test environment (or to production):</p>
<ol>
<li>mvn install</li>
<li>scp -server/target/-1.0.onejar.jar appuser@appserver:/home/appuser/test-env1/</li>
<li>ssh appuser@appserver &#8220;cd /home/appuser/test-env1/ &#038;&#038; java -jar -1.0.onejar.jar&#038;&#8221;</li>
</ol>
<p>This require no prior installed software on the appserver (with the exception of the JVM). It requires no prior configuration. Rolling back is a matter of replacing one jar-file with another. Clustering is a matter of deploying the same application several times.</p>
<p>In order to make this work in a real environment, there are a many details you as a developer need to take care of. As a matter of fact, you will have to take responsibility for your operational environment. The good news is that creating a good operational environment is not more time-consuming than trying to cope with the feed and care of a big-a Application Server.</p>
<p>In this scheme every application comes with its own application server in the form of jetty&#8217;s jar-files embedded in the deployed jar-file.</p>
<p>The advantages</p>
<p>Why would you want to do something like this?</p>
<ul>
<li><strong>Independent application</strong>: If you&#8217;ve ever been told that you can&#8217;t use Java 1.5 because that would require an upgrade of the application server. And if we upgrade the application server, that could affect someone else adversely. So we need to start a huge undertaking to find out who could possibly be affected.</li>
<li><strong>Developer managed libraries</strong>: Similar problems can occur with libraries. Especially those that come with the application server. For example: Oracle OC4J helpfully places a preview version of JPA 1.0 first in your classpath. If you want to use Hibernate with JPA 1.0-FINAL, it will mostly work. Until you try to use a annotation that was changed after the preview version (@Discriminator, for example). The general rule is: <em>If an API comes with your app server, you&#8217;re better served by staying away from it.</em> A rather bizarre state of affairs.</li>
<li><strong>Deployment, configuration and upgrades</strong>: Each version of the application, including all its dependencies is packaged into a single jar-file that can be deployed on several application server, or several times on the same application server (with different ports). The configuration is read from a properties-file in the current working directory. On the minus side, there&#8217;s no fancy web UI where you can step through a wizard to deploy the application or change the configuration. On the plus side, there is no fancy web UI &#8230;. If you&#8217;ve used one such web UI, you know what I mean.</li>
<li><strong>Continuous deployment</strong>: As your maven-repository will contain stand alone applications, creating a continuous deployment scheme is very easy. In my previous environment, a cron job running wget periodically was all that was needed to connect the dots. Having each server environment PULL the latest version gives a bit more flexibility if you want many test environments. (However, if you&#8217;re doing automated PUSH deployment, it&#8217;s probably just as practical for you).</li>
<li><strong>Same code in test and production</strong>: The fact that you can <a href="http://svn.brodwall.com/demo/embedded-container/embedded-container-web/src/test/java/no/steria/embeddedcontainer/web/HelloWebTest.java">start Jetty inside a plain old JUnit test</a> means that it is ideal for taking your automated tests one step further. However, if you test with Jetty and deploy on a different Application Server, the difference will occasionally trip you. It&#8217;s not a big deal. You have to test in the server environment anyway. But why not eliminate the extra source of pain if you can?</li>
<li><strong>Licenses</strong>: Sure, you can afford to pay a few million $ for an application server. You probably don&#8217;t have any better use for that money, anyway, right? However, if you have to pay licenses for each test-server in addition, it will probably mean that you will test less. We don&#8217;t want that.</li>
<li><strong>Operations</strong>: In my experience, operations people don&#8217;t like to mess around with the internals of an Application Server. An executable jar file plus a script that can be run with [start|status|stop] may be a much better match.</li>
</ul>
<p>The missing bits</p>
<p>Taking control of the application server takes away a lot of complex technology. This simplifies and makes a lot of stuff cheaper. It also puts you back in control of the environment. However, it forces you to think about some things that might&#8217;ve been solved for you before:</p>
<ul>
<li><strong>Monitoring</strong>: The first step of monitoring is simple: Just make sure you write to a log file that is being monitored by your operations department. The second step requires some work: Create a servlet (or a Jetty Handler) that a monitoring tool can ping to check that everything is okay. Taking control of this means that you can improve it: Check if your data sources can connect, if your file share is visible, if that service answers. Maybe add application-calibrated load reporting. Beyond that, Jetty has good JMX support, but I&#8217;ve never needed it myself.</li>
<li><strong>Load balancing</strong>: My setup supports no load balancing or failover out of the box. However, this is normally something that the web server or routers in front of the application server anyway. You might want to look into <a href="http://docs.codehaus.org/display/JETTY/Configuring+mod_proxy">Jetty&#8217;s options for session affinity</a>, if you need that.</li>
<li><strong>Security</strong>: Jetty supports JAAS, of course. Also: In all the environments I&#8217;ve been working with (CA SiteMinder, Sun OpenSSO, Oracle SSO), the SSO server sends the user name of the currently logged in user as an HTTP header. You can get far by just using that.</li>
<li><strong>Consistency</strong>: If you deploy more than one application as an embedded application server, the file structure used by an application (if any) should be standardized. As should the commands to start and stop the application. And the location of logs. Beyond that, reuse what you like, recreate what you don&#8217;t.</li>
</ul>
<p>Taking control of your destiny</p>
<p>Using an embedded application server means using the application server as a library instead of a framework. It means taking control of your &#8220;main&#8221; method. There&#8217;s a surprisingly small number of things you need to work out yourself. In exchange, you get the control to do many things that are impossible with a big-A Application Server.</p>
<p><em>Thanks to Dicksen, Eivind, Terje, Kristian and Kristian for a fun discussion on Jetty as a production app server</em></p>
    ]]></content>
  </entry>
  <entry>
    <title>ESDC 2010 resources</title>
    <link rel="alternate" type="text/html" href="http://www.javaworld.com/community/node/4132" />
    <id>http://www.javaworld.com/community/node/4132</id>
    <published>2010-03-08T13:48:39-05:00</published>
    <updated>2010-03-11T15:00:13-05:00</updated>
    <author>
      <name>Andrew Glover</name>
    </author>
    <category term="agile" />
    <category term="amazon" />
    <category term="Andy" />
    <category term="bdd" />
    <category term="cloud" />
    <category term="Cloud Computing" />
    <category term="Developer Testing" />
    <category term="development 2.0" />
    <category term="dsl" />
    <category term="easyb" />
    <category term="ec2" />
    <category term="gae" />
    <category term="gaelyk" />
    <category term="Google" />
    <category term="grails" />
    <category term="groovy" />
    <category term="java" />
    <category term="open source" />
    <category term="programming" />
    <category term="rest" />
    <category term="software as a service" />
    <category term="Software Development" />
    <category term="TDD" />
    <category term="testing" />
    <summary type="html"><![CDATA[<!--paging_filter--><p>I recently had the opportunity to present four different talks at the <a href="http://thediscoblog.com/2010/01/19/development-2-0-concepts-at-esdc/">Enterprise Software Development Conference</a> (or ESDC) in San Mateo, California. In an effort to provide additional data points and information, I created individual resource pages for each talk. These pages (hosted at my company&#8217;s site &#8212; <a href="http://beacon50.com/">beacon50.com</a>) provide links to articles, blog entries, tutorials, and a copy of each presentation.</p>
    ]]></summary>
    <content type="html"><![CDATA[<!--paging_filter--><p>I recently had the opportunity to present four different talks at the <a href="http://thediscoblog.com/2010/01/19/development-2-0-concepts-at-esdc/">Enterprise Software Development Conference</a> (or ESDC) in San Mateo, California. In an effort to provide additional data points and information, I created individual resource pages for each talk. These pages (hosted at my company&#8217;s site &#8212; <a href="http://beacon50.com/">beacon50.com</a>) provide links to articles, blog entries, tutorials, and a copy of each presentation. If you&#8217;re curious to see what you missed at ESDC, then have a look, man:</p>
<ul>
<li><a href="http://beacon50.com/resources/esdc/gtrench.html">Resources for Groovy from the trenches</a></li>
<li><a href="http://beacon50.com/resources/esdc/easyb.html">Resources for Easy BDD with easyb</a></li>
<li><a href="http://beacon50.com/resources/esdc/cloud.html">Resources for Comparing the cloud: GAE versus EC2</a></li>
<li><a href="http://beacon50.com/resources/esdc/rest.html">Resources for RESTful web services in Grails</a></li>
</ul>
<p>Thanks to everyone who came to ESDC and attended my talks &#8212; I had a great time discussing these topics (and more!) with you! </p>
<p>Looking to spin up Continuous Integration <em>quickly</em>? Check out <a href="http://www.ciinabox.com">www.ciinabox.com</a>.</p>
    ]]></content>
  </entry>
  <entry>
    <title>Correlation Between Typing Speed and Programming Competence</title>
    <link rel="alternate" type="text/html" href="http://www.javaworld.com/community/node/4128" />
    <id>http://www.javaworld.com/community/node/4128</id>
    <published>2010-03-06T22:50:00-05:00</published>
    <updated>2010-03-18T00:00:48-04:00</updated>
    <author>
      <name>dmarx</name>
    </author>
    <category term="Dustin" />
    <category term="General Development" />
    <summary type="html"><![CDATA[<!--paging_filter--><p>A colleague recently asked me, "Have you noticed that the better developers we've worked with are also fast typists?"  I acknowledged that I had noticed relatively quick typing speed to be a common trait of most of the best developers that I know.</p>
    ]]></summary>
    <content type="html"><![CDATA[<!--paging_filter--><p>A colleague recently asked me, "Have you noticed that the better developers we've worked with are also fast typists?"  I acknowledged that I had noticed relatively quick typing speed to be a common trait of most of the best developers that I know.  It also made me think of the <a href="http://www.codinghorror.com/blog/">Jeff Atwood</a> post <a href="http://www.codinghorror.com/blog/2008/11/we-are-typists-first-programmers-second.html">We are Typists First, Programmers Second</a> and the <a href="http://www.blogger.com/profile/14812997485690838920">Steve Yegge</a> post <a href="http://steve-yegge.blogspot.com/2008/09/programmings-dirtiest-little-secret.html">Programming's Dirty Little Secret</a>.</p>
<p>I do know a few exceptions where a particularly talented developer is not even in the top half in terms of typing skills, but it is the rare exception.  The majority of the best developers I've had the good fortune to work with are in the "top half" in terms of typing speed.  I am a strong believer that good software development is much more than just hacking some code.  So, I in this post, I look at the correlation between the ability to type rapidly and the likelihood of being a successful software developer.</p>
<p>It goes without saying that a fast typist is not necessarily a good developer.  I've never seen (other than on television) anyone type faster than my mom.  She had been an administrative assistant (called secretary at the time) for several years.  This experience combined with an obvious knack for the skill had led to her typing 120+ words per minute with few or no mistakes (on typewriters no less).  She was not a software developer.</p>
<p>Although it is true that typing is a big part of the software developer's job, so are many other things such as understanding customer needs, coming up with architectures and designs that feature the most important <a href="http://www.codesqueeze.com/the-7-software-ilities-you-need-to-know/">-ilities</a>, working on teams, knowing language syntax, understanding various third-party products and frameworks, and so forth.  Typing is clearly a big part of most software developers' daily routine, but what makes it seem to be so highly correlated with the most successful software developers?</p>
<p><strong>We Do Well What We Do Often</strong></p>
<p>In many ways, the correlation between typing and software development success is not so as much about faster typing leading to a better developer as it is about faster typing being evidence of countless hours spent with the keyboard writing code.  In other words, it is not necessarily that faster typing makes the developer better or more efficient (though it obviously cannot hurt) as it is that the great developer is a fast typist simple because that developer has spent so much time coding (and learning to be a better typing as a pure side effect of those many hours).  One could make the argument that becoming experienced and accomplished in software development makes one a better typist rather than making the argument that being a better typist makes one a better developer.</p>
<p>I have noticed that my fastest typing comes when I type the same thing over and over.  What this means is that I end up being very quick to type things like build commands, database/SQL commands, application server administrative and deployment commands, configuration management commands, and the like.  The things I do everyday are the things I do most quickly.</p>
<p><strong>Efficient Typing Allows Time for Other Things</strong></p>
<p>One advantage that faster typists have compared to developers with lesser typing skills is that less time spent typing in characters means more time doing the many other things that good software developers do: scripting routine tasks, <a href="http://en.wikipedia.org/wiki/Software_testing">writing and running tests</a>, <a href="http://www.techscribe.co.uk/ta/how-to-write-user-documentation.htm">documenting for users</a> and <a href="http://en.wikipedia.org/wiki/Software_maintenance">maintainers</a>, <a href="http://www.philosophicalgeek.com/2008/04/01/10-ways-to-learn-new-things-in-development/">learning new things</a>, <a href="http://www.businessknowhow.com/internet/bizemailet.htm">writing e-mail messages</a>, <a href="http://marxsoftware.blogspot.com/2009/09/more-software-developers-should-write.html">writing blogs</a>, etc.  In an almost recursive fashion, many of these tasks that can have more time dedicated to them because a developer was able to type code more quickly are themselves beneficiaries of better typing skills as well.</p>
<p><strong>Efficiency of Typing can Lead to Perceived Faster Typing</strong></p>
<p>One of the interesting characteristics I've observed in many of the best developers I've worked with is their ability to take advantage of many different key strokes, macros, and other devices to accomplish the same task more quickly.  Although just about every developer I work with these days uses an IDE, it wasn't all that long ago when certain developers could make the (truthful) argument that they could write and develop code more quickly in their simple text editor than most developers around them could with the IDE.</p>
<p>For the smallest of projects, I still find myself sometimes <a href="http://marxsoftware.blogspot.com/2009/08/faithful-old-development-tools.html">using these simple tools</a> when the IDEs or other more advanced tools just feel unnecessarily heavy.  I have amazed some people around me with my perceived <a href="http://www.eng.hawaii.edu/Tutor/vi.html">vi</a> prowess, but what they don't realize is that I'm really an amateur compared to some of the <a href="http://en.wikipedia.org/wiki/Vi">vi</a> skills I have seen others possess.  When these developers combine a powerful IDE with a <a href="http://blogs.sun.com/katakai/entry/netbeans_vi_editor_module1">vi emulator</a>, it can be dizzying trying to watch them in action.</p>
<p>Some of the fastest developers I have worked with complement their own typing speed with knowledge of and familiarity with their favorite tools.  This is often seen in the world of IDEs where a developer who knows the IDE well can take advantage of all types of different features to developer more quickly and accurately.</p>
<p><strong>Fast Typing is an Inherent Advantage in Some Aspects of Software Development</strong></p>
<p>Although it can be argued (as I did above) that fast typing is a side effect or consequence of years of inadvertently practicing typing while writing code, there is no question that some areas of software development are prone to benefit from faster typing.  It is obvious that a fast typist has advantage when getting his or her thoughts into code, though I have seen that advantage at least partially mitigated by IDE code completion and other features.</p>
<p>Writing original code is an obvious area where faster typing is an advantage.  Faster typing is also an advantage, however, for the person doing refactoring outside that supported well by the IDE.  Faster typing might make a developer less concerned about having enough time to write that one last test he or she feels would be nice to have.</p>
<p><strong>Typing is Not Writing</strong></p>
<p>One of the areas where the correlation between fast typist and great developer breaks down most is when typing without creativity is considered.  Developers' typing is more like authors' and reporters' typing and less like administrative assistants' typing and <a href="http://en.wikipedia.org/wiki/Stenotype">stenotyping</a>.   By this, I mean that a developer typically must insert his or her own creativity and thought into what he or she is typing.  Rarely is the developer asked to simply type up some <a href="http://en.wikipedia.org/wiki/Pseudocode">pseudocode</a> or other previously dictated implementation.  What this can mean is that the raw speed of typing may be not quite as important as it would be if typing up what someone else was saying or writing because some time is spent in that thinking.</p>
<p><strong>Conclusion</strong></p>
<p>It's not all that surprising that, at least in my experience, that the better developers generally tend to be faster typists.  The correlation between productive developer and typing skills seems to enjoy somewhat of a causal relationship from both sides.  Being a better developer as a result of years spent toiling over a keyboard writing code cannot help but make one more efficient with the keyboard.  From the other perspective, faster typing skills help a developer to get more done in the same amount of time.  As with just about everything in life and especially in software development, there are exceptions.  I do know of some really good developers who are probably not in the top half of typist abilities, but they are the exception.  Most of the best developers I know are also better than average typists.  The good news is that developers can practice both at the same time.  As one writes code, one also practices typing.</p>
<p><strong>Additional References</strong></p>
<p>&#8658; <a href="http://steve-yegge.blogspot.com/2008/09/programmings-dirtiest-little-secret.html">Programming's Dirty Little Secret</a></p>
<p>&#8658; <a href="http://www.codinghorror.com/blog/2008/11/we-are-typists-first-programmers-second.html">We Are Typists First, Programmers Second</a></p>
<p>&#8658; <a href="http://stochasticresonance.wordpress.com/2009/11/20/speed-chess/">Speed Chess</a></p>
<p>&#8658; Stack Overflow: <a href="http://stackoverflow.com/questions/31757/should-programmers-be-excellent-typists">Should Programmers Be Excellent Typists?</a></p>
    ]]></content>
  </entry>
  <entry>
    <title>hmm... PowerDesigner</title>
    <link rel="alternate" type="text/html" href="http://www.javaworld.com/community/node/4126" />
    <id>http://www.javaworld.com/community/node/4126</id>
    <published>2010-03-05T15:30:38-05:00</published>
    <updated>2010-03-05T15:30:38-05:00</updated>
    <author>
      <name>Oleg Mikheev</name>
    </author>
    <category term="DDD" />
    <category term="Hibernate" />
    <category term="ORM" />
    <category term="PowerDesigner" />
    <summary type="html"><![CDATA[<!--paging_filter--><p>Today I'm going to blog about closed-source paid software.</p>
<p>Most DBA guys that I knew considered PowerDesigner one of the best tools for database design. Being not a very DB guy I got curious about whether it could be of any help to me.</p>
<p>I've downloaded a trial PowerDesigner 15 to give it a try.</p>
<p>Imagine my surprise when I observed a very good quality support for Hibernate. It seem like PowerDesigner can do all sorts of data transformations and mappings from/to any model. Including mapping data from DB to XML, and of course mapping between physical/conceptual DB and Hibernate.</p>
    ]]></summary>
    <content type="html"><![CDATA[<!--paging_filter--><p>Today I'm going to blog about closed-source paid software.</p>
<p>Most DBA guys that I knew considered PowerDesigner one of the best tools for database design. Being not a very DB guy I got curious about whether it could be of any help to me.</p>
<p>I've downloaded a trial PowerDesigner 15 to give it a try.</p>
<p>Imagine my surprise when I observed a very good quality support for Hibernate. It seem like PowerDesigner can do all sorts of data transformations and mappings from/to any model. Including mapping data from DB to XML, and of course mapping between physical/conceptual DB and Hibernate.</p>
<p>PowerDesigner was capable of generating Hibernate Object-Oriented model from the database schema and construct mappings table. It was capable of recognizing reference tables -- they get imported as references (connections) between OO entities.</p>
<p>Then the two models stay connected which means that any change to OO model can be propagated to physical model level and vise-versa.</p>
<p>So basically it makes it possible to follow DDD and to fine-tune the resulting DB physical model in the best possible way.</p>
<p>I've seen lots of tools that tried to do ORM mappings, but none of them was even close to what I've seen in PowerDesigner. Tools like NetBeans or Idea just not about database design, the best they can do is to generate some sort of Hibernate code from a database, then do code assistance. They are just not about design, however they simplify Java developer life a lot.</p>
<p>Of course there is so much more than just ORM capabilities, most notably UML, but that's not too rare in current market.</p>
<p>If I had spare $3,000 I would definitely spend it on PowerDesigner :)</p>
    ]]></content>
  </entry>
  <entry>
    <title>OSGi plugs along</title>
    <link rel="alternate" type="text/html" href="http://www.javaworld.com/community/node/4123" />
    <id>http://www.javaworld.com/community/node/4123</id>
    <published>2010-03-03T10:57:49-05:00</published>
    <updated>2010-03-03T11:52:07-05:00</updated>
    <author>
      <name>Josh Fruhlinger</name>
    </author>
    <category term="OSGi" />
    <summary type="html"><![CDATA[<!--paging_filter--><p>Get it?  Because it's a pun, and it's about pluggable modules, and ... erm.  Anyway, whereas <a href="http://www.infoq.com/news/2007/08/osgi-jsr277-debate" target="_blank">once long ago</a> there was debate over how exactly the OSGi frameworks would end up implemented in the Java language, that debate is more or less settled, and now the benefits are being quietly reaped.  One of the bigger bits of OSGi-related news in the past few months is the <a href="http://java.dzone.com/news/netbeans-69-m1-osgi-support" target="_blank">new support in NetBeans</a>, announced last month.    ]]></summary>
    <content type="html"><![CDATA[<!--paging_filter--><p>Get it?  Because it's a pun, and it's about pluggable modules, and ... erm.  Anyway, whereas <a href="http://www.infoq.com/news/2007/08/osgi-jsr277-debate" target="_blank">once long ago</a> there was debate over how exactly the OSGi frameworks would end up implemented in the Java language, that debate is more or less settled, and now the benefits are being quietly reaped.  One of the bigger bits of OSGi-related news in the past few months is the <a href="http://java.dzone.com/news/netbeans-69-m1-osgi-support" target="_blank">new support in NetBeans</a>, announced last month.  Of course, OSGi has been supported in Eclipse for some time with that IDE's Equinox module -- long enough that <a href="http://java.dzone.com/reviews/osgi-and-equinox-creating" target="_blank">Addison-Wesley now has a book on the subject</a>.</p>

<p>OSGi developer interest is still going strong, with a <a href="http://www.infoq.com/news/2010/03/osgi-devcon" target="_blank">first ever London dev conference</a> last month.  And if you'd like to get up to speed on OSGi yourself, <em>JavaWorld</em> has an excellent <a href="http://www.javaworld.com/javaworld/jw-03-2008/jw-03-osgi1.html" target="_blank">introductory series</a> on the subject. <strong>UPDATE:</strong> Oh, and whaddya know, just after I post <a href="http://osgi.dzone.com/articles/osgi-42-blueprint" target="_blank">IBM announces OSGi integration into one of its WebSphere app server offerings</a>!</p>

<p>Oh, and, hey!  In unrelated news, sometimes the people you blog about read your blog and leave nice and informative comments!  After I put up my <a href="http://www.javaworld.com/community/node/4116" target="_blank">post yesterday about whether features of the Da Vinci Machine would end up in the newly merged HotSpot-JRockit creation</a>, Mark Reinhold was kind enough to stop by and say this:</p>

<p><em>The Da Vinci Machine is a Project in which various ideas for the better support of non-Java languages on the JVM are being explored and prototyped. It's not a separate VM. It's not even a copy of the HotSpot VM, but rather a set of patches against it. It's being developed by some of the very same engineers who work on HotSpot. I expect that some features from the Da Vinci Project will wind up in the SE Platform, and hence in all Java VMs, over time. The most prominent of these is JSR 292, a.k.a. "InvokeDynamic", which is already in JDK 7 (the product) and will be proposed for inclusion in Java SE 7 (the platform). Other features are at an earlier stage of development and require further work.</em></p>

<p>So there you go -- it sounds like the Da Vinci innovations will be percolating out to all JVMs via the Java standard rather than being custom-picked for Oracle's creation.  Good for all of us!</p>    ]]></content>
  </entry>
  <entry>
    <title>Free lunches, mousetraps and the Actor model</title>
    <link rel="alternate" type="text/html" href="http://www.javaworld.com/community/node/4121" />
    <id>http://www.javaworld.com/community/node/4121</id>
    <published>2010-03-02T19:01:25-05:00</published>
    <updated>2010-03-11T15:00:13-05:00</updated>
    <author>
      <name>Andrew Glover</name>
    </author>
    <category term="actor model" />
    <category term="Andy" />
    <category term="concurrency" />
    <category term="erlang" />
    <category term="JVM" />
    <category term="kilim" />
    <category term="multicore" />
    <category term="scala" />
    <category term="Software Development" />
    <summary type="html"><![CDATA[<!--paging_filter--><p>A politician once mused </p>
<p>A free lunch is only found in mousetraps.</p>
    ]]></summary>
    <content type="html"><![CDATA[<!--paging_filter--><p>A politician once mused </p>
<p>A free lunch is only found in mousetraps.</p>
<p>While this quote is amusing, it&#8217;s painfully true. In fact, the whole notion of a free lunch and its consequences was copacetically captured by Herb Sutter in an article entitled &#8220;<a href="http://www.gotw.ca/publications/concurrency-ddj.htm">The Free Lunch is Over: A Fundamental Turn Toward Concurrency in Software</a>&#8221; that was published in <a href="http://www.ddj.com/">Dr Dobb&#8217;s Journal</a> back in 2005. In this well crafted masterpiece, Mr Sutter tore apart the misplaced belief that <a href="http://en.wikipedia.org/wiki/Moore%27s_law">Moore&#8217;s Law</a> would continue to unleash higher and higher CPU clock speeds and thus he predicted an end of the &#8220;free lunch&#8221; that we&#8217;ve had when it comes to increasing the performance of software applications. That is, clock speeds have roughly stabilized around 3GHz &#8212; and they&#8217;ve held there for a few years now. </p>
<p>As Mr. Sutter points out</p>
<p>the growth [in chip speeds speeds] will come mostly in directions that do not take most current applications along for their customary free ride.</p>
<p>Thus, obtaining an appreciable speed up in application performance requires taking advantage of multi-core chip architectures (where Moore&#8217;s Law has been realized). And to do this, of course, Mr. Sutter advocates <a href="http://thediscoblog.com/2008/09/06/concurrency-is-hard-but-does-anyone-care/">concurrent programming</a>:</p>
<p>applications will increasingly need to be concurrent if they want to fully exploit CPU throughput gains</p>
<p>Interestingly, the author concludes with a few points, one of which hits the nail on the head with respect to where the majority of mind share around this subject is focused: </p>
<p>we desperately need a higher-level programming model for concurrency than languages offer today</p>
<p>Indeed, the basic programming model of hip languages like Java is thread based. And while multi-threaded applications aren&#8217;t terribly hard to write &#8212; there are challenging to write correctly. </p>
<p>In a paper published in 2006 by Edward A. Lee entitled &#8220;<a href="http://www.eecs.berkeley.edu/Pubs/TechRpts/2006/EECS-2006-1.pdf">The Problem with Threads</a>&#8220;, the author argues that concurrent programming isn&#8217;t all that hard. In his view, the problem isn&#8217;t with concurrency &#8212; it&#8217;s with the prevailing model: threads. </p>
<p>As he states: </p>
<p>The problem is that we have chosen concurrent abstractions that do not even vaguely resemble the concurrency of the physical world</p>
<p>The author goes on to point out that the inherent non deterministic nature of threads presents a conundrum for developers: </p>
<p>a folk definition of insanity is to do the same thing over and over again and to expect the results to be different. By this definition, we in fact require that programmers of multithreaded systems be insane.</p>
<p>Mr. Lee provides an interesting story regarding the challenges and hidden dangers of concurrent programming. He relates an experience where a multi-threaded application that had a strict code review policy in place along with <a href="http://thediscoblog.com/2008/12/01/code-coverage-coterie-confab/">100% code coverage</a> (note, what type of coverage or how it was obtained wasn&#8217;t disclosed) ran for 4 years without error. Nevertheless, finally the code deadlocked. He goes on to speculate that many </p>
<p>multi-threaded general-purpose applications are, in fact, so full of concurrency bugs that as multi-core architectures become commonplace, these bugs will begin to show up as system failures</p>
<p>As such, Mr. Lee espouses an alternative to threads: <a href="http://en.wikipedia.org/wiki/Actor_model">actors</a>. He&#8217;s quick to note that actor-oriented models aren&#8217;t new, but what he does suggest is interesting. He notes that languages that have actors, such as <a href="http://thediscoblog.com/2008/10/19/book-review-programming-erlang/">Erlang</a>, weren&#8217;t taking root (at the time); thus, he submits:</p>
<p>We should not replace established languages. We should instead build on them.</p>
<p>Fast forward to today. Java the platform isn&#8217;t dead. It&#8217;s thriving with a multitude of alternate JVM languages &#8212; a few of which embed the actor model (namely <a href="http://thediscoblog.com/2009/12/10/book-review-programming-scala/">Scala</a>). What&#8217;s more, libraries written in Java and for Java are available, which enable the actor model (such as <a href="http://www.malhar.net/sriram/kilim/">Kilim</a>). Plus, the Java language itself has started to add more complex features to enable easier concurrent programming. </p>
<p>So what&#8217;s the lesson in all of this? First, the evolutionary instinct to throw more hardware at a performance problem is now extinct. Programs written today will need to be designed with concurrency in mind. Second, doing this with normal threads is challenging at best. A better, more understandable way is via the actor model, which is available in a number of <a href="http://thediscoblog.com/2008/10/19/poll-which-language-is-better-suited-for-jvm-concurrency/">frameworks</a> and <a href="http://thediscoblog.com/2008/10/31/is-scala-or-clojure-poised-for-stardom/">alternate languages</a>. Therefore, learn them today, lest you find yourself snagged by a mousetrap, man.</p>
<p>Looking to spin up Continuous Integration <em>quickly</em>? Check out <a href="http://www.ciinabox.com">www.ciinabox.com</a>.</p>
    ]]></content>
  </entry>
</feed>
