<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" version="2.0">
  <channel>
    <title>SpringOne 2GX</title>
    <link>http://www.springone2gx.com</link>
    <description>SpringOne 2GX</description>
    <item>
      <title>I have moved to a new blog</title>
      <link>http://www.springone2gx.com/blog/matt_taylor/2010/03/i_have_moved_to_a_new_blog</link>
      <description>&lt;p&gt;I am tired of maintaining blog software on my own, so I&amp;#8217;ve created a &lt;a href="http://rhyolight.posterous.com"&gt;new blog here&lt;/a&gt;. This site will stick around indefinitely, but I won&amp;#8217;t be posting here, and I probably won&amp;#8217;t be very responsive to comments.&lt;/p&gt;
&lt;div align="center"&gt;&lt;a href="http://rhyolight.posterous.com" title="link to my new blog"&gt;&lt;img src="http://weblog.dangertree.net/wp-content/uploads/2010/03/posterous.png" alt="posterous" title="posterous" width="612" height="531" class="alignleft size-full wp-image-631" /&gt;&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Fri, 12 Mar 2010 16:46:00 CST</pubDate>
      <guid isPermaLink="true">http://weblog.dangertree.net/?p=630</guid>
      <dc:creator>Matthew Taylor</dc:creator>
    </item>
    <item>
      <title>Open Source Update: jQuery PeriodicalUpdater, TestingLabs, GPars, etc.</title>
      <link>http://www.springone2gx.com/blog/robert_fischer/2010/03/open_source_update_jquery_periodicalupdater_testinglabs_gpars_etc_</link>
      <description>&lt;p&gt;I&amp;#8217;ve done a fair bit of fairly small open source updates recently.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;jQuery PeriodicalUpdater&lt;/code&gt;: The main function now returns a handle that can be used to call &lt;code&gt;stop()&lt;/code&gt;, thereby ignoring any updates that may come back and preventing future updates from being sent.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TestingLabs&lt;/code&gt;: I released TestingLabs 0.4 to work with Grails 1.2.0. Had a bug with versioning under Grails: &lt;a rel="nofollow" target="_blank" href="http://jira.codehaus.org/browse/GRAILSPLUGINS-2023"&gt;More info on JIRA&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Presentations&lt;/code&gt;: I&amp;#8217;m now storing the slides for my presentations on GitHub. They&amp;#8217;re under a Creative Commons License.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ClosureBridge&lt;/code&gt;: This is a tiny library (up on &lt;a rel="nofollow" target="_blank" href="http://repo.smokejumperit.com"&gt;the repo.smokejumperit.com Maven repo&lt;/a&gt;) that provides a link between Groovy&amp;#8217;s Closures and Callable/Runnable/Java code.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Fun with GPars&lt;/code&gt;: A small library where I was experimenting with GPars&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GPars&lt;/code&gt;: Submitted a fix and generally been discussing things with the GPars community (and by that, I mean Vacalv Pech)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See &lt;a rel="nofollow" target="_blank" href="https://github.com/RobertFischer"&gt;my GitHub page&lt;/a&gt; for more info.&lt;/p&gt;
&lt;hr /&gt;
This post was by &lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/author/candide/"&gt;Robert Fischer&lt;/a&gt;, written on March 12, 2010.&lt;br /&gt;
Comment on this post: &lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/os-update-march2010/#respond"&gt;http://enfranchisedmind.com/blog/posts/os-update-march2010/#respond&lt;/a&gt;&lt;br /&gt;
Public Permalink: &lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/os-update-march2010/"&gt;http://enfranchisedmind.com/blog/posts/os-update-march2010/&lt;/a&gt;
&lt;hr /&gt;&lt;a rel="nofollow" target="_blank" href="http://creativecommons.org/licenses/by-sa/3.0/us/"&gt;&lt;img alt="Creative Commons License" style="border-width:0;" src="http://i.creativecommons.org/l/by-sa/3.0/us/88x31.png"/&gt;&lt;/a&gt;&lt;br /&gt;This article was a post on &lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog"&gt;the EnfranchisedMind blog&lt;/a&gt;. &lt;span&gt;EnfranchisedMind Blog&lt;/span&gt; by &lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/"&gt;Robert Fischer, Brian Hurt, and Other Authors&lt;/a&gt; is licensed under a &lt;a rel="nofollow" target="_blank" href="http://creativecommons.org/licenses/by-sa/3.0/us/"&gt;Creative Commons Attribution-Share Alike 3.0 United States License&lt;/a&gt;.&lt;p style="display:none;"&gt;(Digital Fingerprint: bcecb67d74ab248f06f068724220e340 (69.9.45.35) )&lt;/p&gt;</description>
      <pubDate>Fri, 12 Mar 2010 12:28:00 CST</pubDate>
      <guid isPermaLink="true">http://enfranchisedmind.com/blog/?p=2353</guid>
      <dc:creator>Robert Fischer</dc:creator>
    </item>
    <item>
      <title>Open Source Your Project (with Jasig)</title>
      <link>http://www.springone2gx.com/blog/john_lewis/2010/03/open_source_your_project_with_jasig_</link>
      <description>&lt;p&gt;Here is the full screencast from my Jasig 2010 Conference Session on "Open Sourcing Your Project (with Jasig)". Enjoy!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.unicon.net/node/1368"&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Wed, 10 Mar 2010 12:52:00 CST</pubDate>
      <guid isPermaLink="true">1368 at http://www.unicon.net</guid>
      <dc:creator>John Lewis</dc:creator>
    </item>
    <item>
      <title>Actor style messaging and honey do lists</title>
      <link>http://www.springone2gx.com/blog/andrew_glover/2010/03/actor_style_messaging_and_honey_do_lists</link>
      <description>&lt;p&gt;&lt;img style="PADDING-LEFT: 1.0em; PADDING-RIGHT: 0.0em; PADDING-TOP: 0.0em; FLOAT: RIGHT; PADDING-BOTTOM: 0.0em" src="http://thediscoblog.com/images/2010/housewife.jpg" alt="free lunch" width="158" height="210"/&gt;As I previously mentioned in &amp;#8220;&lt;A HREF="http://thediscoblog.com/2010/03/03/free-lunches-mousetraps-and-the-actor-model/"&gt;Free lunches, mousetraps and the Actor model&lt;/A&gt;&amp;#8220;, Edward A. Lee wrote an interesting article entitled &amp;#8220;&lt;a href="http://www.eecs.berkeley.edu/Pubs/TechRpts/2006/EECS-2006-1.pdf"&gt;The Problem with Threads&lt;/a&gt;&amp;#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 &lt;a href="http://thediscoblog.com/2008/10/19/book-review-programming-erlang/"&gt;Erlang&lt;/a&gt;). He states:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;We should not replace established languages. We should instead build on them.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;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 &lt;a href="http://thediscoblog.com/2009/12/10/book-review-programming-scala/"&gt;Scala&lt;/a&gt;, which supports actors and &lt;A HREF="http://gpars.codehaus.org/"&gt;Groovy with GPars&lt;/A&gt;, there&amp;#8217;s framework&amp;#8217;s like &lt;A HREF="http://www.malhar.net/sriram/kilim/"&gt;Kilim&lt;/A&gt;, &lt;A HREF="http://osl.cs.uiuc.edu/af/"&gt;ActorFoundry&lt;/A&gt;, &lt;A HREF="http://actorsguildframework.org/"&gt;Actors Guild&lt;/A&gt;, and &lt;A HREF="http://code.google.com/p/jetlang/"&gt;jetlang&lt;/A&gt;.  &lt;/p&gt;
