<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7833979</id><updated>2012-01-31T11:07:20.274-06:00</updated><category term='grails'/><category term='clojure springsource groovy'/><category term='java'/><category term='groovy'/><category term='web'/><title type='text'>Jeffs Groovy Web Log</title><subtitle type='html'>Jeff's technology blog dedicated to discussing technology that interests me including Groovy, Grails and other cool stuff.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>55</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7833979.post-1475392848287851470</id><published>2011-08-18T21:33:00.003-05:00</published><updated>2011-08-18T22:09:24.253-05:00</updated><title type='text'>Today's Loss</title><content type='html'>I have all but abandoned this blog.  I think it has been over a year since I posted anything here.  At this point, writing here reminds me of Forest Whitaker's character in the movie Phenomenon telling his story over a radio that he knows no one is listening to.  That is fine.&lt;br /&gt;&lt;br /&gt;My parents divorced when I was 10 years old.  My Mother was put in a position where she had to take action.  She put myself and my 2 sisters in the car and drove across the country to St. Louis where she had grown up and where her family lived.  We had made the trip before for summer vacations but this time it was for good.  I can only imagine how terrifying this must have been for her.  Imagine a 10 year old car, kids 10, 12 and 13, some clothes and nothing else, nothing.  I expect many people couldn't do it.&lt;br /&gt;&lt;br /&gt;We got to St. Louis where there was lots of family support.  My Mother had 2 brothers and a sister all in St. Louis along with her parents.  Her sister Brenda took us into her house.  She had a great place in a great neighborhood in the suburbs.  Brenda was a single Mom with 3 kids of her own but her home was ours.  I was young enough that I would not have been involved in financial discussions but I am sure this was a hardship for her take on 4 more people.  My Mother had been a housewife and I think she left our home in Virginia with no money.  If she had any money, I don't think it could have been very much.  3 kids, no money, no career.&lt;br /&gt;&lt;br /&gt;During those first few months when we lived at Aunt Brenda's house, it really was a pretty good time for me.  I spent time with my cousins.  We had a great place to live.  We did a lot of fun things on the weekends.  It was tough working out the deal with my Dad no longer being with us but the day to day was good and the reason it was good is that Brenda took us in and made sure we had everything we needed.  My grandparents, Uncles and Aunt were all there to provide support in lots of ways but it was Aunt Brenda's house we lived in and she bore a lot of the burden.  I doubt she ever gave it a thought.&lt;br /&gt;&lt;br /&gt;Aside from my Mother, it may be that Brenda is most responsible for our survival during that time, that of myself my Mother and my sisters.  When I think about the time immediately following my parents' divorce, I think about the time I spent living in her house.  We weren't living in a crappy motel or worse.  Because of her we lived in a fantastic place and had everything we needed.&lt;br /&gt;&lt;br /&gt;Today, Brenda's battle with cancer has come to a crushing end.  I am crushed.  I am crushed as I think about my cousins, her kids who are without her.  I am crushed as I think about my Mother who just 2 months ago lost her Mother and now her sister.&lt;br /&gt;&lt;br /&gt;Brenda was a tiny woman but a feisty take charge kind of woman.  She didn't take any shit from anyone and if I worded it any other way, she might have taken offense.&lt;br /&gt;&lt;br /&gt;I thank Brenda for everything she did for us.  If I was a poet I would write a tribute to her.  If I could paint I would paint a tribute to her.  As it is, I will be thinking about her and the rest of the family and will do my best to be inspired by what she did for me and my family.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-1475392848287851470?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/1475392848287851470/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=1475392848287851470' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/1475392848287851470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/1475392848287851470'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2011/08/todays-loss.html' title='Today&apos;s Loss'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-8272591086250166215</id><published>2010-04-23T11:20:00.004-05:00</published><updated>2010-04-23T11:37:51.646-05:00</updated><title type='text'>Switching Versions Of Grails (and other tools)</title><content type='html'>I have a little trick that I have used for many years to switch back and forth between versions of development tools.  For example, because of the work that I do day to day I often need to switch back and forth between different versions of &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt;.  Occasionally I will execute this trick while sitting with another developer or during a live coding presentation at a conference without even thinking about it.  Often someone will notice and and stop me to ask "what was that?". &lt;br /&gt;&lt;br /&gt;I have a directory below my HOME directory called Tools.  This Tools directory is where I install development tools like Groovy, Grails, Gradle, Ant etc.  For some of those tools, I may want to have numerous versions of the tool available.  For example, I have the following subdirectories below Tools...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;grails-1.0.5&lt;br /&gt;grails-1.1.1&lt;br /&gt;grails-1.1.2&lt;br /&gt;grails-1.2-M4&lt;br /&gt;grails-1.2.0&lt;br /&gt;grails-1.2.0.RC1&lt;br /&gt;grails-1.2.0.RC2&lt;br /&gt;grails-1.2.1&lt;br /&gt;grails-1.2.2&lt;br /&gt;grails-1.3.0.RC1&lt;br /&gt;grails-1.3.0.RC2&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;One thing I might do when I need to use a specific version of Grails is something like this...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;export GRAILS_HOME=~/Tools/grails-1.2.2&lt;br /&gt;export PATH=$GRAILS_HOME/bin:$PATH&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;One limitation of that approach is it is a lot of tedious typing.  Another is that the change would only apply to the shell where that was executed.   Normally if I am working with a particular version of Grails, I want that version to be in play in all open shells.&lt;br /&gt;&lt;br /&gt;Instead of pointing GRAILS_HOME at a particular version of Grails, I create a symlink at ~/Tools/grails and that link points to one of the specific Grails version directories.  GRAILS_HOME points to that symlink.  If I am currently using Grails 1.2.2 and I want to switch to 1.3.0.RC2, I just move the symlink and leave GRAILS_HOME and PATH alone.&lt;br /&gt;&lt;br /&gt;Moving the symlink is easy enough but I simplify it further by defining aliases in my ~/.profile.  Those look something like this...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;alias gr105='rm ~/Tools/grails &amp;&amp; ln -s ~/Tools/grails-1.0.5 ~/Tools/grails'&lt;br /&gt;alias gr111='rm ~/Tools/grails &amp;&amp; ln -s ~/Tools/grails-1.1.1 ~/Tools/grails'&lt;br /&gt;alias gr112='rm ~/Tools/grails &amp;&amp; ln -s ~/Tools/grails-1.1.2 ~/Tools/grails'&lt;br /&gt;alias gr12='rm ~/Tools/grails &amp;&amp; ln -s ~/Tools/grails-1.2.0 ~/Tools/grails'&lt;br /&gt;alias gr121='rm ~/Tools/grails &amp;&amp; ln -s ~/Tools/grails-1.2.1 ~/Tools/grails'&lt;br /&gt;alias gr122='rm ~/Tools/grails &amp;&amp; ln -s ~/Tools/grails-1.2.2 ~/Tools/grails'&lt;br /&gt;alias gr130rc1='rm ~/Tools/grails &amp;&amp; ln -s ~/Tools/grails-1.3.0.RC1 ~/Tools/grails'&lt;br /&gt;alias gr130rc2='rm ~/Tools/grails &amp;&amp; ln -s ~/Tools/grails-1.3.0.RC2 ~/Tools/grails'&lt;br /&gt;# use my local development copy of Grails&lt;br /&gt;alias grdev='rm ~/Tools/grails &amp;&amp; ln -s /Users/jeff/Projects/grails/core ~/Tools/grails'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now if I want to use Grails 1.2.2 I just open a shell and type "gr122".&lt;br /&gt;&lt;br /&gt;I use the exact same approach for other tools that I may want to easily move from version to version.&lt;br /&gt;&lt;br /&gt;I do all of this on OS X.  The same trick should work on Linux.  I don't know enough about cygwin to know if this can work on Windows or not.  I expect that it probably would.&lt;br /&gt;&lt;br /&gt;That is all I have.  It isn't any big deal but is one of those little things that over the years numerous folks have asked me about and then expressed that they liked it well enough that they were going to do the same.&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-8272591086250166215?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/8272591086250166215/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=8272591086250166215' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/8272591086250166215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/8272591086250166215'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2010/04/switching-versions-of-grails-and-other.html' title='Switching Versions Of Grails (and other tools)'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-8283235163423882716</id><published>2009-07-30T16:26:00.008-05:00</published><updated>2009-07-30T17:21:42.769-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='clojure springsource groovy'/><title type='text'>Grails, SpringSource And Clojure</title><content type='html'>I recently developed a &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; plugin which provides support for easily accessing &lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt; code in a Grails app.  The details of how the plugin works are covered at &lt;a href="http://grails.org/plugin/clojure"&gt;http://grails.org/plugin/clojure&lt;/a&gt;.  That page includes a link to a brief video demonstration which is available at &lt;a href="http://s3.amazonaws.com/jeffscreencasts/grails_clojure_demo.mov"&gt;http://s3.amazonaws.com/jeffscreencasts/grails_clojure_demo.mov&lt;/a&gt;.  Check it out.  &lt;br /&gt;&lt;br /&gt;Shortly after publishing the plugin I posted &lt;a href="http://twitter.com/jeffscottbrown/status/2716646376"&gt;something about it&lt;/a&gt; on Twitter.  Not too long after that a couple of other &lt;a href="http://www.springsource.com"&gt;SpringSource&lt;/a&gt; folks tweeted about Clojure (&lt;a href="http://twitter.com/adriancolyer/statuses/2735215584"&gt;here&lt;/a&gt; and &lt;a href="http://twitter.com/graemerocher/statuses/2735112222"&gt;here&lt;/a&gt;).  I got a couple of questions (in jest I am sure) about SpringSource and Clojure.  "Is SpringSource Moving To Clojure?".  Of course not.  SpringSource is not moving to Clojure.  SpringSource is all about helping folks build serious applications for the JVM and most of that is done in Java.  This is not news.  I work on Groovy and Grails.  Much of what I do is in Groovy.  This too is not news.  Making it easy for folks to use languages like Scala and Clojure while taking advantage of all the great stuff that Grails has to offer, that is appealing to me and that is why I developed the Clojure plugin.  &lt;br /&gt;&lt;br /&gt;Clojure is a really interesting language.  There are &lt;a href="http://www.scala-lang.org/"&gt;others&lt;/a&gt;.  The fact that 3 folks from SpringSource have expressed some kind of interest in Clojure shouldn't be all that surprising.  There are probably even more folks at SpringSource who have some kind of interest in Clojure but for entertainment, lets focus on the 3 mentioned...&lt;br /&gt;&lt;br /&gt;I am honestly not sure how many technologists work for SpringSource but for the sake of having a number to work with, lets say there are 50.  Lets also say that Clojure is interesting enough that 15% of JVM developers are interested in learning more about it.  I can't back that number up with any research, lets just go with it.  If 15% of JVM developers are interested in the language and you take a random group of 50 JVM developers (the 50 in question are certainly not 50 random developers, these are the edge cutters which probably makes them more likely to be interested in keeping an eye on what is new, but work with the idea that they are random)... Do the math.  No, really... Do the math.  Do the math to figure out the likelihood that 3 of the 50 would be interested in Clojure.  I challenge you to do the math in Clojure and post your solution in a comment here.  Do it in Scala,  Do it in Groovy.  Pick a JVM language and do the math.&lt;br /&gt;&lt;br /&gt;The simplest solution is probably not very interesting.  Prefer a solution that shows off something interesting in your language of choice.&lt;br /&gt;&lt;br /&gt;Hmmm... are you more likely to need to refer to &lt;a href="http://www.pragprog.com/titles/shcloj/programming-clojure"&gt;the Clojure book&lt;/a&gt;, or the high school math book?  ;)&lt;br /&gt;&lt;br /&gt;Now, you have one more reason to tinker with a new language.&lt;br /&gt;&lt;br /&gt;Enjoy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-8283235163423882716?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/8283235163423882716/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=8283235163423882716' title='24 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/8283235163423882716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/8283235163423882716'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2009/07/grails-springsource-and-clojure.html' title='Grails, SpringSource And Clojure'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>24</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-5778479304313327890</id><published>2009-01-29T19:26:00.002-06:00</published><updated>2009-01-29T19:45:44.222-06:00</updated><title type='text'>Grails 1.1 beta3 Is Out!</title><content type='html'>We are closing in on the much anticipated release of Grails 1.1.  Today beta 3 was released.  See &lt;a href="http://www.grails.org/1.1-beta3+Release+Notes"&gt;the release notes&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A new feature that has not been documented yet involves new validation capabilities.  Up to this point, domain classes and command objects within a Grails app have supported really powerful validation capabilities.  See section 7 in &lt;a href="http://grails.org/doc/1.1-beta3/"&gt;The User Guide&lt;/a&gt; for info on how that works.  What is new is now you can apply those same validation capabilities to any class within a Grails app, not just domain classes and command objects.  Making a class validateable involves defining a static property called "constraints" and assigning a closure, just like you would in a domain class or a command object.  &lt;br /&gt;&lt;br /&gt;Second, you have to tell Grails about your validateable class.  You have 2 options for doing that.  One option is to mark you class with the org.codehaus.groovy.grails.validation.Validateable annotation.  Another option is to define your validateable classes in grails-app/conf/Config.groovy by assigning a value to the grails.validateable.classes property.  That would look something like this...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;grails.validateable.classes = [ com.mycompany.dto.SomeClass, com.mycompany.SomeOtherClass]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;An annotated class might look something like this...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;// src/groovy/com/companyname/SomeClass.groovy&lt;br /&gt;package com.companyname&lt;br /&gt;&lt;br /&gt;import org.codehaus.groovy.grails.validation.Validateable&lt;br /&gt;&lt;br /&gt;@Validateable&lt;br /&gt;class SomeClass {&lt;br /&gt;    Integer age&lt;br /&gt;    String name&lt;br /&gt;&lt;br /&gt;    static constraints = {&lt;br /&gt;        age range: 16..66&lt;br /&gt;        name blank: false, size: 5..35&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note that if you are using the annotation based approach, Grails will search all classes in the app to find all of the @Validateables.  While that isn't really a performance problem, you can tune that a bit by specifying some specific packages that Grails should search.  To do that, assign a value to grails.validateable.packages in grails-app/conf/Config.groovy like this...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;grails.validateable.packages = ['com.companyname.dto', 'com.companyname.someotherpackage']&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;If the grails.validateable.packages property has a value then Grails will only look in those packages (and packages below those packages) for classes marked with @Validateable.&lt;br /&gt;&lt;br /&gt;While this is still beta software, I think the feature will end up being delivered in the final release pretty much like it is described above.  If you have any input on that or any other features in Grails.  We would love to hear from you.  Bring it to the &lt;a href="http://grails.org/Mailing+lists"&gt;mailing list&lt;/a&gt; or file a &lt;a href="http://jira.codehaus.org/browse/GRAILS"&gt;JIRA&lt;/a&gt; issue.&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-5778479304313327890?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/5778479304313327890/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=5778479304313327890' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/5778479304313327890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/5778479304313327890'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2009/01/grails-11-beta3-is-out.html' title='Grails 1.1 beta3 Is Out!'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-5648858679233963098</id><published>2008-11-13T21:39:00.006-06:00</published><updated>2008-12-15T14:17:29.786-06:00</updated><title type='text'>Getting Groovy With "with"</title><content type='html'>&lt;span style="font-weight:bold;"&gt;UPDATE 12/15/2008&lt;/span&gt;: &lt;span style="font-style:italic;"&gt;I committed a change yesterday that changes the behavior of the .with method to use DELEGATE_FIRST as the resolveStrategy instead of OWNER_FIRST.  If you are not sure what that means, you should by the end of this post.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Strange enough title.&lt;br /&gt;&lt;br /&gt;Let's start with a hypothetical conversation between a geeky developer and his much less geeky wife:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Jeff: Betsy, how are you?&lt;br /&gt;&lt;br /&gt;Betsy: I am fine thanks.  How are you?&lt;br /&gt;&lt;br /&gt;Jeff: Betsy, I am fine thank you.&lt;br /&gt;&lt;br /&gt;Betsy: Great.&lt;br /&gt;&lt;br /&gt;Jeff: Betsy, you know my birthday is the day after tomorrow right?&lt;br /&gt;&lt;br /&gt;Betsy: Yes, I haven't forgotten.  You mention it about 9 times a day you know.&lt;br /&gt;&lt;br /&gt;Jeff: Betsy, yes I know.  Are we going to have an ice cream cake?&lt;br /&gt;&lt;br /&gt;Betsy: Yes, I think that would be good.&lt;br /&gt;&lt;br /&gt;Jeff: Betsy, are you going to buy me the new Opeth DVD?&lt;br /&gt;&lt;br /&gt;Betsy: I will get it for you but that music sucks big time.&lt;br /&gt;&lt;br /&gt;Jeff: Betsy, that is awesome.  Thank you.&lt;br /&gt;&lt;br /&gt;Betsy: Why do you keep saying "Betsy" at the beginning of every sentence?&lt;br /&gt;&lt;br /&gt;Jeff: Betsy, I guess I am used to inflexible languages which aren't very expressive.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Um, what does any of that have to do with Groovy?  Well, lets talk about the problem with this conversation (aside from the lady's lack of appreciation for Swedish heavy metal).  What is wrong is Jeff begins each sentence with "Betsy".  Why might he do that?  One reason is so Betsy knows that he is talking to her.  Clearly this isn't necessary.  It isn't necessary because she already knows he is talking to her.  A context has been established which makes the addressing unnecessary.  Jeff began the conversation by addressing Betsy, they probably made eye contact and were in close proximity.  Once the conversation started, there isn't much question about who each sentence is being directed to.&lt;br /&gt;&lt;br /&gt;Again, what does any of that have to do with Groovy?  Lets press on...&lt;br /&gt;&lt;br /&gt;Consider the following Java code which prints out a specific date.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;// PrintIndependenceDay.java&lt;br /&gt;&lt;br /&gt;import java.util.Calendar;&lt;br /&gt;import java.util.Date;&lt;br /&gt;&lt;br /&gt;public class PrintIndependenceDay {&lt;br /&gt;&lt;br /&gt;  public static void main(String[] args) {&lt;br /&gt;    Calendar calendar = Calendar.getInstance();&lt;br /&gt;    calendar.clear();&lt;br /&gt;    calendar.set(Calendar.MONTH, Calendar.JULY);&lt;br /&gt;    calendar.set(Calendar.DATE, 4);&lt;br /&gt;    calendar.set(Calendar.YEAR, 1776);&lt;br /&gt;    Date time = calendar.getTime();&lt;br /&gt;    System.out.println(time);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Groovy developers can look at that and find quite a bit of noise that doesn't really have anything to do with what the code is trying to do but I want to focus on one specific thing.  That one thing is all of the interaction with the calendar variable.  Notice that we call clear() on the calendar, then call set() several times and later call getTime() on that same variable.  All of those calls are prefixed with "calendar." so the compiler knows what we want to do.  If we called "clear()" instead of "calendar.clear()", what would that mean?  Are we calling the clear() method in this class?  If that was our intent, it would not work because there is no clear() method.  We have to prefix the call with an object reference so the compiler knows where to send the request.  That seems to make sense.  However, if we are going to do a bunch of things "with" the same object, wouldn't it be kind of nice if we could somehow do all of those things without all the repetition.  Specifically, it might be nice if we could get rid of all of those "calendar." prefixes.  &lt;br /&gt;&lt;br /&gt;On to Groovy...&lt;br /&gt;&lt;br /&gt;The following Groovy code does the same thing that the Java code above does.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;// PrintIndependenceDay.groovy&lt;br /&gt;&lt;br /&gt;def calendar = Calendar.instance&lt;br /&gt;calendar.with {&lt;br /&gt;  clear()&lt;br /&gt;  set MONTH, JULY&lt;br /&gt;  set DATE, 4&lt;br /&gt;  set YEAR, 1776&lt;br /&gt;  println time&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Wow.  That is a good bit cleaner than what we started with.  Part of the reason for that is we were able to get rid of all of those "calendar." prefixes.  What allowed us to do that is calling the "with" method on the calendar object and passing a closure as an argument.  What we have done there is establish a context that says "do all of this stuff with this calendar object".  When the closure executes, the calendar is given an opportunity to respond to method calls like clear() and set() and the implicit call to getTime() when referring to the "time" property which is being passed to println.  Likewise, the references to MONTH, JULY, DATE and YEAR properties are also being handled by the calendar object.&lt;br /&gt;&lt;br /&gt;That is pretty slick.  Lets dig just a little deeper to get a little better understanding of what is really going on.&lt;br /&gt;&lt;br /&gt;Groovy closures have a delegate associated with them.  The delegate is given an opportunity to respond to method calls which happen inside of the closure.  Here is a simple example:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;// define a closure&lt;br /&gt;def myClosure = {&lt;br /&gt;  // call a method that does not exist&lt;br /&gt;  append 'Jeff'&lt;br /&gt;  append ' was here.'&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// assign a delegate to the closure&lt;br /&gt;def sb = new StringBuffer()&lt;br /&gt;myClosure.delegate = sb&lt;br /&gt;&lt;br /&gt;// execute the closure&lt;br /&gt;myClosure()&lt;br /&gt;&lt;br /&gt;assert 'Jeff was here.' == sb.toString()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;When the closure is executed, those calls to append() in the closure end up being sent to the delegate, the StringBuffer in this case.&lt;br /&gt;&lt;br /&gt;Something similar is happening in the Groovy calendar code above.  A closure is being passed to the with() method.  That closure is calling methods like set() and getTime() which don't really exist in that context.  The reason those calls don't fail is the with() method is assigning a delegate to the closure before it is executed.  The delegate being assigned is the object that the with() method was invoked on.  In the calendar example, the delegate is the calendar object.  Something like this is happening...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def closure = {&lt;br /&gt;  clear()&lt;br /&gt;  set MONTH, JULY&lt;br /&gt;  set DATE, 4&lt;br /&gt;  set YEAR, 1776&lt;br /&gt;  println time&lt;br /&gt;}&lt;br /&gt;def calendar = Calendar.instance&lt;br /&gt;closure.delegate = calendar&lt;br /&gt;closure()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This code does the same thing as the first Groovy example.  Obviously the first one is cleaner.&lt;br /&gt;&lt;br /&gt;I sort of lied a bit, or at least left out a detail that may be significant.  The closure that is being passed to the with() method is really being cloned and it is the clone that is assigned the delegate and executed.  This is a safer approach than monkeying with the original closure.  If the reasons for that aren't clear, the explanation is another story.&lt;br /&gt;&lt;br /&gt;Another bit of info that is missing here is the strategy that a closure uses to decide when to send method calls to the delegate.  Each Groovy closure has a resolveStrategy associated with it.  This property determines how/if the delegate comes in to play.  The 4 possible values for the resolveStrategy are OWNER_FIRST, DELEGATE_FIRST, OWNER_ONLY and DELEGATE_ONLY (all constants defined in groovy.lang.Closure).  The default is OWNER_FIRST.  Consider the owner to be the "this" wherever the closure is defined.  Here is a simple example...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class ResolutionTest {&lt;br /&gt;    &lt;br /&gt;    def append(arg) {&lt;br /&gt;        println "you called the append method and passed ${arg}"&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    def doIt() {&lt;br /&gt;        def closure = {&lt;br /&gt;            append 'Jeff was here.'&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        def buffer = new StringBuffer()&lt;br /&gt;        &lt;br /&gt;        closure.delegate = buffer&lt;br /&gt;        &lt;br /&gt;        // the append method in this ResolutionTest&lt;br /&gt;        // will be called because resolveStrategy is&lt;br /&gt;        // OWNER_FIRST (the default)&lt;br /&gt;        closure()&lt;br /&gt;        &lt;br /&gt;        // give the delegate first crack at method&lt;br /&gt;        // calls made inside the closure&lt;br /&gt;        closure.resolveStrategy = Closure.DELEGATE_FIRST&lt;br /&gt;        &lt;br /&gt;        // the append method on buffer will&lt;br /&gt;        // be called because the delegate gets&lt;br /&gt;        // first crack at the call to append()&lt;br /&gt;        closure()&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    static void main(String[] a) {&lt;br /&gt;        new ResolutionTest().doIt()&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So you see how the with() method helps establish a context where a bunch of things may happen "with" a specific object without having to refer to that object over and over.  This can help clean up code like the Java code we started with.  This approach can also be really useful when building a domain specific language in Groovy, a topic for another time.&lt;br /&gt;&lt;br /&gt;Enjoy!  :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-5648858679233963098?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/5648858679233963098/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=5648858679233963098' title='30 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/5648858679233963098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/5648858679233963098'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2008/11/getting-groovy-with-with.html' title='Getting Groovy With &quot;with&quot;'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>30</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-2446603944957787795</id><published>2008-08-04T11:39:00.001-05:00</published><updated>2008-08-04T11:40:27.675-05:00</updated><title type='text'>Grails Training In Chicago</title><content type='html'>We are really excited to have a 3 day Groovy/Grails training event coming up in Chicago later this month.  The training dates are August 26-28.  The training will be held at the Hotel Indigo in Palatine.&lt;br /&gt;&lt;br /&gt;This is 3 days of lecture and reinforcing lab work.  Attendees should expect to write a lot of Groovy and Grails code with your training expert.  There is no better way to quickly get your team up to speed on the technology, well beyond the basics.&lt;br /&gt;&lt;br /&gt;As with all G2One training events, students will receive a free 12 month license to use IntelliJ IDEA.  The IntelliJ guys have done a fantastic job of building first class Groovy and Grails support for the IDE.&lt;br /&gt;&lt;br /&gt;For a full course outline and more information, please visit &lt;a href="http://g2one.com/training/"&gt;http://g2one.com/training/&lt;/a&gt;.  Any questions may be directed to training@g2one.com.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-2446603944957787795?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/2446603944957787795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=2446603944957787795' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/2446603944957787795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/2446603944957787795'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2008/08/grails-training-in-chicago.html' title='Grails Training In Chicago'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-6391241732293334486</id><published>2008-07-30T09:56:00.002-05:00</published><updated>2008-07-30T10:00:04.702-05:00</updated><title type='text'>G2One QuickCast Site Launched!</title><content type='html'>&lt;a href="http://www.g2one.com"&gt;G2One&lt;/a&gt; have launched the &lt;a href="http://www.g2one.com/quickcasts/"&gt;G2One QuickCast site&lt;/a&gt;.  A G2One QuickCast is fast and furious little movie demonstrating something interesting about the Groovy language and/or the Grails framework.  &lt;br /&gt;&lt;br /&gt;The &lt;a href="http://g2one.com/quickcasts/grails-git.html"&gt;first movie available&lt;/a&gt; there demonstrates how powerful tools like Grails and Git can work together to support a really really agile development process.  Watch this movie and try to do something like this with your web framework and your VCS.  If you can't, your tools are not flexible enough.  :)&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-6391241732293334486?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/6391241732293334486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=6391241732293334486' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/6391241732293334486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/6391241732293334486'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2008/07/g2one-quickcast-site-launched.html' title='G2One QuickCast Site Launched!'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-2675950350667489193</id><published>2008-07-14T08:04:00.002-05:00</published><updated>2008-07-14T08:22:49.591-05:00</updated><title type='text'>G2One Groovy Grails Training In North America</title><content type='html'>&lt;a href="http://www.g2one.com/"&gt;G2One&lt;/a&gt; have announced our &lt;a href="http://groovy.codehaus.org"&gt;Groovy&lt;/a&gt;/&lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; North American public training schedule for the rest of the year.  The schedule is available at &lt;a href="http://www.g2one.com/training/"&gt;http://www.g2one.com/training/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Our training events are a fantastic experience.  G2One are the folks who lead and sustain the development of both Groovy and Grails.  No one understands the technology better than the people who build it.  G2One training events give developers an opportunity to spend several days with a technology expert covering everything from fundamentals to advanced language and framework features.  The sessions include a perfect mix of lecture and reinforcing lab work.  That hands on approach is a great way for developers to internalize the details.  There is no better way to quickly get a team up and running with the technology.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-2675950350667489193?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/2675950350667489193/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=2675950350667489193' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/2675950350667489193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/2675950350667489193'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2008/07/g2one-groovy-grails-training-in-north.html' title='G2One Groovy Grails Training In North America'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-9202053121320077121</id><published>2008-06-19T21:32:00.006-05:00</published><updated>2008-12-11T04:28:25.231-06:00</updated><title type='text'>Grails Plugin For Hudson</title><content type='html'>I am pleased to announce that we have worked up a &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; plugin for &lt;a href="https://hudson.dev.java.net/"&gt;Hudson&lt;/a&gt;.  Hudson is a really slick continuous integration server.  Check out &lt;a href="http://hudson.dev.java.net"&gt;their site&lt;/a&gt; for more info on the engine itself.&lt;br /&gt;&lt;br /&gt;It has always been possible to build Grails apps from Hudson but in the past this has involved writing shell scripts that are triggered by Hudson.  This works but is not the slickest solution.  What you really want is for the CI server to have knowledge of the fact that the project you are building is a Grails app and that knowledge will allow the tool to be more efficient about carrying out the build and also allow the CI server to provide Grails specific options for the build.  This is where the new Grails plugin is heading.&lt;br /&gt;&lt;br /&gt;Right now the plugin is very basic.  In the system configuration screen you may configure as many Grails installations as you like.  This is useful for situations where the same CI server may be building multiple projects with different version of Grails or maybe even building multiple copies of the same project with multiple versions of Grails.  Below is a screenshot of the system configuration screen:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_sCHZN3OBwGY/SFsZnVC7gKI/AAAAAAAAACQ/6BL8pI8pZvU/s1600-h/hudsonSystemConfig.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_sCHZN3OBwGY/SFsZnVC7gKI/AAAAAAAAACQ/6BL8pI8pZvU/s400/hudsonSystemConfig.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5213789157066506402" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Notice that there is built in validation to make sure you have entered a valid path to your Grails installation.&lt;br /&gt;&lt;br /&gt;When configuring a project in Hudson you have a lot of options for what should happen at build time.  The Grails plugin adds a "Build With Grails" option and if that option is selected you can select from a list of common build targets to execute as well as type in any arbitrary targets you may want to execute.  This is useful for executing Grails commands that are not in the list of checkboxes and for executing your own custom Grail scripts that may be part of your project.  Below is a screenshot of the project configuration screen:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_sCHZN3OBwGY/SFsZiOmQO3I/AAAAAAAAACI/_AZWKIvykuQ/s1600-h/hudsonProjectConfig.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_sCHZN3OBwGY/SFsZiOmQO3I/AAAAAAAAACI/_AZWKIvykuQ/s400/hudsonProjectConfig.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5213789069436271474" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The first version of the plugin has not been released yet but will be soon.  In the meantime, I would be happy to hear what kinds of capabilities you would like to see the plugin provide.  Even in its current very basic state, the plugin is very useful as it makes configuring a Grails project in Hudson drop dead simple.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-9202053121320077121?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/9202053121320077121/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=9202053121320077121' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/9202053121320077121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/9202053121320077121'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2008/06/grails-plugin-for-hudson.html' title='Grails Plugin For Hudson'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_sCHZN3OBwGY/SFsZnVC7gKI/AAAAAAAAACQ/6BL8pI8pZvU/s72-c/hudsonSystemConfig.png' height='72' width='72'/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-5406331402602961808</id><published>2008-06-07T10:01:00.002-05:00</published><updated>2008-06-07T10:10:17.145-05:00</updated><title type='text'>St. Louis Dynamic Language Interest Group</title><content type='html'>I have created the &lt;a href="http://www.linkedin.com/e/gis/117406/4FF0B85F5118"&gt;St. Louis Dynamic Language Interest Group&lt;/a&gt; at &lt;a href="http://www.linkedin.com"&gt;LinkedIn&lt;/a&gt;.  If you have a special interest in dynamic languages and are in the St. Louis area or are close enough to the St. Louis area that you would like to be involved with the group, please take a minute to visit the group at &lt;a href="http://www.linkedin.com/e/gis/117406/4FF0B85F5118"&gt;LinkedIn&lt;/a&gt; and join us.&lt;br /&gt;&lt;br /&gt;More information is coming regarding the goals of the group and what sorts of activities we may engage in.  I want to give the group some time to populate before moving forward with those details.&lt;br /&gt;&lt;br /&gt;If you have any questions about the group in the meantime, please don't hesitate to let me know.&lt;br /&gt;&lt;br /&gt;Jeff Brown&lt;br /&gt;Director - North American Operations&lt;br /&gt;&lt;a href="http://www.g2one.com/"&gt;http://www.g2one.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-5406331402602961808?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/5406331402602961808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=5406331402602961808' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/5406331402602961808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/5406331402602961808'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2008/06/st-louis-dynamic-language-interest.html' title='St. Louis Dynamic Language Interest Group'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-2547751842501484837</id><published>2008-06-04T13:34:00.002-05:00</published><updated>2008-06-04T14:00:38.553-05:00</updated><title type='text'>New Grails Mail Plugin</title><content type='html'>The new &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; Mail Plugin is really slick stuff.  Very little effort has gone in to the thing so far and there is more to come but even in its current state this is really nice.  More details are available at &lt;a href="http://grails.org/Mail+Plugin"&gt;http://grails.org/Mail+Plugin&lt;/a&gt; but basically you get a method called 'sendMail' added to your controllers (or you could use an autowired mailService) that accepts a closure and the contents of the closure express the details of the message being sent.  A simple example looks like this...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;sendMail {     &lt;br /&gt;  to 'fred@g2one.com'&lt;br /&gt;  subject 'Hello Fred'   &lt;br /&gt;  body 'How are you?' &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Take a look at the docs for more information.  This is good stuff already.  I think the simplicity of sending a message like this is pretty impressive but more impressive is how easy it is to build support for something like that in a dynamic language like &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt;.  More and more folks are taking advantage of the &lt;a href="http://grails.org/plugins/"&gt;Grails Plugin System&lt;/a&gt; to easily add capabilities like this to their web apps.&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-2547751842501484837?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/2547751842501484837/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=2547751842501484837' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/2547751842501484837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/2547751842501484837'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2008/06/new-grails-mail-plugin.html' title='New Grails Mail Plugin'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-8508876107379252040</id><published>2008-05-21T14:26:00.002-05:00</published><updated>2008-05-21T14:30:31.386-05:00</updated><title type='text'>Groovy Grails Training From G2One and Callista Enterprise</title><content type='html'>&lt;a href="http://www.g2one.com"&gt;G2One, Inc.&lt;/a&gt; and &lt;a href="http://www.callistaenterprise.se/"&gt;Callista Enterprise AB&lt;/a&gt; have announced a partnership to support Advanced &lt;a href="http://groovy.codehaus.org"&gt;Groovy&lt;/a&gt; and &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; training in Scandinavia.&lt;br /&gt;&lt;br /&gt;Göteborg 2008-09-08&lt;br /&gt;Stockholm 2008-09-15&lt;br /&gt;Malmö 2008-09-22&lt;br /&gt;&lt;br /&gt;The 3 day comprehensive course covers details from intro to advanced for both the Groovy language and the Grails framework.  The course description may be found &lt;a href="http://www.callistaenterprise.se/download/18.146c1a30118e9c69ac680005494/GroovyGrails.pdf"&gt;here&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;As with all G2One training events, students will receive a free 12 month license for &lt;a href="http://www.jetbrains.com/idea"&gt;IntelliJ IDEA&lt;/a&gt;.  IDEA's &lt;a href="http://www.jetbrains.com/idea/features/groovy_grails.html"&gt;JetGroovy&lt;/a&gt; brings fantastic support for both Groovy and Grails to the IDE.  &lt;br /&gt;&lt;br /&gt;Please contact us at training at g2one dot com with any training related inquiries.&lt;br /&gt;&lt;br /&gt;North American dates coming soon...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-8508876107379252040?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/8508876107379252040/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=8508876107379252040' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/8508876107379252040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/8508876107379252040'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2008/05/groovy-grails-training-from-g2one-and.html' title='Groovy Grails Training From G2One and Callista Enterprise'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-523896918180065383</id><published>2008-04-30T20:20:00.002-05:00</published><updated>2008-04-30T20:35:24.277-05:00</updated><title type='text'>Pre JavaOne Groovy/Grails Meetup Next Monday</title><content type='html'>We have been busy preparing for &lt;a href="http://java.sun.com/javaone/sf/"&gt;JavaOne&lt;/a&gt; and it is finally almost here.  Yay!&lt;br /&gt;&lt;br /&gt;We hope to see you at the &lt;a href="http://www.g2one.com/meetup/"&gt;G2One / NFJS Meetup&lt;/a&gt; Monday night.  Click the link for all of the details and be sure to click the "&lt;a href="http://g2one.com/meetup/registration/register"&gt;register&lt;/a&gt;" link.  Registration is free and the event promises to be a load of fun.  Come hear the latest &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt; and &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt; news from &lt;a href="http://www.g2one.com/"&gt;G2One&lt;/a&gt;, the latest word from the respected &lt;a href="http://www.nofluffjuststuff.com/"&gt;NFJS tour&lt;/a&gt; and finally a great expert panel discussion.  Author signed copies of Scott Davis' &lt;a href="http://pragprog.com/titles/sdgrvr/groovy-recipes"&gt;Groovy Recipes&lt;/a&gt; book and Venkat Subramaniam's &lt;a href="http://pragprog.com/titles/vslg/programming-groovy"&gt;Programming Groovy&lt;/a&gt; book will be raffled off.&lt;br /&gt;&lt;br /&gt;Don't miss it.&lt;br /&gt;&lt;br /&gt;Between now and then, I hope to see some of you in &lt;a href="http://www.nofluffjuststuff.com/conference/denver/2008/05/index.html"&gt;Denver&lt;/a&gt; this weekend.  :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-523896918180065383?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/523896918180065383/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=523896918180065383' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/523896918180065383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/523896918180065383'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2008/04/pre-javaone-groovygrails-meetup-next.html' title='Pre JavaOne Groovy/Grails Meetup Next Monday'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-3358092182272951410</id><published>2008-02-18T09:45:00.002-06:00</published><updated>2008-02-18T09:53:02.122-06:00</updated><title type='text'>Another Big Week For Groovy And Grails</title><content type='html'>This is definitely going to be another big week for Groovy and Grails.  The &lt;a href="http://docs.codehaus.org/display/GRAILS/2008/02/18/Grails+1.0.1+Released?nocache"&gt;Grails 1.0.1&lt;/a&gt; point release was published today.  This release contains over 40 enhancements over the 1.0 release from just a couple of weeks ago.  The Grails community has been buzzing at full steam since the 1.0 release.  This is fantastic stuff!&lt;br /&gt;&lt;br /&gt;This Wednesday I am heading to the great New York City to speak at &lt;a href="http://www.javasig.com/"&gt;their JUG&lt;/a&gt; about Groovy.  That is going to be a lot of fun.  Immediately after that is the event that so many people (including myself) have been looking forward to for a long time.  That of course is &lt;a href="http://groovygrails.com/gg/2gexperience"&gt;The Groovy Grails Experience&lt;/a&gt; in Reston Virginia, starting on Thursday Feb. 21 and running through Saturday the 23rd.  It will be a while before this many of the key players in the Groovy/Grails community get together in one spot to talk shop.  I can't wait!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-3358092182272951410?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/3358092182272951410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=3358092182272951410' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/3358092182272951410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/3358092182272951410'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2008/02/another-big-week-for-groovy-and-grails.html' title='Another Big Week For Groovy And Grails'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-5773024746016339219</id><published>2008-02-09T14:54:00.001-06:00</published><updated>2008-02-09T15:01:11.151-06:00</updated><title type='text'>Jeff Brown Interview At Groovy Zone</title><content type='html'>I had the great pleasure of doing an interview recently with &lt;a href="http://groovy.dzone.com/users/sdevijver"&gt;Steven Devijver&lt;/a&gt; for &lt;a href="http://groovy.dzone.com/"&gt;The Groovy Zone&lt;/a&gt;.  Today, that interview was published.  Check it out at &lt;a href="http://groovy.dzone.com/news/jeff-brown-grails-10-and-beyon"&gt;http://groovy.dzone.com/news/jeff-brown-grails-10-and-beyon&lt;/a&gt;.  In the interview we discussed the &lt;a href="http://grails.org/"&gt;Grails 1.0 release&lt;/a&gt;, the great plugin story that Grails has to offer, the upcoming&lt;a href="http://groovygrails.com/gg/2gexperience"&gt; Groovy Grails Experience&lt;/a&gt; and more.  I want to thank Steven for the opportunity.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-5773024746016339219?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/5773024746016339219/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=5773024746016339219' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/5773024746016339219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/5773024746016339219'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2008/02/jeff-brown-interview-at-groovy-zone.html' title='Jeff Brown Interview At Groovy Zone'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-6027593066403525175</id><published>2008-02-07T11:05:00.001-06:00</published><updated>2008-02-07T11:42:38.703-06:00</updated><title type='text'>The Groovy And Grails Communities Continue To Buzz</title><content type='html'>A lot of things are going on right now in the &lt;a href="http://groovy.codehaus.org"&gt;Groovy&lt;/a&gt; and &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; communities.  I have been really busy myself and have a lot of exciting things coming up.  I am very excited about my role as Director of North American Operations with &lt;a href="http://g2one.com/"&gt;G2One&lt;/a&gt; and that is really keeping me busy.  &lt;br /&gt;&lt;br /&gt;I spent the first part of this week out in Silicon Valley with Graeme Rocher and Peter Ledbrook working on some really exciting Grails stuff.  It was great to be out there with Graeme on the day that Grails 1.0 was released.  The whole development team and user community have done an incredible amount of work on Grails to get to this point but I think Graeme himself deserves the props.  Graeme conceived the thing and has been driving it very hard from the beginning with the focus and vision necessary to get the framework to this point.  Well done Graeme!&lt;br /&gt;&lt;br /&gt;Later this month I am going to have the pleasure of speaking at &lt;a href="http://www.javasig.com/"&gt;The New York Java SIG&lt;/a&gt; about Groovy.  I speak at JUGs all the time but this one in particular I am looking forward to.  A few months ago I was on the schedule to speak out there and due to an incredible string of bad luck, I wasn't able to make it.  My flight was cancelled.  My replacement flight was delayed.  Once my delayed flight took off we ended up circling in the air for a long time waiting for some weather to settle down.  Once I got to New York we found it near impossible to get in to Manhattan because it just happened this was the day of the huge water main explosion.  I ended up spending the entire day on airplanes and in terminals just so I could get to my hotel, sleep and then fly home the next day.  This time, things will no doubt go much more smoothly.  I can't wait to get out there.&lt;br /&gt;&lt;br /&gt;When I leave the New York Java SIG I will be heading straight to the airport to get to the event that I am even more excited about.  That is &lt;a href="http://groovygrails.com/gg/2gexperience"&gt;The Groovy Grails Experience&lt;/a&gt; in Reston VA beginning on Feb. 21.  The event is being put on by the same folks who have been putting on the hugely successful &lt;a href="http://www.nofluffjuststuff.com/"&gt;No Fluff Just Stuff&lt;/a&gt; symposiums for years now so I know it is going to be a great event.  This is 3 days packed with talks all about Groovy and Grails.  Of all the shows I do this year, this is probably going to end up being the one that is most exciting for me personally.  All of my friends from the Groovy and Grails communities are going to be there and I know everyone is going to have a great time.  This is the biggest Groovy/Grails event ever to be put together.  It isn't often that we get an opportunity like this to get together so many players in the Groovy/Grails communities to talk about the technology.  For folks who are interested in the power of Groovy and Grails and the vast possibilities that dynamic languages bring to the JVM, I can't think of a better way to spend 3 days.  I am completely pumped about this event.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-6027593066403525175?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/6027593066403525175/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=6027593066403525175' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/6027593066403525175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/6027593066403525175'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2008/02/groovy-and-grails-communities-continue.html' title='The Groovy And Grails Communities Continue To Buzz'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-3159392663273389577</id><published>2007-12-12T19:35:00.000-06:00</published><updated>2007-12-12T19:48:43.912-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>The Groovy Grails Experience</title><content type='html'>The first major &lt;a href="http://groovy.codehaus.org"&gt;Groovy&lt;/a&gt; / &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; conference in North America is just around the corner.  &lt;a href="http://groovygrails.com/gg/2gexperience"&gt;The Groovy Grails Experience&lt;/a&gt; is going to be in Reston Virginia on Feb 21-23, 2008.  The event is bringing key players in the Groovy and Grails community together from all over the globe to put on what is sure to be a really exciting event.&lt;br /&gt;&lt;br /&gt;Check out &lt;a href="http://www.groovygrails.com/gg/conference/speakers?showId=131"&gt;the speaker list&lt;/a&gt;.  Graeme Rocher!  Jason Rudolph!  Dierk Koenig!  Scott Davis!  Andy Glover!  Venkat Subranamium!  Neal Ford!  Brian Sletten!  The list goes on and on...  This really promises to be a fantastic event.  I am really looking forward to it.&lt;br /&gt;&lt;br /&gt;The event is coming along at a great time.  Groovy is finishing up a really really exciting year that started with the release of 1.0 and ran right up to the release of 1.5 last week.  We have seen a bunch of new public facing Grails sites go live this year as well as lots of internal application development being done with Grails.  Grails is closing in on the very much anticipated 1.0 release.&lt;br /&gt;&lt;br /&gt;Good times continue!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-3159392663273389577?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/3159392663273389577/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=3159392663273389577' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/3159392663273389577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/3159392663273389577'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2007/12/groovy-grails-experience.html' title='The Groovy Grails Experience'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-1957497179973706310</id><published>2007-10-16T08:49:00.000-05:00</published><updated>2007-10-16T08:53:14.589-05:00</updated><title type='text'>Grails 1.0 RC1 Has Been Released</title><content type='html'>&lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; 1.0 RC1 has been released!  See the &lt;a href="http://docs.codehaus.org/display/GRAILS/1.0-RC1+Release+Notes"&gt;release notes&lt;/a&gt; for details about many of the new features.&lt;br /&gt;&lt;br /&gt;This is fantastic news for the Groovy and Grails community.&lt;br /&gt;&lt;br /&gt;In a few hours I am getting on a plane to London to speak at &lt;a href="http://grails-exchange.com/"&gt;The Grails eXchange&lt;/a&gt;.  I am really looking forward to finally meeting in person some of the folks I have been working with for so long now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-1957497179973706310?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/1957497179973706310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=1957497179973706310' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/1957497179973706310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/1957497179973706310'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2007/10/grails-10-rc1-has-been-released.html' title='Grails 1.0 RC1 Has Been Released'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-4708570965792905578</id><published>2007-09-09T16:06:00.000-05:00</published><updated>2007-09-09T16:14:20.164-05:00</updated><title type='text'>Maverick On Rails</title><content type='html'>Mark Cuban &lt;a href="http://www.blogmaverick.com/2007/08/27/the-internet-is-still-dead-and-boring/"&gt;says&lt;/a&gt;...&lt;br /&gt;&lt;br /&gt;"I'm such an exciting guy, I downloaded Ruby on Rails and read the documentation as well. That's what Saturday Nights are for."&lt;br /&gt;&lt;br /&gt;Maybe Mark will come out to the upcoming &lt;a href="http://www.nofluffjuststuff.com/"&gt;NFJS&lt;/a&gt; show in &lt;a href="http://www.nofluffjuststuff.com/conference/dallas/2007/10/index.html"&gt;Dallas&lt;/a&gt; and learn about &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt;.  :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-4708570965792905578?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/4708570965792905578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=4708570965792905578' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/4708570965792905578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/4708570965792905578'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2007/09/maverick-on-rails.html' title='Maverick On Rails'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-5748070619402014323</id><published>2007-08-07T21:15:00.000-05:00</published><updated>2007-08-07T23:16:44.580-05:00</updated><title type='text'>Interesting Groovy Loops Detail</title><content type='html'>While fixing a bug in &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; last night I came across something that I found interesting.  At first I was really puzzled but now that I know what is going on, it all makes perfect sense.&lt;br /&gt;&lt;br /&gt;A unit test that had been passing for some time just started failing.  I isolated a specific revision of a specific file that seemed to be causing the test to fail.  The test passes with version X of the file and the test fails with version X+1 of that file.  I spent some time diffing the 2 revisions and couldn't find anything that seemed relevant.  Eventually I figured out the specific change that was causing the failure.  There was code that looked something like this...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;someCollection.each { someElement -&gt;&lt;br /&gt;  // do something with someElement&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That code had been changed to look something like this...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;for(someElement in someCollection) {&lt;br /&gt;  // do something with someElement&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The code inside the loop was exactly the same for both versions.  The only difference is the original code was using "each" to iterate over the collection and the new code was using a "for" loop to do the same thing.  I puzzled over that for a bit trying to figure out what was going wrong and after discussing with my co-developers the problem eventually became clear.  Code inside the loop was making use of someElement inside of a closure and later that closure was being executed.  Consider this...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def listOfClosures = []&lt;br /&gt;def numbers = [1, 2, 3]&lt;br /&gt;numbers.each { number -&gt;&lt;br /&gt;  listOfClosures[number] = { println "number is $number" }&lt;br /&gt;}&lt;br /&gt;listOfClosures[1]()&lt;br /&gt;listOfClosures[2]()&lt;br /&gt;listOfClosures[3]()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;As you might guess, the output from that looks like this...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;number is 1&lt;br /&gt;number is 2&lt;br /&gt;number is 3&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now consider this...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def listOfClosures = []&lt;br /&gt;def numbers = [1, 2, 3]&lt;br /&gt;for (number in numbers) {&lt;br /&gt;  listOfClosures[number] = { println "number is $number" }&lt;br /&gt;}&lt;br /&gt;listOfClosures[1]()&lt;br /&gt;listOfClosures[2]()&lt;br /&gt;listOfClosures[3]()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The output from that looks like this...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;number is 3&lt;br /&gt;number is 3&lt;br /&gt;number is 3&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;With the "for" loop approach, the same "number" variable is used each time through the loop so by the time the loop completes, the value of "number" is 3 which is what is used by the time the closures execute.  With the "each" approach, a separate variable is used for each iteration so each closure accesses the "number" that was around when the closure was declared.  None of that is broken or a bug.  I believe it is all working as it should.&lt;br /&gt;&lt;br /&gt;Thanks to &lt;a href="http://headius.blogspot.com/"&gt;Charles Nutter&lt;/a&gt; and &lt;a href="http://graemerocher.blogspot.com/"&gt;Graeme Rocher&lt;/a&gt; for helping with that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-5748070619402014323?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/5748070619402014323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=5748070619402014323' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/5748070619402014323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/5748070619402014323'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2007/08/interesting-groovy-loops-detail.html' title='Interesting Groovy Loops Detail'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-7945459669009665416</id><published>2007-07-20T17:55:00.000-05:00</published><updated>2007-07-20T18:37:33.388-05:00</updated><title type='text'>My Apologies To The New York City SIG</title><content type='html'>This past Wednesday night &lt;a href="http://www.nofluffjuststuff.com/speaker_view.jsp?speakerId=32"&gt;Andy Glover&lt;/a&gt; and I were scheduled to co-present at &lt;a href="http://www.nyjavasig.com/"&gt;The New York Java Special Interest Group&lt;/a&gt;.  Andy was going to give a 90 minute session on &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt; and I was going to give a 90 minute session on &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt;.  &lt;br /&gt;&lt;br /&gt;Wednesday turned out to be crazy day in New York.  Weather made it difficult for air travelers to make their way in to JFK Airport.  The huge steam pipe explosion that happened in mid-town Manhattan made it very difficult to drive in to Manhattan.  The whole story is a very long one but the short of it is that Andy's flight was canceled and so was mine.  We couldn't get a second flight booked for Andy but we were able to get one booked for me.  Unfortunately mine was an indirect flight and the second leg was delayed numerous times and I finally got to JFK to find that because of the steam pipe explosion in the city, the trip from JFK to the meeting location was well over an hour and by the time I got into the city, there was no point.  I think the meeting was scheduled to run until about 8:00 and I think I got into Manhattan shortly after 8:00.&lt;br /&gt;&lt;br /&gt;I was really disappointed myself as I have never had the opportunity to work with Andy before this event and I was really looking forward to it but mostly I felt bad for all of the developers in New York who made it to the show only to find out that there were no speakers.  The New York developer community is really enthusiastic about Groovy and Grails and the large audience that turned up to see the show represents that.  I am sorry that they were left to look at an empty stage Wednesday night.  I promise all of them that we were scrambling all day to work it out and each time we came up with a solution another problem came up, mostly related to shut downs at JFK.  I hope that many of the folks who came out to the SIG meeting will make it to the &lt;a href="http://www.nofluffjuststuff.com/show_view.jsp?showId=90"&gt;NFJS show in Princeton New Jersey&lt;/a&gt; the weekend of August 10th.  I will not be there myself but my friends &lt;a href="http://www.nofluffjuststuff.com/speaker_view.jsp?speakerId=4738"&gt;Jason Rudolph&lt;/a&gt;, &lt;a href="http://www.nofluffjuststuff.com/speaker_view.jsp?speakerId=18"&gt;Scott Davis&lt;/a&gt; and &lt;a href="http://www.nofluffjuststuff.com/speaker_view.jsp?speakerId=11"&gt;Venkat Subramanium&lt;/a&gt; will all be there with Groovy and Grails sessions.&lt;br /&gt;&lt;br /&gt;Again, I offer my apologies to everyone who came out to the show Wednesday evening and I hope that you will invite us again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-7945459669009665416?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/7945459669009665416/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=7945459669009665416' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/7945459669009665416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/7945459669009665416'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2007/07/my-apologies-to-new-york-city-sig.html' title='My Apologies To The New York City SIG'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-5069196507916965600</id><published>2007-05-19T22:53:00.000-05:00</published><updated>2007-05-19T22:57:00.270-05:00</updated><title type='text'>Alternate Syntax For URL Mapping In Grails</title><content type='html'>One of the cool new features that was introduced with &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; 0.5 is &lt;a href="http://grails.org/URL+mapping"&gt;Custom URL Mapping&lt;/a&gt;.  The syntax for declaring the mapping looks something like this...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class MyUrlMappings {&lt;br /&gt;  static mappings = {&lt;br /&gt;    "/product/$id" {&lt;br /&gt;       controller = "product"&lt;br /&gt;       action = "show"&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;     "/$blog/$year/$month/$id" {&lt;br /&gt;          controller = "blog"&lt;br /&gt;          action = "show"&lt;br /&gt;          constraints {&lt;br /&gt;               year(matches:/\d{4}/)&lt;br /&gt;               month(matches:/\d{2}/)&lt;br /&gt;          }&lt;br /&gt;     }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Since the release we have added support for an alternate syntax (which I happen to like) that looks like this...&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class MyUrlMappings {&lt;br /&gt;  static mappings = {&lt;br /&gt;    "/product/$id" (controller:"product", action:"show")&lt;br /&gt;&lt;br /&gt;     "/$blog/$year/$month/$id" (controller:"blog", action:"show"){&lt;br /&gt;          constraints {&lt;br /&gt;               year(matches:/\d{4}/)&lt;br /&gt;               month(matches:/\d{2}/)&lt;br /&gt;          }&lt;br /&gt;     }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Dynamic languages like Groovy make these sorts of things really easy to support.  Behind the scenes of this url mapping there there is no grammar file and no tangly parser to manage.  The configuration file is plain old groovy code.  Blurring the line between code and configuration files by using a DSL like this is so much easier in Groovy that it might be in a language like C++ or Java.  You have got to love it.  :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-5069196507916965600?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/5069196507916965600/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=5069196507916965600' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/5069196507916965600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/5069196507916965600'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2007/05/alternate-syntax-for-url-mapping-in.html' title='Alternate Syntax For URL Mapping In Grails'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-6704752285940078416</id><published>2007-05-19T22:40:00.000-05:00</published><updated>2007-05-19T22:51:39.924-05:00</updated><title type='text'>Autism Visibility Continues To Increase</title><content type='html'>&lt;a href="http://www.doverspeedway.com/"&gt;Dover Speedway&lt;/a&gt; has announced that the &lt;a href="http://www.nascar.com/series/cup/"&gt;NEXTEL Cup&lt;/a&gt; race coming up there in June will be named  “&lt;a href="http://tinyurl.com/yvts4v"&gt;The Autism Speaks 400 presented by Visa&lt;/a&gt;”.  NEXTEL Cup racing is huge here in North America and has a very large fan base.  &lt;a href="http://www.autismspeaks.org/"&gt;Autism Speaks&lt;/a&gt; is one of the largest foundations in the world that is dedicated to autism.  I am happy to see them get their name on the marquee of an event like this.  That can only help with awareness.&lt;br /&gt;&lt;br /&gt;This is not the first time that autism and automobile racing have crossed paths.  &lt;a href="http://www.jamiemcmurray.com/"&gt;Jamie McMurray&lt;/a&gt; has an autistic niece and partnered with &lt;a href="http://www.autism-society.org/"&gt;The Autism Society of American&lt;/a&gt; in 2004 when he drove the “Drive For A Cure” car.  &lt;a href="http://en.wikipedia.org/wiki/Tony_Renna"&gt;Tony Renna&lt;/a&gt; drove the “&lt;a href="http://www.cureautismnow.org/"&gt;Cure Autism Now&lt;/a&gt;” car in 2003.  There have been others.&lt;br /&gt;&lt;br /&gt;It has been almost exactly 5 years since my youngest son Jake was diagnosed autistic.  In those 5 years I have learned a number of things about autism and one of those things that I have learned is that there are not a lot of people who know much about autism.  Awareness is increasing.  That isn't because more people are reading medical journals in their free time.  Aside from a dramatic increase in the number of kids being diagnosed autistic, the biggest reason that awareness is increasing is that more and more autism is showing up in the mainstream media.  Recently some actors and other celebrities have been criticized for jumping on the “autism bandwagon”.  These criticisms often refer to autism as the disease du jour.  I don't have much to say about that except to say that raising awareness is an important part of this fight and when I see people going out of their way to help with awareness, I am happy to see that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-6704752285940078416?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/6704752285940078416/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=6704752285940078416' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/6704752285940078416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/6704752285940078416'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2007/05/autism-visibility-continues-to-increase.html' title='Autism Visibility Continues To Increase'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-4865932907015298507</id><published>2007-05-01T19:30:00.000-05:00</published><updated>2007-05-01T20:23:22.544-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Cool New Features In Grails 0.5</title><content type='html'>&lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; 0.5 was released today and this release is one of the most exciting releases yet.  This release has closed the gap on a number of key features that needed to be knocked out before the coming 1.0 release.  Some of the new features will be more appealing to some projects and other features more appealing to other pojects.  For me some of the coolest new features added in 0.5 are &lt;a href="http://grails.org/Command+objects+and+Form+Validation"&gt;Command Objects&lt;/a&gt;, &lt;a href="http://grails.org/GORM+-+Collection+Types#GORM-CollectionTypes-Listsofobjects%28Since0.5%29"&gt;List and Map Support in GORM&lt;/a&gt; and &lt;a href="http://grails.org/URL+mapping"&gt;Custom URL Mappings&lt;/a&gt;.  Hundres of JIRA issues have been addressed in this release and significant performance enhancements have been made.  The development team got a whole lot done during this iteration.  See the &lt;a href="http://grails.org/0.5+Release+Notes"&gt;release notes&lt;/a&gt; for a more complete list of new features.&lt;br /&gt;&lt;br /&gt;With the recent release of the &lt;a href="http://docs.codehaus.org/display/GROOVY/2007/04/30/Groovy+1.1-beta-1+with+annotation+support"&gt;first beta of Groovy 1.1&lt;/a&gt;, things continue to heat up in the Groovy and Grails communities.  &lt;br /&gt;&lt;br /&gt;This year I have been speaking at Java User Groups, internal training events and on the &lt;a href="http://www.nofluffjuststuff.com/"&gt;No Fluff Just Stuff Tour&lt;/a&gt; about Groovy and Grails and I am finding that folks in the Java community are really excited about both Groovy and Grails and the possibilities that these technologies bring to their projects.  After a bit of time that really seemed kind of dull for the JVM, Groovy and Grails are making it all fun again and at the same time adding a lot of value to the enterprise by increasing productivity and expanding the possibilities.  For example, defining a &lt;a href="http://en.wikipedia.org/wiki/Domain-specific_programming_language"&gt;DSL&lt;/a&gt; using &lt;a href="http://www.antlr.org/"&gt;Antlr&lt;/a&gt; or similar technologies may not have been a realistic possibility for many applications but dynamic technologies like Groovy make things like that not only possible but simple to build.  There are many many examples just like that which represent ways Groovy can help developers get their jobs done faster and more simply.  Frankly, I don't think Grails would be anywhere near as compelling as it is if it weren't for all of the coolness made possible by Groovy.  Grails has taken the possibilities that Groovy provides and leveraged them all over the framework to provide simple concise techniques for web application developers to use to build powerful web applications very quickly.&lt;br /&gt;&lt;br /&gt;Grails has earned a lot of respect in the community by getting very far along in a short amount of time.  While Grails applications are already being deployed in production environments, both private and public facing sites, the coming 1.0 release is going to push Grails right out there to the front of the pack.  This is exciting stuff!&lt;br /&gt;&lt;br /&gt;More to come... :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-4865932907015298507?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/4865932907015298507/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=4865932907015298507' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/4865932907015298507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/4865932907015298507'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2007/05/cool-new-features-in-grails-05.html' title='Cool New Features In Grails 0.5'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-117587795834824017</id><published>2007-04-06T11:33:00.000-05:00</published><updated>2007-04-06T11:45:58.360-05:00</updated><title type='text'>I Have Been Tagged (Twice)</title><content type='html'>I have been tagged twice recently.  First by &lt;a href="http://jasonrudolph.com/blog/2007/03/05/tag-here-goes/"&gt;Jason&lt;/a&gt; and now by &lt;a href="http://blog.james-carr.org/?p=62"&gt;James&lt;/a&gt;.  I suppose I need to be a good citizen and play along.  :)&lt;br /&gt;&lt;br /&gt;I am not really sure what the rules are here.  I know that I am supposed to list several things that you probably don't know about me.  I don't know if these things are supposed to be funny, embarrassing, personal, impressive, inspiring or what.  I don't know if knowing the rules would help me figure out what to write anyway so I am just going to jot out some facts and hope that I don't suffer some sort of penalty for any violation I might commit.  :)&lt;br /&gt;&lt;br /&gt;I am a member of &lt;a href="http://usgo.org/"&gt;The American Go Association&lt;/a&gt;.  I love playing Go, although I am not able to make as much time for it as I might like.  My commitment to Go seems to come and go with periods when I will play a lot and periods when I don't play much at all.  My friend Lianzhou Yu moved out of state a couple of years ago and that has affected my playing time.  Lianzhou is one of the top players in The United States and was a great mentor to have access to.  A few years ago my friend Brian Gilstrap and I got together in his wood shop (which I am envious of) to build a couple of Go boards.  I am pretty happy with the way my board turned out.  I wish I played on it more often.  As it is, most games I play these days are played on my laptop against GNU Go.&lt;br /&gt;&lt;br /&gt;I won the first large poker tournament I ever played in.  The tournament was a charity event to benefit The National Alliance For Autism Research (now &lt;a href="http://autismspeaks.org/"&gt;Autism Speaks&lt;/a&gt;).  Having an autistic son, I was happy to contribute and participate in the tournament.  There were about 130 entrants.  When I heard about this event I gathered up the group of guys that I played cards with regularly and we ended up with 11 of us in the tournament.  The final table at the tournament (final 10 players) included 4 guys from our group.  In one of the final hands I made a mistake and then ended up getting pretty lucky to beat my friend Paul Jensen out of a big pot and that piece of luck put me in a position to win the tournament.&lt;br /&gt;&lt;br /&gt;My name is Jeff, and I am a metal head.  There, I said it.  I am a fan of heavy metal music.  Black Sabbath, Iron Maiden, Slayer, Sepultura, Opeth, Lamb Of God... all guilty pleasures.&lt;br /&gt;&lt;br /&gt;I enjoy fly fishing.  I tie all of my own flies.  I fish mostly for trout in the cold water streams and rivers in Missouri.  My late father-in-law introduced me to fly fishing more than 10 years ago.  I find less time for fly fishing these days but I really enjoy myself when I do make time to get out in the water.&lt;br /&gt;&lt;br /&gt;There was a time long ago when &lt;a href="http://www.jeffandbetsy.net/jeff/wanted/"&gt;I really, really, really needed a haircut&lt;/a&gt;.  Why didn't anyone approach me and say something like “friends don't let friends have mullets”?&lt;br /&gt;&lt;br /&gt;Now I am going to throw to &lt;a href="http://blahblahblah.info/"&gt;Dean&lt;/a&gt;, &lt;a href="http://europetravelogue.com/blog/index.php"&gt;Lance&lt;/a&gt;, &lt;a href="http://walkingthefringe.blogspot.com/index.html"&gt;Brian&lt;/a&gt;, &lt;a href="http://stuffthathappens.com/blog/"&gt;Eric&lt;/a&gt; and &lt;a href="http://nateisright.blogspot.com/index.html"&gt;Nate&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-117587795834824017?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/117587795834824017/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=117587795834824017' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/117587795834824017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/117587795834824017'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2007/04/i-have-been-tagged-twice.html' title='I Have Been Tagged (Twice)'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-117172789180142785</id><published>2007-02-17T09:43:00.000-06:00</published><updated>2007-02-17T10:15:40.076-06:00</updated><title type='text'>My Mac OS X Bling</title><content type='html'>I am now about 2.5 weeks in to my MacBook Pro owning experience.  I will say that I am really really happy with the experience so far.  I have tinkered with the idea since OS X was introduced and finally decided to give it a go.  I am going to provide a rundown of apps I have installed and use.  This is everything (I think) that I use that isn't part of the standard OS X install that came with the hardware.  If you are an OS X user then at least some of these you already know about but maybe there will be a couple new ones here for you.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mozilla.com/en-US/firefox/"&gt;Firefox&lt;/a&gt;&lt;br /&gt;To be honest, I didn't even give &lt;a href="http://www.apple.com/macosx/features/safari/"&gt;Safari&lt;/a&gt; a shot.  One of the first things I did was download Firefox.  Maybe I should look at Safari, but I probably won't unless at some point I hear/read something that gives me some specific reason to do so.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://desktopmanager.berlios.de/"&gt;Desktop Manager&lt;/a&gt;&lt;br /&gt;This is a virtual desktop switcher with nice effects (bling) when switching desktops like the rotating cube and others.  &lt;a href="http://virtuedesktops.info/"&gt;VirtueDesktops&lt;/a&gt; has some nice features but it crashed more than once for me.  I may look again when the next release comes about.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://macromates.com/"&gt;TextMate&lt;/a&gt;&lt;br /&gt;TextMate is The Full Schizzle.  If you edit text (xml, java, c, ruby, groovy, screenplays, etc...) TextMate is for you.  If you aren't familiar with TM, visit the site and &lt;a href="http://macromates.com/screencasts"&gt;watch some of the screencasts&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ambrosiasw.com/utilities/snapzprox/"&gt;SnapZ Pro X&lt;/a&gt;&lt;br /&gt;This is really nice software for recording screencasts.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.adiumx.com/"&gt;Adium&lt;/a&gt;&lt;br /&gt;Adium is an IM client that allows me to connect to MSN, Yahoo, AIM, Google Talk, ICQ, Jabber and others.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.skype.com/"&gt;Skype&lt;/a&gt;&lt;br /&gt;Skype is another messaging client.  The only reason I have this in addition to Adium is that I have a meeting once a week with some folks overseas and we do that over Skype using its group voice capabilities.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.planamesa.com/neojava/en/index.php"&gt;NeoOffice&lt;/a&gt;&lt;br /&gt;OpenOffice for the Mac.  I haven't used it enough to say for sure if I really like it, but so far it is fine.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.filewell.com/iRedLite/"&gt;iRed Lite&lt;/a&gt;&lt;br /&gt;iRed Lite is a utility that lets me use the standard MacBook remote control to control more applications than it otherwise does, like NeoOffice, PowerPoint and others.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://quicksilver.blacktree.com/"&gt;QuickSilver&lt;/a&gt;&lt;br /&gt;A slick utility similar to the built in Spotlight but a little nicer to use, at least for some things.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://spanningsync.com/"&gt;Spanning Sync&lt;/a&gt;&lt;br /&gt;This lets me sync my desktop iCal with my public Google calendar, which I really like.  The main site says "coming soon" but betas are available now.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.sente.ch/software/goban/"&gt;Goban&lt;/a&gt;&lt;br /&gt;I don't play computer games, except for Go.  This is a nice Go client.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blender3d.org/"&gt;Blender&lt;/a&gt;&lt;br /&gt;An awesome 3D animation tool.  The movie &lt;a href="http://www.elephantsdream.org/"&gt;Elephant's Dream&lt;/a&gt; was created with Blender.  The entire movie is distributed under a Creative Commons license so you can get all of the production files for free and monkey with the movie if you want to.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.stuffit.com/mac/expander/"&gt;StuffIt Expander&lt;/a&gt;&lt;br /&gt;I don't have much to say about this one but I use it and include it here for completeness.&lt;br /&gt;&lt;br /&gt;Standard dev tools that really aren't peculiar to OS X but I happen to use on my MacBook Pro...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.eclipse.org/jdt/"&gt;Eclipse&lt;/a&gt;, &lt;a href="http://www.netbeans.org/"&gt;NetBeans&lt;/a&gt; and &lt;a href="http://www.jetbrains.com/idea/"&gt;IntelliJ IDEA&lt;/a&gt;&lt;br /&gt;I have installed all 3 IDEs.  I use Eclipse primarily.  I installed NetBeans because I am about to start doing NetBeans Platform development and need to get familiar with the environment.  I installed IntelliJ for no particular reason other than I have a license for open source development, though I haven't used it in a couple of years.&lt;br /&gt;&lt;br /&gt;I also use &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt;, &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt;, &lt;a href="http://jruby.codehaus.org/"&gt;JRuby&lt;/a&gt;, &lt;a href="http://ant.apache.org/"&gt;Ant&lt;/a&gt; and the &lt;a href="http://subversion.tigris.org/"&gt;Subversion Client&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I would be happy to hear about your favorite OS X applications.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-117172789180142785?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/117172789180142785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=117172789180142785' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/117172789180142785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/117172789180142785'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2007/02/my-mac-os-x-bling.html' title='My Mac OS X Bling'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-116930766338993699</id><published>2007-01-20T08:50:00.000-06:00</published><updated>2007-01-20T12:18:17.103-06:00</updated><title type='text'>Groovy And Others Continue To Expand The JVM Horizon</title><content type='html'>We have had the JVM for over a decade now.  There are a whole lot of languages out there that allow developers to build applications for the JVM.  The most popular of course is Java.  The alternative languages cover the whole spectrum including Lisp, Scheme, Logo, Tcl, Cobol, Ada, Python, Forth, Fortran, Pascal and on and on and on.  Why would so many people spend so much effort developing new languages for the JVM or bindings for existing languages to run on the JVM when Sun already went to the trouble of developing the Java language?  That is a fair question.  The answer varies from case to case.  Many of the languages built for the JVM were academic exercises but certainly not all of them.  Part of the answer is the fact that the JVM is a fantastic platform for deploying applications but the Java language is not always the best solution for the job at hand.  &lt;br /&gt;&lt;br /&gt;Among the wide array of languages for the JVM, a few languages have poked their heads up as key players lately.  In particular, dynamic languages are getting a lot of attention, for good reason.  Of those dynamic languages at this point &lt;a href="http://groovy.codehaus.org"&gt;Groovy&lt;/a&gt; and &lt;a href="http://jruby.codehaus.org/"&gt;JRuby&lt;/a&gt; are among the most popular.  &lt;br /&gt;&lt;br /&gt;JRuby is a pure Java implementation of the &lt;a href="http://www.ruby-lang.org/"&gt;Ruby&lt;/a&gt; programming language bringing the power and flexibility of Ruby to the Java platform.  One of the significant contributors to Ruby's success is the &lt;a href="http://www.rubyonrails.org/"&gt;Ruby On Rails&lt;/a&gt; web application framework.  JRuby promises to bring that power and flexibility to the JVM.  JRuby is a great tool for folks who want to write Ruby code for the JVM but JRuby is not what I want to talk about today.  I want to talk about Groovy...&lt;br /&gt;&lt;br /&gt;Groovy is a dynamic language written specifically for the JVM.  Groovy has a syntax that in many areas is going to be really familiar to Java programmers.  Like Ruby has Ruby On Rails, Groovy also has a framework for agile web development and that framework is &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt;.  Grails has taken a whole lot of inspiration from Ruby on Rails and is a really powerful and fun way to build web applications for the JVM.  Grails is bringing the "coding by convention" paradigm to Groovy web programming in a way that is really appealing to developers already familiar with Java's syntax and the rich capabilities of the JVM.&lt;br /&gt;&lt;br /&gt;So What Is Happening With Groovy And Grails?&lt;br /&gt;&lt;br /&gt;So much is going on with Groovy and Grails right now.  The Groovy community has been on track for a long time now knowing that 2007 was going to be a big year.  Now that 2007 is here, Groovy and Grails are really in their groove.  ;)&lt;br /&gt;&lt;br /&gt;Here are some of the things stirring in that community right now:&lt;br /&gt;&lt;br /&gt;- Groovy has just released version 1.0.  The Groovy community has known that this was coming and having 1.0 out there on the shelves now is a big win for Groovy. &lt;br /&gt;&lt;br /&gt;- &lt;a href="http://manning.com/"&gt;Manning&lt;/a&gt; has recently published &lt;a href="http://manning.com/koenig/"&gt;Groovy In Action&lt;/a&gt;, known as GINA.  GINA is being referred to as "Groovy's Pick Axe Book" (a reference to Dave Thomas' definitive guide to Ruby, &lt;a href="http://www.pragmaticprogrammer.com/titles/ruby/index.html"&gt;Programming Ruby&lt;/a&gt;).  That is not because GINA was the first major book published on Groovy.  This has more to do with GINA's clear, direct and thorough coverage of the language.&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://apress.com/"&gt;Apress&lt;/a&gt; has recently published &lt;a href="http://apress.com/book/bookDisplay.html?bID=10205"&gt;The Definitive Guide To Grails&lt;/a&gt;.  In The Definitive Guide, Graeme Rocher presents Grails with a real nuts-and-bolts feel that takes developers through comprehensive coverage of the Grails framework.&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://www.mkp.com/"&gt;Morgan Kaufmann&lt;/a&gt; has recently published &lt;a href="http://books.elsevier.com/us/mk/us/subindex.asp?isbn=9780123725073&amp;country=United+States&amp;community=mk&amp;ref=&amp;mscssid=HQ3R6V05M04E9KFH6QDMJ6AHD91587G2"&gt;Groovy Programmers: An Introduction for Java Developers&lt;/a&gt;.  I have not had time to read Kaufmann's book yet but I think having another general coverage book out there is probably a good thing.&lt;br /&gt;&lt;br /&gt;- Jay Zimmerman and Scott Davis have gone live with &lt;a href="http://www.aboutgroovy.com"&gt;http://www.aboutgrooy.com/&lt;/a&gt;, a great one stop shopping portal for all things Groovy and Grails. &lt;br /&gt;&lt;br /&gt;- &lt;a href="http://www.infoq.com/"&gt;InfoQ&lt;/a&gt; recently published Jason Rudolph's minibook &lt;a href="http://www.infoq.com/minibooks/grails"&gt;Getting Started with Grails&lt;/a&gt;, providing another source of Grails coverage and bringing Grails to the attention of more folks.&lt;br /&gt;&lt;br /&gt;- The 2007 &lt;a href="http://nofluffjuststuff.com/"&gt;No Fluff Just Stuff Symposium Tour&lt;/a&gt; is dedicating significant track time to both Groovy and Grails.  NFJS has always responded to the community by presenting what developers know is going to be important and the timing is just right this year for the tour to bring Groovy and Grails to the forefront.&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://skillsmatter.com/"&gt;Skills Matter&lt;/a&gt; has announced the first 3 day &lt;a href="http://skillsmatter.com/grailsexchange"&gt;Grails eXchange 2007&lt;/a&gt; event.  Grails eXchange focuses on Groovy and Grails in addition to providing tracks dedicated to Java Entperise Edition (JEE) and Ajax/Web 2.0.&lt;br /&gt;&lt;br /&gt;- Sven Haiges has announced that his &lt;a href="http://grails.org/Grails+Podcast"&gt;series of Grails podcasts&lt;/a&gt; is going to expand to include general Groovy coverage.  Sven's podcasts have been a great asset to the Grails community and opening that up to include more Groovy coverage is going to be great for the community.&lt;br /&gt;&lt;br /&gt;- Some recent podcasts of interest include Scott Davis' &lt;a href="http://aboutgroovy.com/item/show/47"&gt;interview with Guillaume Laforge&lt;/a&gt;, an &lt;a href="http://aboutgroovy.com/item/show/46"&gt;interview with Jay Zimmerman&lt;/a&gt; and an &lt;a href="http://aboutgroovy.com/item/show/49"&gt;interview I did&lt;/a&gt; with Sven Haiges for the Grails Podcast series.&lt;br /&gt;&lt;br /&gt;Developers and Enterprises that are interested in building applications for the JVM are going to find that Groovy solves a lot of their problems really well.  All of those Java developers out there will find that learning "The Groovy Way" is not a difficult task and the benefits are fantastic.  Combine all of that with the fact that writing Groovy code is just plain fun and you have got a recipe for success.&lt;br /&gt;&lt;br /&gt;If you don't already know why so many people are getting excited about Groovy, pickup a copy of GINA and start tinkering.  As you start developing your Groovy Kung Fu you will start to question many aspects of "the old way" that have been taken for granted for so long now.  Many things about Groovy "just make sense".&lt;br /&gt;&lt;br /&gt;Have Fun!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-116930766338993699?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/116930766338993699/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=116930766338993699' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/116930766338993699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/116930766338993699'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2007/01/groovy-and-others-continue-to-expand.html' title='Groovy And Others Continue To Expand The JVM Horizon'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-116848777123491469</id><published>2007-01-10T21:40:00.000-06:00</published><updated>2007-01-10T21:56:11.243-06:00</updated><title type='text'>Next Grails Release Coming Soon</title><content type='html'>After a bit of a development slowdown around the holidays the &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; development team is back at full throttle working on the next release.  Version 0.4 is probably going to be ready to ship within the next few weeks.  Version 0.3 was a really significant release in terms of new functionality and addressing some key issues that had been lingering.  I feel like 0.4 is even more significant.  The team is working hard to add new functionality and also filling in a lot of those little nuisance gaps.&lt;br /&gt;&lt;br /&gt;Things are really ramping up in the Grails community.  We are seeing folks coming up with interesting plugins.  The mailing lists are very active.  If you haven't taken a look yet, give Grails a spin.  The &lt;a href="http://grails.org/Quick+Start"&gt;Quick Start Guide&lt;/a&gt; doesn't even scratch the surface of capabilities but is a good first step.  Following that guide will take about 10 minutes and you will have a simple CRUD application up and running.&lt;br /&gt;&lt;br /&gt;Stay tuned for exciting things from Grails in the coming months.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-116848777123491469?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/116848777123491469/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=116848777123491469' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/116848777123491469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/116848777123491469'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2007/01/next-grails-release-coming-soon.html' title='Next Grails Release Coming Soon'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-116778151718778613</id><published>2007-01-02T17:35:00.000-06:00</published><updated>2007-01-02T17:45:17.200-06:00</updated><title type='text'>Groovy 1.0 Has Been Released!</title><content type='html'>Finally, after a lot of waiting and a lot of work from the &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt; dev team, Groovy &lt;a href="http://docs.codehaus.org/display/GROOVY/2007/01/02/Groovy+1.0+is+there"&gt;1.0 has been released&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Thanks to the Groovy dev team for working through all of the challenges, hassles, debates, hard work etc. that were all part of getting to 1.0.&lt;br /&gt;&lt;br /&gt;2007 is going to be a big year for both &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt; and &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt;.  I am proud to be a member of the Grails development team and I am looking forward to what 2007 holds in store for us.&lt;br /&gt;&lt;br /&gt;As one of my mentors is fond of saying... Press On!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-116778151718778613?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/116778151718778613/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=116778151718778613' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/116778151718778613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/116778151718778613'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2007/01/groovy-10-has-been-released.html' title='Groovy 1.0 Has Been Released!'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-116690733759921417</id><published>2006-12-23T14:48:00.000-06:00</published><updated>2006-12-23T14:55:37.616-06:00</updated><title type='text'>Groovy 1.0 RC2 Released</title><content type='html'>&lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt; 1.0 RC2 was released today.  If all goes well over the next few days the 1.0 release should be available by year's end.  The community has been waiting a long time for this.  All of the hard work and patience from the Groovy development team is about to pay off.  Thanks Guys!&lt;br /&gt;&lt;br /&gt;Have A Groovy Christmas!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-116690733759921417?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/116690733759921417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=116690733759921417' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/116690733759921417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/116690733759921417'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2006/12/groovy-10-rc2-released.html' title='Groovy 1.0 RC2 Released'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-116446759311688770</id><published>2006-11-25T09:03:00.000-06:00</published><updated>2006-11-25T09:13:13.126-06:00</updated><title type='text'>The Definitive Guide To Grails</title><content type='html'>&lt;a href="http://www.apress.com/book/bookDisplay.html?bID=10205"&gt;The Definitive Guide To Grails&lt;/a&gt; is finally available from &lt;a href="http://www.apress.com/"&gt;Apress&lt;/a&gt;.  The book is a well written easy read that provides a great foundation for &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt; developers.&lt;br /&gt;&lt;br /&gt;Manning's &lt;a href="http://www.manning.com/koenig/"&gt;Groovy In Action&lt;/a&gt; (GINA) has been available through their &lt;a href="http://www.manning.com/about/meap.html"&gt;Early Access Program&lt;/a&gt; for several months now.  The final version of GINA will be available in the next month or so.&lt;br /&gt;&lt;br /&gt;Things are heating up in the &lt;a href="http://groovy.codehaus.org"&gt;Groovy&lt;/a&gt; and &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt; communities.  Look for a lot of exciting things to be happening around Grails soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-116446759311688770?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/116446759311688770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=116446759311688770' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/116446759311688770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/116446759311688770'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2006/11/definitive-guide-to-grails.html' title='The Definitive Guide To Grails'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-116313011569664825</id><published>2006-11-09T21:34:00.000-06:00</published><updated>2006-11-09T21:41:55.706-06:00</updated><title type='text'>Grails 0.3 Released</title><content type='html'>&lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; 0.3 was released today.  A lot of work went in to this release which addresses &lt;a href="http://jira.codehaus.org/browse/GRAILS?report=com.atlassian.jira.plugin.system.project:changelog-panel"&gt;over 100 bugs and feature requests&lt;/a&gt;.  In my opinion, the fact that Grails is currently at 0.3 is a little misleading.  The framework is very powerful and stable.  There is a lot on the horizon but the tool is very powerful in its current state.  Give it a spin.&lt;br /&gt;&lt;br /&gt;I have recently joined the Grails development team and I am looking forward to what the future has in store for Grails.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-116313011569664825?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/116313011569664825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=116313011569664825' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/116313011569664825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/116313011569664825'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2006/11/grails-03-released.html' title='Grails 0.3 Released'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-116265972106670128</id><published>2006-11-04T10:57:00.000-06:00</published><updated>2006-11-04T11:02:01.076-06:00</updated><title type='text'>Grails Support For HTTP Method Restrictions</title><content type='html'>I have committed code to &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; to support a declarative syntax for imposing restrictions on which controller actions may be invoked using which http request methods. See &lt;a href="http://grails.org/HTTP+Method+Restrictions"&gt;the docs&lt;/a&gt; for details.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-116265972106670128?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/116265972106670128/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=116265972106670128' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/116265972106670128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/116265972106670128'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2006/11/grails-support-for-http-method.html' title='Grails Support For HTTP Method Restrictions'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-116146343572633220</id><published>2006-10-21T15:24:00.000-05:00</published><updated>2006-10-21T15:43:55.736-05:00</updated><title type='text'>Grails Enhancement Submitted</title><content type='html'>I have worked up an enhancement to &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; recently that provides an easy declarative way for application authors to limit access to certain controller actions based on the http request method (PUT, POST, GET, etc...).  Generally speaking, applications should not allow destructive operations to be initiated in response to a GET.  That isn't the only reason to want to impose restrictions, but it is a common one.  With Grails, the only way to deal with this is to put code in your controller to inspect the request object and figure out if the request was a GET, POST or whatever.  For the common case where all I want to do is prevent certain actions from being invoked via a GET, I don't want to have to do that.  I just want to tell the framework not to allow it.  The patch I have worked up does just that.  The patch allows code like this in your controller...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class EmployeeController {&lt;br /&gt;&lt;br /&gt;  // action1 may be invoked via a POST&lt;br /&gt;  // action2 has no restrictions&lt;br /&gt;  // action3 may be invoked via a POST or DELETE&lt;br /&gt;  def httpMethodRestrictions = [action1:'POST',&lt;br /&gt;                                action3:['POST', 'DELETE']]&lt;br /&gt;&lt;br /&gt;  def = action1 { ... }&lt;br /&gt;  &lt;br /&gt;  def = action2 { ... }&lt;br /&gt;&lt;br /&gt;  def = action3 { ... }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The patch has been attached to &lt;a href="http://jira.codehaus.org/browse/GRAILS-379"&gt;http://jira.codehaus.org/browse/GRAILS-379&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-116146343572633220?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/116146343572633220/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=116146343572633220' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/116146343572633220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/116146343572633220'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2006/10/grails-enhancement-submitted.html' title='Grails Enhancement Submitted'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-115841640056495270</id><published>2006-09-16T09:02:00.000-05:00</published><updated>2006-09-16T09:20:00.573-05:00</updated><title type='text'>Grails Presentation Thursday Evening</title><content type='html'>My &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; presentation Thursday evening went very well.  &lt;a href="http://www.weiqigao.com/blog/2006/09/14/jeff_brown_an_introduction_to_building_groovy_web_applications_with_grails.html"&gt;Weiqi Gao blogged&lt;/a&gt; about the presentation in real time.&lt;br /&gt;&lt;br /&gt;The presentation slides are available at &lt;a href="http://www.ociweb.com/javasig/knowledgebase/2006-09/index.html"&gt;http://www.ociweb.com/javasig/knowledgebase/2006-09/&lt;/a&gt;.  The tone of the whole session was very light and fun.  You will see in the notes that I included quotes about Grails from famous people such as John Lennon, Mr. T, Batman and Robin and even Elvis Presley.  Each time a celebrity came up in the slides I asked a trivia question about that celebrity and the first person to shout out the correct answer was given a copy of the &lt;a href="http://www.manning.com/koenig/"&gt;Groovy In Action&lt;/a&gt; MEAP, courtesy of &lt;a href="http://manning.com/"&gt;Manning Publishing&lt;/a&gt;.  Thanks to Manning for those.&lt;br /&gt;&lt;br /&gt;There are not many code samples in the presentation slides.  During the presentation I built a simple application and along the way applied the concepts that are mentioned in the notes.&lt;br /&gt;&lt;br /&gt;Before the presentation there was some discussion among the group about the future of Java and a lot of people in the group agreed that dynamic languages are going to be an important part of what we do in the future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-115841640056495270?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/115841640056495270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=115841640056495270' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/115841640056495270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/115841640056495270'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2006/09/grails-presentation-thursday-evening.html' title='Grails Presentation Thursday Evening'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-115759713635210158</id><published>2006-09-06T20:19:00.000-05:00</published><updated>2006-09-06T21:45:36.400-05:00</updated><title type='text'>Learning New Languages, Like Haskell (not Eddie)</title><content type='html'>There are a number of reasons for developers to learn new programming languages.  One reason is to keep their skills current.  Another reason is that many developers simply find learning new languages to be fun.  Another reason is that learning new languages forces developers to think about problems differently.  That is what I want to discuss.&lt;br /&gt;&lt;br /&gt;Learning new spoken languages changes the way people think about problems.  Learning new programming languages is no different.  When a &lt;a href="http://www.research.att.com/~bs/C++.html"&gt;C++&lt;/a&gt; developer learns Java they can't do pointer arithmetic any more.  They can't use multiple inheritance in the same way.  What about &lt;a href="http://www.ruby-lang.org/"&gt;Ruby&lt;/a&gt; and &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt;?  The fire marshall is going to shut down the Ruby bandwagon because it is way over capacity right now.  I don't think there are any Java developers left who haven't at least tinkered with Ruby.  Java developers learn Ruby and then realize things about Java that start to seem fundamentally wrong.  Why isn't there a simple syntax in Java for declaring properties like you can in Ruby or Groovy?  Why are there so many 1 line getters and setters in the Java world?  What about that dynamic typing?  That takes some getting used to.  On and on...  More languages... More examples...&lt;br /&gt;&lt;br /&gt;Languages like C++, Java, Ruby and Groovy are all very different languages but at the same time, are all pretty much the same.  They are all object oriented.  When you write a program in one of those languages you model the business objects, encapsulate logic, pass references around and all of these objects collaborate to solve a problem.  OO has been around for a pretty long time now and is an effective way to build systems.  If learning different OO languages is beneficial (and it is), what about learning fundamentally different languages?  That ought to be valuable as well.  I say it is anyway.&lt;br /&gt;&lt;br /&gt;I recently spent a little time playing with &lt;a href="http://www.muppetlabs.com/~breadbox/bf/"&gt;BF&lt;/a&gt;.  That is interesting stuff but no sane person is every going to propose that is a good way to write anything.  However, learning BF is an interesting exercise.  Try to write a simple calculator in BF and you will be forced to think about things differently.  Learning BF is strictly an academic exercise.&lt;br /&gt;&lt;br /&gt;On a more practical front I have been playing with &lt;a href="http://haskell.org/haskellwiki/Haskell"&gt;Haskell&lt;/a&gt; lately and am finding it very interesting.  Haskell is a functional programming language.  Functional programming languages are all about the function.  Haskell is a real programming language that is used to build real systems, not just a goofy language to play around with (like BF).  At first the language may seem prohibitively useless for its lack of things imperative programmers are used to.  For example, there is no destructive assignment in a pure functional language.  That means there is no such thing as &amp;quot;x = x + 1&amp;quot;.  What?  How can I write software without basic functionality like that?  You can.  This "feature" isn't missing from the language (or whole class of languages), it just isn't necessary.&lt;br /&gt;&lt;br /&gt;My Haskell Kung Fu is nowhere near sharp enough to provide any kind of tutorial but I will tempt your curiosity with some very basic hello world kind of examples.  Take a look at this...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;fac 1 = 1&lt;br /&gt;fac x = x * fac(x - 1)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That is a way to write a function in Haskell to calculate factorials.  The first line says &amp;quot;factorial 1 is equal to 1&amp;quot;.  The second line says &amp;quot;factorial of any other number is that number multiplied by the factorial of 1 less than that number&amp;quot;.  That seems pretty straightforward, doesn't it?  If you read those 2 lines of code out loud, it reads almost like you would describe what a factorial is.&lt;br /&gt;&lt;br /&gt;If you can follow the factorial example, the &lt;a href="http://en.wikipedia.org/wiki/Fibonacci_number"&gt;fibonacci&lt;/a&gt; example below shouldn't be difficult to understand...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;fib 0 = 0&lt;br /&gt;fib 1 = 1&lt;br /&gt;fib x = fib(x - 1) + fib(x - 2)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I don't know how functional programmers really think about that but my OO mind thinks of that as 3 overloaded versions of the &amp;quot;fib&amp;quot; function.  One takes a 0 as an argument, one takes a 1 as an argument and the other takes any other number as an argument.  This could be written in haskell with just 1 function and some "if" blocks but the code above is &amp;quot;the functional way&amp;quot;.&lt;br /&gt;&lt;br /&gt;A slightly more complicated example is a sort routine like this...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;my_sort [] = []&lt;br /&gt;my_sort (x:xs) = my_sort less_than_x ++ [x] ++ my_sort greater_than_x&lt;br /&gt; where&lt;br /&gt;  less_than_x = filter (&amp;lt;x) xs&lt;br /&gt;  greater_than_x = filter (&amp;gt;=x) xs&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The first line there says that the result of sorting an empty list is an empty list.  That seems reasonable to me.  The rest is another &amp;quot;overloaded&amp;quot; (probably not the terminology the functional crowd would use) version of the same function.  This version accepts a list as an argument where x is the first element in the list and xs is the rest of the list.  That little syntax turns out to be useful a lot.  The result of sorting that list is achieved by concatenating (++) 3 things.  The first thing is a sorted copy of everything that is less than x.  The second thing in the concatenation is x.  The third thing in the concatenation is a sorted copy of everything that is greater than x (actually greater than or equal to x, as we'll see shortly).  The labels &amp;quot;less_than_x&amp;quot; and &amp;quot;greather_than_x&amp;quot; are just that, labels.  There is no Haskell magic at play there.  The lines after the &amp;quot;where&amp;quot; clause define what those labels refer to.  &amp;quot;less_than_x&amp;quot; is defined to be everything in xs that is less than x.  &amp;quot;greater_than_x&amp;quot; is defined to be everything in xs that is greater than or equal to x.  Since &amp;quot;less_than_x&amp;quot; and &amp;quot;greater_than_x&amp;quot; need to be sorted before the concatenation takes place, recursion is taking place.&lt;br /&gt;&lt;br /&gt;Some may look at that code and immediately conclude that it is confusing to look at and can't possibly be a good way to write code.  However, once you understand how each of those pieces work, this is really a pretty direct expression of what is being accomplished.  &lt;br /&gt;&lt;br /&gt;Maybe you will take some time to look at Haskell and find a lot of interesting things about it.  If you are really feeling funky and want to explore functional programming constructs in Java, take a look at &lt;a href="http://functionalj.sourceforge.net/"&gt;FunctionalJ&lt;/a&gt;.  That is interesting to think about but I think from the perspective of tweaking your brain a bit, for a lot of folks learning Haskell is probably a more interesting and more valuable experience.&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-115759713635210158?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/115759713635210158/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=115759713635210158' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/115759713635210158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/115759713635210158'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2006/09/learning-new-languages-like-haskell.html' title='Learning New Languages, Like Haskell (not Eddie)'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-115611812062728383</id><published>2006-08-20T18:40:00.000-05:00</published><updated>2006-08-20T18:55:20.636-05:00</updated><title type='text'>Obscure Programming Language</title><content type='html'>I was doing some research on quines this weekend and while doing so I stumbled across several obscure programming languages that I was not previously familiar with.  The following is actual code I wrote that will compile and run (it isn't a quine)...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;gt;++++++++++[&amp;gt;+++++++&amp;gt;+++++++++++&amp;gt;+++++++&lt;br /&gt;+++&amp;gt;++++++++++++&amp;gt;+++&amp;gt;++++++++[&amp;lt;]&amp;gt;-]&amp;gt;-.&amp;gt;+&lt;br /&gt;++++.&amp;gt;-.+++++.---.&amp;gt;-.&amp;gt;++.&amp;gt;-.&amp;lt;&amp;lt;&amp;lt;---.++++.&lt;br /&gt;&amp;lt;++.--.&amp;gt;---.--.&amp;lt;+.&amp;gt;++++++++.&amp;lt;-----.-.&amp;gt;&amp;gt;&amp;gt;+.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Do you know what language that is?  A few hints...&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;The language is composed of just 8 commands, each expressed with a single character (7 are used in the program above)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Whitespace is insignificant&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The language is &amp;quot;Turing-Complete&amp;quot;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The language has a colorful name (if you reply to this, you may use the initials to avoid the offensive word)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-115611812062728383?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/115611812062728383/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=115611812062728383' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/115611812062728383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/115611812062728383'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2006/08/obscure-programming-language.html' title='Obscure Programming Language'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-115241364428904905</id><published>2006-07-08T21:42:00.000-05:00</published><updated>2006-07-08T21:54:04.340-05:00</updated><title type='text'>db4o and Groovy</title><content type='html'>I want to say thanks to &lt;a href="http://www.db4o.com/about/company/management/christofwittig.aspx"&gt;Christof&lt;/a&gt; and the rest of the gang at &lt;a href="http://www.db4o.com/"&gt;db4o&lt;/a&gt; as they were kind enough to send me a hardcover copy of &lt;a href="http://www.amazon.com/gp/product/1590596560/ref=sr_11_1/103-2820032-8034222?ie=UTF8"&gt;The Definitive Guide to db4o&lt;/a&gt;.  The book showed up this week.  I have not had time to read all of it at this point but at a glance it looks like the authors have covered a lot of interesting territory inlcuding replication with &lt;a href="http://hibernate.org/"&gt;Hibernate&lt;/a&gt;, which I expect is going to be a big win for db4o in the eyes of a lot of folks.&lt;br /&gt;&lt;br /&gt;I have worked up some interesting &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt; integration capabilities for db4o.  As soon as I have some time to clean some of that up and get it documented I will be sharing that.&lt;br /&gt;&lt;br /&gt;I wish continued success to all of the guys at db4o.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-115241364428904905?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/115241364428904905/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=115241364428904905' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/115241364428904905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/115241364428904905'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2006/07/db4o-and-groovy.html' title='db4o and Groovy'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-115033789095353796</id><published>2006-06-14T21:11:00.000-05:00</published><updated>2006-06-14T21:18:10.996-05:00</updated><title type='text'>New Groovy Spec Lead</title><content type='html'>Today the official announcement was made that &lt;a href="http://glaforge.free.fr/weblog/"&gt;Guillaume Laforge&lt;/a&gt; is the new &lt;a href="http://jcp.org/en/jsr/detail?id=241"&gt;Groovy JSR-241&lt;/a&gt; Spec lead.&lt;br /&gt;&lt;br /&gt;The whole Groovy community is anxious about the next few months hoping that 1.0 will be finished up.  Congrats and good luck to Guillaume!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-115033789095353796?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/115033789095353796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=115033789095353796' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/115033789095353796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/115033789095353796'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2006/06/new-groovy-spec-lead.html' title='New Groovy Spec Lead'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-114945984213238647</id><published>2006-06-04T16:42:00.000-05:00</published><updated>2006-06-04T17:24:02.180-05:00</updated><title type='text'>Groovy And JScience</title><content type='html'>I have been spending a lot of time investigating &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt; lately.  I wanted to dig in to writing a &lt;a href="http://docs.codehaus.org/display/GROOVY/Groovy+Categories"&gt;Groovy Category&lt;/a&gt; so I started writing some code to support things like this...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def duration = 30.minutes + 2.hours&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Before I got too far along there I discovered that &lt;a href="http://docs.codehaus.org/display/~tug"&gt;John Wilson&lt;/a&gt; had already implemented a lot of that in his TimeCategory which is part of &lt;a href="http://docs.codehaus.org/display/GROOVY/Google+Data+Support"&gt;Google Data Support&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I had recently read &lt;a href="http://ociweb.com/jnb/jnbJun2006.html"&gt;a JNB article&lt;/a&gt; that &lt;a href="http://europetravelogue.com/blog/index.php"&gt;Lance Finney&lt;/a&gt; had written on &lt;a href="http://jscience.org/"&gt;JScience&lt;/a&gt; and that gave me another idea.  I decided to write a &lt;a href="http://docs.codehaus.org/display/GROOVY/Groovy+Categories"&gt;Groovy Category&lt;/a&gt; that would use JScience to support things like this...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def len = 2.kilometers + 500.meters&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Since I wanted to do this as an exercise I decided to not even do any &lt;a href="http://www.google.com"&gt;research&lt;/a&gt; to find out if anyone had already implemented something like this.  I wanted to build this for my own benefit as a learning exercise.  I started by expressing some of my own requirements in the form of a &lt;a href="http://groovy.codehaus.org/Unit+Testing"&gt;Groovy Unit Test&lt;/a&gt; like this...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class JScienceTest extends GroovyTestCase {&lt;br /&gt;&lt;br /&gt;  void testConversions() {&lt;br /&gt;    use(JScienceCategory) {&lt;br /&gt;      def len = 2.kilometers&lt;br /&gt;      assertEquals 2.0,    len.kilometers,  0.00001&lt;br /&gt;      assertEquals 2.0E3,  len.meters,      0.00001&lt;br /&gt;      assertEquals 2.0E5,  len.centimeters, 0.00001&lt;br /&gt;      assertEquals 2.0E6,  len.millimeters, 0.00001&lt;br /&gt;      assertEquals 2.0E9,  len.micrometers, 0.00001&lt;br /&gt;      assertEquals 2.0E12, len.nanometers,  0.00001&lt;br /&gt;      &lt;br /&gt;      def len2 = 400.centimeters&lt;br /&gt;      assertEquals 4.0E-3, len2.kilometers,  0.00001&lt;br /&gt;      assertEquals 4.0,    len2.meters,      0.00001&lt;br /&gt;      assertEquals 4.0E2,  len2.centimeters, 0.00001&lt;br /&gt;      assertEquals 4.0E3,  len2.millimeters, 0.00001&lt;br /&gt;      assertEquals 4.0E6,  len2.micrometers, 0.00001&lt;br /&gt;      assertEquals 4.0E9,  len2.nanometers,  0.00001&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  void testAddition() {&lt;br /&gt;    use(JScienceCategory) {&lt;br /&gt;      def len = 2.kilometers + 500.meters&lt;br /&gt;      assertEquals 2.5, len.kilometers, 0.00001&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  void testSubtraction() {&lt;br /&gt;    use(JScienceCategory) {&lt;br /&gt;      def len = 3.kilometers - 500.meters&lt;br /&gt;      assertEquals 2.5, len.kilometers, 0.00001&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  void testMultiplication() {&lt;br /&gt;    use(JScienceCategory) {&lt;br /&gt;      def len = 3.kilometers * 2&lt;br /&gt;      assertEquals 6.0, len.kilometers, 0.00001&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  void testDivision() {&lt;br /&gt;    use(JScienceCategory) {&lt;br /&gt;      def len = 42.meters / 3&lt;br /&gt;      assertEquals 14.0, len.meters, 0.00001&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;My Groovy Kung Fu is still developing and I had not done anything at all with JScience before this.  Even with those limitations I was able to get all of those tests passing in about an an hour.&lt;br /&gt;&lt;br /&gt;Would you rather do this in Java...&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Measure length = Measure.valueOf(50, SI.CENTI(SI.METER)).plus(Measure.valueOf(25.0, SI.METER));&lt;br /&gt;Measure lengthInCentimeters = length.to(SI.CENTI(SI.METER));&lt;br /&gt;System.out.println("length in centimeters is " + lengthInCentimeters.getEstimatedValue());&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Or do this in Groovy...&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def length = 50.centimeters + 25.meters&lt;br /&gt;println "length in centimeters is ${length.centimeters}"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Isn't Groovy fun?  :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-114945984213238647?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/114945984213238647/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=114945984213238647' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/114945984213238647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/114945984213238647'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2006/06/groovy-and-jscience.html' title='Groovy And JScience'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-114904189258412005</id><published>2006-05-30T21:08:00.000-05:00</published><updated>2006-05-30T21:18:43.513-05:00</updated><title type='text'>Operator Overloading In Groovy</title><content type='html'>I have been doing some &lt;a href="http://groovy.codehaus.org"&gt;Groovy&lt;/a&gt; development lately.  I just spent a few minutes spinning around a quirky behavior that makes perfect sense to me now but at first had me scratching my head.  Take a look at this...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def sqlDate = new java.sql.Date(System.currentTimeMillis())&lt;br /&gt;sqlDate += 2&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That code is creating an instance of java.sql.Date and adding 2 days to it.  My moment of confusion comes from the fact that after adding the 2 days the sqlDate reference no longer points to a java.sql.Date object but instead points to a java.util.Date object.  Hmm... What is going on?&lt;br /&gt;&lt;br /&gt;The operator overloading is being inherited into java.sql.Date from java.util.Date.  The plus method in java.util.Date is returning a java.util.Date, which makes perfect sense.  Since that method is inherited into java.sql.Date and not overridden then when it is invoked it returns a java.util.Date.&lt;br /&gt;&lt;br /&gt;Try this...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def sqlDate = new java.sql.Date(System.currentTimeMillis())&lt;br /&gt;println sqlDate.class&lt;br /&gt;sqlDate += 2&lt;br /&gt;println sqlDate.class&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-114904189258412005?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/114904189258412005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=114904189258412005' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/114904189258412005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/114904189258412005'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2006/05/operator-overloading-in-groovy.html' title='Operator Overloading In Groovy'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-113384190309533688</id><published>2005-12-05T20:30:00.000-06:00</published><updated>2005-12-06T08:32:11.740-06:00</updated><title type='text'>db4o is pretty interesting</title><content type='html'>I have done a lot of work with a number of &lt;a href="http://java.sun.com"&gt;Java&lt;/a&gt; persistence solutions including &lt;a href="http://java.sun.com/products/jdbc/"&gt;JDBC&lt;/a&gt;, &lt;a href="http://jcp.org/en/jsr/detail?id=243"&gt;JDO&lt;/a&gt;, &lt;a href="http://www.hibernate.org/"&gt;Hibernate&lt;/a&gt;, &lt;a href="http://jcp.org/en/jsr/detail?id=220"&gt;JSR-220 Persistence&lt;/a&gt; and &lt;a href="http://www.prevayler.org/"&gt;Prevayler &lt;/a&gt;(have just tinkered with &lt;a href="http://www.prevayler.org/"&gt;Prevayler&lt;/a&gt;... no real work).  Just recently I started investigating yet another persistence solution called &lt;a href="http://www.db4o.com/"&gt;db4objects (db4o)&lt;/a&gt;.  &lt;a href="http://www.db4o.com"&gt;db4o&lt;/a&gt; has versions for Java, .NET and  Mono.  I have only investigated the Java version.  In the time that I have spent investigating &lt;a href="http://www.db4o.com/"&gt;db4o&lt;/a&gt; I have found some pretty interesting stuff.&lt;br /&gt;&lt;br /&gt;One thing that stands out is that db4o allows you to persist plain 'ol &lt;a href="http://java.sun.com/"&gt;Java &lt;/a&gt;objects as plain 'ol &lt;a href="http://java.sun.com/"&gt;Java &lt;/a&gt;objects.  POJOs need not extend any magic base class or implement any special interface.  POJOs need not have any special id field.  POJOs need not have any special constructor.  There is no requirement for a no-arg constructor or even a public constructor.  db4o doesn't require any object descriptors (XML or otherwise) and doesn't require you to mark persistent classes up with &lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html"&gt;annotations&lt;/a&gt;.  db4o does not require that persistent fields have &lt;a href="http://java.sun.com/products/javabeans/"&gt;Java Bean&lt;/a&gt; compliant getters and setters.  db4o pretty much will take your objects as they come.&lt;br /&gt;&lt;br /&gt;db4o can run in embedded mode which means that all of db4o is inside of your applications process.  There doesn't need to be a separate db4o process running somewhere.  There can be if that suits your deployment needs, but there doesn't need to be.&lt;br /&gt;&lt;br /&gt;db4o has some pretty robust schema evolution capabilities that allow fields to be added, removed and renamed.  There is support for moving classes to new packages.&lt;br /&gt;&lt;br /&gt;db4o is an &lt;a href="http://odbms.org/"&gt;OO database&lt;/a&gt;.  db4o is not an object to relational mapping tool, the db is an &lt;a href="http://odbms.org/"&gt;OO db&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;One of the issues I initially had concerns about was performance once the database accumulated large numbers of objects.  To test some of this, I created a fairly simple object model to represent music cds.  The classes look something like this...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public class CDArtist {&lt;br /&gt;  private String name;&lt;br /&gt;  private List&amp;lt;CD&gt; cds = new ArrayList&amp;lt;CD&gt;();&lt;br /&gt;  // constructor and methods snipped...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public class CD {&lt;br /&gt;  private String title;&lt;br /&gt;  private List&amp;lt;CDTrack&gt; tracks = new ArrayList&amp;lt;CDTrack&gt;();&lt;br /&gt;  // constructor and methods snipped...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class CDTrack {&lt;br /&gt;  private String title;&lt;br /&gt;  private int trackNumber;&lt;br /&gt;  private CD cd;&lt;br /&gt;  // constructor and methods snipped...&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I downloaded a gaboodle of data from &lt;a href="http://freedb.org/"&gt;freedb.org&lt;/a&gt; and wrote a simple parser to turn that data into instances of my classes and started dropping those into my db4o database.  At present I have about 75,000 artists, 185,000 cds and over 2,000,000 tracks in the database.  I realize that for a lot of situations even those 2,000,000+ tracks don't really amount to a lot of data but that is what I am currently working with.  It is enough data to exercise some of the things I wanted to look at.&lt;br /&gt;&lt;br /&gt;db4o supports 3 query techniques...&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Query By Example&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Native Query&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://sodaquery.sourceforge.net/"&gt;S.O.D.A.&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;I will show a simple example of each of these here and include some performance figures.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Query By Example (QBE)&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;The following code uses QBE to retrieve all CDs in the database that contain a track with the name "The Trooper".&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Db4o.configure().objectClass(CDTrack.class).maximumActivationDepth(0);&lt;br /&gt;Db4o.configure().objectClass(CDTrack.class).objectField("title").indexed(true);&lt;br /&gt;&lt;br /&gt;// my custom factory&lt;br /&gt;ObjectContainer db = ObjectContainerFactory.get().createObjectContainer();&lt;br /&gt;&lt;br /&gt;CDTrack myCandidateTrack = new CDTrack(null, 0, "The Trooper");&lt;br /&gt;List&amp;lt;CDTrack&gt; results = db.get(myCandidateTrack);&lt;br /&gt;for (CDTrack track : results) {&lt;br /&gt;  CD theCD = track.getCd();&lt;br /&gt;  System.out.println(theCD);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;db.close();&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;  &lt;br /&gt;&lt;br /&gt;That query completes in less than 300-400 milliseconds.  That is querying over 2,000,000 tracks, identifying the ones that match the name "The Trooper" and retrieving the cd that the track belongs to (note the call to track.getCd() inside of the loop).&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;&lt;a href="http://sodaquery.sourceforge.net/"&gt;S.O.D.A.&lt;/a&gt;&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Db4o.configure().objectClass(CDTrack.class).maximumActivationDepth(0);&lt;br /&gt;Db4o.configure().objectClass(CDTrack.class).objectField("title").indexed(true);&lt;br /&gt;&lt;br /&gt;// my custom factory&lt;br /&gt;ObjectContainer db = ObjectContainerFactory.get().createObjectContainer();&lt;br /&gt;&lt;br /&gt;Query query = db.query();&lt;br /&gt;query.constrain(CDTrack.class);&lt;br /&gt;query.descend("title").constrain("The Trooper");&lt;br /&gt;ObjectSet&amp;lt;CDTrack&gt; results = query.execute();&lt;br /&gt;for (CDTrack track : results) {&lt;br /&gt;  CD theCD = track.getCd();&lt;br /&gt;  System.out.println(theCD);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;db.close();&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That S.O.D.A. query executes in about 100 milliseconds.  Again querying over 2,000,000 tracks and retrieving the matching tracks and their containing cds.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Native Query&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;This is what a native query might look like in db4o.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Db4o.configure().objectClass(CDTrack.class).maximumActivationDepth(0);&lt;br /&gt;Db4o.configure().objectClass(CDTrack.class).objectField("title").indexed(true);&lt;br /&gt;&lt;br /&gt;// my custom factory&lt;br /&gt;ObjectContainer db = ObjectContainerFactory.get().createObjectContainer();&lt;br /&gt;&lt;br /&gt;List&amp;lt;CDTrack&gt; results = db.query(new Predicate&amp;lt;CDTrack&gt;() {&lt;br /&gt;  public boolean match(CDTrack candidate) {&lt;br /&gt;    return candidate.getTitle().equals("The Trooper");&lt;br /&gt;  }&lt;br /&gt;});&lt;br /&gt;for (CDTrack track : results) {&lt;br /&gt;  CD theCD = track.getCd();&lt;br /&gt;  System.out.println(theCD);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;db.close();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This approach has some nice benefits.  One is that you get real compile time type safety.  The query isn't some arbitrary string that might or might not be legal at runtime.  The query is real Java code that gets compiled.  That is nice.  However, that Predicate looks a little suspect to me.  Judging from looking at the code it seems that the db4o engine is going to have to create all of my CDTrack objects and pass each of them one a time to my match(CDTrack) method so I can decide which of them match my criteria.  Since I have over 2,000,000 tracks that can't be efficient.  The code above executes in about 100-150 milliseconds.  I am still querying those 2,000,000+ tracks and retrieving all the same stuff I was retrieving in the previous examples.  What is going on here at runtime is that db4o is doing some slick class loading voodoo and figuring out what my Predicate would do, then it optimizes all of that away by turning my Predicate into a S.O.D.A. query.  Run the code in a debugger and find that my match(CDTrack) method never actually gets called.  There are limits here.  The optimizer does a good job of figuring out what you intended to do but you can do things in your Predicate that the optimizer can't figure out in which case the Predicate cannot be optimized away and then the engine will have to create all of those CDTracks and pass them to the match method.  This is easy enough to sort out at development time if you need to make sure the Predicate will be optimized.  While experimenting with this don't try to put a System.out.println call or logging calls in your Predicate to monitor if your Predicate is getting called or not.  Those fall in the category of things that the optimizer can't handle and a side effect of them being there is that the method will not get optimized away.  There is a callback mechanism you can hookup to retrieve notifications that indicate when a Predicate is optimized and when it isn't.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;ObjectContainer db = ObjectContainerFactory.get().createObjectContainer();&lt;br /&gt;&lt;br /&gt;((YapStream)db).getNativeQueryHandler().addListener(new Db4oQueryExecutionListener() {&lt;br /&gt;  public void notifyQueryExecuted(Predicate filter, String msg) {&lt;br /&gt;  }&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That callback will be notified when db4o first deals with any particular Predicate.  The msg argument will by "DYNOPTIMIZED" if the query has been dynamicallly optimized.  msg will be "UNOPTIMIZED" if the query could not be optimized.  msg will be "PREOPTIMIZED" if the query had been pre optimized.  db4o has some bytecode manipulation tools to preoptimize Predicates but I have not investigated that.&lt;br /&gt;&lt;br /&gt;They are working on some &lt;a href="http://www.hibernate.org"&gt;Hibernate&lt;/a&gt; replication modules that will allow a db4o database to be kept in synch with a relational database via Hibernate.  That code is still in development and I haven't looked at any of that.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://forums.db4o.com/forums/"&gt;discussion forums&lt;/a&gt; are pretty active and as far as I can tell there is a lot of momentum behind the effort right now.&lt;br /&gt;&lt;br /&gt;db4o is distributed under a couple of different license.  There is a GPL version available for open source projects, experimenting and internal projects.  There is also a commercial license available for commercial, non-open source applications.  As far as I know, the GPL version is the same software as the commercial version.  The restrictions have to do with distribution, not the software itself.&lt;br /&gt;&lt;br /&gt;No reasonable person is going to claim that db4o is the silver bullet of persistence but it is interesting stuff and probably makes a lot of sense for a lot of applications.  If nothing else, it is a good thing to be aware of.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-113384190309533688?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/113384190309533688/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=113384190309533688' title='21 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/113384190309533688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/113384190309533688'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2005/12/db4o-is-pretty-interesting.html' title='db4o is pretty interesting'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>21</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-111478612267055973</id><published>2005-04-29T09:46:00.000-05:00</published><updated>2005-04-29T09:48:42.673-05:00</updated><title type='text'>Is Sun Pimping The Java Name?</title><content type='html'>Does the name "Java" really belong on these products?&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.sun.com/software/javadesktopsystem/"&gt;Sun Java Desktop System&lt;/a&gt;&lt;br/&gt;&lt;br /&gt;&lt;a href="http://www.sun.com/desktop/workstation/w1100z/index.jsp"&gt;Sun Java Workstation W1100z&lt;/a&gt;&lt;br/&gt;&lt;br /&gt;&lt;a href="http://www.sun.com/desktop/workstation/w2100z/index.jsp"&gt;Sun Java Workstation W2100z&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-111478612267055973?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/111478612267055973/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=111478612267055973' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/111478612267055973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/111478612267055973'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2005/04/is-sun-pimping-java-name.html' title='Is Sun Pimping The Java Name?'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-110987739023116896</id><published>2005-03-03T13:16:00.000-06:00</published><updated>2005-03-03T13:22:04.776-06:00</updated><title type='text'>Free IntelliJ IDEA License</title><content type='html'>A few weeks ago the guys at JetBrains/IntelliJ announced the availability of IntelliJ IDEA licenses that they were making available free of charge to qualifying open source developers.  See &lt;a href="http://www.jetbrains.com/idea/opensource/"&gt;http://www.jetbrains.com/idea/opensource/&lt;/a&gt; for details.&lt;br /&gt;&lt;br /&gt;I already own a current license for IntelliJ IDEA and that license allows me to do whatever development I like (personal, commercial, open source, whatever).  I can even install that license on as many machines as I like as long as I am the only person using them.  Contrast that with the more limited open source license which is only allowed to be used for open source development and may be limited further to only being used on development of open source projects that the guys at IntelliJ approve.  I am not exactly sure about that last part, but the license is limited to open source work.  Anyway, because I already own a less restrictive license, the free license doesn't really buy me anything, but I wanted to participate in their program, so I submitted a request based on my involvement with &lt;a href="http://www.jarspy.org/"&gt;JarSpy&lt;/a&gt;.  Shortly after sending the request I got an email response letting me know that they have received lots of requests and that each one needs to be evaluated individually and that will be time consuming.  I wasn't too worried about it so I saved the email and went on with my business.  &lt;br /&gt;&lt;br /&gt;Fast forward to today.  Today I received an email from them letting me know that they have approved my request and are issuing me a free license.  Whooo Hoo!  In a way, this is of absolutely no consequence whatsoever.  In another way, I am still glad that they are extending this offer and that they are not being overly restrictive about it.&lt;br /&gt;&lt;br /&gt;I hope that this helps IntelliJ IDEA continue to grow in its popularity and subsequently leads to its continued life of innovation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-110987739023116896?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/110987739023116896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=110987739023116896' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/110987739023116896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/110987739023116896'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2005/03/free-intellij-idea-license.html' title='Free IntelliJ IDEA License'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-110969685060410839</id><published>2005-03-01T11:01:00.000-06:00</published><updated>2005-03-01T11:07:30.606-06:00</updated><title type='text'>JDO 2.0 Has Been Approved!</title><content type='html'>I am pleased to report that &lt;a href="http://www.jcp.org/en/jsr/results?id=3078"&gt;JDO 2.0 has been approved&lt;/a&gt;!  This is great news for the JDO community.  &lt;a href="http://www.jcp.org/en/jsr/results?id=2997"&gt;The initial public review ballot&lt;/a&gt; was voted down back in January with a vote of 10 against, 5 for and 1 abstainer.  &lt;a href="http://www.jcp.org/en/jsr/results?id=3078"&gt;The reconsideration ballot&lt;/a&gt; passed with a vote of 0 against, 12 for, 1 no vote and 3 abstainers.&lt;br /&gt;&lt;br /&gt;I don't think this vote hurts the &lt;a href="http://www.jcp.org/en/jsr/detail?id=220"&gt;JSR 220&lt;/a&gt; effort but I think it does a lot of good for JDO users and JDO vendors.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-110969685060410839?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/110969685060410839/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=110969685060410839' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/110969685060410839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/110969685060410839'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2005/03/jdo-20-has-been-approved.html' title='JDO 2.0 Has Been Approved!'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-110787881139743219</id><published>2005-02-08T10:04:00.000-06:00</published><updated>2005-02-08T10:06:51.396-06:00</updated><title type='text'>Free IntelliJ IDEA License</title><content type='html'>The guys at &lt;a href="http://www.intellij.com/"&gt;IntelliJ&lt;/a&gt; are giving away free licenses for IDEA to open source projects.  I haven't read all of the details, but at a glance this looks awesome.&lt;br /&gt;&lt;br /&gt;Details available &lt;a href="http://www.jetbrains.com/idea/opensource/"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-110787881139743219?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/110787881139743219/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=110787881139743219' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/110787881139743219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/110787881139743219'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2005/02/free-intellij-idea-license.html' title='Free IntelliJ IDEA License'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-110618835276830135</id><published>2005-01-19T20:20:00.000-06:00</published><updated>2005-01-19T20:32:32.766-06:00</updated><title type='text'>Bad News For JDO</title><content type='html'>I am very disappointed to see the &lt;a href="http://jcp.org/en/jsr/results?id=2997"&gt;results of the JSR 243 public review ballot&lt;/a&gt;.  I believe this means that the Expert Group has 30 days to submit an updated draft for a revote.  If a revised draft is not submitted in that timeframe or if the revote fails, the JSR will be closed.  If anyone thinks that is not correct, please share what you understand about the process.&lt;br /&gt;&lt;br /&gt;I knew that &lt;a href="http://jcp.org/en/jsr/detail?id=220"&gt;JSR 220&lt;/a&gt; was eventually going to succeed JDO 2.0 but as I understand it, there won't be anything "real" coming from &lt;a href="http://jcp.org/en/jsr/detail?id=220"&gt;JSR 220&lt;/a&gt; until 2006.&lt;br /&gt;&lt;br /&gt;Given the vote count and some of the comments submitted by the voters, it doesn't to me look very likely that the draft will be revised in such a way to change voter's minds.  I think that if the vote is going to turn around it would have to be in response to community feedback but I don't know how much of that there will be.&lt;br /&gt;&lt;br /&gt;I really am disappointed in this whole thing.  ;(&lt;br /&gt;&lt;br /&gt;Someone say it ain't so...  &lt;br /&gt;&lt;br /&gt;Already I am seeing talk of org.jdo.* popping up.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-110618835276830135?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/110618835276830135/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=110618835276830135' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/110618835276830135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/110618835276830135'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2005/01/bad-news-for-jdo.html' title='Bad News For JDO'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-110549620556321926</id><published>2005-01-11T20:44:00.000-06:00</published><updated>2005-01-12T09:21:52.880-06:00</updated><title type='text'>JarSpy Plugin For IntelliJ</title><content type='html'>Tonight I was looking for the &lt;a href="http://www.intellij.org/twiki/bin/view/Main/IntelliJPluginsHome"&gt;IntelliJ Plugin Wiki&lt;/a&gt; but I couldn't remember &lt;a href="http://www.intellij.org/twiki/bin/view/Main/IntelliJPluginsHome"&gt;the url&lt;/a&gt; so I did the obvious; I put "intellij plugin" into &lt;a href="http://www.google.com/"&gt;google&lt;/a&gt;.  To my surprise, the first link in the search results referred to my &lt;a href="http://www.jarspy.org/intellijPlugin.php"&gt;JarSpy Plugin For IntelliJ&lt;/a&gt;.  I can't say that I had forgotten ever having written that, but I can say that I haven't had any reason to think about it for a long time.  A couple of years ago I got an email from one of the billions of &lt;a href="http://www.jarspy.org/"&gt;JarSpy&lt;/a&gt; fans out there and the email was asking me for a &lt;a href="http://www.jarspy.org/"&gt;JarSpy&lt;/a&gt; plugin for &lt;a href="http://www.intellij.com/"&gt;IntelliJ&lt;/a&gt;.  I was an &lt;a href="http://www.intellij.com/"&gt;IntelliJ&lt;/a&gt; user at the time (I still am) and I was interested in taking a look at their plugin API so I went at it.  It didn't take long to write the plugin (although I do remember wishing there was better documentation for their API, maybe that has improved since then).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.jarspy.org/"&gt;JarSpy&lt;/a&gt; has turned out to be one of those little things that continues to popup for me from time to time.  Just a couple of weeks ago at my regular poker game one of my friends, who I had never had any reason to discuss &lt;a href="http://www.jarspy.org/"&gt;JarSpy&lt;/a&gt; with, said something like "hey, I was using JarSpy today and...". &lt;br /&gt;&lt;br /&gt;It has probably been more than a year since I made any code changes to &lt;a href="http://www.jarspy.org/"&gt;JarSpy&lt;/a&gt;.  I have some interesting ideas that I would like to add.  Maybe I will get some time to play with that soon.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-110549620556321926?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/110549620556321926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=110549620556321926' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/110549620556321926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/110549620556321926'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2005/01/jarspy-plugin-for-intellij.html' title='JarSpy Plugin For IntelliJ'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-110446531113376762</id><published>2004-12-30T21:45:00.000-06:00</published><updated>2004-12-30T21:57:18.013-06:00</updated><title type='text'>Ant Docbook Styler Suite</title><content type='html'>If you do any publishing with &lt;a href="http://www.docbook.org"&gt;Docbook&lt;/a&gt; you should take a look at the &lt;a href="http://www.cs.put.poznan.pl/dweiss/xml/projects/ant-docbook-styler/index.xml?lang=en"&gt;Ant and Docbook Styler Suite&lt;/a&gt;.  I recently stumbled across that and have so far been very impressed.  Installation is as simple as executing a target in the build file provided with the distribution and using the library is as simple as adding a task in your Ant build file to execute a target in their build file.  You have to provide a handful of property values so their task knows where to find your docbook source, what to generate, etc. but it really is a snap to use.  Their 3 or 4 page instructions (included in the distribution of course) are very clear and got me up and running within 10 minutes or so.&lt;br /&gt;&lt;br /&gt;I have looked at other &lt;a href="http://ant.apache.org/"&gt;Ant&lt;/a&gt; + &lt;a href="http://www.docbook.org/"&gt;Docbook&lt;/a&gt; solutions and they are all a wirey mess of dependencies and you have to download &lt;a href="http://www.docbook.org/"&gt;Docbook&lt;/a&gt; stylesheets separately and plugging in FO support is another twisted mess, and on and on.  The &lt;a href="http://www.cs.put.poznan.pl/dweiss/xml/projects/ant-docbook-styler/index.xml?lang=en"&gt;Styler Suite&lt;/a&gt; was much much simpler and seems to do a very nice job.&lt;br /&gt;&lt;br /&gt;If you are a docbook author but not a Java developer, this may turn out being more headache than it is worth but if you already have &lt;a href="http://ant.apache.org/"&gt;Ant&lt;/a&gt; and Java installed, using this is a cinch.&lt;br /&gt;&lt;br /&gt;Thanks to Dawid Weiss for the slick tool!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-110446531113376762?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/110446531113376762/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=110446531113376762' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/110446531113376762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/110446531113376762'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2004/12/ant-docbook-styler-suite.html' title='Ant Docbook Styler Suite'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-110443290728565476</id><published>2004-12-30T13:20:00.000-06:00</published><updated>2004-12-30T13:41:08.683-06:00</updated><title type='text'>Code Cracker Lives On</title><content type='html'>I bought my first &lt;a href="http://www.palm.com/"&gt;Palm Pilot&lt;/a&gt; back when the Palm IV series first came out.  I think it was 1998.  Soon after I bought the device I was interested in writing software to run on the thing.  I picked up a copy of &lt;a href="http://www.amazon.com/exec/obidos/ASIN/1565925254/qid%3D1104431967/sr%3D11-1/ref%3Dsr%5F11%5F1/104-3134560-6016720"&gt;OReilly's Palm Programming: The Developer's Guide&lt;/a&gt;, and I was on the ground running.  I remember spending a weekend just playing around with the API and I built a very simple little game that played like the old &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/B00004TFZL/qid=1104432131/sr=8-1/ref=pd_csp_1/104-3134560-6016720?v=glance&amp;s=toys&amp;n=507846"&gt;MasterMind&lt;/a&gt;  game that most of us played as a kid.  It wasn't that I wanted to write a MasterMind game, that was just something simple that I could use to help learn the PalmOS API.  I expected to just throw the thing away when I was done but I found myself enjoying playing the game when I had a minute or 2 to kill (like standing around in front of the microwave at work waiting for my lunch to cook) so I held on to it.  I gave the application a proper name, &lt;a href="http://codecracker.sourceforge.net"&gt;CodeCracker&lt;/a&gt;, created a very simple web page that explained a little about the game and I put it on my personal web site and made the game available for download.  I remember being surprised at how many people found the page and even more surprised at how many people bothered to take time to send a thank you note to me.  A couple of years later I was cleaning up a hard drive and stumbled across the source code.  I decided to put the source code on &lt;a href="http://codecracker.sourceforge.net/"&gt;SourceForge&lt;/a&gt; for safe keeping and it has been there ever since.  &lt;br /&gt;&lt;br /&gt;Just today I received an email from a guy in Italy saying thanks for the game and offering some suggestions for how to improve the game.  &lt;br /&gt;&lt;br /&gt;I spent a weekend 6 or 7 years ago playing around with writing something for the PalmOS and a very simple game evolved.  It is sort of interesting how these little things linger on.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://codecracker.sourceforge.net"&gt;CodeCracker&lt;/a&gt; Lives On!  ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-110443290728565476?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/110443290728565476/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=110443290728565476' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/110443290728565476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/110443290728565476'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2004/12/code-cracker-lives-on.html' title='Code Cracker Lives On'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-110416530522006836</id><published>2004-12-27T10:35:00.000-06:00</published><updated>2004-12-27T10:59:47.226-06:00</updated><title type='text'>Hostility Directed At Prevayler</title><content type='html'>&lt;a href="http://www.prevayler.org/wiki.jsp"&gt;Prevayler&lt;/a&gt; seems to be getting a lot of blog attention all of a sudden.  I don't know what kicked off the spike in attention, but something seems to have done just that.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.prevayler.org/wiki.jsp"&gt;Prevayler&lt;/a&gt; is yet another framework for POJO persistence.  What makes &lt;a href="http://www.prevayler.org/wiki.jsp"&gt;Prevayler&lt;/a&gt; unique is the fact that it takes an approach that your entire data model is in memory all of the time.  Because it is always reading from RAM, performance benefits are touted as high as 9000 times faster than Oracle and 3000 times faster than MySQL (I won't go into all of the details behind those numbers, see their site for more details).  One of the costs of this approach is directly related to RAM limitations.  If everything is loaded into RAM all of the time then the amount of RAM is an obvious potential road block.&lt;br /&gt;&lt;br /&gt;Some of the blogging rants I have seen go to great lengths to elaborate on the flaws of this approach.  &lt;a href="http://www.pyrasun.com/mike/mt/archives/2004/12/23/22.37.00/index.html"&gt;This guy&lt;/a&gt; rants with some hostility for several pages about Prevayler's shortcomings while &lt;a href="http://radio.javaranch.com/channel/frank/2004/12/27/1104152030000.html"&gt;this guy&lt;/a&gt; seems to take a more calm pragmattic look.  Some of the attacks I have read are really pointed at the idea that &lt;a href="http://www.prevayler.org/wiki.jsp"&gt;Prevayler&lt;/a&gt; is a ridiculous idea that could never replace our relational databases.  I don't think &lt;a href="http://www.prevayler.org/wiki.jsp"&gt;Prevayler&lt;/a&gt; is proposing that they are really a threat to Oracle or any other DB vendor.  I think they are proposing a solution that makes sense for some systems but not all.  I don't know if they are right or not, but I think that is what they are proposing.&lt;br /&gt;&lt;br /&gt;I am not a &lt;a href="http://www.prevayler.org/wiki.jsp"&gt;Prevayler&lt;/a&gt; proponent and I am not taking a position to defend &lt;a href="http://www.prevayler.org/wiki.jsp"&gt;Prevayler&lt;/a&gt;.  I have played around with their tool a little and it is interesting but I am really not a &lt;a href="http://www.prevayler.org/wiki.jsp"&gt;Prevayler&lt;/a&gt; evangalist.  What I find interesting about the attacks on &lt;a href="http://www.prevayler.org/wiki.jsp"&gt;Prevayler&lt;/a&gt; is that a lot of them seem to be very passionate and fired up.  If &lt;a href="http://www.prevayler.org/wiki.jsp"&gt;Prevayler&lt;/a&gt; was really a totally insane ridiculous idea I don't think anyone would even pay attention.  Maybe this is just another manifestation of the idea of how emotionally connected Enterprises (that means people) get to their databases and even the idea that it might not be right is enough to launch the missiles.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-110416530522006836?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/110416530522006836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=110416530522006836' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/110416530522006836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/110416530522006836'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2004/12/hostility-directed-at-prevayler.html' title='Hostility Directed At Prevayler'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-110395484202759182</id><published>2004-12-25T01:59:00.000-06:00</published><updated>2004-12-25T00:10:17.726-06:00</updated><title type='text'>Naughty  Or Nice?</title><content type='html'>Apparently, &lt;a href="http://www.chron.com/cs/CDA/ssistory.mpl/front/2962021"&gt;this guy&lt;/a&gt; sold his kids' Christmas presents on &lt;a href="http://www.ebay.com"&gt;eBay&lt;/a&gt; because the kids were naughty.  My wife and I sometimes joke about selling our boys on eBay when they misbehave (that is right, the boys... not their toys.).  I never considered selling their stuff.  ;)&lt;br /&gt;&lt;br /&gt;As I type this post I am looking out over a sea of toys and schtuff all wrapped up and spread around our family room.  In about 6 hours from now I expect a certain 7 year old boy to be jumping up and down on my bed yelling something about Santa Clause having been in our house.  I better get to bed.&lt;br /&gt;&lt;br /&gt;Happy Holidays To All!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-110395484202759182?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/110395484202759182/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=110395484202759182' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/110395484202759182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/110395484202759182'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2004/12/naughty-or-nice.html' title='Naughty  Or Nice?'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-110350509406520494</id><published>2004-12-19T21:10:00.000-06:00</published><updated>2004-12-19T19:11:34.066-06:00</updated><title type='text'>JDO 2.0</title><content type='html'>The Public Draft of JSR-243 is available for download at &lt;a href="http://jcp.org/en/jsr/detail?id=243"&gt;http://jcp.org/en/jsr/detail?id=243&lt;/a&gt;.  This JSR is defining the JDO 2.0 spec.&lt;br /&gt;&lt;br /&gt;There is a lot of new and cool stuff being proposed for 2.0.  One item in particular that I am interested in is the whole detachment idea.  The idea is that we would be able to detach a persistent object from the data store, modify the object and then later re-attach that object and commit the changes.  The changes could be commited by a different PersistenceManager and could even be committed in an entirely different VM. &lt;br /&gt;&lt;br /&gt;Another nicety proposed for 2.0 is the formalization of O/R metadata for defining indexes, foreign keys and constraints.  Some JDO implementations already support this sort of thing via vendor extensions in the meta data.  &lt;a href="http://www.objectdb.com"&gt;ObjectDB&lt;/a&gt; uses this approach.  Other implementations suggest that you let their tool create the tables and columns and then you go in after the fact and define your indexes, constraints etc. in the database yourself.  &lt;a href="http://tjdo.sourceforge.net"&gt;TJDO&lt;/a&gt; takes this approach.  It will be nice to have this formalized in the metadata for portability.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-110350509406520494?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/110350509406520494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=110350509406520494' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/110350509406520494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/110350509406520494'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2004/12/jdo-20.html' title='JDO 2.0'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-110322571095751803</id><published>2004-12-16T15:32:00.000-06:00</published><updated>2004-12-16T13:35:10.956-06:00</updated><title type='text'>J2SE 6.0 Snapshots Available</title><content type='html'>I just noticed that it looks like J2SE 6.0 snapshot releases are being made available at &lt;a href="https://j2se.dev.java.net/"&gt;https://j2se.dev.java.net/&lt;/a&gt;.  Have I finished upgrading to J2SE 5.0 yet???  ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-110322571095751803?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/110322571095751803/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=110322571095751803' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/110322571095751803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/110322571095751803'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2004/12/j2se-60-snapshots-available.html' title='J2SE 6.0 Snapshots Available'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7833979.post-110269554439717908</id><published>2004-12-10T09:50:00.000-06:00</published><updated>2004-12-10T10:47:46.980-06:00</updated><title type='text'>What Is Wrong With Our Web Apps?</title><content type='html'>Last night Rob Smith gave a great &lt;a href="http://www.ociweb.com/javasig/knowledgebase.html"&gt;presentation&lt;/a&gt; on &lt;a href="http://jakarta.apache.org/tapestry/"&gt;Tapestry&lt;/a&gt; at the &lt;a href="http://www.ociweb.com/javasig/"&gt;St. Louis Java SIG&lt;/a&gt;.  I liked a lot of the things that I learned about Tapestry but as I listened and learned I was thinking about what sorts of problems does Tapestry really solve for me.  Then I started thinking about how that relates to many other web app frameworks that are out there.  Just off the top of my head without spending too much time thinking about it or Googling or anything like that, I came up with this list of tools that help us build web apps...&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;JSP&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Servlet&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Java Server Faces&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Velocity&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Tapestry&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Struts&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Spring&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Tiles&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Several of those can be thought of as being direct competitors of each other.&lt;br /&gt;&lt;br /&gt;These technologies all try to help improve our web apps by making it easy to do things like separate the presentation layer from the data.  Some provide tools to help with state management.  Some help with scalability.  Those are all important things to address and sometimes are difficult to address.  If the tools can help solve those problems that is a good thing of course.&lt;br /&gt;&lt;br /&gt;Web apps are hard to build.  Few would still entertain fantasies about some magic web tool that solves all of the Enterprise's problems, is easy for everyone in the Enterprise to use and doesn't call for much development time.  We all know that can't happen.  If we didn't know that in the beginning, we know it now.&lt;br /&gt;&lt;br /&gt;I believe that a lot of things are well suited as web apps and for the purposes of this conversation I am using the term "web app" to mean an application that uses a web browser as its primary front end.  However, I am wondering if a lot of us are spending a lot of time and effort (that sounds like money to me) building web apps that really shouldn't be web apps.  At last year's &lt;a href="http://www.nofluffjuststuff.com/index.jsp"&gt;No Fluff Just Stuff Java Symposium&lt;/a&gt; in St. Louis I remember a comment that Bob Lee made during one of the expert panels.  Bob said something very close to "Can we all just agree to stop building browser based apps?".&lt;br /&gt;&lt;br /&gt;I don't think that web apps are bad.  I think a lot of things work very well as web apps.  In addition, as a Software Engineer I find working with a lot of the web app frameworks to be a lot of fun.  I am just wondering if we are collectively trying to push pegs into the wrong shaped holes too often.&lt;br /&gt;&lt;br /&gt;More and more I am feeling like we really need a fundamentally different (and better) way to build distributed systems.  I can't exactly put my finger on it, but somewhow I feel like we are solving a lot of the wrong problems and that in 6 months or 6 years or however long it takes us to come up with this next generation of ideas we are going to look back and wonder how we ever managed to operate our businesses any other way.&lt;br /&gt;&lt;br /&gt;What do you think about any of that?  Let me throw out some specific questions for thought.&lt;br /&gt;&lt;br /&gt;What problems do you have in building web apps that are not solved very well by the existing frameworks?&lt;br /&gt;&lt;br /&gt;What types of projects have you been involved with that were architected as web apps that should not have been and what made them poor candidates to be built as a web app?&lt;br /&gt;&lt;br /&gt;What types of projects have you been involved in that were not architected as web apps that should have been and what made them so well suited to be web apps?&lt;br /&gt;&lt;br /&gt;What do you think is next?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7833979-110269554439717908?l=javajeff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javajeff.blogspot.com/feeds/110269554439717908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7833979&amp;postID=110269554439717908' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/110269554439717908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7833979/posts/default/110269554439717908'/><link rel='alternate' type='text/html' href='http://javajeff.blogspot.com/2004/12/what-is-wrong-with-our-web-apps.html' title='What Is Wrong With Our Web Apps?'/><author><name>Jeff Brown</name><uri>http://www.blogger.com/profile/13650645104670573315</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.jeffandbetsy.net/images/jb300.jpg'/></author><thr:total>2</thr:total></entry></feed>