&lt;p&gt;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.  &lt;/p&gt;
&lt;p&gt;In the end, the speed up attributed to Kilim (or indirectly leveraging its actor model) was hardly noticeable (some aspects of &lt;A HREF="http://www.infoq.com/news/2008/06/kilim-message-passing-in-java"&gt;Kilim&lt;/A&gt; were noticeably faster though &amp;#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 &lt;I&gt;mailbox&lt;/I&gt;. That is, in the actor model, processes can &lt;I&gt;share data more safely&lt;/I&gt;. &lt;/p&gt;
&lt;p&gt;There are quite a few different implementations and ways to facilitate message passing in various languages and platforms, but to me, the actor model&amp;#8217;s mailbox notion is quite intuitive. In &lt;A HREF="http://java.dzone.com/articles/java-actors-with-kilim"&gt;Kilim&amp;#8217;s actor model&lt;/A&gt;, messages are passed between processes via a &lt;code&gt;Mailbox&lt;/code&gt; &amp;#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). &lt;/p&gt;
&lt;p&gt;As an example of leveraging mailboxes in Kilim, I wrote two actors (a &lt;code&gt;Husband&lt;/code&gt; and a &lt;code&gt;Wife&lt;/code&gt;) that extend from Kilim&amp;#8217;s &lt;code&gt;Task&lt;/code&gt; type. Previous versions of Kilim had an &lt;code&gt;Actor&lt;/code&gt; type; however, as of version 0.6, &lt;code&gt;Task&lt;/code&gt; is the way to go. &lt;/p&gt;
&lt;pre class="brush: java;"&gt;
import kilim.Mailbox;
import kilim.Pausable;
import kilim.Task;

public class Husband extends Task {
 private Mailbox&amp;lt;Message&amp;gt; mailbox;

 public Husband(Mailbox&amp;lt;Message&amp;gt; mailbox) {
  super();
  this.mailbox = mailbox;
 }

 @Override
 public void execute() throws Pausable, Exception {
  while (true) {
   System.out.println(&amp;quot;Husband listening...&amp;quot;);
   Message msg = mailbox.get(); // blocks
   if (msg.getReceipient() == Message.HUSBAND) {
    System.out.println(&amp;quot;Husband hears: &amp;quot; + msg.getMessage());
    Message reply = new Message(Message.WIFE, &amp;quot;Yes, dear&amp;quot;);
    mailbox.putnb(reply);
   }
   Task.sleep(1000);
  }
 }
}
&lt;/pre&gt;
&lt;p&gt;Under the covers, Kilim works by weaving bytecode so as to control &lt;code&gt;Task&lt;/code&gt; types and facilitate their safe interaction &amp;#8212; specifically, Kilim&amp;#8217;s weaver is looking for methods that throw the &lt;code&gt;Pausable&lt;/code&gt; type (previous versions used the &lt;code&gt;@Pausable&lt;/code&gt; annotation). &lt;/p&gt;
&lt;p&gt;In the &lt;code&gt;Husband&lt;/code&gt; class, a few things are going on &amp;#8212; first, the instance waits for a message from a shared mailbox. In this case, I used a blocking &lt;code&gt;get&lt;/code&gt; call (as in reality, a husband really doesn&amp;#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 &amp;#8220;clean your room&amp;#8221; or &amp;#8220;brush your hair&amp;#8221;). &lt;/p&gt;
&lt;p&gt;Once a &lt;code&gt;Message&lt;/code&gt; type (which, in this case, is not a Kilim type) is determined to be sent to a &lt;code&gt;Husband&lt;/code&gt; instance, the &lt;code&gt;Husband&lt;/code&gt; type replies appropriately by creating a &lt;code&gt;Message&lt;/code&gt; and placing it into the &lt;code&gt;mailbox&lt;/code&gt; instance. Finally, the &lt;code&gt;sleep&lt;/code&gt; call is just placed to facilitate reading console output. &lt;/p&gt;
&lt;p&gt;The &lt;code&gt;Wife&lt;/code&gt; class is similar (expect that she doesn&amp;#8217;t wait to listen&amp;#8230;). Like the &lt;code&gt;Husband&lt;/code&gt; instance, this class creates a &lt;code&gt;Message&lt;/code&gt; (in the form of a Honey Do) and sends it off via the shared &lt;code&gt;MailBox&lt;/code&gt;; however, she doesn&amp;#8217;t wait around &amp;#8212; that is, the instance uses the &lt;code&gt;putnb&lt;/code&gt; call, which is non-blocking. What&amp;#8217;s more, she&amp;#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 (&lt;code&gt;getnb&lt;/code&gt;) like so:&lt;/p&gt;
&lt;pre class="brush: java;"&gt;
import kilim.Mailbox;
import kilim.Pausable;
import kilim.Task;

public class Wife extends Task {

 private Mailbox&amp;lt;Message&amp;gt; mailbox;

 public Wife(Mailbox&amp;lt;Message&amp;gt; mailbox) {
  super();
  this.mailbox = mailbox;
 }

 @Override
 public void execute() throws Pausable, Exception {
  while (true) {
   Message request = new Message(Message.HUSBAND,
    &amp;quot;Please do x, y, and z today, husband.&amp;quot;);

   mailbox.putnb(request);
   Task.sleep(1000);
   Message msg = mailbox.getnb(); // no block

   if (msg != null &amp;amp;&amp;amp; msg.getReceipient() == Message.WIFE) {
    System.out.println(&amp;quot;Wife hears: &amp;quot; + msg.getMessage());
   }
  }
 }
}
&lt;/pre&gt;
&lt;p&gt;As you can see, if there is a message waiting for her, she&amp;#8217;ll hear it, otherwise, she moves on and requests her husband to do something else.&lt;/p&gt;
&lt;p&gt;Lastly, everything is coordinated by a simple driver class containing a &lt;code&gt;main&lt;/code&gt; method like so:&lt;/p&gt;
&lt;pre class="brush: java;"&gt;
import kilim.Mailbox;
import kilim.Task;

public class HoneyDo {

 public static void main(String[] args) {

  Mailbox&amp;lt;Message&amp;gt; sharedMailbox = new Mailbox&amp;lt;Message&amp;gt;();

  Task wife = new Wife(sharedMailbox);
  Task husband = new Husband(sharedMailbox);

  husband.start();
  wife.start();
 }
}
&lt;/pre&gt;
&lt;p&gt;Note how a &lt;code&gt;Mailbox&lt;/code&gt; instance is created for my custom &lt;code&gt;Message&lt;/code&gt; type; what&amp;#8217;s more, the &lt;code&gt;sharedMailbox&lt;/code&gt; is then shared between both the &lt;code&gt;wife&lt;/code&gt; and &lt;code&gt;husband&lt;/code&gt; instances. Lastly, things are started via the &lt;code&gt;start&lt;/code&gt; method. &lt;/p&gt;
&lt;p&gt;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 &amp;#8220;yes, dear&amp;#8221;, which the wife hears). &lt;/p&gt;
&lt;pre class="brush: plain;"&gt;
 Husband listening...
 Husband hears: Please do x, y, and z today, husband.
 Husband says: Yes, dear
 Husband listening...
 Wife hears: Yes, dear
 Husband hears: Please do x, y, and z today, husband.
 Husband says: Yes, dear
 Husband listening...
 Wife hears: Yes, dear
 Husband hears: Please do x, y, and z today, husband.
 Husband says: Yes, dear
 Wife hears: Yes, dear
 Husband listening...
 Husband hears: Please do x, y, and z today, husband.
 Husband says: Yes, dear
 Husband listening...
 Wife hears: Yes, dear
 Husband hears: Please do x, y, and z today, husband.
 Husband says: Yes, dear
 Wife hears: Yes, dear
 Husband listening...
 Husband hears: Please do x, y, and z today, husband.
 Husband says: Yes, dear
&lt;/pre&gt;
&lt;p&gt;The actor model facilitates &lt;a href="http://thediscoblog.com/2008/10/19/poll-which-language-is-better-suited-for-jvm-concurrency/"&gt;concurrent programming&lt;/a&gt; by allowing a safer mechanism for message passing between processes (or actors). Implementations of this model vary between languages and frameworks &amp;#8212; I suggest checking out &lt;a href="http://thediscoblog.com/2008/10/19/book-review-programming-erlang/"&gt;Erlang&lt;/a&gt;&amp;#8217;s actors followed by &lt;a href="http://thediscoblog.com/2009/12/10/book-review-programming-scala/"&gt;Scala&lt;/a&gt;&amp;#8217;s as each implementation is quite neat given their respective syntax. &lt;/p&gt;
&lt;p&gt;In the end, if you want to leverage plain Jane Java &lt;a href="http://en.wikipedia.org/wiki/Actor_model"&gt;actors&lt;/a&gt;, then have a look at &lt;a href="http://www.malhar.net/sriram/kilim/"&gt;Kilim&lt;/a&gt; (or one of the other frameworks available)  &amp;#8212; just make sure you&amp;#8217;ve finished your honey do list first, man.&lt;/p&gt;
                                 &lt;p&gt;&lt;center&gt;Looking to spin up Continuous Integration &lt;em&gt;quickly&lt;/em&gt;? Check out &lt;a href="http://www.ciinabox.com"&gt;www.ciinabox.com&lt;/a&gt;.&lt;/center&gt;&lt;/p&gt;</description>
      <pubDate>Wed, 10 Mar 2010 09:56:00 CST</pubDate>
      <guid isPermaLink="true">http://thediscoblog.com/?p=1069</guid>
      <dc:creator>Andrew Glover</dc:creator>
    </item>
    <item>
      <title>Annotation-Based Spring Portlet MVC</title>
      <link>http://www.springone2gx.com/blog/john_lewis/2010/03/annotation_based_spring_portlet_mvc</link>
      <description>&lt;p&gt;Here is the full screencast from my Jasig 2010 Conference Session on Annotation-Based Spring Portlet MVC. Enjoy!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.unicon.net/node/1367"&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Tue, 09 Mar 2010 13:34:00 CST</pubDate>
      <guid isPermaLink="true">1367 at http://www.unicon.net</guid>
      <dc:creator>John Lewis</dc:creator>
    </item>
    <item>
      <title>ESDC 2010 resources</title>
      <link>http://www.springone2gx.com/blog/andrew_glover/2010/03/esdc_2010_resources</link>
      <description>&lt;p&gt;I recently had the opportunity to present four different talks at the &lt;A HREF="http://thediscoblog.com/2010/01/19/development-2-0-concepts-at-esdc/"&gt;Enterprise Software Development Conference&lt;/A&gt; (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&amp;#8217;s site &amp;#8212; &lt;A HREF="http://beacon50.com/"&gt;beacon50.com&lt;/A&gt;) provide links to articles, blog entries, tutorials, and a copy of each presentation. If you&amp;#8217;re curious to see what you missed at ESDC, then have a look, man:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;A HREF="http://beacon50.com/resources/esdc/gtrench.html"&gt;Resources for Groovy from the trenches&lt;/A&gt;&lt;/li&gt;
&lt;li&gt;&lt;A HREF="http://beacon50.com/resources/esdc/easyb.html"&gt;Resources for Easy BDD with easyb&lt;/A&gt;&lt;/li&gt;
&lt;li&gt;&lt;A HREF="http://beacon50.com/resources/esdc/cloud.html"&gt;Resources for Comparing the cloud: GAE versus EC2&lt;/A&gt;&lt;/li&gt;
&lt;li&gt;&lt;A HREF="http://beacon50.com/resources/esdc/rest.html"&gt;Resources for RESTful web services in Grails&lt;/A&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks to everyone who came to ESDC and attended my talks &amp;#8212; I had a great time discussing these topics (and more!) with you! &lt;/p&gt;
                                 &lt;p&gt;&lt;center&gt;Looking to spin up Continuous Integration &lt;em&gt;quickly&lt;/em&gt;? Check out &lt;a href="http://www.ciinabox.com"&gt;www.ciinabox.com&lt;/a&gt;.&lt;/center&gt;&lt;/p&gt;</description>
      <pubDate>Mon, 08 Mar 2010 12:48:00 CST</pubDate>
      <guid isPermaLink="true">http://thediscoblog.com/?p=1090</guid>
      <dc:creator>Andrew Glover</dc:creator>
    </item>
    <item>
      <title>Scala: Post-Functional, Post-Modern, or Just Perl++?</title>
      <link>http://www.springone2gx.com/blog/robert_fischer/2010/03/scala_post_functional_post_modern_or_just_perl__</link>
      <description>&lt;h3&gt;Let&amp;#8217;s start with some background.&lt;/h3&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/scala-not-functional/"&gt;I complained that Scala did not seem to be very functional to me&lt;/a&gt;, but I didn&amp;#8217;t really know how best to express what was fundamentally wrong with it. I did know that if &lt;a rel="nofollow" target="_blank" href="http://www.artima.com/scalazine/articles/goals_of_scala.html"&gt;&amp;#8220;functional languages have a fixed set of features&amp;#8221; like Scala&amp;#8217;s creator, Odersky, claims&lt;/a&gt;, then it wasn&amp;#8217;t simply &amp;#8220;first-class functions in there, function literals, closures&amp;#8221;, &amp;#8220;types, generics, [and] pattern matching&amp;#8221;. Scala has missed the functional boat in some basic way.&lt;/p&gt;
&lt;p&gt;After a kerfuffle in the comments, &lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/what-is-a-functional-programming-language/"&gt;Brian enlightened us all by telling us what is a functional programming language&lt;/a&gt;. His explanation (while being a self-admitted generalization) is summarized as follows:&lt;br /&gt;
&lt;blockquote&gt;So, what is it that differentiates the functional programming languages from all the other programming languages? It is simply this: the functional programming languages use, as their fundamental model of computation, the lambda calculus, while all the other programming languages use the Turing machine as their fundamental model of computation.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Six months later, &lt;a rel="nofollow" target="_blank" href="http://www.scala-lang.org/node/4960"&gt;Odersky responds with a very interesting post&lt;/a&gt;, which actually agrees that Scala is not a functional language in Brian&amp;#8217;s sense, but instead argues that any language is functional if it &amp;#8220;makes programming centered around functions easy and natural&amp;#8221;. He then runs through a list of features which is in common with functional languages, noting that Scala has them within handwave enough (more on that later). He ends wishing that people would &amp;#8220;stop thinking of functional programming as a different, novel, or exotic way to code&amp;#8221;. Even more, though, Scala is apparently &amp;#8220;an early example of a new breed of postfunctional languages&amp;#8221;.&lt;/p&gt;
&lt;h3&gt;And that gets us to this blog post.&lt;/h3&gt;
&lt;p&gt;First of all, Odersky is still missing the point. It&amp;#8217;s not about whether you use &lt;code&gt;fold&lt;/code&gt;, &lt;code&gt;map&lt;/code&gt;, and &lt;code&gt;iter&lt;/code&gt;, or whether you can write closures easily. It&amp;#8217;s not even really about pure functions vs. side-effects. To code in a functional style is a fundamentally different way of thinking about problems: instead of thinking about problems as nouns that are doing things, functional programming views a problem as a series of transformations to the world which results in an answer. This is why functional programming is considered &amp;#8220;a different, novel, or exotic way to code&amp;#8221;: it &lt;em&gt;is&lt;/em&gt; a different, novel, and (as of yet) exotic way to code. It&amp;#8217;s as different, novel, and exotic from OO as OO was from procedural. It&amp;#8217;s a different way of thinking about the entire issue. You can &lt;a rel="nofollow" target="_blank" href="http://itmmetelko.com/blog/2008/02/23/functional-programming-immutable-objects-explained-irc-style/"&gt;check out this snippet of an IRC conversation from #ocaml&lt;/a&gt; for more on that.&lt;/p&gt;
&lt;p&gt;The paragon of this way of programming is &lt;a rel="nofollow" target="_blank" href="http://buffered.io/2009/06/27/point-free-style-what-is-it-good-for/"&gt;point-free programming&lt;/a&gt;, where you are quite literally building up a mega-function that describes how your program works, and then executing that one, single function when you run that program. If your language doesn&amp;#8217;t lead people to re-discover point free programming at least in the small, then the language really isn&amp;#8217;t taking function manipulation and functional language type conceptions seriously. And that&amp;#8217;s the case with Scala: even Odersky admits that in Scala, &amp;#8220;currying is more verbose and much less used than in other functional languages&amp;#8221;. (Protip to Scala people: If one of the fundamental stunts of a style is pervasive in all the code but yours, you&amp;#8217;re not in the same style of programming.)&lt;/p&gt;
&lt;p&gt;What really gets me, though, is the claim that Scala is &amp;#8220;an early example of a new breed of postfunctional languages&amp;#8221;, because aside from the static typing, all the language features that Odersky trots out already exist in Perl. It&amp;#8217;s hard to be a vanguard of a new breed of programming languages when there&amp;#8217;s prior art &lt;a rel="nofollow" target="_blank" href="http://history.perl.org/PerlTimeline.html#1980s"&gt;from the 1980s&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Don&amp;#8217;t believe me? &lt;a rel="nofollow" target="_blank" href="http://www.amazon.com/exec/obidos/ASIN/1558607013/lovespiralsof-20"&gt;The existence of a book on the topic unconvincing&lt;/a&gt;? Then let&amp;#8217;s run the list of functional language features from Odersky.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Functions as first class values: &lt;em&gt;check&lt;/em&gt;. &lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="perl" style="font-family:monospace;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;sub&lt;/span&gt; apply&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#339933;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$)&lt;/span&gt; &lt;span style="color:#009900;"&gt;&amp;#123;&lt;/span&gt; &lt;span style="color:#666666;font-style:italic;"&gt;# Take a function as an argument no problem&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;$_&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color:#cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color:#339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$_&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color:#cc66cc;"&gt;1&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;
&lt;span style="color:#009900;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span style="color:#000000;font-weight:bold;"&gt;sub&lt;/span&gt; times2&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$)&lt;/span&gt; &lt;span style="color:#009900;"&gt;&amp;#123;&lt;/span&gt; &lt;span style="color:#666666;font-style:italic;"&gt;# Create a function to take&lt;/span&gt; &lt;span style="color:#000066;"&gt;print&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;$_&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color:#cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color:#339933;"&gt;*&lt;/span&gt;&lt;span style="color:#cc66cc;"&gt;2&lt;/span&gt; &lt;span style="color:#339933;"&gt;.&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;"&lt;span style="color:#000099;font-weight:bold;"&gt;&amp;#92;n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;
&lt;span style="color:#009900;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
apply&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;#92;&amp;amp;times2&lt;/span&gt;&lt;span style="color:#339933;"&gt;,&lt;/span&gt; &lt;span style="color:#cc66cc;"&gt;3&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt; &lt;/li&gt;
&lt;li&gt;Convenient closure syntax: &lt;em&gt;check&lt;/em&gt; &lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="perl" style="font-family:monospace;"&gt;&lt;span style="color:#b1b100;"&gt;my&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;$x&lt;/span&gt; &lt;span style="color:#339933;"&gt;=&lt;/span&gt; &lt;span style="color:#cc66cc;"&gt;2&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;
apply &lt;span style="color:#009900;"&gt;&amp;#123;&lt;/span&gt; &lt;span style="color:#000066;"&gt;print&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;$_&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color:#cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;*$x&lt;/span&gt; &lt;span style="color:#339933;"&gt;.&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;"&lt;span style="color:#000099;font-weight:bold;"&gt;&amp;#92;n&lt;/span&gt;"&lt;/span&gt; &lt;span style="color:#009900;"&gt;&amp;#125;&lt;/span&gt; &lt;span style="color:#cc66cc;"&gt;3&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span style="color:#b1b100;"&gt;my&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;$times_x&lt;/span&gt; &lt;span style="color:#339933;"&gt;=&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;sub&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$)&lt;/span&gt; &lt;span style="color:#009900;"&gt;&amp;#123;&lt;/span&gt; &lt;span style="color:#000066;"&gt;print&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;$_&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color:#cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;*$x&lt;/span&gt; &lt;span style="color:#339933;"&gt;.&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;"&lt;span style="color:#000099;font-weight:bold;"&gt;&amp;#92;n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;
&lt;span style="color:#009900;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;$times_x&lt;/span&gt;&lt;span style="color:#339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#cc66cc;"&gt;3&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt; &lt;/li&gt;
&lt;li&gt;List comprehensions: &lt;em&gt;check&lt;/em&gt;. (See &lt;a rel="nofollow" target="_blank" href="http://perldoc.perl.org/index-functions-by-cat.html#Functions-for-list-data"&gt;perlfunc on list data&lt;/a&gt;.)
&lt;/li&gt;
&lt;li&gt;&amp;#8220;Curried&amp;#8221; function definitions and applications: check-ish.&lt;br /&gt;
Okay, so calling this a &amp;#8220;check&amp;#8221; on Scala is a bit of a reach (&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/scala-not-functional/#currying"&gt;cite&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/scala-not-functional/#comment-35168"&gt;cite&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/scala-not-functional/#comment-35550"&gt;cite&lt;/a&gt;, although &lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/scala-not-functional/#comment-35231"&gt;note this&lt;/a&gt;—&lt;a rel="nofollow" target="_blank" href="http://www.codecommit.com/blog/scala/function-currying-in-scala"&gt;here&lt;/a&gt; is a more sympathetic run-down on Scala currying). Ignoring the &lt;code&gt;foo(2,_:Int)&lt;/code&gt; syntax for a moment, we can implement basically the same style of &amp;#8220;&amp;#8216;curried&amp;#8217; function definitions&amp;#8221; such as Scala&amp;#8217;s &lt;a rel="nofollow" target="_blank" href="http://www.scala-lang.org/docu/files/api/scala/List.html#foldLeft%28B%29"&gt;List#foldLeft&lt;/a&gt;. &lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="perl" style="font-family:monospace;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;sub&lt;/span&gt; add &lt;span style="color:#009900;"&gt;&amp;#123;&lt;/span&gt; &lt;span style="color:#b1b100;"&gt;my&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;$x&lt;/span&gt; &lt;span style="color:#339933;"&gt;=&lt;/span&gt; &lt;span style="color:#000066;"&gt;shift&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt; &lt;span style="color:#000066;"&gt;return&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;sub&lt;/span&gt; &lt;span style="color:#009900;"&gt;&amp;#123;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;$x&lt;/span&gt; &lt;span style="color:#339933;"&gt;+&lt;/span&gt; &lt;span style="color:#000066;"&gt;shift&lt;/span&gt; &lt;span style="color:#009900;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;
&lt;span style="color:#009900;"&gt;&amp;#125;&lt;/span&gt;
add&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#cc66cc;"&gt;2&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#cc66cc;"&gt;3&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt; &lt;span style="color:#666666;font-style:italic;"&gt;# Okay, so you do need an extra -&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt; &lt;p&gt;In the case of our &lt;code&gt;apply&lt;/code&gt; function above (where we take a function as the first argument), it&amp;#8217;s even easier.&lt;/p&gt; &lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="perl" style="font-family:monospace;"&gt;apply &lt;span style="color:#009900;"&gt;&amp;#123;&lt;/span&gt; &lt;span style="color:#000066;"&gt;print&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;$_&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color:#cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;*$x&lt;/span&gt; &lt;span style="color:#339933;"&gt;.&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;"&lt;span style="color:#000099;font-weight:bold;"&gt;&amp;#92;n&lt;/span&gt;"&lt;/span&gt; &lt;span style="color:#009900;"&gt;&amp;#125;&lt;/span&gt; &lt;span style="color:#cc66cc;"&gt;8&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt; &lt;p&gt;Now, there isn&amp;#8217;t really argument skipping (i.e.: &lt;code&gt;foo(_:Int,3)&lt;/code&gt;) as a syntax feature, and there isn&amp;#8217;t a built-in &lt;code&gt;curry&lt;/code&gt; function, but if you want Scala&amp;#8217;s &lt;code&gt;Function.curried&lt;/code&gt; in perl, here it is:&lt;/p&gt; &lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="perl" style="font-family:monospace;"&gt;&lt;span style="color:#666666;font-style:italic;"&gt;# This code released under Creative Commons 0 and WTFPL.&lt;/span&gt;
&lt;span style="color:#000000;font-weight:bold;"&gt;sub&lt;/span&gt; curry&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#339933;"&gt;&amp;amp;@&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#009900;"&gt;&amp;#123;&lt;/span&gt; &lt;span style="color:#b1b100;"&gt;my&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$f&lt;/span&gt;&lt;span style="color:#339933;"&gt;,&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;@args&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#339933;"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;@_&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt; &lt;span style="color:#000066;"&gt;return&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;sub&lt;/span&gt; &lt;span style="color:#009900;"&gt;&amp;#123;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;$f&lt;/span&gt;&lt;span style="color:#339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;@args&lt;/span&gt;&lt;span style="color:#339933;"&gt;,&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;@_&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt; &lt;span style="color:#009900;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;
&lt;span style="color:#009900;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span style="color:#000000;font-weight:bold;"&gt;sub&lt;/span&gt; add&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$$&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#009900;"&gt;&amp;#123;&lt;/span&gt; &lt;span style="color:#000066;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;$_&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color:#cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color:#339933;"&gt;+&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;$_&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color:#cc66cc;"&gt;1&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;
&lt;span style="color:#009900;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span style="color:#b1b100;"&gt;my&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;$curried&lt;/span&gt; &lt;span style="color:#339933;"&gt;=&lt;/span&gt; curry&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;#92;&amp;amp;add&lt;/span&gt;&lt;span style="color:#339933;"&gt;,&lt;/span&gt; &lt;span style="color:#cc66cc;"&gt;2&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt; &lt;span style="color:#000066;"&gt;print&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;$curried&lt;/span&gt;&lt;span style="color:#339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#cc66cc;"&gt;3&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#339933;"&gt;.&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;"&lt;span style="color:#000099;font-weight:bold;"&gt;&amp;#92;n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt; &lt;/li&gt;
&lt;li&gt;Lazy evaluation: &lt;em&gt;check&lt;/em&gt;. See &lt;a rel="nofollow" target="_blank" href="http://search.cpan.org/~jesse/Scalar-Defer-0.23/lib/Scalar/Defer.pm"&gt;Scalar::Defer&lt;/a&gt; for lazy val equivalents and &lt;a rel="nofollow" target="_blank" href="http://search.cpan.org/~genie/Tie-LazyList-0.05/LazyList.pm"&gt;Tie::LazyList&lt;/a&gt; for lazy seq equivalents. People generally use a &lt;a rel="nofollow" target="_blank" href="http://www.perldesignpatterns.com/?LazyEvaluation"&gt;double-return approach&lt;/a&gt; for generators (which I realize are different than lazy seqs and only kinda-sorta lazy).
&lt;/li&gt;
&lt;li&gt;Pattern matching: &lt;em&gt;check&lt;/em&gt; (okay, check-ish). See &lt;a rel="nofollow" target="_blank" href="http://perldoc.perl.org/Switch.html"&gt;Switch&lt;/a&gt;. The decomposition isn&amp;#8217;t there, which is the biggest weakness. But the general cumbersomeness and lack of real algebraic data types hamstrings the coolest parts of pattern matching anyway, so I&amp;#8217;m calling it a draw. (This should be read as a generous and sympathetic ruling for Scala: Cedric Beust, for instance, rails against pattern matching/case classes and says &amp;#8220;&lt;a rel="nofollow" target="_blank" href="http://beust.com/weblog2/archives/000490.html"&gt;it&amp;#8217;s hard for me to see case classes as anything but a failure&lt;/a&gt;&amp;#8220;.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In addition, perl&amp;#8217;s got a few features in its favor for functional programming, like more flexible arguments, &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Autovivification"&gt;autovificiation&lt;/a&gt;, list/argument coercion, and dynamic symbol table mangling. Since perl also has OO capabilities, perl is &lt;em&gt;at least&lt;/em&gt; as convincing a &amp;#8220;post-functional language&amp;#8221; as Scala. But there&amp;#8217;s even more in common between the two than that.&lt;/p&gt;
&lt;p&gt;Odersky&amp;#8217;s &amp;#8220;post-functional language&amp;#8221; is really a subtype of &lt;a rel="nofollow" target="_blank" href="http://www.wall.org/~larry/pm.html"&gt;Larry Wall&amp;#8217;s &amp;#8220;post-modern language&amp;#8221;&lt;/a&gt;: it&amp;#8217;s an attempt to create a language that is a grab-bag of multiple paradigms. And when you do that, you&amp;#8217;re just begging for the complaints that you hear leveled against both perl and Scala: it&amp;#8217;s too complicated, its syntax is weird, it&amp;#8217;s too magical, people write in entirely distinct subsets of the language, etc. (&lt;a rel="nofollow" target="_blank" href="http://creativekarma.com/ee.php/weblog/comments/my_verdict_on_the_scala_language/"&gt;cite&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href="http://www.weiqigao.com/blog/2008/03/24/scala_still_uncomfortable_after_five_years.html"&gt;cite&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href="http://neopythonic.blogspot.com/2008/11/scala.html"&gt;cite&lt;/a&gt;) Now, those who master the language (or master their favorite subset of it) love the &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/There's_more_than_one_way_to_do_it"&gt;TIMTOWTDI&lt;/a&gt; aspect. But it also means that the language is left as a jack-of-all-trades, master of none. Yes, Scala and perl integrate a lot of powerful tools from functional languages—but learning OCaml still blew my mind, despite knowing perl for years. As I started off saying, Scala is not a functional programming language. It is a statically typed object oriented language with closures.&lt;/p&gt;
&lt;p&gt;Now, there is a sense in which Odersky is really onto something. The world of programming is forever transformed with closures and list comprehensions as being mandatory for new high-level languages, even if they&amp;#8217;re otherwise object oriented. And software developers are going to need how to work with them effectively if they want to read code moving forward. Yes, after 20+ years, the rest of the programming world finally caught up to one of perl&amp;#8217;s fundamental insights.&lt;/p&gt;
&lt;hr /&gt;&lt;h2&gt;Comments&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37346"&gt;March 7, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://blog.barrkel.com/' class='url'&gt;Barry Kelly&lt;/a&gt; wrote: Functional programming optimizes for different things than OO does. That means for different problems, you want to take different approaches, depending on your level of familiarity with the problem domain and the solution strategies. And thus for a language that supports both paradigms, different people will often end up using different subsets of the language. But I don't think this is necessarily a damning criticism. Our problems are bigger and more compositional. We need languages that have the semantic richness to support different solution strategies. An example. There's an isomorphism between OO polymorphism / dynamic dispatch, and algebraic data types / pattern matching and destructuring. OO lets you add subclasses as late as dynamically at runtime. ADT lets you add functions freely, and such functions are more composable that they're dealing with well-defined quantities. More generally, OO is about defining loosely bound protocols, while FP is more about flexibly defining transformations over tightly defined structures. But if you want to write a solution that's natural for one paradigm in the other, you end up re-inventing and poorly reinventing the other paradigm. In a comment somewhere else out in the ether, I made an argument that getting FP to work as well as a dynamically typed late bound language like Ruby for fast-iterating web solutions that join together multiple independently developed and fast-iterating modules, you'd end up writing what amounted to a dynamic language just to avoid the brittleness that comes from the over-specification that naturally falls out of static typing. I will agree that e.g. currying is useful, as it decomposes the concept of functions of arbitrary arity into what amounts to a linked list of unary functions; and this is particularly handy for programming in a point-free style. But point-free mostly helps (I would assert) on problems where what you need to do is create an algorithm, where little helpers like fold, map, memoize etc. are your bread and butter. But not all problems are like that, not by a long shot.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37347"&gt;March 7, 2010&lt;/a&gt;, Ittay wrote: "because aside from the static typing, all the language features that Odersky trots out already exist in Perl" That is a big 'aside'. You also forgot that Scala runs on the JVM and Perl not. Not to mention that I think it is common consensus that Perl code is very unreadable. So Scala is a language that combines some FP characteristics with OO, running on the JVM and with a readable (and scalable) syntax. That's a big win for me.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37348"&gt;March 7, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://enfranchisedmind.com/blog/posts/author/candide/' class='url'&gt;Robert Fischer&lt;/a&gt; wrote: I will freely grant that there's a lot to be gained by having some flexibility, but languages that end up trying to play in multiple sandboxes end up either doing one part badly (e.g. OCaml and OO, Scala and functional). The answer seems to be using multiple languages for different contexts, not trying to create the One True Language with all the features of the world in it. That's why when I encounter a programming problem, I will generally reach for perl, Groovy, or OCaml/F#: which one I go for depends on the nature of the problem. But I don't long for a day when there's a language that has all the features of perl, Groovy, and OCaml, because they're fundamentally incompatible takes on the process of programming. The strongly opinionated natures of these languages is precisely what makes them so good. Scala's lack of strong opinions is what's frustrating me. Well, that and having to explain to Java devs over and over again at No Fluff events that learning Scala does not mean learning to program in a functional style. I mean, you &lt;em&gt;can&lt;/em&gt; code Scala in a functional style, but &lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/this-is-your-brain-this-is-your-brain-on-ocaml/"&gt;I can code Java in a functional style&lt;/a&gt;. And yes, it's a &lt;em&gt;bit&lt;/em&gt; easier to code in a functional style in Scala, but learning Scala is no more learning functional programming than learning perl is learning functional programming.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37349"&gt;March 7, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://enfranchisedmind.com/blog/posts/author/candide/' class='url'&gt;Robert Fischer&lt;/a&gt; wrote: The "readable (and scalable) syntax" bit is a big assumption—at least to my ear, there's as much concern about the readability of Scala code as there is about perl code. And how much Scala's static typing really helps vs. how much it gets in the way is a matter of contention. But both of those are an aside. The purpose of this post was not to say that people should stop coding Scala and start coding perl: if you're still futzing around in Java-land, Scala (like Groovy and JRuby) is a productivity huge win that can leverage your existing infrastructure. Groovy's probably the semantically closest, JRuby's the conceptually cleanest, and Scala keeps the fetishized complexity and the BDSM aspects of Java. No, this wasn't a call to go back to perl. The purpose of this post is to show that the idea of merging closures with imperative isn't a new idea, and that Scala is no more a functional language than those languages (like perl) which merged the concepts beforehand.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37351"&gt;March 7, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://www.illegalargument.com' class='url'&gt;Richard Vowles&lt;/a&gt; wrote: I've been saying this for 6 months at least now - Scala and Perl have way more in common than Scala has in common with any other language. Including a tendency towards unreadability.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37352"&gt;March 7, 2010&lt;/a&gt;, Marc wrote: "It’s as different, novel, and exotic from OO as OO was from imperative." OO is as imperative, if not more so, than C. I assume you meant procedural? Also, there is nothing new in programming languages, period. Everything you see in "new" languages was figured out at least 20 years ago. So, all language designers are just mixing and matching as they see fit. So it's unfair to single out Scala in this regard. While you're at it, go after Groovy, Clojure, Boo, F#, etc.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37353"&gt;March 7, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://www.cirrusmachina.com/' class='url'&gt;Nick Bauman&lt;/a&gt; wrote: I find the description "combines some FP characteristics with OO" problematic when discussing hybrid Functional / OO languages. The more I use one of my favorites of these languages, Python, the more I find the OO aspects receding into the background and the functional ones coming to the fore. It seems to me that &lt;b&gt;Functional is OO "done right"&lt;/b&gt; where when I do use OO in them, it's not as heavyweight and seems more natural. I think the key is that in most traditional OO languages the concept of what a type is tends to be much narrower. Can you confirm this in your experience?&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37354"&gt;March 7, 2010&lt;/a&gt;, Thomas Heywood wrote: Robert, I admire your ability to "professionally blog." You delivered no useful content, but you did it with inspiring attention to page hits and comment controversy. Yes, Scala is a multiparadigm language. Yes, Perl is one too. Yes, they both share features from Common Lisp. That's not really worth my or your time. But you cleverly used the confrontational tone to make the blatant non-issue into a controversial &lt;i&gt;issue&lt;/i&gt;. You cleverly used Blogosphere's beloved "Scala" and "Perl" tags in a &lt;i&gt;single&lt;/i&gt; article. You nagged about a minor syntax issue like it was life-or-death as only a true master-of-functional-programming-who-blogs-more-than-he-actually-programs can. Bob, you're my hero - a true &lt;i&gt;Dilbert's&lt;/i&gt; Wally in flesh. A guy without any real code to show - but who "realigns the tone of existing projects" and whose "technical leadership focuses on pragmatic communication" like there's no tomorrow. Wally - sorry, Robert - do you think you could write some posts on how to professionally sell bull and call it "technical accomplishments?" Many of us CompSci majors would like to get in on this money for nothing scheme. Unless, of course, you're not comfortable writing about things you actually do know a little about.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37355"&gt;March 7, 2010&lt;/a&gt;, Nilanjan Raychaudhuri wrote: Well I believe it is possible to write unreadable code in any language and I am not sure blaming any programming language for that is a good idea.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37356"&gt;March 7, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://www.codecommit.com/blog' class='url'&gt;Daniel Spiewak&lt;/a&gt; wrote: Throwing out static typing fundamentally changes what Scala has to offer. In a sense, I agree with you that if we completely threw out Scala's type system (and &lt;i&gt;all&lt;/i&gt; that it entails), then we would end up with a language which improves very little (if at all) over languages like Perl or Ruby. However, that first step is a doozy and not really fair. Consider a snippet like this: &lt;pre lang="scala"&gt;"123".to[Int] // =&amp;gt; 123
".+".to[Regexp] // =&amp;gt; /.+/
true.to[Regexp] // compile error!&lt;/pre&gt; There's a lot of magic going on here, all of which is made possible by the static type system. In fact, while this sort of thing is *possible* in a dynamic language with open classes (like Ruby), the implementation will be ugly, unscoped, brittle and difficult to extend. In Scala, the implementation looks something like this: &lt;pre lang="scala"&gt;trait Converter[-A, +B] { def apply(a: A): B
} implicit object StringToInt extends Converter[String, Int] { def apply(str: String) = str.toInt
} implicit object StringToRegexp extends Converter[String, Regexp] { def apply(str: String) = Regexp(str)
} implicit def toSyntax[A](a: A)= new { def to[B](implicit conv: Converter[A, B]) = conv(a)
}&lt;/pre&gt; This is taking advantage of a feature which Scala inherits from Haskell called &lt;i&gt;typeclasses&lt;/i&gt;. This is an feature which is inherently tied to static typing and is often very difficult to emulate in dynamic, so-called "more flexible" languages. The real magic of this is two-fold. First, it's scoped, and so we actually have to import these members before they start messing with our objects. It's hard to over-state how important this is to keeping such extensions from devolving into intractable monkey-patching. Second, it's extremely extensible. What if we want to add another conversion from Foo to Bar? Just define it ourselves as an implicit value in scope! Or, if we &lt;i&gt;don't&lt;/i&gt; want the implicit syntax, we can always specify the conversion explicitly: &lt;pre lang="scala"&gt;// off in *our* code, separate from the converter lib
implicit object StringToBool extends Converter[String, Boolean] { def apply(str: String) = str.toBoolean
} "true".to[Boolean] // =&amp;gt; true
"false".to(StringToBool) // =&amp;gt; false&lt;/pre&gt; I'm not even going to try to imagine how to do this sort of thing in Perl. Even in Ruby, which usually makes monkey-patching quite simple, the implementation still ends up extremely nasty: &lt;pre lang="ruby"&gt;class Object def to(target) case target when :fixnum if self.class == String self.to_i else raise "Unknown conversion: String -&amp;gt; :fixnum" end # ... end end
end&lt;/pre&gt; ...and, you get the picture. You could probably do this in a nicer way, but it would still end up being fragile, unscoped and virtually impossible to extend. &lt;i&gt;This&lt;/i&gt; is what you're throwing away when you discard the type system, not some unreliable correctness "guarantee". And if I can throw together an example like this in a blog comment in just a few lines of Scala, imagine what can be done in a non-trivial system with real requirements. The type system is an intrinsic part of Scala's power and expresivity. Remove it and you're not even looking at the same language.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37357"&gt;March 7, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://www.codecommit.com/blog' class='url'&gt;Daniel Spiewak&lt;/a&gt; wrote: While currying and point-free aren't as syntactically clean as they could be in Scala, they are certainly still used (I use those features all the time). Does this make Scala less "functional" than Haskell or ML? Yeah, probably (I've made that argument in the past). Does it mean that Scala is no more functional than Perl? Absolutely not. Theoretically speaking, currying is possible in &lt;i&gt;any&lt;/i&gt; language which supports closures (alblue, if you're reading, yes I do mean "closure" and not "lambda"). You can even define a curry function in C++, though the obfuscated template mess it entails makes it nigh unreadable. Lambdas ("closures" if you will) and function values do not a functional language make. C has function values, and I don't think anyone who understands the debate will argue that it is "functional". Ruby has function values &lt;i&gt;and&lt;/i&gt; lambdas, but they are fundamentally different constructs and produce different values (just like in Perl). Again, not a functional language (though you can use many patterns which find their roots in FP, like &lt;code&gt;map&lt;/code&gt; and &lt;code&gt;fold&lt;/code&gt;). My point is this: you can't go out of your way to link FP to point-free and lambda calculus and then turn right around and claim that Perl and Scala are in the same league. Scala's unified functions and function values alone should be sufficient to overturn that one.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37358"&gt;March 7, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://enfranchisedmind.com/blog/posts/author/candide/' class='url'&gt;Robert Fischer&lt;/a&gt; wrote: Yes, I meant procedural.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37359"&gt;March 7, 2010&lt;/a&gt;, Martin wrote: You really can't claim "perl has had _____ since the 80's" and then point to books about Perl 5. Perl 25 years ago is *very* different than it is now. Your point that Scala and perl are similar is well taken, but I'm not totally clear why this is bad for Scala or Perl. The way Perl 6 is going towards a virtual machine, I wouldn't be surprised to see Perl and Scala and Java running together on a JVM sometime soon.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37360"&gt;March 7, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://enfranchisedmind.com/blog/posts/author/candide/' class='url'&gt;Robert Fischer&lt;/a&gt; wrote: I'm not saying it's bad for either Scala or perl to be similar to each other — on the point of similarity, I'm simply saying that in the ways Odersky argues Scala is "functional", perl is just as functional, and so I'm still unconvinced that Scala deserves to be called a "functional language". You don't hear people listing off the functional languages like: "Haskell, OCaml, perl, Lisp...". So to hear people say "Haskell, OCaml, Scala, Clojure" just gets my goat. I'm also saying that on the point of similarity, it shouldn't be a surprise that we're getting similar unreadability/complexity complaints about Scala as we got about perl, since they are so similar. I heard something about perl getting onto the JVM for AppEngine, but can't find additional info on it.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37361"&gt;March 7, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://enfranchisedmind.com/blog/posts/author/candide/' class='url'&gt;Robert Fischer&lt;/a&gt; wrote: In what ways do Scala's unififed functions and function values outperform perl?&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37362"&gt;March 7, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://enfranchisedmind.com/blog/posts/author/candide/' class='url'&gt;Robert Fischer&lt;/a&gt; wrote: Note the point I'm arguing: I'm arguing that Scala is no more a functional language than perl is. Functional languages can be dynamic (e.g. Clojure), so static vs. dynamic typing is irrelevant to the point I'm trying to make.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37363"&gt;March 7, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://enfranchisedmind.com/blog/posts/author/candide/' class='url'&gt;Robert Fischer&lt;/a&gt; wrote: You've earned a special spot in my heart: this is my new favorite flame of all time. I mean, the fact that you say I don't have "any real code to show" just goes to show that you're not paying attention, because you've somehow managed to miss my long trail of open source projects. And you kinda missed the boat on the entire fundamental question: "Is Scala a functional programming language?" But still, the Dilbert references, the accidentally-on-purpose "slip of the keyboard", and the general long-suffering tone is really nicely done. A+&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37364"&gt;March 7, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://enfranchisedmind.com/blog/posts/author/candide/' class='url'&gt;Robert Fischer&lt;/a&gt; wrote: Oh, and you're fair on the dating thing. It's hyperbolic to conflate Perl 1 with Perl 5, although I honestly have no idea how far back I can go in perl and still have my code samples work. If you find out, let me know.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37365"&gt;March 7, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://enfranchisedmind.com/blog/posts/author/candide/' class='url'&gt;Robert Fischer&lt;/a&gt; wrote: Brian Hurt, the co-blogger here on EnfranchisedMind, is theoretically working on a post about how OO is fundamentally broken. I'll leave that to him. My experience has been that many of the Gang of Four design patterns just aren't relevant anymore, and inheritance is something I'm extremely reluctant to use and much more aware of its difficulties. I'm not sure exactly what it would mean to say that "the concept of what a type is tends to be much narrower", but I certainly have a much thinner type hierarchies in the world of functional programming.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37366"&gt;March 7, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://enfranchisedmind.com/blog/posts/author/candide/' class='url'&gt;Robert Fischer&lt;/a&gt; wrote: Oh, not to mention the cite of enterprise-ese from SmokejumperIT.com. I mean, that's some real attention to detail for the zingers. In all seriousness, this is my favorite flame of me of all time. Thanks!&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37367"&gt;March 7, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://www.naildrivin5.com/blog' class='url'&gt;Dave&lt;/a&gt; wrote: FWIW, I really dug this post. As to the topic at hand, I'm not even sure what point there is to saying Scala is or isn't "functional". The only real purpose seems to be to make it easy to show how awesome Haskell is by point out Scala's perceived shortcomings as a functional language. For my money, Scala is simply "Java: The Next Generation". A general-purpose, statically-typed, object-oriented language that has broad applicability to many problem domains. Arguing "what is functional" might be a fun exercise, but it's not really going to lead us anywhere; look at most n-tier Java applications: to say they are object oriented would be a vast overstatement. Java is object-oriented in that it's main means of organizing code are around classes and objects (which is exactly the same as in Scala), but most systems still end up using OO only when it helps, and throwing it for imperative/procedural stuff when it makes sense to do so. I would be willing to bet that Scala will be much the same way; the code &lt;b&gt;inside&lt;/b&gt; our classes might be much more functional (simply because its' simply worth-it to do in Scala, whereas it's not terribly so in Java), but I don't see it ushering in some functional utopia (LISP has had, oh, I don't know, &lt;i&gt;the entire history of the field of computer science&lt;/i&gt; to usher this in and largely failed [no offense to LISP]). Scala is an escape route from Java's cruftiness without having to bend your mind or prejudices &lt;b&gt;too&lt;/b&gt; much. Much as Java was to C++.
&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37368"&gt;March 7, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://www.kaleidic.com' class='url'&gt;Tracy Harms&lt;/a&gt; wrote: The most interesting sentence in your post, to me, was this: &lt;em&gt;If your language doesn’t lead people to re-discover point free programming at least in the small, then the language really isn’t taking function manipulation and functional language type conceptions seriously.&lt;/em&gt; This has me wondering, though, about your agreement with Brian that the key quality is reliance on lambda calculus as the model of computation. Not that I'm convinced we need a "key quality." It just looks to me that the range of languages you have in mind would not be identified through this criterion.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37369"&gt;March 8, 2010&lt;/a&gt;, joe poki wrote: what's up with these groovy people nowadays? groovy++ is 10 trillion times faster than scala actors, now this piece. your rant could be summarized like I Do Not Like Scala. Look, I get that. But I must say it's funny that you use this patronizing tone with Odersky as he was a n00b who has no idea about languages and then once you get a trollish comment, you go on and post it everywhere: OMG somebody was responding to my trollish post in a trollish manner, what a surprise? as for your post:
just because a language can be used in a certain way (or certain language toolsets can be simulated in that language) that does not mean that the users will find that specific style idiomatic. What matters is the style you will meet the most while reading or writing code in that specific language (hack, even java has various functional libraries: lambdaj, functionaljava etc. but how many people would consider code written with these library java-like?). When people say that scala is "kinda functional", what they really mean is that the language is nudging you into that direction (preference for pattern matching, option type, final variables, map, foreach,closures, partial functions etc.). And this nudging towards the functional style is what makes scala "postfunctional". (other features responsible for the "scala feel" but not directly related to the functional thing: static typing w/ type inference, a powerful type system, xml literals, implicit converions, case classes, mixins + various actor libs etc.)&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37370"&gt;March 8, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://enfranchisedmind.com/blog/posts/author/candide/' class='url'&gt;Robert Fischer&lt;/a&gt; wrote: My issue isn't with people saying Scala is "kinda functional". It's saying it's a "functional language". I've heard people say they want to learn Scala b/c then they'll know functional programming, and that's just wrong. Worse, I've heard people write off functional programming because they didn't like Scala. This means that the misconception that Scala is a functional language is hurting &lt;em&gt;real&lt;/em&gt; functional language adoption and hindering people's advancement as software developers by making them think they know functional when they don't. So I'm trying to reinforce the barrier between real functional languages and languages with closures. I'm not particularly knocking Odersky here: what he's done with Scala is pretty impressive. But he's clinging to a title that Scala doesn't deserve. While I appreciate the move with "postfunctional", I'd be a big fan if it also meant he'd give up "functional" — but he's just taking both titles on. In so doing, he's diluting what we mean by a "functional language", and that's just not helpful to anyone involved. The evidence does seem to be that Odersky doesn't really know functional languages. Or, if he does know them, he knows them academically or intellectually, and doesn't really grok them. But you can't be an expert on everything, and I get that. This whole conversation is really kind of sad. There's such an extreme dichotomy here: the assumption seems to be that if you criticize a language, you must hate it. I don't hate Scala: Scala is what Java should be. It's finally a competitor to C# on the JVM — the advanced capabilities of C# have been downright embarrassing for a long time, and Scala evens the playing field. I'm just criticizing the way we talk about this language, and providing counter-evidence to some of the claims made about it.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37371"&gt;March 8, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://enfranchisedmind.com/blog/posts/author/candide/' class='url'&gt;Robert Fischer&lt;/a&gt; wrote: Which languages do you see as missing one of the two qualities?&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37372"&gt;March 8, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://enfranchisedmind.com/blog/posts/author/candide/' class='url'&gt;Robert Fischer&lt;/a&gt; wrote: As &lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37370"&gt;I will say below&lt;/a&gt;, my issue is mainly one of vocabulary and pedagogy, because I'm frustrated with the murky waters that such marketing-speak has created.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37374"&gt;March 8, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://enfranchisedmind.com/blog/posts/author/candide/' class='url'&gt;Robert Fischer&lt;/a&gt; wrote: &lt;b&gt;PS:&lt;/b&gt; From someone who has been there &lt;i&gt;(remember: I'm a static typing fan, too)&lt;/i&gt;: If you want to debate static typing usefulness vs. dynamic typing usefulness, don't argue that it's hard to implement type safety in a dynamically typed language. It doesn't win you any points with the dynamic language crowd, because they've already accepted they don't need it.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37376"&gt;March 8, 2010&lt;/a&gt;, Peter Lewerin wrote: Daedalus and his son Icarus were imprisoned by King Minos, and made themselves wings out of wax and feathers to escape. Before they took off from the island, Daedalus warned his son not to fly too close to the sun. The sensation of flying made Icarus forget the warning and he soared higher and higher. Eventually the wax melted and he fell into the sea. A programmer can escape the prison of procedural programming using functional programming, but going for the purest form of FP isn't really a sustainable goal. Most likely, these wonktional programmers will melt their wings by straying too close to the realm of mathematics and plunge to their deaths.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37377"&gt;March 8, 2010&lt;/a&gt;, Thomas Heywood wrote: &lt;cite&gt;And you kinda missed the boat on the entire fundamental question: “Is Scala a functional programming language?"&lt;/cite&gt; Scala is a multiparadigm language that supports procedural, functional and object-oriented programming. We've had that since 1950s and Lisp. Now, what was the fundamental question again?&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37378"&gt;March 8, 2010&lt;/a&gt;, Thomas Heywood wrote: (Mea culpa: we've only really had it supplied with the language since 70s, when Lisp machines took off. Still, a blatant fact is blatant, no matter how much you blog it into shape.)&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37379"&gt;March 8, 2010&lt;/a&gt;, Vassil Dichev wrote: Robert, if you like Perl, that's nothing to be ashamed of :-) Seriously, I think your article is thought-provoking, if a little controversial. Still, there are several things I disagree with. First of all, I have interpreted Odersky's article in the spirit of: "OK, I don't insist on calling Scala a functional language". One important piece you didn't mention was immutable data structures. Perl doesn't scale very favorably here. Was this on purpose? I find it important not just what a language *can* do, but also what it *cannot* (easily) do. Mutation and scoping are some of the things Scala restricts rather successfully. I also don't find how the fact that Perl has flexible arguments, autovivificiation, list/argument coercion, and dynamic symbol table mangling makes it more functional. Does Haskell have these? Do you consider Haskell functional? Then I also don't see many people argue that Java is object-oriented. By the same reasoning, it's not- it certainly has types that are not objects, and you can certainly write in a procedural style in Java (unfortunately some people really do). Also, I don't see you arguing that OCaml is not object-oriented, because it's also considered a multi-paradigm language. I see that in one of your comments you agree that OO is poor in OCaml, which is fair enough, but I think some OCaml users wouldn't agree with you on this count either. I most emphatically agree that if you "know" how to write working Scala code, this doesn't mean you know all about functional programming. But I disagree that this harms "real" (read purer) functional languages any more than Java harms "real" object-oriented languages (whatever they are). In the end, I'm also fine with the definition of "statically typed object oriented language with closures".&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37380"&gt;March 8, 2010&lt;/a&gt;, Vassil Dichev wrote: I've just read some of the blog posts you've linked to, and it's quite telling that &lt;a rel="nofollow" target="_blank" href="http://creativekarma.com/ee.php/weblog/comments/my_verdict_on_the_scala_language/"&gt;two&lt;/a&gt; of &lt;a rel="nofollow" target="_blank" href="http://www.weiqigao.com/blog/2008/03/24/scala_still_uncomfortable_after_five_years.html"&gt;them&lt;/a&gt; complain that Scala is &lt;em&gt;too&lt;/em&gt; functional, while you complain that it's not functional &lt;em&gt;enough&lt;/em&gt;. I think this is the problem with Scala: you can't appease everybody without any mental effort on their part to get used to the new style of programming. And I think the same can be said of OCaml. I also think OCaml would be a wonderful language to learn (and I might try it soon).&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37382"&gt;March 8, 2010&lt;/a&gt;, Paul Kaletta wrote: All of your examples should work with any version of Perl 5, which came out in 1994.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37384"&gt;March 8, 2010&lt;/a&gt;, Martin Odersky wrote: Robert: Your blog and even more so your comments make it sound as if I have no clue about what functional programming is. So, it must be because of a series of freak accidents that I organized ICFP, am a member of the IFIP working group on functional programming and am a member of the editorial board of the Journal of Functional Programming. And I even published quite a bit on lambda calculus, too :-). Seriously, I stand completely by my article on postfunctional programming. I believe your post here has added nothing of substance to the discussion. http://www.scala-lang.org/node/4960&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37386"&gt;March 8, 2010&lt;/a&gt;, joe poki wrote: if you cite every single well-known post that dismisses scala one way or another and you go on and say "it’s too complicated, its syntax is weird, it’s too magical, people write in entirely distinct subsets of the language", then people will rightly assume you do not like scala, I do not get it why you are surprised (notice, I did not say you hate it, just that you dislike it). see, the patronizing stuff again "Odersky doesn’t really know functional languages". As I tried to point out: what matters is how a language is used and what's considered idiomatic and in that sense scala definitely has some functional feel to it (and no, it's not just about closures or foreach, but preference for pattern matching, option types, final variables, map, foreach,closures, partial functions etc. etc.).&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37387"&gt;March 8, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://www.kaleidic.com' class='url'&gt;Tracy Harms&lt;/a&gt; wrote: To the best of my knowledge, Factor, Joy, FL, and J are languages that favor anonymous arguments (and/or emphasize composition of functions) while lacking reliance on lambda expressions.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37388"&gt;March 8, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://enfranchisedmind.com/blog/posts/author/candide/' class='url'&gt;Robert Fischer&lt;/a&gt; wrote: If you're up for not calling Scala a "functional programming language", tell Odersky.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37389"&gt;March 8, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://enfranchisedmind.com/blog/posts/author/candide/' class='url'&gt;Robert Fischer&lt;/a&gt; wrote: It's not patronizing to say someone doesn't know something, or to disagree with the way someone is using language. That's just not what patronizing speech is. It'd be patronizing if I started explaining to Odersky what closures are and how they're supposed to work, or &lt;a rel="nofollow" target="_blank" href="http://tinyurl.com/yk9nas8"&gt;if I sent you off to look at this link&lt;/a&gt;. &lt;em&gt;That&lt;/em&gt; would be patronizing.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37390"&gt;March 8, 2010&lt;/a&gt;, Thomas Heywood wrote: &lt;cite&gt;Your blog and even more so your comments make it sound as if I have no clue about what functional programming is.&lt;/cite&gt; Martin, hate to break it to you, but all you ever did was bring effective functional programming to a mainstream platform for the benefit of industry and academia. Call me back when you write a wrapper library or two, learn the persistence API of a web framework, or &lt;cite&gt;realign the tone of existing projects.&lt;/cite&gt;&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37391"&gt;March 8, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://enfranchisedmind.com/blog/posts/author/candide/' class='url'&gt;Robert Fischer&lt;/a&gt; wrote: That's cool that you're so involved. Ultimately, though, our problem is boiling down to one of language. If Scala and perl are functional languages, how do we differentiate them from languages like Haskell, OCaml, and Lisp, where the fundamental way of tackling problems is different? I'd like to use the term "functional programming language" for the latter, and I'm more than happy to stick to "postfunctional programming language" or "multi-paradigm programming language" for the former. But that means we stop calling Scala a functional programming language, as most of the commenters here on the post already have. Deal?&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37392"&gt;March 8, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://enfranchisedmind.com/blog/posts/author/candide/' class='url'&gt;Robert Fischer&lt;/a&gt; wrote: Yeah, that's the general issue with these multiparadigm languages like Scala and perl. If OCaml narrowly avoided that fate (and I think it has), it was by completely subjugating the OO aspect to the functional aspect, and not really using the OO aspect much.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37393"&gt;March 8, 2010&lt;/a&gt;, joe poki wrote: If you think saying somebody does not know squat about a subject while that person is supposed to be some sort of an expert on the topic is not condescending, then I do not know what is. By the way, it seems I was not alone, see Odersky's comment above.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37394"&gt;March 8, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://enfranchisedmind.com/blog/posts/author/candide/' class='url'&gt;Robert Fischer&lt;/a&gt; wrote: The immutability is a good point, and it's an area where Scala certainly pulls ahead. Actually, the Ruby (and, to a lesser extent, C#) people regularly say that Java isn't really OO, because a lot of things in Java weren't either objects or messages. I think Ruby inherited that criticism from the old SmallTalk people. And I'll happily argue that OCaml isn't object oriented: while it &lt;em&gt;has&lt;/em&gt; objects, it's certainly not oriented towards them. What harms functional programming languages is when Java people learn Scala and then think they know functional programming languages. Or, worse, when they decide they don't like Scala and then conclude they don't like functional programming. This happens &lt;em&gt;a lot&lt;/em&gt; because Scala was lauded as a functional programming language on the JVM which was comfortable for Java people. It's the murkiness in the water that's the issue.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37395"&gt;March 8, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://www.codecommit.com/blog' class='url'&gt;Daniel Spiewak&lt;/a&gt; wrote: In Perl, functions and lambdas are fundamentally different. If nothing else, this can be seen by the different invocation syntax. You can convert between functions and lambdas (just like in Ruby and Groovy), but they are very different constructs as far as the language is concerned. To me, one of the essentials of a functional language is that functions are merely lambdas which have been assigned to a named value. OCaml and Haskell encourage this notion with their syntax for function declaration (in fact, Haskell's function decl syntax is &lt;i&gt;exactly&lt;/i&gt; the same as its value decl syntax). Perl doesn't even come close to meeting this qualification. Scala does &lt;i&gt;substantially&lt;/i&gt; better, though I'll admit that it does have its gotchas (methods are sometimes tricky).&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37396"&gt;March 8, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://enfranchisedmind.com/blog/posts/author/candide/' class='url'&gt;Robert Fischer&lt;/a&gt; wrote: While that's a bit hardcore of a comparison (and somewhat damning on people's ability to learn), I definitely agree with your point. And Scala's great in this regard—as I said a number of times, I think Scala is where Java should be if Java's growth hadn't been stunted. If you look at how C# has evolved, Scala's basically right in line with that kind of development. And so a Java developer learning Scala in order to push their way of thinking about types and functions is a great move.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37397"&gt;March 8, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://enfranchisedmind.com/blog/posts/author/candide/' class='url'&gt;Robert Fischer&lt;/a&gt; wrote: True — I'm oversimplifying the world into imperative and functional. There are other paradigms out there (e.g. Factor's stack-based approach) which also can lead to point free programming.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37398"&gt;March 8, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://enfranchisedmind.com/blog/posts/author/candide/' class='url'&gt;Robert Fischer&lt;/a&gt; wrote: Do they work before that? (Or, rather, would they work before that if I dumped the prototypes?)&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37399"&gt;March 8, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://enfranchisedmind.com/blog/posts/author/candide/' class='url'&gt;Robert Fischer&lt;/a&gt; wrote: True: there are conversions that need to be made between functions and lambdas in perl. This suggests for Scala (as a multiparadigm language) having a somewhat stronger functional aspect than perl, but it still doesn't make it a functional programming language &lt;i&gt;a la&lt;/i&gt; OCaml and Haskell.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37400"&gt;March 8, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://aliciaweller.com/' class='url'&gt;Alicia&lt;/a&gt; wrote: Wouldn't it be awesome if you really could make money writing b.s.? People won't even donate a dollar towards valuable open source projects...the suggestion that you could make money for being good at b.s. is hilarious.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37401"&gt;March 8, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://enfranchisedmind.com/blog/posts/author/candide/' class='url'&gt;Robert Fischer&lt;/a&gt; wrote: Amen.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37402"&gt;March 8, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://enfranchisedmind.com/blog/posts/author/candide/' class='url'&gt;Robert Fischer&lt;/a&gt; wrote: True enough. I'm just trying to wrap my head around how Odersky can really grok functional programming and then assert that it's simply bolt-on features of a language. The difference between Haskell and Java is not simply one of syntactic sugar. Claiming he's mistaken about how FP works is actually a generous take—claiming he's clinging to the FP title for Scala for some ulterior reason when he should know better is much less generous. I was trying to give him the benefit of the doubt.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37403"&gt;March 8, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://james-iry.blogspot.com' class='url'&gt;James Iry&lt;/a&gt; wrote: Robert Fischer Finally Admits That Scala Is Functional (http://james-iry.blogspot.com/2010/03/robert-fischer-finally-admits-that.html)&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/post-functional-scala/#comment-37404"&gt;March 8, 2010&lt;/a&gt;, Martin Odersky wrote: Robert, please, read my post again: http://www.scala-lang.org/node/4960 Nowhere did I define functional programming exclusively by a list of features. Instead I had as my central definition: "A functional language makes programming centered around functions easy and natural." A good test of this would be: is it common to write functional programs in the language in question? It's usually far easier to tell whether a program is functional than whether a programming language is functional. By that standard Scala is clearly functional; many of the classes and modules written in it are purely functional and every cool idea from Haskell seems to be implemented sooner or later in Scala (not that we don't invent some cool ideas of our own as well). I don't know Perl well enough to be able to tell whether there are many functional programs written in it, and whether the expression of such programs is easy and natural.</description>
      <pubDate>Sat, 06 Mar 2010 21:30:00 CST</pubDate>
      <guid isPermaLink="true">http://enfranchisedmind.com/blog/?p=2330</guid>
      <dc:creator>Robert Fischer</dc:creator>
    </item>
    <item>
      <title>Griffon rises once more</title>
      <link>http://www.springone2gx.com/blog/andres_almiray/2010/03/griffon_rises_once_more</link>
      <description>&lt;p&gt;The Griffon team is very pleased to announce that &lt;a hre="http://groovy.dzone.com/announcements/griffon-03-released"&gt;Griffon 0.3 has been released!&lt;/a&gt;. This release is loaded with new features, plus a good number of bug fixes. Here's a quick tour on what 0.3 has to offer:&lt;/P&gt;

&lt;h3&gt;Addon enhancements&lt;/h3&gt;
&lt;p&gt;As you may know, addons are Griffon's runtime plugins; you can use them to extend the capabilities of an application. Addons were introduced in 0.2 however they only exposed a small set of hooks (factories, methods, props) plus their own life cycle hooks. Starting form this release addons are able to contribute application event listeners and all types of delegates that a FactoryBuilderSupport builder can handle.&lt;/p&gt;

&lt;h3&gt;Native libraries support&lt;/h3&gt;
&lt;p&gt;What do you do if your application requires a platform specific library or jar? What if you need to package several of those depending on which platform you intend to run on? What about plugins and native libraries? Well all these questions and more can now be solved by following a file placement convention that can save you lots of time. Supported platforms at the moment include: Windows, Linux, OSX and Solaris (all 32bit versions).
&lt;/p&gt;

&lt;h3&gt;Packaging enhancements&lt;/h3&gt;
&lt;p&gt;Closely related to native libraries support, you're now able to specify additional settings and resources that can merged into the generated JNLP files when running on webstart and applet modes. No need to manually fumble with those files anymore. Plugins can take advantage of this feature too.
&lt;/p&gt;

&lt;h3&gt;Artifacts API&lt;/h3&gt;
&lt;p&gt;Since the beginning Griffon has had basic artifacts (Model, View, Controller) but there was no easy way to query them for additional info. This is precisely what the artifacts API does for you now. Additional artifact types may be added an listed when calling 'griffon stats'. this API is further enhanced by the &lt;a href="http://griffon.codehaus.org/Artifacts+Plugin"&gt;artifacts-plugin&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Lightweight services&lt;/h3&gt;
&lt;p&gt;Griffon 0.3 introduces services support. Services in Griffon differ from their Grails counterparts as they are not transactional. The Griffon runtime will inject an instance of a particular service to other artifatcs following a simple naming convention; this is not a replacement for a full DI solution but gets the job done without installing additional plugins.&lt;/p&gt;

&lt;h3&gt;Threading additions&lt;/h3&gt;
&lt;p&gt;While SwingBuilder's &lt;tt&gt;edt{}&lt;/tt&gt;, &lt;tt&gt;doLater{}&lt;/tt&gt; and &lt;tt&gt;doOutside{}&lt;/tt&gt; are very handy they only work if the current toolkit is Swing. Griffon supports other toolkits via plugins (SWT, Pivot, Gtk, and JavaFX) so it makes sense to have generic threading facilities that can work with any toolkit. This is precisely what &lt;tt&gt;UIThreadHelper&lt;/tt&gt; does.&lt;/p&gt;

In addition to this features, a new set of plugins is available too; check'em out&lt;ul&gt;
&lt;li&gt;&lt;a href="http://griffon.codehaus.org/Artifacts+Plugin"&gt;artifacts&lt;/a&gt; - further enhancements to the artifacts API. distributed as a plugin to keep core's dependency count low.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://griffon.codehaus.org/I18n+Plugin"&gt;i18n&lt;/a&gt; - message i18n support using Spring's MessageSources.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://griffon.codehaus.org/Erlang+Plugin"&gt;erlang&lt;/a&gt; - support for making RPC calls to Erlang servers using Erlang's JInterface.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://griffon.codehaus.org/Flyingsaucer+Plugin"&gt;flyingsaucer&lt;/a&gt; - an XHTML renderer component.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://griffon.codehaus.org/Processing+Plugin"&gt;processing&lt;/a&gt; - make 2D/3D renders and animations with the Processing Programming language and Griffon.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://griffon.codehaus.org/Serial+Plugin"&gt;serial&lt;/a&gt; - serial port communication libraries.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://griffon.codehaus.org/Thrift+Plugin"&gt;thrift&lt;/a&gt; - Apache Thrift support (another serialization option).&lt;/li&gt;
&lt;li&gt;&lt;a href="http://griffon.codehaus.org/Jmx+Plugin"&gt;jmx&lt;/a&gt; - a straight port of the Grails JMX plugin, originally created by Ken Sipe.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://griffon.codehaus.org/P6spy+Plugin"&gt;p6spy&lt;/a&gt; - another Grails plugin port.&lt;/li&gt;
&lt;/ul&gt;
Speaking of toolkits the following plugins have become available too:&lt;ul&gt;
&lt;li&gt;&lt;a href="http://griffon.codehaus.org/Swt+Plugin"&gt;swt&lt;/a&gt; - relies on SWTBuilder.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://griffon.codehaus.org/Pivot+Plugin"&gt;pivot&lt;/a&gt; - brand new UI Toolkit from VMWare labs, donated to Apache.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://griffon.codehaus.org/Gtk+Plugin"&gt;gtk&lt;/a&gt; - GNOME integration via java-gnome.&lt;/li&gt;
&lt;/ul&gt;
Griffon couldn't stay behind the recent NoSQL movement:
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://griffon.codehaus.org/Berkeleydb+Plugin"&gt;berkeleydb&lt;/a&gt; - available now!&lt;/li&gt;
&lt;li&gt;&lt;a href="http://griffon.codehaus.org/Db4o+Plugin"&gt;db4o&lt;/a&gt; - available now!&lt;/li&gt;
&lt;li&gt;&lt;a href="http://griffon.codehaus.org/Couchdb+Plugin"&gt;couchdb&lt;/a&gt; - preview mode&lt;/li&gt;
&lt;li&gt;&lt;a href="http://griffon.codehaus.org/Neo4j+Plugin"&gt;neo4j&lt;/a&gt; - preview mode&lt;/li&gt;
&lt;li&gt;&lt;a href="http://griffon.codehaus.org/Riak+Plugin"&gt;riak&lt;/a&gt; - preview mode&lt;/li&gt;
&lt;/ul&gt;
Other existing plugins have been updated, perhaps most notably &lt;a href="http://griffon.codehaus.org/Spring+Plugin"&gt;Spring&lt;/a&gt;, &lt;a href="http://griffon.codehaus.org/GSQL+Plugin"&gt;GSQL&lt;/a&gt; and builder plugins.&lt;br/&gt;&lt;br/&gt;Let us know what your impressions are of these new features and tools. We would also appreciate if you let us know if Griffon has been of use to you and how. Feedback is welcome always.&lt;br/&gt;&lt;br/&gt;Keep on Groovying!</description>
      <pubDate>Sat, 06 Mar 2010 17:45:00 CST</pubDate>
      <guid isPermaLink="true">http://www.jroller.com/aalmiray/entry/griffon_rises_once_more</guid>
      <dc:creator>Andres Almiray</dc:creator>
    </item>
    <item>
      <title>Free lunches, mousetraps and the Actor model</title>
      <link>http://www.springone2gx.com/blog/andrew_glover/2010/03/free_lunches_mousetraps_and_the_actor_model</link>
      <description>&lt;p&gt;&lt;img style="PADDING-LEFT: 1.0em; PADDING-RIGHT: 0.0em; PADDING-TOP: 0.0em; FLOAT: RIGHT; PADDING-BOTTOM: 0.0em" src="http://thediscoblog.com/images/2010/freelunch.jpg" alt="free lunch" width="231" height="198"/&gt;A politician once mused &lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;A free lunch is only found in mousetraps.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;While this quote is amusing, it&amp;#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 &amp;#8220;&lt;A HREF="http://www.gotw.ca/publications/concurrency-ddj.htm"&gt;The Free Lunch is Over: A Fundamental Turn Toward Concurrency in Software&lt;/A&gt;&amp;#8221; that was published in &lt;A HREF="http://www.ddj.com/"&gt;Dr Dobb&amp;#8217;s Journal&lt;/A&gt; back in 2005. In this well crafted masterpiece, Mr Sutter tore apart the misplaced belief that &lt;A HREF="http://en.wikipedia.org/wiki/Moore%27s_law"&gt;Moore&amp;#8217;s Law&lt;/A&gt; would continue to unleash higher and higher CPU clock speeds and thus he predicted an end of the &amp;#8220;free lunch&amp;#8221; that we&amp;#8217;ve had when it comes to increasing the performance of software applications. That is, clock speeds have roughly stabilized around 3GHz &amp;#8212; and they&amp;#8217;ve held there for a few years now. &lt;/p&gt;
&lt;p&gt;As Mr. Sutter points out&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;the growth [in chip speeds speeds] will come mostly in directions that do not take most current applications along for their customary free ride.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Thus, obtaining an appreciable speed up in application performance requires taking advantage of multi-core chip architectures (where Moore&amp;#8217;s Law has been realized). And to do this, of course, Mr. Sutter advocates &lt;A HREF="http://thediscoblog.com/2008/09/06/concurrency-is-hard-but-does-anyone-care/"&gt;concurrent programming&lt;/A&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;applications will increasingly need to be concurrent if they want to fully exploit CPU throughput gains&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;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: &lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;we desperately need a higher-level programming model for concurrency than languages offer today&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Indeed, the basic programming model of hip languages like Java is thread based. And while multi-threaded applications aren&amp;#8217;t terribly hard to write &amp;#8212; there are challenging to &lt;I&gt;write correctly&lt;/I&gt;. &lt;/p&gt;
&lt;p&gt;In a paper published in 2006 by Edward A. Lee entitled &amp;#8220;&lt;A HREF="http://www.eecs.berkeley.edu/Pubs/TechRpts/2006/EECS-2006-1.pdf"&gt;The Problem with Threads&lt;/A&gt;&amp;#8220;, the author argues that concurrent programming isn&amp;#8217;t all that hard. In his view, the problem isn&amp;#8217;t with concurrency &amp;#8212; it&amp;#8217;s with the prevailing model: threads. &lt;/p&gt;
&lt;p&gt;As he states: &lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;The problem is that we have chosen concurrent abstractions that do not even vaguely resemble the concurrency of the physical world&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;The author goes on to point out that the inherent non deterministic nature of threads presents a conundrum for developers: &lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;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.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;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 &lt;A HREF="http://thediscoblog.com/2008/12/01/code-coverage-coterie-confab/"&gt;100% code coverage&lt;/A&gt; (note, what type of coverage or how it was obtained wasn&amp;#8217;t disclosed) ran for 4 years without error. Nevertheless, finally the code deadlocked. He goes on to speculate that many &lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;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&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;As such, Mr. Lee espouses an alternative to threads: &lt;A HREF="http://en.wikipedia.org/wiki/Actor_model"&gt;actors&lt;/A&gt;. He&amp;#8217;s quick to note that actor-oriented models aren&amp;#8217;t new, but what he does suggest is interesting. He notes that languages that have actors, such as &lt;A HREF="http://thediscoblog.com/2008/10/19/book-review-programming-erlang/"&gt;Erlang&lt;/A&gt;, weren&amp;#8217;t taking root (at the time); thus, he submits:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;We should not replace established languages. We should instead build on them.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Fast forward to today. Java the platform isn&amp;#8217;t dead. It&amp;#8217;s thriving with a multitude of alternate JVM languages &amp;#8212; a few of which embed the actor model (namely &lt;A HREF="http://thediscoblog.com/2009/12/10/book-review-programming-scala/"&gt;Scala&lt;/A&gt;). What&amp;#8217;s more, libraries written in Java and for Java are available, which enable the actor model (such as &lt;A HREF="http://www.malhar.net/sriram/kilim/"&gt;Kilim&lt;/A&gt;). Plus, the Java language itself has started to add more complex features to enable easier concurrent programming. &lt;/p&gt;
&lt;p&gt;So what&amp;#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 &lt;A HREF="http://thediscoblog.com/2008/10/19/poll-which-language-is-better-suited-for-jvm-concurrency/"&gt;frameworks&lt;/A&gt; and &lt;A HREF="http://thediscoblog.com/2008/10/31/is-scala-or-clojure-poised-for-stardom/"&gt;alternate languages&lt;/A&gt;. Therefore, learn them today, lest you find yourself snagged by a mousetrap, man.&lt;/p&gt;
                                 &lt;p&gt;&lt;center&gt;Looking to spin up Continuous Integration &lt;em&gt;quickly&lt;/em&gt;? Check out &lt;a href="http://www.ciinabox.com"&gt;www.ciinabox.com&lt;/a&gt;.&lt;/center&gt;&lt;/p&gt;</description>
      <pubDate>Tue, 02 Mar 2010 18:01:00 CST</pubDate>
      <guid isPermaLink="true">http://thediscoblog.com/?p=1061</guid>
      <dc:creator>Andrew Glover</dc:creator>
    </item>
    <item>
      <title>Part 1 of Jonas Partner's series on OpenCredo Esper extension project</title>
      <link>http://www.springone2gx.com/blog/russell_miles/2010/02/part_1_of_jonas_partner_s_series_on_opencredo_esper_extension_project</link>
      <description>&lt;p&gt;My colleague Jonas Partner has just published the &lt;a href="http://www.jonaspartner.com/?p=335"&gt;first article&lt;/a&gt; in a series that is going to provide a walk through the new &lt;a href="http://www.opencredo.com/technologies/opencredo-esper"&gt;OpenCredo Esper&lt;/a&gt; extension project.&lt;/p&gt;
&lt;p&gt;For anyone interested in what this project brings to the event-based-architecture table, &lt;a href="http://www.jonaspartner.com/?p=335"&gt;Jonas' series&lt;/a&gt; is a great place to start.&lt;/p&gt;</description>
      <pubDate>Fri, 26 Feb 2010 07:25:53 CST</pubDate>
      <guid isPermaLink="true">http://www.russmiles.com/home/2010/2/26/part-1-of-jonas-partners-series-on-opencredo-esper-extension.html</guid>
      <dc:creator>Russell Miles</dc:creator>
    </item>
    <item>
      <title>Azure pricing and what this means for the cloud market, explained on InfoQ</title>
      <link>http://www.springone2gx.com/blog/russell_miles/2010/02/azure_pricing_and_what_this_means_for_the_cloud_market_explained_on_infoq</link>
      <description>&lt;p&gt;My &lt;a href="http://www.infoq.com/news/2010/02/azure-pricing"&gt;first article for InfoQ&lt;/a&gt; was published earlier today. In this article I summarise an interview with Matt Deacon of Microsoft on Windows Azure's entry into the priced, public cloud market.&lt;/p&gt;
&lt;p&gt;This is a real rite-of-passage for the Azure PaaS and I attempt to frame what this means within the context of the emerging cloud utility market.&lt;/p&gt;</description>
      <pubDate>Thu, 25 Feb 2010 04:54:23 CST</pubDate>
      <guid isPermaLink="true">http://www.russmiles.com/home/2010/2/25/azure-pricing-and-what-this-means-for-the-cloud-market-expla.html</guid>
      <dc:creator>Russell Miles</dc:creator>
    </item>
    <item>
      <title>easyb will support behavior tagging</title>
      <link>http://www.springone2gx.com/blog/andrew_glover/2010/02/easyb_will_support_behavior_tagging</link>
      <description>&lt;p&gt;Back in the Age of Aquarius, I wrote an article entitled &amp;#8220;&lt;A HREF="http://www.ibm.com/developerworks/java/library/j-cq10316/index.html"&gt;Use test categorization for agile builds&lt;/A&gt;&amp;#8221; in which I attempted to delineate various types of tests and then went on to suggest how to categorize these various tests so as to get the most out of a build run (i.e make it fast and effective at providing meaningful feedback).  Back then (and to an extent now) my concern was with test &lt;i&gt;execution&lt;/i&gt;; that is, I like to categorize tests as fast and slow. Accordingly, I run the fast ones all the time, such as before I check-in (I prefer a fast build to be less than 3 minutes &amp;#8212; longer and I get bored). What&amp;#8217;s more, for the slow ones, I usually schedule a build (via Hudson, for instance) that runs them hourly, nightly, etc &amp;#8212; it all depends on how slow they are, man! &lt;/p&gt;
&lt;p&gt;As it turns out, unit-like tests are usually the fast ones and functional-like tests are the slow ones. This all makes sense as functional ones usually &lt;A HREF="http://www.ibm.com/developerworks/java/library/j-cq09266.html"&gt;require a lot of test up&lt;/A&gt;, like seeding a database or firing up Selenium. &lt;/p&gt;
&lt;p&gt;Categorizing tests by execution speed it helpful, but a bit broad in some cases. Thus, I often find myself grouping tests (or behaviors) by feature, behavior or goal. That is, there might be a macro-feature in development broken up by a series of stories (or tests) and I find it&amp;#8217;s helpful to run those stories as a group in isolation for focus. Those behavior groups are then aggregated into iteration builds that correspondingly execute all targeted behaviors, for instance. &lt;/p&gt;
&lt;p&gt;This exercise, combined with the &lt;A HREF="http://www.oracle.com/technology/pub/articles/dev2arch/2006/09/testng-categorization.html"&gt;influence of TestNG&lt;/A&gt; (which supported test groups long long ago) has lead to a new feature in &lt;A HREF="http://easyb.org/"&gt;easyb&lt;/A&gt;: tags. With the &lt;code&gt;tags&lt;/code&gt; keyword, you can categorize a behavior and then  exercise only those desired behaviors via the &lt;code&gt;-tags&lt;/code&gt; command line option or via the &lt;code&gt;tags&lt;/code&gt; attribute in easyb&amp;#8217;s Ant task, for instance.&lt;/p&gt;
&lt;p&gt;Thus, the following story is tagged as &amp;#8220;23949314&amp;#8243; &amp;#8212; this happens to be a &lt;A HREF="http://www.pivotaltracker.com/"&gt;Pivotal Tracker&lt;/A&gt; story ID and in the current iteration, there are 4 stories 23949314, 23949315, 23949316, 23949317. &lt;/p&gt;
&lt;pre class="brush: groovy;"&gt;
tags &amp;quot;23949314&amp;quot;

scenario &amp;quot;AcmeFoo should support expired account deletions&amp;quot;
scenario &amp;quot;AcmeFoo should support child account deletions&amp;quot;
&lt;/pre&gt;
&lt;p&gt;The beauty here is that when this particular story is run, its status is &lt;i&gt;pending&lt;/i&gt;, thus providing some status as to a particular feature. &lt;/p&gt;
&lt;p&gt;Going forward in this iteration, subsequent easyb stories are tagged with appropriate IDs (23949315, etc) and during this iteration, builds are run that exercise these particular tags in isolation. Of course, there are other builds that exercise all other existing stories (via a build pipeline) so as to perform a continuous regression. &lt;/p&gt;
&lt;p&gt;The &lt;code&gt;tags&lt;/code&gt; keyword is flexible too &amp;#8212; you can add multiple tags by including the tag names in a &lt;code&gt;List&lt;/code&gt; like so:&lt;/p&gt;
&lt;pre class="brush: groovy;"&gt;
tags [&amp;quot;23949314&amp;quot;, &amp;quot;functional&amp;quot;]

scenario &amp;quot;AcmeFoo should support expired account deletions&amp;quot;
scenario &amp;quot;AcmeFoo should support child account deletions&amp;quot;
&lt;/pre&gt;
&lt;p&gt;In this case, this story is tagged as both 23949314 &lt;I&gt;and functional&lt;/I&gt; &amp;#8212; accordingly, a build can be configured to  execute only functional behaviors and, of course, this one will be included. Conversely, if a build is run with a tag such as prototype, then this particular story won&amp;#8217;t be executed. &lt;/p&gt;
&lt;p&gt;This is an evolving feature in easyb. Right now, only story level tags are supported. Scenario tagging is planned. What&amp;#8217;s more, tags are currently supported in the tip of &lt;A HREF="http://code.google.com/p/easyb/source/browse"&gt;easyb&amp;#8217;s SVN repository&lt;/A&gt; &amp;#8212; if you&amp;#8217;re eager to start using them now, you&amp;#8217;ll have to &lt;A HREF="http://easyb.org/source.html"&gt;build your own version of easyb&lt;/A&gt;. Otherwise, a release is forthcoming, which will contain this feature. Can you dig it? &lt;/p&gt;
                                 &lt;p&gt;&lt;center&gt;Looking to spin up Continuous Integration &lt;em&gt;quickly&lt;/em&gt;? Check out &lt;a href="http://www.ciinabox.com"&gt;www.ciinabox.com&lt;/a&gt;.&lt;/center&gt;&lt;/p&gt;</description>
      <pubDate>Mon, 22 Feb 2010 18:31:00 CST</pubDate>
      <guid isPermaLink="true">http://thediscoblog.com/?p=1054</guid>
      <dc:creator>Andrew Glover</dc:creator>
    </item>
    <item>
      <title>Setting up Clojure 1.1.0 on Mac OSX</title>
      <link>http://www.springone2gx.com/blog/ken_sipe/2010/02/setting_up_clojure_1_1_0_on_mac_osx</link>
      <description>As part of the &lt;a href="http://lambdalounge.org/"&gt;Lambda Lounge&lt;/a&gt;, established by Alex Miller (Thanks!!), we have started a group to study the SICP.    We just started and are going virtual... if you would like to participate, email or tweet me (@kensipe).   In the process of studying SICP and LISP, I plan on focusing on Clojure.  Clojure was previously on my machine as I was reading Stu's book &lt;a href="http://www.amazon.com/Programming-Clojure-Pragmatic-Programmers-Halloway/dp/1934356336"&gt;Programming Clojure&lt;/a&gt;, however increased usage would require some maturing of my tools.  This led to the discovery of Mark Reid's blog on &lt;a href="http://mark.reid.name/sap/setting-up-clojure.html"&gt;Setting up Clojure for Mac OS X&lt;/a&gt;, however I assume based on updates and changes over the last year, it requires some updates.&lt;br /&gt;&lt;br /&gt;Read Mark's blog first... getting clojure, the clojure-contrib and jline.  Here are the differences:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Create an environment variable CLOJURE_HOME assigned to the directory for clojure&lt;/li&gt;&lt;li&gt;Create the /bin directory for the clj script included below&lt;/li&gt;&lt;li&gt;Add $CLOJURE_HOME/bin in the $PATH&lt;/li&gt;&lt;li&gt;Clojure is distributed with clojure.jar in the CLOJURE_HOME... so I maintain that.  It is expected that contrib and jline are in the same directory.&lt;/li&gt;&lt;li&gt;Mark's clj script has been updated below... The previous script invokes classes which are depreciated.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Here is the updated script:&lt;br /&gt;&lt;pre class="brush: bash"&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;# Runs Clojure using the classpath specified in the `.clojure` file of the&lt;br /&gt;# current directory.&lt;br /&gt;#&lt;br /&gt;# Ken Sipe &lt;http: com=""&gt;  2010-02-20&lt;br /&gt;# Inspired by Mark Reid &lt;http: name=""&gt;&lt;br /&gt;# original: http://github.com/mreid/clojure-framework/blob/e1c80cc650f448713243be8272dba1fa3c1a7cea/clj&lt;br /&gt;#&lt;br /&gt;# This scripts expects $JAVA_HOME and $CLOJURE_HOME to be defined for the system it is running on&lt;br /&gt;# The clojure.jar is standardly in the clojure_home dir (and not in the lib directory), so&lt;br /&gt;# the expectation is that clojure-contrib.jar and the jline.jar are placed in the same dir&lt;br /&gt;&lt;br /&gt;CLJ_DIR=$CLOJURE_HOME&lt;br /&gt;CLOJURE=$CLJ_DIR/clojure.jar&lt;br /&gt;CONTRIB=$CLJ_DIR/clojure-contrib.jar&lt;br /&gt;JLINE=$CLJ_DIR/jline-0_9_5.jar&lt;br /&gt;CP=$PWD:$CLOJURE:$JLINE:$CONTRIB&lt;br /&gt;&lt;br /&gt;# Add extra jars as specified by `.clojure` file&lt;br /&gt;if [ -f .clojure ]&lt;br /&gt;then&lt;br /&gt;   CP=$CP:`cat .clojure`&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;if [ -z "$1" ]; then&lt;br /&gt;   java -server -cp $CP \&lt;br /&gt;        jline.ConsoleRunner clojure.lang.Repl&lt;br /&gt;else&lt;br /&gt;   java -server -cp $CP clojure.main -i $*&lt;br /&gt;fi&lt;br /&gt;&lt;/pre&gt;Love the TextMate support and the history support in JLine!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-6961516311112589806?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</description>
      <pubDate>Sun, 21 Feb 2010 22:27:00 CST</pubDate>
      <guid isPermaLink="true">tag:blogger.com,1999:blog-7461275049781191261.post-6961516311112589806</guid>
      <dc:creator>Ken Sipe</dc:creator>
    </item>
    <item>
      <title>OpenCredo Esper is Go!</title>
      <link>http://www.springone2gx.com/blog/russell_miles/2010/02/opencredo_esper_is_go_</link>
      <description>&lt;p&gt;I have the huge pleasure today of announcing the public availability of the open source &lt;a href="http://www.opencredo.com/technologies/opencredo-esper"&gt;OpenCredo Esper project&lt;/a&gt;, which has today hit its 1.0 release. From Jonas Partner's (O/C Esper project lead) release notes:&lt;/p&gt;
&lt;blockquote&gt;&lt;!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } 		A:link { so-language: zxx } --&gt;
&lt;p&gt;The  OpenCredo Esper project builds on top of the excellent Complex Event Stream processing project, &lt;a href="http://esper.codehaus.org"&gt;Esper&lt;/a&gt;.  The OpenCredo Esper project is primarily motivated by a desire to make using Esper easier within messaging applications built on Spring Integration.&lt;/p&gt;
&lt;p&gt;Using Esper to provide views of the data/messages passing through a system is an excellent way to improve the comprehension of complex event driven/asynchronous messaging based applications in Spring Integration.&lt;/p&gt;
&lt;p&gt;In order to implement the Spring Integration integrations, the OpenCredo Esper project also created a Spring-style template which makes calling Esper extremely simple regardless of whether the application is using Spring Integration.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I had a hand in the early development of this project and it's great to see it joining the &lt;a href="http://www.opencredo.com/technologies/opencredo-amq"&gt;OpenCredo AMQ&lt;/a&gt; project in our open source ranks.&lt;/p&gt;
&lt;p&gt;Look for a follow-up post where I'll show how to use &lt;a href="http://www.opencredo.com/technologies/opencredo-esper"&gt;OpenCredo Esper&lt;/a&gt; to implement a simple Throughput Monitor to some &lt;a href="http://www.springsource.org/spring-integration"&gt;Spring Integration&lt;/a&gt;-based messaging infrastructure.&lt;/p&gt;</description>
      <pubDate>Sun, 21 Feb 2010 09:49:42 CST</pubDate>
      <guid isPermaLink="true">http://www.russmiles.com/home/2010/2/21/opencredo-esper-is-go.html</guid>
      <dc:creator>Russell Miles</dc:creator>
    </item>
    <item>
      <title>DynamicDomainProperties and the AGPL</title>
      <link>http://www.springone2gx.com/blog/robert_fischer/2010/02/dynamicdomainproperties_and_the_agpl</link>
      <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.fsf.org/licensing/licenses/agpl-3.0.html"&gt;&lt;img src="http://www.gnu.org/graphics/agplv3-155x51.png"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://www.pledgie.com/campaigns/9065'&gt;&lt;img alt='Click here to lend your support to: Un-AGPL DynamicDomainProperties 1.0 and make a donation at www.pledgie.com !' src='http://www.pledgie.com/campaigns/9065.png?skin_name=chrome' border='0'/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I just released the DynamicDomainProperties plugin for Grails, which allows domain classes to have dynamic properties. It&amp;#8217;s pretty nifty, if I do say so myself.&lt;/p&gt;
&lt;p&gt;Based on &lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/open-letter-to-burt-beckwith/"&gt;my frustration with the Grails plugin culture&lt;/a&gt; because of &lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/open-source-users/"&gt;differing cultural assumptions about open source works&lt;/a&gt;, and based on &lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/self-destructive-oss/"&gt;my lack of appreciation for the promises of indirect compensation offered to me as an open source developer&lt;/a&gt;, I&amp;#8217;ve decided to release it under the &lt;a rel="nofollow" target="_blank" href="http://www.fsf.org/licensing/licenses/agpl-3.0.html"&gt;GNU-Affero GPL 3.0&lt;/a&gt;, which is like the GPL but (among other things) requires the source to be available to the users of a web app that use this plugin.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m open to the idea of releasing it under the more &amp;#8220;biz-friendly&amp;#8221; BSD, but then &lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/a-defense-of-the-gpl/"&gt;I&amp;#8217;m going to want a different form of compensation&lt;/a&gt;. So I&amp;#8217;m putting up a bounty via Pledgie: if I was building this plugin as a consultant, it would have cost a client about $2500. So, if the commercial community contributes $2500, I&amp;#8217;ll do a BSD release. Anyone who donates $250 or more gets a single-domain usage license right away.&lt;/p&gt;
&lt;p&gt;For more information on the plugin, see &lt;a rel="nofollow" target="_blank" href="http://grails.org/plugin/dynamic-domain-properties"&gt;the plugin page on grails.org&lt;/a&gt;. (I&amp;#8217;ve had enough difficulty with GitHub&amp;#8217;s wiki freaking out on me and would rather avoid that.)&lt;/p&gt;
&lt;hr /&gt;&lt;h2&gt;Comments&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/dynamicdomainproperties-grails-plugin-agpl/#comment-37286"&gt;February 22, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://www.anyware.co.uk' class='url'&gt;Marc Palmer&lt;/a&gt; wrote: I'm interested to see how this pans out Robert - good luck!&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/dynamicdomainproperties-grails-plugin-agpl/#comment-37328"&gt;March 4, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://gr8fanboy.wordpress.com/' class='url'&gt;Jeremy Flowers&lt;/a&gt; wrote: Way to go. This looks like the way forward to me. In the Microsoft' arena GUI component vendors started to sell there wares this way too, like Infragistics. I always thought plug-ins would have to go the same way to get support for your plug-ins. You have to put food on the table somehow..&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/dynamicdomainproperties-grails-plugin-agpl/#comment-37338"&gt;March 5, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://metasieve.wordpress.com/2010/03/05/does-grails-have-a-problem/' class='url'&gt;Does Grails have a problem? &amp;laquo; The MetaSieve Blog&lt;/a&gt; wrote: [...] I have time to, I can completely comprehend Robert&amp;#8217;s point of view and his desire to get a different kind of compensation for his open source work. In fact, there should be plenty of space for both approaches (and [...]&lt;/li&gt;&lt;/ul&gt;&lt;hr /&gt;
This post was by &lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/author/candide/"&gt;Robert Fischer&lt;/a&gt;, written on February 20, 2010.&lt;br /&gt;
Comment on this post: &lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/dynamicdomainproperties-grails-plugin-agpl/#respond"&gt;http://enfranchisedmind.com/blog/posts/dynamicdomainproperties-grails-plugin-agpl/#respond&lt;/a&gt;&lt;br /&gt;
Public Permalink: &lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/dynamicdomainproperties-grails-plugin-agpl/"&gt;http://enfranchisedmind.com/blog/posts/dynamicdomainproperties-grails-plugin-agpl/&lt;/a&gt;
&lt;hr /&gt;&lt;a rel="nofollow" target="_blank" href="http://creativecommons.org/licenses/by-sa/3.0/us/"&gt;&lt;img alt="Creative Commons License" style="border-width:0;" src="http://i.creativecommons.org/l/by-sa/3.0/us/88x31.png"/&gt;&lt;/a&gt;&lt;br /&gt;This article was a post on &lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog"&gt;the EnfranchisedMind blog&lt;/a&gt;. &lt;span&gt;EnfranchisedMind Blog&lt;/span&gt; by &lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/"&gt;Robert Fischer, Brian Hurt, and Other Authors&lt;/a&gt; is licensed under a &lt;a rel="nofollow" target="_blank" href="http://creativecommons.org/licenses/by-sa/3.0/us/"&gt;Creative Commons Attribution-Share Alike 3.0 United States License&lt;/a&gt;.&lt;p style="display:none;"&gt;(Digital Fingerprint: bcecb67d74ab248f06f068724220e340 (69.147.112.168) )&lt;/p&gt;</description>
      <pubDate>Sat, 20 Feb 2010 18:24:00 CST</pubDate>
      <guid isPermaLink="true">http://enfranchisedmind.com/blog/?p=2309</guid>
      <dc:creator>Robert Fischer</dc:creator>
    </item>
    <item>
      <title>Book Review: DSLs in Boo</title>
      <link>http://www.springone2gx.com/blog/andrew_glover/2010/02/book_review_dsls_in_boo</link>
      <description>&lt;div style="float:right; padding-left:1.0em; padding-top:0.0em;"&gt;&lt;iframe src="http://rcm.amazon.com/e/cm?t=thdibl-20&amp;#038;o=1&amp;#038;p=8&amp;#038;l=as1&amp;#038;asins=1933988606&amp;#038;fc1=000000&amp;#038;IS2=1&amp;#038;lt1=_blank&amp;#038;m=amazon&amp;#038;lc1=0000FF&amp;#038;bc1=000000&amp;#038;bg1=FFFFFF&amp;#038;f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;p&gt;While I don&amp;#8217;t spend a lot of time on the .NET platform anymore, I&amp;#8217;m still &lt;A HREF="http://www.infoq.com/articles/boo-intro"&gt;a big fan of Boo&lt;/A&gt;. Having cut &lt;A HREF="http://www.oreillynet.com/pub/a/python/2005/01/13/cheetah.html"&gt;my teeth on Python&lt;/A&gt; many years ago, I&amp;#8217;ve always enjoyed hip &lt;A HREF="http://thediscoblog.com/category/languages/python/"&gt;Pythonic languages&lt;/A&gt; and when Boo came out for the .NET platform way back when, I jumped on the opportunity to experiment with it and leverage it at client sites. What&amp;#8217;s more, it&amp;#8217;s no secret that &lt;A HREF="http://easyb.org"&gt;I&amp;#8217;m a fan of DSLs&lt;/A&gt; as I do find they can be quite powerful, for example, in leveraging natural language semantics that enhance the &amp;#8220;user experience&amp;#8221; such as with expressing &lt;I&gt;&lt;A HREF="http://thediscoblog.com/2010/02/02/introduction-to-easyb-video/"&gt;intent&lt;/A&gt;&lt;/I&gt;.&lt;/p&gt;
&lt;p&gt;Thus, when I had a chance to read &lt;A HREF="http://ayende.com/blog/default.aspx"&gt;Ayende Rahien&lt;/A&gt;&amp;#8217;s &amp;#8220;&lt;a href="http://www.amazon.com/gp/product/1933988606?ie=UTF8&amp;#038;tag=thdibl-20&amp;#038;linkCode=as2&amp;#038;camp=1789&amp;#038;creative=9325&amp;#038;creativeASIN=1933988606"&gt;DSLs in Boo&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=thdibl-20&amp;#038;l=as2&amp;#038;o=1&amp;#038;a=1933988606" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&amp;#8220;, I jumped at the opportunity, baby! Ayende does a great job of of introducing the notion of DSLs (interestingly, there isn&amp;#8217;t a ton of literature here specifically about DSLs alone other than &lt;A HREF="http://martinfowler.com/bliki/DomainSpecificLanguage.html"&gt;Martin Fowler&lt;/A&gt;&amp;#8217;s bliki and of course, &lt;A HREF="http://en.wikipedia.org/wiki/Domain-specific_language"&gt;Wikipedia&lt;/A&gt;) in the first chapter, specifically covering the various types of DSLs (i.e. internal, external, and he goes on to define graphical ones plus he reluctantly includes fluent interfaces). What&amp;#8217;s more, he also explores why one would want to write an DSL. Here he covers a few reasons, but a quote stuck out regarding one particular reason, which is for expressing&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;rules and actions in a way that&amp;#8217;s close to the domain and understandable to business people&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;This is, of course, the intent of easyb &amp;#8212; that is, to express intentions in an easily understandable language that stakeholders can grasp. &lt;/p&gt;
&lt;p&gt;After chapter 1, Ayende goes on to cover the &lt;A HREF="http://boo.codehaus.org/"&gt;basics of Boo&lt;/A&gt;, which, of course, would be needed should you want to actually create a DSL in Boo! It isn&amp;#8217;t until chapter 4, however, that you start to get your hands dirty coding DSLs; nevertheless, I understand the need to introduce the various required concepts leading up to chapter 4. Thus, in chapter 4, a few high level examples are covered. &lt;/p&gt;
&lt;p&gt;Later chapters go into some details about writing and maintaining DSL code; plus, in chapter 7, he unveils Rhino DSL, which is an open source project that facilitates authoring DSLs in Boo (Ayende, by the way, is a prolific coder &amp;#8212; he&amp;#8217;s all over the map in the .NET world). Chapter 8 finally covers testing a DSL, which I can attest as quite difficult but paramount to a DSL&amp;#8217;s success and stability. He also goes on to cover versioning, which I found quite intriguing as backward compatibility is a double-edged sword. &lt;/p&gt;
&lt;p&gt;What I find most interesting is the way in which a base language affects the resulting implementation of a DSL (i.e. the end result). That is, Pythonic DSLs still have the oft complained about &amp;#8220;&lt;A HREF="http://weblog.hotales.org/cgi-bin/weblog/nb.cgi/view/python/2005/02/19/1"&gt;white-space issue&lt;/A&gt;.&amp;#8221; For instance, here is a code snippet from the book for an order processing engine:&lt;/p&gt;
&lt;pre class="brush: python;"&gt;
upon auth_denied:
  when preferred_customer:
       delay_order_until_payment_is_authorized &amp;quot;preferred customer benefit&amp;quot;
  when default_customer:
       cancel_order &amp;quot;no money, no order&amp;quot;
&lt;/pre&gt;
&lt;p&gt;Note how the underlying language (Boo) forces the DSL to use spaces (rather than say brackets or &lt;code&gt;def&lt;/code&gt;/&lt;code&gt;do&lt;/code&gt;/&lt;code&gt;end&lt;/code&gt; like calls), what&amp;#8217;s more, underscores (i.e. _) are required so as to keep the compiler happy. It&amp;#8217;s, in many ways, the same in something like &lt;a href="http://code.google.com/p/easyb/"&gt;easyb&lt;/a&gt; (which is, of course, backed by &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt;), which is essentially forced to use brackets and in one case, a comma like so:&lt;/p&gt;
&lt;pre class="brush: groovy;"&gt;
given &amp;quot;a preferred customer&amp;quot;, {
  //blah blah
}
&lt;/pre&gt;
&lt;p&gt;Note how Groovy requires the DSL to include a comma between the description &lt;code&gt;String&lt;/code&gt; and the &lt;code&gt;Closure&lt;/code&gt;. Ruby, by the way, and in the case of something like &lt;a href="http://rspec.info/"&gt;RSpec&lt;/a&gt;, doesn&amp;#8217;t have this requirement. For instance, in &lt;A HREF="http://thediscoblog.com/2007/08/28/is-bdd-tdd-done-right/"&gt;RSpec&lt;/A&gt;:&lt;/p&gt;
&lt;pre class="brush: ruby;"&gt;
it &amp;quot;should return item enqueued&amp;quot; do
  @queue.enqueue(&amp;quot;test&amp;quot;)
  @queue.dequeue.should == &amp;quot;test&amp;quot;
end
&lt;/pre&gt;
&lt;p&gt;Yet, notice the &lt;code&gt;do&lt;/code&gt; and &lt;code&gt;end&lt;/code&gt;! Needless to say, you can see similar influences in something like &lt;A HREF="http://thediscoblog.com/2009/11/16/comparing-scala-and-groovy-via-scalatest-and-easyb/"&gt;Scala&lt;/A&gt; too. &lt;/p&gt;
&lt;p&gt;DSLs are interesting beasts and they&amp;#8217;ve clearly affected productivity on various platforms (need I remind you that &lt;A HREF="http://en.wikipedia.org/wiki/Ruby_on_Rails"&gt;Rails&lt;/A&gt; is a DSL?). &amp;#8220;&lt;a href="http://www.amazon.com/gp/product/1933988606?ie=UTF8&amp;#038;tag=thdibl-20&amp;#038;linkCode=as2&amp;#038;camp=1789&amp;#038;creative=9325&amp;#038;creativeASIN=1933988606"&gt;DSLs in Boo&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=thdibl-20&amp;#038;l=as2&amp;#038;o=1&amp;#038;a=1933988606" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&amp;#8221; specifically explores DSLs on a specific platform, yet it&amp;#8217;s still an interesting read. Because it&amp;#8217;s my bag, I&amp;#8217;m definitely looking forward to more books exploring DSLs as a main subject! All in all though, this is an interesting book &lt;em&gt;regardless of your chosen platform&lt;/em&gt;. Can you dig it, man?&lt;/p&gt;
                                 &lt;p&gt;&lt;center&gt;Looking to spin up Continuous Integration &lt;em&gt;quickly&lt;/em&gt;? Check out &lt;a href="http://www.ciinabox.com"&gt;www.ciinabox.com&lt;/a&gt;.&lt;/center&gt;&lt;/p&gt;</description>
      <pubDate>Thu, 18 Feb 2010 17:34:00 CST</pubDate>
      <guid isPermaLink="true">http://thediscoblog.com/?p=1022</guid>
      <dc:creator>Andrew Glover</dc:creator>
    </item>
    <item>
      <title>Reporting from SpeakerConf 2010</title>
      <link>http://www.springone2gx.com/blog/ken_sipe/2010/02/reporting_from_speakerconf_2010</link>
      <description>I was able to attend&lt;a href="http://speakerconf.com/"&gt; speakerconf 2010&lt;/a&gt; this year in Aruba. It was an amazing gathering of talented leaders in the software development space. Each day of the conference started with several 15 – 30 minute talks lasting roughly 3 hours. According to the retro at the end of the conference, most people enjoyed and preferred these short talks as a primer to longer conversations in the afternoon along the pool or beach. Most talks were met with the struggle to maintain time often due to the many follow on questions generated by the subject. As far as I know the subjects were selected by the speaker and they were generally not preannounced. It is impossible to capture the essence of the conference and I make no effort to cover the most valuable part of it… the evening free form discussions. Most of the information went so fast that it was difficult to mentally be engaged and take notes. Here is a glimpse of what was discussed.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Day 1&lt;/span&gt;&lt;br /&gt;&lt;a href="http://thinkrelevance.com/team"&gt;&lt;span style="font-weight: bold;"&gt;Stu Halloway&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Stu introduced the ADD development… which is alcohol driven. Stu then jumped into clojure, introducing a private testing project he is working on called circumspect. Stu offered up some advice for working in clojure:&lt;br /&gt;  * be less clever&lt;br /&gt;  * idiomatic clojure&lt;br /&gt;  * make adjectives not nouns&lt;br /&gt;&lt;br /&gt;The focus on circumspect was to provide an idiomatic testing option for functional testing in clojure. Stu mentioned that through his testing exploration that an test he created actually detected a bug in the clojure code.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://notdennisbyrne.blogspot.com/"&gt;&lt;span style="font-weight: bold;"&gt;Dennis Byrne&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Dennis is the first to discuss a topic on hardware and general process constraints in a talk titled Memory Barriers. The challenge is that virtual machines and hardware interfaces reorder code in ways most developers are not aware of. Fences or memory barriers define for the VM what can and can’t be reordered. There was some discussion on the expensive nature of these barriers.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.theagiledeveloper.com/"&gt;&lt;span style="font-weight: bold;"&gt;Matt Deiters&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Matt introduces a challenging problem that he has been working on in a story about vertex. The problem stems from social network analysis… it doesn’t work in SQL. Their previous implementation in SQL might take an hour to find all the details need for just 2 degrees of separation in a social network. Matt introduces &lt;a href="http://neo4j.org/"&gt;neo4j&lt;/a&gt; an open source nosql graph database and &lt;a href="http://github.com/mdeiters/neo4jr-simple"&gt;neo4jr-simple&lt;/a&gt;, which is a RESTful ruby API. I enjoyed the fact that Matt wasn’t a No SQL bigot… He espoused a “Not all SQL” approach, using alternatives where SQL databases fall down.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Fred George&lt;/span&gt;&lt;br /&gt;Fred displayed a triangle with management, story and programmers (or workers) at the vertexes. He wanted to focus on the relationship of the story to the programmer. Fred focuses on a Lean process and raises the question if acceptance tests are really lean? This stirred some debate. In the end, It appeared to me that what was being argued in most cases was the definition of acceptance tests vs. other types of tests. I don’t know if I agreed with Fred’s position, which we discussed at length the rest of the conference. My favorite part of his talk was a list of words or phrases that are flags that your project isn’t Agile. They include: Review, I need it in writing, write me a ticket, plan, checklist, code freeze, gant chart.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.briangoetz.com/"&gt;&lt;span style="font-weight: bold;"&gt;Brian Goetz&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Brian’s talk is on how we find ourselves in this mess with multi-cores. Brian gives a wonderful history of processors defining them in eras: CISC era, RISC era, and Multi-Core era. The big take-aways for me include:&lt;br /&gt;  * a move from explicit to implicit parallelism&lt;br /&gt;  * moore’s law favors bandwidth over latency&lt;br /&gt;  * cost of memory access&lt;br /&gt;&lt;br /&gt;With the speed of today’s processors, it takes 200-300 clock cycles to get 1 memory fetch, where it used to be 1 cycle. As latency increases we need more caches. Memory access times by clock cycle are roughly:&lt;br /&gt;  * Register ~ 1 cycle&lt;br /&gt;  * L1 ~ 3&lt;br /&gt;  * L2 ~ 15&lt;br /&gt;  * RAM ~ 200 – 300&lt;br /&gt;&lt;br /&gt;Brian states “Memory is the new disk”. Clearly memory access is the new problem to solve in computer hardware. Brian also states that there is no programming model for this new multi-core era. Based on the talk, it appears to be that the industry has a new chicken or the egg problem. Hardware is struggling to evolve, because there is no software development model. Software is struggling because there isn’t a new standard. Brian concludes with latency is the enemy and the industries need to provide development teams with new tools. There will be a growing need to understand the memory access model of a running program, which can only be determined at run-time at the chip level. It will be necessary to understand the Integer pipe and memory cache misses. At the end of Brian’s talk, Nygard mentioned Chuck Moore’s Multi-Core chip where each core runs a tiny forth program. It is something I’ve added to the list of things to look into.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.michaelfeathers.com/"&gt;&lt;span style="font-weight: bold;"&gt;Michael Feathers&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Michael discusses challenges to object oriented and functional language hybrids. There is background that I didn’t record, but one of the great observations is that functional programming is a “tell, don’t ask” model and object oriented programming is a “ask, don’t tell” model. In the FP approach, programming logic and data seem to bubble up the call tree and in the OO approach the opposite is true, logic seems to be pushed down the tree. Michael then looks at what it looks like conceptually if FP is on top of OO or OO is on top of FP. Michael then introduces the group to an algorithm used to solve &lt;a href="http://cmm.ensmp.fr/%7Ebeucher/wtshed.html"&gt;morphological watersheds&lt;/a&gt; :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Day 2&lt;/span&gt;&lt;br /&gt;&lt;a href="http://steve.vinoski.net/blog/"&gt;&lt;span style="font-weight: bold;"&gt;Steve Vinoski&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Steve introduced us to a product his startup company &lt;a href="http://www.verivue.com/"&gt;Verivue&lt;/a&gt;, Inc is producing for the big media companies for streaming video. The IO throughput numbers were unbelievable. The software at the core of the product… Erlang!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://obiefernandez.com/"&gt;&lt;span style="font-weight: bold;"&gt;Obie Fernadez&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Obie and Desi introduced us to the agile practices of Hashrocket, indicating that they have evolved past iterations and they question the value added by iteration activities. They develop in one-week windows and use &lt;a href="http://www.pivotaltracker.com/"&gt;Pivotal Tracker&lt;/a&gt; for tracking stories and progress. The term “Iteration” isn’t even in their vocabulary. Later in the week, I challenged Obie to see if the word “week” replaces the word “iteration” as a convenience and to see if they were doing all things an ”iteration” would entail. The short answer is No! Clearly pivotal tracker desires a good look.  Another tool Obie mentioned later in the week was &lt;a href="http://www.balsamiq.com/"&gt;Balsamiq&lt;/a&gt;... a tool used for screen mocking.  Yet another tool to checkout.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ph7spot.com/"&gt;&lt;span style="font-weight: bold;"&gt;Phillip Hanrigou&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Phillip starts with the phrase “any sufficiently advance technology should feel like magic”. He continues with the fact that 30% of Amazon’s sales is based on recommendations. This was an interesting talk that had me flashing back to Matt’s talk on neo4j looking for synergies.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ayende.com/blog/"&gt;&lt;span style="font-weight: bold;"&gt;Oren Eini&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Oren suggests that TDD doesn’t scale… with a beautiful picture of a motorcycle with training wheels. The major point is that unit tests are bad and scenario based tests are good.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.exampler.com/"&gt;&lt;span style="font-weight: bold;"&gt;Brian Marick&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;The take away… “I don’t want to care about anything until I absolutely have to care about it”… Love it!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.davethomas.net/"&gt;&lt;span style="font-weight: bold;"&gt;Dave Thomas&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Dave introduces us to vector functional languages such as KDB and k. These specialized languages are the workhorses behind querying ½ terabyte of data in 1 second for the hedge fund industry. Dave claims this is the most interesting technology to come along in 25 years. If interested, he suggests getting started with &lt;a href="http://jsoftware.com/"&gt;j from jsoftware.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.linkedin.com/in/ericyew"&gt;&lt;span style="font-weight: bold;"&gt;Eric Yew&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Eric gives us a deep dive into GPUs. He was on the NVidia team that built the technology. Eric suggests that GPUs are making the industry rethink previous assumptions that are not correct in the GPU world. How would we code differently if:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;There were no costs to threads&lt;/li&gt;&lt;li&gt;And no costs to context switching&lt;/li&gt;&lt;/ol&gt;The approach suggests that memory lookup is too expensive (seems like we keep hearing this :). It is cheaper to recalculate a value on a 100 threads then to retrieve from memory.&lt;br /&gt;&lt;br /&gt;This model supports scale and throughput and not latency. Latency once again is sacrificed.&lt;br /&gt;&lt;br /&gt;The memory model is upside down as well from the traditional general processors. There are 3 memory access points:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;global - ~ 100 cycles to get to it&lt;/li&gt;&lt;li&gt;shared&lt;/li&gt;&lt;li&gt;local – stacks&lt;/li&gt;&lt;/ol&gt;It appears that the old paradigm of being abstracted from the hardware is over. The benefit is that the price of 2 Teraflops is near nothing… thank you computer gaming community!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Day 3&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.nealford.com/"&gt;&lt;span style="font-weight: bold;"&gt;Neal Ford&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Neal did a wonderful job presenting a presentation on presentation :) at a conference on conferences… it was a very meta way to start the morning. The big take away is &lt;a href="http://presentationpatterns.com/"&gt;http://presentationpatterns.com/&lt;/a&gt; a site and forth-coming book on presentation styles, techniques and anti-patterns. The biggest benefit of the book is its focus on the practical. It will include templates for good practices.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pandamonial.grahamis.com/"&gt;&lt;span style="font-weight: bold;"&gt;Amanda Laucher&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Amanda starts by defining the classifications of assholes and morons which got a lot of mileage the rest of the day. Amanda focused on educating us on terminologies in the category theory space with examples in F#. Here was what I was able to capture:&lt;br /&gt;&lt;br /&gt;  * Catamorphism - a fold&lt;br /&gt;  * Anamorphism – unfold&lt;br /&gt;  * Endomorphis – takes a type and returns the same type&lt;br /&gt;  * Homomorphism – takes a structure and returns the same structure or shape&lt;br /&gt;  * Monoid – A Functor&lt;br /&gt;  * Monad – Applied context&lt;br /&gt;  * A Monad is a monoid in the category endofunctors&lt;br /&gt;&lt;br /&gt;&lt;a href="http://redsquirrel.com/dave/"&gt;&lt;span style="font-weight: bold;"&gt;Dave Hoover&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Dave discussed the value of &lt;a href="http://github.com/defunkt/resque"&gt;Resque&lt;/a&gt; and how it help in the development of Groupon.com&lt;br /&gt;&lt;br /&gt;&lt;a href="http://nutrun.com/"&gt;&lt;span style="font-weight: bold;"&gt;George Malamidis&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;George continues the conversation on memory access times and threads, introducing us to &lt;a href="http://nodejs.org/"&gt;Node.js&lt;/a&gt; as a high scale solution for the web.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.michaelnygard.com/blog/"&gt;&lt;span style="font-weight: bold;"&gt;Michael Nygard&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Thoughts on consistency – what a great talk! Michael introduces the concept of an observer and a super observer in a system through an object lesson. He then follows it up with the fact that with in a database there are often inconsistent states… the point is at the end of a transaction there cannot be any inconsistent states. For example, it is possible that an insert into the database would result in a violation of referential integrity… this is ok and necessary until a commit occurs.&lt;br /&gt;&lt;br /&gt;Consistency is based on time. Frozen time means no change.&lt;br /&gt;&lt;br /&gt;Another practical example:&lt;br /&gt;2 ebay users making the same query at roughly the same time get different query results. This is viewed as being ok, because from the perspective of the observer it is consistent (they have no idea). From the perspective of a super observer there are some inconsistencies. This led to some discussion in mainly of the corporate failures stemming from the complexity created when trying to maintain consistency from the perspective of a super observer (which is a fallacy and trap).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.aslakhellesoy.com/"&gt;&lt;span style="font-weight: bold;"&gt;Aslask Hellesoy&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Another agile talk… this one focused on visualization of the return on development through CFD graphs. The suggestion was that velocity is a questionable valuation.&lt;br /&gt;&lt;br /&gt;References included: &lt;a href="http://bit.ly/3bCNtZ"&gt;CFD Details&lt;/a&gt; and a &lt;a href="http://bit.ly/bBtRc2"&gt;google spreadsheet&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.objectmentor.com/omTeam/martin_r.html"&gt;&lt;span style="font-weight: bold;"&gt;Robert Martin&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;I don’t think you can summarize Uncle Bob… you have to experience him :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;&lt;br /&gt;I made a couple of interesting observation / assessments through the conference. The first is there was a large percentage of the speakers / attendees that had a strong EE background. I truly enjoyed revisiting challenges at this level again.&lt;br /&gt;&lt;br /&gt;Here are some of my takeaways from the conference:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;We are at the beginning of a new era in field of computing. One in which we do not have a standardize model or tools&lt;/li&gt;&lt;li&gt;There is a need for programming solutions which reduce (or leak) the abstraction from the memory model that is generally preferable in the previous programming model. It will be necessary to indicate that values in memory are near, far or very far. It will be necessary to be able to measure and understand the cache miss rate.&lt;/li&gt;&lt;li&gt;We appear to be at our limits in our pursuit to improve latency. Worse…. Latency is the component that is consistently sacrificed to increase throughput.&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7461275049781191261-3147577372058857138?l=kensipe.blogspot.com' alt='' /&gt;&lt;/div&gt;</description>
      <pubDate>Wed, 17 Feb 2010 17:14:15 CST</pubDate>
      <guid isPermaLink="true">tag:blogger.com,1999:blog-7461275049781191261.post-3147577372058857138</guid>
      <dc:creator>Ken Sipe</dc:creator>
    </item>
    <item>
      <title>Dead Programmers Society</title>
      <link>http://www.springone2gx.com/blog/matt_stine/2010/02/dead_programmers_society</link>
      <description>&lt;p&gt;A local Pastor once gave the &lt;a href="http://holding2truth.blogspot.com/2009/01/strange-sounding-advice.html"&gt;advice of introducing ourselves&lt;/a&gt; &lt;a href="http://holding2truth.blogspot.com/2009/02/strange-advice-introducing-our-kids-to.html"&gt;and our kids to dead people&lt;/a&gt;. It is his belief that if his kids grow up idolizing the likes of Eric Liddell, Jim Elliot, and Hudson Taylor, they would be far better off than by looking up to many of our so-called &amp;#8220;heroes&amp;#8221; of today. I happen to agree with his advice, but that&amp;#8217;s not the subject of tonight&amp;#8217;s blog entry.&lt;/p&gt;
&lt;p&gt;I think that this advice is very applicable to us as software developers today. While our industry is still young enough that a great many of our &amp;#8220;founding fathers&amp;#8221; are still around, it is surprising to see how often their work and contributions go unnoticed by the vast majority of us. At the January Memphis/Mid-South Java User Group meeting, our program focused on books that all of us as developers should read. Four of us gave our takes on the topic. Joel Neely, one of a few people that I learn from every time I get near them, pulled yet another rabbit out of his hat by focusing on several books, all of which had been published before the majority of us were out of diapers! One book struck me in particular: &lt;em&gt;A Discipline of Programming&lt;/em&gt; by Edsgar W. Dijkstra. In it EWD &amp;#8220;presents a formal approach to developing (non-deterministic!) algorithms, using what we would now call a DSL for algorithm design. Incidentally, that book was published in 1976.&amp;#8221; (Thanks Joel for the excellent summary). I&amp;#8217;d like to pull out just a couple of quotes from that book:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A most important, but also a most elusive, aspect of any tool is its influence on the habits of those who train themselves in its use. If the tool is a programming language, this influence is - whether we like it or not - an influence on our thinking habits.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Just out of curiosity, does this sound anything at all to you like the frequent admonitions to learn a &amp;#8220;language of the year (LOTY)?&amp;#8221; Of course that isn&amp;#8217;t the context of EWD&amp;#8217;s quote, but the underlying principle remains the same. Almost universally accompanying that admonition is a statement along the lines of &amp;#8220;even if you never use it in your day job, it will affect THE WAY YOU THINK about programming during your day job.&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;#8230;a carefully chosen separation of concerns is essential for the design of in all respects, high quality programs&amp;#8230;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Does &amp;#8220;loosely coupled, highly cohesive, modular architecture&amp;#8221; come to mind?&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;#8230;the fact that programming languages could be used as a vehicle for instructing existing automatic computers, has for a long time been regarded as their most important property&amp;#8230;we shall try to redress the balance, and we shall do so by regarding the fact that our algorithms could actually be carried out be a computer as a lucky accidental circumstance that need not occupy a central position in our considerations&amp;#8230;I view a programming language primarily as a vehicle for the description of (potentially highly sophisticated) abstract mechanisms.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I hear so much of what is bandied about today as &amp;#8220;new&amp;#8221; embodied in this quote. The calls to liberate programming from its &amp;#8220;C&amp;#8221; roots by banishing primitives, because hey, primitives are only their to keep &amp;#8220;Java from being too slow!&amp;#8221; The calls to favor &amp;#8220;essence over ceremony&amp;#8221; in language design by eliminating boilerplate code in favor of sensible defaults that clear away the noise from the algorithmic intent that we&amp;#8217;re trying to communicate. The constant reminders that it&amp;#8217;s more important for our code to be readable to humans, not to computers, because that&amp;#8217;s what compilers are for. &lt;/p&gt;
&lt;p&gt;What&amp;#8217;s the point? The point is that most, if not all, of the ideas that are &amp;#8220;new&amp;#8221; today are simply restatements of past ideas in a different context. A wise man, one much wiser than I, once said &amp;#8220;&amp;#8230;there is nothing new under the sun&amp;#8221; (Ecclesiastes 1:9). Edsgar W. Dijkstra passed from this earth in 2002, but his ideas live on, and they are very much applicable to software developers today. There are may others like him: Donald Knuth, John McCarthy, Alan Turing, David Gries - some dead, some alive, but all giants upon whose shoulders we stand. We would do well to consider their words.&lt;/p&gt;</description>
      <pubDate>Tue, 16 Feb 2010 21:42:00 CST</pubDate>
      <guid isPermaLink="true">http://www.mattstine.com/?p=285</guid>
      <dc:creator>Matt Stine</dc:creator>
    </item>
    <item>
      <title>Detecting eviction events on a WebSphere extreme Scale client</title>
      <link>http://www.springone2gx.com/blog/billy_newport/2010/02/detecting_eviction_events_on_a_websphere_extreme_scale_client_18</link>
      <description>&lt;p&gt;I've just pushed another sample to &lt;a href="http://github.com/bnewport/Samples/tree/master/sample-eviction-notify/"&gt;github&lt;/a&gt;. This sample shows how to attach a &lt;a href="http://github.com/bnewport/Samples/blob/master/sample-eviction-notify/src/main/java/com/devwebsphere/evictionnotifier/EvictionEventPublisher.java"&gt;listener&lt;/a&gt; to the grid which watches transactions involved a set of maps. Any eviction events in those maps are 'noticed' and an eviction event is inserted in to a map thats basically used like a simple queue. I wrote a &lt;a href="http://github.com/bnewport/Samples/blob/master/sample-eviction-notify/src/main/java/com/devwebsphere/evictionnotifier/EvictionEventListener.java"&gt;client side listener&lt;/a&gt; that can be attached to a client grid reference. This listener polls the server side grid looking for these events and returns them to the client.&lt;/p&gt;&lt;p&gt;The particular use case that prompted this sample was a customer using the grid to store application sessions and they needed a way for applications to be notified when the grid evicted their sessions. They wanted EVERY application JVM to see EVERY eviction. This is important to realize. Every eviction event will be processed by every application JVM instance. If we just needed the eviction event to be handled by exactly one application JVM then I'd write it using the getNextKey function in WXS.&lt;/p&gt;&lt;p&gt;The test package has sample &lt;a href="http://github.com/bnewport/Samples/blob/master/sample-eviction-notify/src/test/resources/objectgrid.xml"&gt;objectgrid.xml&lt;/a&gt; and &lt;a href="http://github.com/bnewport/Samples/blob/master/sample-eviction-notify/src/test/resources/deployment.xml"&gt;deployment.xml&lt;/a&gt; files as well as a &lt;a href="http://github.com/bnewport/Samples/blob/master/sample-eviction-notify/src/test/java/com/devwebsphere/TestEvictionNotificationsSingleJVM.java"&gt;test case&lt;/a&gt; showing how to invoke the client to test it.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/dev/websphere/~4/eLqxmSwmR38" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 11 Feb 2010 14:42:00 CST</pubDate>
      <guid isPermaLink="true">tag:typepad.com,2003:post-6a00d83452595969e20120a88e98b0970b</guid>
      <dc:creator>Billy Newport</dc:creator>
    </item>
    <item>
      <title>How to use WebSphere eXtreme Scale in front of a database</title>
      <link>http://www.springone2gx.com/blog/billy_newport/2010/02/how_to_use_websphere_extreme_scale_in_front_of_a_database_19</link>
      <description>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;span style="font-family: Times; font-size: medium; line-height: normal; "&gt;&lt;p style="padding-top: 7px; padding-right: 7px; padding-bottom: 7px; padding-left: 7px; background-color: #ffffff; font: normal normal normal 13px/1.22 arial, helvetica, clean, sans-serif; font-family: 'Trebuchet MS', Verdana, sans-serif; font-size: small; "&gt;&lt;p&gt;This is a very common scenario. The customer wants a Map to reflect entries in a database table. They want:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;To preload database records in to the grid map&lt;/li&gt;
&lt;li&gt;Lazy fetch anything not preloaded in to the grid map&lt;/li&gt;
&lt;li&gt;Write any changes to entries in the map back to the database&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The&amp;nbsp;&lt;a href="http://github.com/bnewport/Samples/tree/master/sample-jpa-preload/" style="color: blue !important; text-decoration: underline !important; cursor: text !important; "&gt;sample on github&lt;/a&gt;&amp;nbsp;shows how to do this. This sample uses the wxsutils library on github also. This contains code for several patterns and makes using WXS easier. The main things used by this sample are the bulk load primitives in the wxsutils library.&lt;/p&gt;

&lt;p&gt;The sample as is works on the command line and uses a mysql database. OpenJPA 1.2 is used as an object relational mapper which means you can substitute DB2 or Oracle pretty easily. There is no mysql specific code in the main sample. I do register the mysql driver in the code.&lt;/p&gt;

&lt;p&gt;The main package includes the&amp;nbsp;&lt;a href="http://github.com/bnewport/Samples/blob/master/sample-jpa-preload/src/main/resources/objectgrid.xml" style="color: blue !important; text-decoration: underline !important; cursor: text !important; "&gt;objectgrid.xml&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href="http://github.com/bnewport/Samples/blob/master/sample-jpa-preload/src/main/resources/deployment.xml" style="color: blue !important; text-decoration: underline !important; cursor: text !important; "&gt;deployment.xml&lt;/a&gt;&amp;nbsp;files showing how to make the grid with one Map (Customer) with an attached Loader. The Loader uses the builtin JPALoader. This Loader converts Map.get and map.update/delete methods to SQL commands to the database. The META-INF folder has the&amp;nbsp;&lt;a href="http://github.com/bnewport/Samples/blob/master/sample-jpa-preload/src/main/resources/META-INF/persistence.xml" style="color: blue !important; text-decoration: underline !important; cursor: text !important; "&gt;persistence.xml&lt;/a&gt;&amp;nbsp;file which points at the database to use with the program.&lt;/p&gt;

&lt;p&gt;The test package contains code to&amp;nbsp;&lt;a href="http://github.com/bnewport/Samples/blob/master/sample-jpa-preload/src/test/java/com/devwebsphere/TestPreloadDatabaseFromFile.java" style="color: blue !important; text-decoration: underline !important; cursor: text !important; "&gt;create a database table and fill it with records&lt;/a&gt;&amp;nbsp;for the test. There is another test case that shows&amp;nbsp;&lt;a href="http://github.com/bnewport/Samples/blob/master/sample-jpa-preload/src/test/java/com/devwebsphere/TestSimplePreloadGridFromDatabase.java" style="color: blue !important; text-decoration: underline !important; cursor: text !important; "&gt;how to preload&lt;/a&gt;&amp;nbsp;the database table in to a Map efficiently (using WXSUtils WXSMap.insertAll). The final test case just shows us looking up records in WXS.&lt;/p&gt;

&lt;p&gt;For very large record sets then it may be necessary to fetch the records in a parallel fashion for highest speed but for reasonable numbers of records (I tested with 300k records on my laptop), the approach in this simple sample should suffice.&lt;/p&gt;

&lt;br/&gt;&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/dev/websphere/~4/LKGOw_tqUFg" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 09 Feb 2010 14:06:00 CST</pubDate>
      <guid isPermaLink="true">tag:typepad.com,2003:post-6a00d83452595969e2012877813763970c</guid>
      <dc:creator>Billy Newport</dc:creator>
    </item>
    <item>
      <title>Spring Web Flow RefCard</title>
      <link>http://www.springone2gx.com/blog/craig_walls/2010/02/spring_web_flow_refcard</link>
      <description>&lt;p&gt;In case you've not heard or don't &lt;a href="http://www.twitter.com/habuma"&gt;follow me on Twitter&lt;/a&gt;, I'm pleased to announce that my fourth DZone Refcard, one covering &lt;a href="http://refcardz.dzone.com/refcardz/spring-web-flow"&gt;Spring Web Flow&lt;/a&gt;, was released today. You can also read a &lt;a href="http://java.dzone.com/articles/spring-webflow-refcard-meet"&gt;short interview that I did with James Sugrue&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In case you're wondering...yep, I'm still working on &lt;a href="http://www.manning.com/walls4"&gt;&lt;i&gt;Spring in Action 3&lt;/i&gt;&lt;/a&gt;. In fact, I'm now writing the Spring Web Flow chapter...so I get a chance to expand on what's in the Refcard. It's a lot of fun writing Refcards, but it's incredibly difficult to cram so much good material into less than 6 pages. In fact, despite my best efforts to keep it brief, over 2 pages of material landed on the cutting floor before the final product made it online. I assure you that there all of that good stuff, and more, will make it into the SiA3 Web Flow chapter.&lt;/p&gt;

&lt;p&gt;I hope you like the Spring Web Flow Refcard. I hope to get a chance to do some more later this year once I've finished working on SiA3.&lt;/p&gt;</description>
      <pubDate>Mon, 08 Feb 2010 21:34:00 CST</pubDate>
      <guid isPermaLink="true">http://www.jroller.com/habuma/entry/spring_web_flow_refcard</guid>
      <dc:creator>Craig Walls</dc:creator>
    </item>
    <item>
      <title>Goodbye cable, hello internet TV</title>
      <link>http://www.springone2gx.com/blog/matt_taylor/2010/02/goodbye_cable_hello_internet_tv</link>
      <description>&lt;p&gt;This post is for &lt;a href="http://marioaquino.blogspot.com"&gt;Mario&lt;/a&gt;. I started it as an email to him, but he &lt;a href="http://twitter.com/MarioAquino/status/8721952237"&gt;suggested&lt;/a&gt; it as a blog post in the first place, and now that it&amp;#8217;s done it does seem to be post-worthly (although off-topic).&lt;/p&gt;
&lt;p&gt;Here are the details of my new home TV system.&lt;/p&gt;
&lt;p&gt;First of all, the only paying services I have for TV entertainment are DSL and Netflix. You can get the cheapest Netflix membership and still get all the &amp;#8220;Watch it now&amp;#8221; content that they have. Not the best and most recent movies, but there is a lot of stuff you can watch, and I always seem to find something interesting for myself or the kids. I think you can get the basic Netflix account for under $10.&lt;/p&gt;
&lt;p&gt;My DSL is the only other monthly expense, which is $60 a month. But it&amp;#8217;s only that high because I have a static IP address, which I want to use to access my home computers remotely (at some point in the future).&lt;/p&gt;
&lt;p&gt;In order to handle all the streaming content to not only my media computer, but the other 2 computers in my house, I bought an &lt;a href="http://www.newegg.com/Product/Product.aspx?Item=N82E16833124277"&gt;N-band wireless router&lt;/a&gt; for $80. You can get a G-band wifi router for under $60, but it is 50Mbps vs over 300Mbps. It is worth it because I can watch youtube on my computer while my kids watch a movie on Netflix.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.hulu.com"&gt;Hulu&lt;/a&gt; is awesome, and it is even more awesome because of &lt;a href="http://www.hulu.com/labs/hulu-desktop"&gt;Hulu Desktop&lt;/a&gt;, which installs on your Mac as an app and interfaces with hulu without a web browser. My Apple remote worked with it without configuring everything, so I can change shows easily without getting up.&lt;/p&gt;
&lt;p&gt;The computer I&amp;#8217;m using is just the MBP I was using for development for G2One. It only has 2 MB of memory, and it seems to be working fine. I was going to sell it and buy a new Mac Mini, but I thought why not try this one out first, and it is working just fine.&lt;/p&gt;
&lt;p&gt;A note about resolution&amp;#8230; I have a 1080p HDTV, and the quality of the streaming video can be hit-and-miss at times. Hulu *always* looks great, but Netflix can sometimes deliver crappy video quality if the shows you are watching are older. And YouTube usually looks crappy on a 52-inch TV, but it is better than nothing.&lt;/p&gt;
&lt;p&gt;Let me know if any of you attempt this, I&amp;#8217;ll be interested to hear of other people&amp;#8217;s experiences. I&amp;#8217;m really happy so far, but then I hate cable companies. I get so frustrated with the DVR UIs. Don&amp;#8217;t they pay usability experts to design them? AT&amp;#038;T Uverse was the best I&amp;#8217;ve seen so far, so coming back to Comcast here made me want to throw up.&lt;/p&gt;
&lt;p&gt;Another thing you need to think about is placement of the media computer. If you are going to use a remote, you have to put it in a place with line of site to your remote, so it can&amp;#8217;t be behind the entertainment center somewhere. I also have a spot right in front of the flatscreen where I put my (very small Apple) keyboard and wireless mighty mouse. You&amp;#8217;ll still need to put a keyboard and mouse somewhere because you can&amp;#8217;t do everything with your remote.&lt;/p&gt;</description>
      <pubDate>Sat, 06 Feb 2010 18:14:00 CST</pubDate>
      <guid isPermaLink="true">http://weblog.dangertree.net/?p=627</guid>
      <dc:creator>Matthew Taylor</dc:creator>
    </item>
    <item>
      <title>I Don’t Get It</title>
      <link>http://www.springone2gx.com/blog/robert_fischer/2010/02/i_don_t_get_it</link>
      <description>&lt;p&gt;When encountering a bug in an open source project, most Java people seem unwilling to either fix it themselves or pay the maintainer to fix it—they&amp;#8217;d rather abandon the project or kludge their software painfully and repetitively. WTF?&lt;/p&gt;
&lt;hr /&gt;&lt;h2&gt;Comments&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/i-dont-get-it/#comment-37216"&gt;February 5, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://hamletdarcy.blogspot.com' class='url'&gt;Hamlet D'Arcy&lt;/a&gt; wrote: In the past my problem has been that my organization would not let me rely on a personal or nightly build of a project. So when you need a workaround by the end of the week, waiting 2 months for the next release candidate of an OS project is not an option. ... now go release JConch 1.2.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/i-dont-get-it/#comment-37217"&gt;February 5, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://www.naildrivin5.com/blog' class='url'&gt;Dave&lt;/a&gt; wrote: I've encountered this a few times. Sometimes, I'm trying to get things done, so I hack around the problem and then there's not always time to go back and learn a new codebase to submit a patch. Further, having submitted a few patches to a maven plugin (a piece of software I cannot stand, but submitted anyway), it's been months since I uploaded a freakin' zip file to their JIRA and no movement. I also think compared to, say, Ruby, a lot of Java packages are very large and complex. If I find a bug in Spring or Hibernate, my chances of even navigating the codebase to find out where the problem is are nil. And Spring is actually pretty clean code; I mucked through JSCh and the maven release plugin and was HORRIFIED at how awful the code was. And then there's the myriad build systems and spotty tests; One of the Castor devs asked me write a test or he wouldn't accept my patch; my patch was to make his code actually compile. And their tests on trunk (and release tag) didn't pass. Meanwhile, on github, I've submitted patches to things that I wrote and tested in less time than it took to find the svn link on Apache's site. I've also incorporated others changes to my code (that they didn't even submit). Granted these things are not as complex as Spring, but, well, maybe that's a good thing?&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/i-dont-get-it/#comment-37218"&gt;February 5, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://www.naildrivin5.com/blog' class='url'&gt;Dave&lt;/a&gt; wrote: @Hamlet D'Arcy in your case, I have imported the released version I'm using into our company's svn repo and made changes I needed against that, then deployed THAT to our maven repo. It was painful, but worked.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/i-dont-get-it/#comment-37219"&gt;February 5, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://twitter.com/RobertFischer' class='url'&gt;Robert Fischer&lt;/a&gt; wrote: Argh. I've totally forgotten about JConch 1.2. Just released it. It's now a Gradle-based build (I wanted to OSGi-ify the project and have a Maven repo).&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/i-dont-get-it/#comment-37220"&gt;February 5, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://spockframework.org' class='url'&gt;Peter Niederwieser&lt;/a&gt; wrote: From my experience, most developers aren't even willing to take the time to report a bug they encounter...&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/i-dont-get-it/#comment-37222"&gt;February 6, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://plasmasturm.org/' class='url'&gt;Aristotle Pagaltzis&lt;/a&gt; wrote: I agree with Peter – I actually &lt;a rel="nofollow" target="_blank" href="http://twitter.com/apag/status/7101875141"&gt;tweeted the same observation&lt;/a&gt; just a few weeks ago. I got &lt;a rel="nofollow" target="_blank" href="http://twitter.com/jrockway/status/7101912403"&gt;one response to that&lt;/a&gt; that &lt;a rel="nofollow" target="_blank" href="http://twitter.com/apag/status/7360563175"&gt;didn’t satisfy me either&lt;/a&gt;. It’s not limited to Java either.&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/i-dont-get-it/#comment-37233"&gt;February 6, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://blog.james-carr.org' class='url'&gt;James Carr&lt;/a&gt; wrote: Yeah... this has often surprised me as well. I've witnessed a team try to use some open source solution and give up because of a minor bug and go to a much more difficult to use proprietary solution (which amusingly had more critical bugs). I was also surprised when at my current client site they actually asked me spend a week working on fixing a bug in an open source project and submit a patch... that's definitely the best attitude to have. :)&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/i-dont-get-it/#comment-37413"&gt;March 8, 2010&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href='http://mcherm.com/' class='url'&gt;Michael Chermside&lt;/a&gt; wrote: For projects in ALL languages, the difficulty in getting a patch accepted is a genuine issue (and is difficult to solve). There is a sweet-spot of small, recent projects that accept patches easily. Older projects are often neglected (or abandoned) by their original authors, which makes accepting patches difficult. Larger projects necessarily set standards (like requiring unit tests or moderately complicated review processes, or certain coding standards) which not every patch will meet. The problem is not easily solved because these are inherent problems rather than just projects being obstinate. Meanwhile, Java programmers are probably worse because (1) many well-known open-source Java projects are large and corporately sponsored which makes it difficult to get them to accept patches, and (2) many Java programmers work in corporate environments where it is difficult to get "permission" to contribute to an open source project. Simply not being in the habit of doing so makes the practice less likely than with other languages.&lt;/li&gt;&lt;/ul&gt;&lt;hr /&gt;
This post was by &lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/author/candide/"&gt;Robert Fischer&lt;/a&gt;, written on February 5, 2010.&lt;br /&gt;
Comment on this post: &lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/i-dont-get-it/#respond"&gt;http://enfranchisedmind.com/blog/posts/i-dont-get-it/#respond&lt;/a&gt;&lt;br /&gt;
Public Permalink: &lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/i-dont-get-it/"&gt;http://enfranchisedmind.com/blog/posts/i-dont-get-it/&lt;/a&gt;
&lt;hr /&gt;&lt;a rel="nofollow" target="_blank" href="http://creativecommons.org/licenses/by-sa/3.0/us/"&gt;&lt;img alt="Creative Commons License" style="border-width:0;" src="http://i.creativecommons.org/l/by-sa/3.0/us/88x31.png"/&gt;&lt;/a&gt;&lt;br /&gt;This article was a post on &lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog"&gt;the EnfranchisedMind blog&lt;/a&gt;. &lt;span&gt;EnfranchisedMind Blog&lt;/span&gt; by &lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/"&gt;Robert Fischer, Brian Hurt, and Other Authors&lt;/a&gt; is licensed under a &lt;a rel="nofollow" target="_blank" href="http://creativecommons.org/licenses/by-sa/3.0/us/"&gt;Creative Commons Attribution-Share Alike 3.0 United States License&lt;/a&gt;.&lt;p style="display:none;"&gt;(Digital Fingerprint: bcecb67d74ab248f06f068724220e340 (69.147.112.168) )&lt;/p&gt;</description>
      <pubDate>Fri, 05 Feb 2010 14:29:00 CST</pubDate>
      <guid isPermaLink="true">http://enfranchisedmind.com/blog/?p=2276</guid>
      <dc:creator>Robert Fischer</dc:creator>
    </item>
    <item>
      <title>Groovy, Grails, Griffon @ ESDC 2010</title>
      <link>http://www.springone2gx.com/blog/andres_almiray/2010/02/groovy_grails_griffon__esdc_2010</link>
      <description>&lt;p&gt;In just a few weeks (March 1-3) the first edition of &lt;a href="http://go-esdc.com/"&gt;ESDC&lt;/a&gt; will take place in San Mateo, California. ESDC is a brand new conference that offers more than 70 workshops and technical classes. There are plenty of topics to choose from. Groovy, Grails and Griffon are no exception. A list of Groovy related workshops and classes follows.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;b&gt;WORKSHOPS&lt;/b&gt;&lt;/center&gt;&lt;/p&gt;&lt;br/&gt;
&lt;h3&gt;Groovy Tutorial – Scripting on the JVM - Paul King&lt;/h3&gt;
&lt;p&gt;Groovy is a dynamic language for the JVM; it’s like a super version of Java. For Java programmers, it offers a syntax that closely resembles (in some cases exactly resembles) Java, but offers many improvements that not only greatly simplify code but also provide an enriched environment with many productivity features. In many cases, such features are promised in Java versions 7, 8 or up, but they are available today in Groovy.
&lt;/p&gt;&lt;p&gt;
For non-Java programmers, Groovy provides a great entry point to the JVM. It allows code to be written which harnesses many of JVM features without the large learning curve associated with learning all of Java. Groovy’s mix of language design choices and features make it suitable for everything from small scripting tasks through to large complex software systems with stringent Agile quality requirements.
&lt;/p&gt;&lt;p&gt;
The tutorial will introduce attendees to Groovy, cover writing their first programs, run through a whirlwind tour of the basic language features, including data types, regex handling, XML processing, databases, graphics, file processing, build tasks, using Closures, testing and more.
&lt;/p&gt;&lt;p&gt;
The tutorial will also talk about the pros and cons of using Groovy, available tool support, great ways to introduce Groovy intro your project, what practices may change if you adopt Groovy, and briefly compare Groovy with other JVM languages.
&lt;/p&gt;&lt;p&gt;
Prerequisites: This is an introductory workshop. It assumes that attendees have some programming experience but requires no in-depth Java experience. It is suitable for Java programmers wanting to increase their productivity by using a dynamic language or for non-Java developers such as PHP or .NET developers wanting to leverage the JVM without the burden of learning all of Java.
&lt;/p&gt;

&lt;h3&gt;Groovy Power Features - Paul King&lt;/h3&gt;
&lt;p&gt;Groovy is a dynamic language for the JVM; it’s like a super version of Java. For Java programmers, it offers a syntax that closely resembles (in some cases exactly resembles) Java, but offers many improvements that not only greatly simplify code but also provide an enriched environment with many productivity features. In many cases, such features are promised in Java versions 7 and later, but they are available today in Groovy.
&lt;/p&gt;&lt;p&gt;
Some of the power features of Groovy you’ll learn about are:&lt;ul&gt;
&lt;li&gt;Leveraging Groovy’s features to write DSLs&lt;/li&gt;
&lt;li&gt;Writing Web Service servers and clients in a few lines of code&lt;/li&gt;
&lt;li&gt;Replacing Design Patterns with language features and/or libraries&lt;/li&gt;
&lt;li&gt;Talking to the Polyglot world from Groovy: Scala, Clojure, Jython, JRuby, JavaScript and Jaskell&lt;/li&gt;
&lt;li&gt;Harnessing constraint/logic and functional programming&lt;/li&gt;
&lt;li&gt;Simple but powerful tests&lt;/li&gt;
&lt;li&gt;Simplify how you write build tasks&lt;/li&gt;
&lt;li&gt;Accessing Hibernate through GORM&lt;/li&gt;
&lt;li&gt;Harnessing parallel processing&lt;/li&gt;
&lt;li&gt;Leveraging Spring and OSGi&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Prerequisites: This is an intermediate to advanced tutorial. It assumes that attendees have some previous exposure to Groovy or are accomplished at Java. Alternatively, you can take the Groovy Tutorial.
&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;b&gt;CLASSES&lt;/b&gt;&lt;/center&gt;&lt;/p&gt;&lt;br/&gt;
&lt;h3&gt;Make Your Builds More Groovy - Paul King&lt;/h3&gt;
&lt;p&gt;The bane of many developers' lives is their build scripts. They find them hard to write, hard to understand later, and each project seems to do things in vastly different ways and they take forever to run—if they successfully run at all. This class looks at the available technologies to ease the burden of writing build files with a particular focus on technologies that support the Groovy programming language. We’ll cover:
&lt;/p&gt;&lt;p&gt;
The “build your own” approach, including process and parallelization features using Ant from Groovy; using Groovy from Ant; using Ivy; using Gant; using Maven and GMaven; using Graven; using Gradle; continuous integration server hooks; and deployment management.
&lt;/p&gt;&lt;p&gt;
While these options leverage the Groovy language, they are by no means solely for building projects that make heavy use of Groovy directly. All of these technologies are very much applicable to Java only as well as polyglot projects. A brief look at non-Groovy alternatives will also be covered.
&lt;/p&gt;&lt;p&gt;
As we discuss each technology (some would argue that some of the options we have for writing builds actually can make our lives worse!), we’ll try to look at the pros and cons and best practices.
&lt;/p&gt;
&lt;h3&gt;Groovy from the Trenches - Andrew Glover&lt;/h3&gt;
&lt;p&gt;Groovy has been successfully leveraged at various companies around the world in order to build enterprise applications on the Java platform quickly. In particular, Groovy has proved its value at a large financial services client on more than one occasion to build mission critical applications in short order, all while leveraging their existing investment in the Java platform from developer tools all they way to data center management.
&lt;/p&gt;&lt;p&gt;
From exposing legacy data models via RESTful Web services, to mission-critical reporting applications built with GroovySQL and Spring, to Groovy's core language features and much, much more, I'll show you tips and tricks that separate Groovy from the pack and expose how one can quickly build real world applications that meet a business's needs quickly with fewer lines of code.
&lt;/p&gt;
&lt;h3&gt;Make the Most of your Testing Time in the Java Virtual Machine - Andres Almiray&lt;/h3&gt;
&lt;p&gt;The Java platform ecosystem harbors many languages besides Java. In that vast set of languages there is one that has received the title of “Next-Generation Java,” but not because it dismisses Java, not at all! It is because it embraces the language and extends it in a friendly and fluent way. That language is Groovy. Testing Java code can be cumbersome, especially when rigid limits as verbose syntax and static typing get in the way. Groovy can help you write less code while retaining the same behavior. It can also test your Java production code without any special bridge between languages. Groovy integrates seamlessly with all Java libraries, testing frameworks and IDEs, which means you won’t be throwing away your Java knowledge, you’ll just make it groovier. You’ll learn how to use Groovy to aid Java tests in key areas as code verbosity, mocking, XML production/consumption, and behavior-driven development.
&lt;/p&gt;&lt;p&gt;
Prerequisites: Attendees should have good knowledge of the Java language and common testing frameworks like JUnit and TestNG, and be proficient in one of the major Java IDEs (IDEA, NetBeans, Eclipse), as well in Apache Ant or Maven. Laptops loaded with the latest stable groovy distribution can be found at groovy.codehaus.org/Download
&lt;/p&gt;
&lt;h3&gt;Make Your Tests More Groovy - Paul King&lt;/h3&gt;
&lt;p&gt;Testing can be a complex and thankless task. The technologies change so fast that your tools don't work as they should or you have to write lots of low-level boilerplate code that is obsolete almost as soon as it's written. Your tests are brittle and hard to relate to customer requirements. You aren't even sure that you are testing the right things. Let's explore some techniques and tools for easing some of these burdens and try to move testing from tedious and hard to easier and fun!
&lt;/p&gt;&lt;p&gt;
In this class, you’ll sample a flavor of many techniques and tools, and cover these topics:&lt;ul&gt;
&lt;li&gt;Using easyb for BDD-flavored acceptance tests&lt;/li&gt;
&lt;li&gt;Developer testing using JUnit 4, TestNG, Instinct, Spock and GMock&lt;/li&gt;
&lt;li&gt;Writing domain specific testing languages (testing DSLs)&lt;/li&gt;
&lt;li&gt;Testing Web applications with WebTest, Tellurium, Selenium and WebDriver&lt;/li&gt;
&lt;li&gt;Testing RESTful and SOAP-flavored Web services&lt;/li&gt;
&lt;li&gt;Testing databases with DbUnit&lt;/li&gt;
&lt;li&gt;Testing rich clients and GUIs with FEST&lt;/li&gt;
&lt;li&gt;Performance testing with JMeter&lt;/li&gt;
&lt;li&gt;Model-driven testing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Many of the examples will use the Groovy language, but the lessons apply to Ruby, .NET, and other languages and scenarios.
&lt;/p&gt;
&lt;h3&gt;Easy BDD with Groovy - Andrew Glover&lt;/h3&gt;
&lt;p&gt;The Manifesto for Agile Software Development essentially focuses on meeting customer needs through reducing wasteful activities. For example, Agile developmental practices push for reducing repetitive documentation and for a rapid acceptance of change. Yet, achieving these goals is by no means easy. While a process can enable increased collaboration, for instance, there are various tools that can effectively implement Agile principles.
&lt;/p&gt;&lt;p&gt;
Once such tool is easyb (www.easyb.org), which is a Groovy-based domain specific language, which facilitates collaboration by bridging those that define requirements (i.e. customers) and those who turn requirements into code (i.e. development). With easyb, collaborative teams can develop stories in a specific format, which are then implemented as tests through a framework that marries the underlying application. This test suite enables change and produces accordance among Agile teams in short order.
&lt;/p&gt;&lt;p&gt;
In this talk, you will learn how to embrace collaboration and change rapidly by defining easyb stories that exercise a Java application end to end. You will learn how to define specific easyb structures, how to plug them into real code, and how to run them in an automated fashion. You will see first hand how non-coders can define tests easily and how the collaboration this brings yields working software faster.&lt;/p&gt;
&lt;h3&gt;Building Desktop Applications with Griffon (Part 1 &amp;amp; 2) - Andres Almiray&lt;/h3&gt;
&lt;p&gt;Building a desktop application is a hard task; there are so many things to keep track of that many projects simply fail to meet their goals. Setting up the project structure, keeping each artifact in a well-identified location given its responsibility and type, defining the base schema for managing the application's life cycle, making sure the build is properly set up, and more. These are recurring tasks that should be handled by a tool or, better yet, a framework. Griffon is such a framework. Inspired by the Grails framework, Griffon aims to bring the same productivity gains to desktop development. There are so many traits shared by both frameworks that a Grails developer should be able to pick up the pace fairly quickly.
&lt;/p&gt;&lt;p&gt;
Prerequisites: Attendees should have good knowledge of the Java language and Java Swing. Laptops loaded with the latest stable Griffon distribution found at griffon.codehaus.org/Download.&lt;/p&gt;
&lt;h3&gt;Construction Techniques for Domain Specific Languages - Neal Ford&lt;/h3&gt;
&lt;p&gt;Domain-specific languages have been the Next Big Thing for years now, but they have quietly started penetrating the development world. This talk covers language techniques in Java, Groovy and Ruby on how and why to create DSLs. This class starts by motivating you to convert APIs into DSLs, and various patterns, anti-patterns, and best practices for how to achieve the optimum effect. You’ll also learn about the very important topic of implicit context, and how language constructs can allow you to write less verbose and more expressive code.&lt;/p&gt;
&lt;h3&gt;RESTing Easy With Grails - Andrew Glover&lt;/h3&gt;
&lt;p&gt;Representational state transfer (REST) is a way of thinking, not a protocol or standard. It's a style of designing loosely coupled applications that rely on named resources (in the form of URLs, URIs and URNs, for instance) rather than messages. Ingeniously, REST piggybacks on the already validated and successful infrastructure of the Web: HTTP. That is, REST leverages aspects of the HTTP protocol such as GET and POST requests, which map standard business-application needs, such as create, read, update and delete (CRUD). By associating requests, which act like verbs, with resources, which act like nouns, you end up with a logical expression of behavior (GET this document and DELETE that record, for example).
&lt;/p&gt;&lt;p&gt;
In this class, you will learn about the mechanism for creating RESTful applications with Groovy’s Grails, which gives you the ability to apply RESTful techniques with a full-fledged Web application framework that supports an ORM and testing to boot! As you will learn, using Groovy's Grails framework makes building RESTful Web services a snap.&lt;/p&gt;&lt;br/&gt;See you there!&lt;br/&gt;&lt;br/&gt;Keep on Groovying!</description>
      <pubDate>Thu, 04 Feb 2010 18:50:00 CST</pubDate>
      <guid isPermaLink="true">http://www.jroller.com/aalmiray/entry/esdc_2010</guid>
      <dc:creator>Andres Almiray</dc:creator>
    </item>
  </channel>
</rss>

