tag:blogger.com,1999:blog-78339792024-03-07T00:42:08.488-06:00Jeffs Groovy Web LogJeff's technology blog dedicated to discussing technology that interests me including Groovy, Grails and other cool stuff.Jeff Brownhttp://www.blogger.com/profile/13650645104670573315noreply@blogger.comBlogger55125tag:blogger.com,1999:blog-7833979.post-14753928482878514702011-08-18T21:33:00.003-05:002011-08-18T22:09:24.253-05:00Today's LossI 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.
<br />
<br />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.
<br />
<br />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.
<br />
<br />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.
<br />
<br />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.
<br />
<br />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.
<br />
<br />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.
<br />
<br />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.Jeff Brownhttp://www.blogger.com/profile/13650645104670573315noreply@blogger.com11tag:blogger.com,1999:blog-7833979.post-82725910862501662152010-04-23T11:20:00.004-05:002010-04-23T11:37:51.646-05:00Switching Versions Of Grails (and other tools)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 <a href="http://grails.org">Grails</a>. 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?". <br /><br />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...<br /><br /><pre><br />grails-1.0.5<br />grails-1.1.1<br />grails-1.1.2<br />grails-1.2-M4<br />grails-1.2.0<br />grails-1.2.0.RC1<br />grails-1.2.0.RC2<br />grails-1.2.1<br />grails-1.2.2<br />grails-1.3.0.RC1<br />grails-1.3.0.RC2<br /></pre><br /><br />One thing I might do when I need to use a specific version of Grails is something like this...<br /><br /><pre><br />export GRAILS_HOME=~/Tools/grails-1.2.2<br />export PATH=$GRAILS_HOME/bin:$PATH<br /></pre><br /><br />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.<br /><br />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.<br /><br />Moving the symlink is easy enough but I simplify it further by defining aliases in my ~/.profile. Those look something like this...<br /><br /><pre><br />alias gr105='rm ~/Tools/grails && ln -s ~/Tools/grails-1.0.5 ~/Tools/grails'<br />alias gr111='rm ~/Tools/grails && ln -s ~/Tools/grails-1.1.1 ~/Tools/grails'<br />alias gr112='rm ~/Tools/grails && ln -s ~/Tools/grails-1.1.2 ~/Tools/grails'<br />alias gr12='rm ~/Tools/grails && ln -s ~/Tools/grails-1.2.0 ~/Tools/grails'<br />alias gr121='rm ~/Tools/grails && ln -s ~/Tools/grails-1.2.1 ~/Tools/grails'<br />alias gr122='rm ~/Tools/grails && ln -s ~/Tools/grails-1.2.2 ~/Tools/grails'<br />alias gr130rc1='rm ~/Tools/grails && ln -s ~/Tools/grails-1.3.0.RC1 ~/Tools/grails'<br />alias gr130rc2='rm ~/Tools/grails && ln -s ~/Tools/grails-1.3.0.RC2 ~/Tools/grails'<br /># use my local development copy of Grails<br />alias grdev='rm ~/Tools/grails && ln -s /Users/jeff/Projects/grails/core ~/Tools/grails'<br /></pre><br /><br />Now if I want to use Grails 1.2.2 I just open a shell and type "gr122".<br /><br />I use the exact same approach for other tools that I may want to easily move from version to version.<br /><br />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.<br /><br />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.<br /><br />Enjoy!Jeff Brownhttp://www.blogger.com/profile/13650645104670573315noreply@blogger.com22tag:blogger.com,1999:blog-7833979.post-82832351634238827162009-07-30T16:26:00.008-05:002009-07-30T17:21:42.769-05:00Grails, SpringSource And ClojureI recently developed a <a href="http://grails.org">Grails</a> plugin which provides support for easily accessing <a href="http://clojure.org/">Clojure</a> code in a Grails app. The details of how the plugin works are covered at <a href="http://grails.org/plugin/clojure">http://grails.org/plugin/clojure</a>. That page includes a link to a brief video demonstration which is available at <a href="http://s3.amazonaws.com/jeffscreencasts/grails_clojure_demo.mov">http://s3.amazonaws.com/jeffscreencasts/grails_clojure_demo.mov</a>. Check it out. <br /><br />Shortly after publishing the plugin I posted <a href="http://twitter.com/jeffscottbrown/status/2716646376">something about it</a> on Twitter. Not too long after that a couple of other <a href="http://www.springsource.com">SpringSource</a> folks tweeted about Clojure (<a href="http://twitter.com/adriancolyer/statuses/2735215584">here</a> and <a href="http://twitter.com/graemerocher/statuses/2735112222">here</a>). 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. <br /><br />Clojure is a really interesting language. There are <a href="http://www.scala-lang.org/">others</a>. 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...<br /><br />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.<br /><br />The simplest solution is probably not very interesting. Prefer a solution that shows off something interesting in your language of choice.<br /><br />Hmmm... are you more likely to need to refer to <a href="http://www.pragprog.com/titles/shcloj/programming-clojure">the Clojure book</a>, or the high school math book? ;)<br /><br />Now, you have one more reason to tinker with a new language.<br /><br />Enjoy.Jeff Brownhttp://www.blogger.com/profile/13650645104670573315noreply@blogger.com24tag:blogger.com,1999:blog-7833979.post-57784793043133278902009-01-29T19:26:00.002-06:002009-01-29T19:45:44.222-06:00Grails 1.1 beta3 Is Out!We are closing in on the much anticipated release of Grails 1.1. Today beta 3 was released. See <a href="http://www.grails.org/1.1-beta3+Release+Notes">the release notes</a>.<br /><br />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 <a href="http://grails.org/doc/1.1-beta3/">The User Guide</a> 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. <br /><br />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...<br /><br /><pre><br />grails.validateable.classes = [ com.mycompany.dto.SomeClass, com.mycompany.SomeOtherClass]<br /></pre><br /><br />An annotated class might look something like this...<br /><br /><pre><br />// src/groovy/com/companyname/SomeClass.groovy<br />package com.companyname<br /><br />import org.codehaus.groovy.grails.validation.Validateable<br /><br />@Validateable<br />class SomeClass {<br /> Integer age<br /> String name<br /><br /> static constraints = {<br /> age range: 16..66<br /> name blank: false, size: 5..35<br /> }<br />}<br /></pre><br /><br />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...<br /><br /><pre><br />grails.validateable.packages = ['com.companyname.dto', 'com.companyname.someotherpackage']<br /></pre><br /><br />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.<br /><br />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 <a href="http://grails.org/Mailing+lists">mailing list</a> or file a <a href="http://jira.codehaus.org/browse/GRAILS">JIRA</a> issue.<br /><br />Enjoy!Jeff Brownhttp://www.blogger.com/profile/13650645104670573315noreply@blogger.com13tag:blogger.com,1999:blog-7833979.post-56488586792339630982008-11-13T21:39:00.006-06:002008-12-15T14:17:29.786-06:00Getting Groovy With "with"<span style="font-weight:bold;">UPDATE 12/15/2008</span>: <span style="font-style:italic;">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.</span><br /><br />Strange enough title.<br /><br />Let's start with a hypothetical conversation between a geeky developer and his much less geeky wife:<br /><br /><pre><br />Jeff: Betsy, how are you?<br /><br />Betsy: I am fine thanks. How are you?<br /><br />Jeff: Betsy, I am fine thank you.<br /><br />Betsy: Great.<br /><br />Jeff: Betsy, you know my birthday is the day after tomorrow right?<br /><br />Betsy: Yes, I haven't forgotten. You mention it about 9 times a day you know.<br /><br />Jeff: Betsy, yes I know. Are we going to have an ice cream cake?<br /><br />Betsy: Yes, I think that would be good.<br /><br />Jeff: Betsy, are you going to buy me the new Opeth DVD?<br /><br />Betsy: I will get it for you but that music sucks big time.<br /><br />Jeff: Betsy, that is awesome. Thank you.<br /><br />Betsy: Why do you keep saying "Betsy" at the beginning of every sentence?<br /><br />Jeff: Betsy, I guess I am used to inflexible languages which aren't very expressive.<br /></pre><br /><br />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.<br /><br />Again, what does any of that have to do with Groovy? Lets press on...<br /><br />Consider the following Java code which prints out a specific date.<br /><br /><pre><br />// PrintIndependenceDay.java<br /><br />import java.util.Calendar;<br />import java.util.Date;<br /><br />public class PrintIndependenceDay {<br /><br /> public static void main(String[] args) {<br /> Calendar calendar = Calendar.getInstance();<br /> calendar.clear();<br /> calendar.set(Calendar.MONTH, Calendar.JULY);<br /> calendar.set(Calendar.DATE, 4);<br /> calendar.set(Calendar.YEAR, 1776);<br /> Date time = calendar.getTime();<br /> System.out.println(time);<br /> }<br />}<br /></pre><br /><br />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. <br /><br />On to Groovy...<br /><br />The following Groovy code does the same thing that the Java code above does.<br /><br /><pre><br />// PrintIndependenceDay.groovy<br /><br />def calendar = Calendar.instance<br />calendar.with {<br /> clear()<br /> set MONTH, JULY<br /> set DATE, 4<br /> set YEAR, 1776<br /> println time<br />}<br /></pre><br /><br />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.<br /><br />That is pretty slick. Lets dig just a little deeper to get a little better understanding of what is really going on.<br /><br />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:<br /><br /><pre><br />// define a closure<br />def myClosure = {<br /> // call a method that does not exist<br /> append 'Jeff'<br /> append ' was here.'<br />}<br /><br />// assign a delegate to the closure<br />def sb = new StringBuffer()<br />myClosure.delegate = sb<br /><br />// execute the closure<br />myClosure()<br /><br />assert 'Jeff was here.' == sb.toString()<br /></pre><br /><br />When the closure is executed, those calls to append() in the closure end up being sent to the delegate, the StringBuffer in this case.<br /><br />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...<br /><br /><pre><br />def closure = {<br /> clear()<br /> set MONTH, JULY<br /> set DATE, 4<br /> set YEAR, 1776<br /> println time<br />}<br />def calendar = Calendar.instance<br />closure.delegate = calendar<br />closure()<br /></pre><br /><br />This code does the same thing as the first Groovy example. Obviously the first one is cleaner.<br /><br />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.<br /><br />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...<br /><br /><pre><br />class ResolutionTest {<br /> <br /> def append(arg) {<br /> println "you called the append method and passed ${arg}"<br /> }<br /> <br /> def doIt() {<br /> def closure = {<br /> append 'Jeff was here.'<br /> }<br /> <br /> def buffer = new StringBuffer()<br /> <br /> closure.delegate = buffer<br /> <br /> // the append method in this ResolutionTest<br /> // will be called because resolveStrategy is<br /> // OWNER_FIRST (the default)<br /> closure()<br /> <br /> // give the delegate first crack at method<br /> // calls made inside the closure<br /> closure.resolveStrategy = Closure.DELEGATE_FIRST<br /> <br /> // the append method on buffer will<br /> // be called because the delegate gets<br /> // first crack at the call to append()<br /> closure()<br /> }<br /> <br /> static void main(String[] a) {<br /> new ResolutionTest().doIt()<br /> }<br />}<br /></pre><br /><br />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.<br /><br />Enjoy! :)Jeff Brownhttp://www.blogger.com/profile/13650645104670573315noreply@blogger.com116tag:blogger.com,1999:blog-7833979.post-24466039449577877952008-08-04T11:39:00.001-05:002008-08-04T11:40:27.675-05:00Grails Training In ChicagoWe 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.<br /><br />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.<br /><br />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.<br /><br />For a full course outline and more information, please visit <a href="http://g2one.com/training/">http://g2one.com/training/</a>. Any questions may be directed to training@g2one.com.Jeff Brownhttp://www.blogger.com/profile/13650645104670573315noreply@blogger.com9tag:blogger.com,1999:blog-7833979.post-63912417322933344862008-07-30T09:56:00.002-05:002008-07-30T10:00:04.702-05:00G2One QuickCast Site Launched!<a href="http://www.g2one.com">G2One</a> have launched the <a href="http://www.g2one.com/quickcasts/">G2One QuickCast site</a>. A G2One QuickCast is fast and furious little movie demonstrating something interesting about the Groovy language and/or the Grails framework. <br /><br />The <a href="http://g2one.com/quickcasts/grails-git.html">first movie available</a> 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. :)<br /><br />Enjoy!Jeff Brownhttp://www.blogger.com/profile/13650645104670573315noreply@blogger.com13tag:blogger.com,1999:blog-7833979.post-26759503506674891932008-07-14T08:04:00.002-05:002008-07-14T08:22:49.591-05:00G2One Groovy Grails Training In North America<a href="http://www.g2one.com/">G2One</a> have announced our <a href="http://groovy.codehaus.org">Groovy</a>/<a href="http://grails.org">Grails</a> North American public training schedule for the rest of the year. The schedule is available at <a href="http://www.g2one.com/training/">http://www.g2one.com/training/</a>.<br /><br />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.Jeff Brownhttp://www.blogger.com/profile/13650645104670573315noreply@blogger.com4tag:blogger.com,1999:blog-7833979.post-92020531213200771212008-06-19T21:32:00.006-05:002008-12-11T04:28:25.231-06:00Grails Plugin For HudsonI am pleased to announce that we have worked up a <a href="http://grails.org">Grails</a> plugin for <a href="https://hudson.dev.java.net/">Hudson</a>. Hudson is a really slick continuous integration server. Check out <a href="http://hudson.dev.java.net">their site</a> for more info on the engine itself.<br /><br />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.<br /><br />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:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwUoWBJartiFKwHZPEAqkjoy_bPz9-XKJZieHv3e3UbDVra0VHqZEO5NMhquLFC3f5T6kRakMU_8KlMWlL2MZlUpbNo1qf7Ihoe-AIrxANa5lTdnFCWq_ToQX391pUEm4Je1SdrQ/s1600-h/hudsonSystemConfig.png"><img style="cursor:pointer; cursor:hand;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwUoWBJartiFKwHZPEAqkjoy_bPz9-XKJZieHv3e3UbDVra0VHqZEO5NMhquLFC3f5T6kRakMU_8KlMWlL2MZlUpbNo1qf7Ihoe-AIrxANa5lTdnFCWq_ToQX391pUEm4Je1SdrQ/s400/hudsonSystemConfig.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5213789157066506402" /></a><br /><br />Notice that there is built in validation to make sure you have entered a valid path to your Grails installation.<br /><br />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:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEham5n7FvTtzofZtagvhmQ8RdwAw2l3mcFf_OnHmdyWSCpFJxqxcKQljGq3np57vR9DKCIl59GQIIe1WrsvM07WiM2_xpLLQixgrbMTekqj4Ah31pYQdsdXopKAObr0Ngg2lHWUIQ/s1600-h/hudsonProjectConfig.png"><img style="cursor:pointer; cursor:hand;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEham5n7FvTtzofZtagvhmQ8RdwAw2l3mcFf_OnHmdyWSCpFJxqxcKQljGq3np57vR9DKCIl59GQIIe1WrsvM07WiM2_xpLLQixgrbMTekqj4Ah31pYQdsdXopKAObr0Ngg2lHWUIQ/s400/hudsonProjectConfig.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5213789069436271474" /></a><br /><br />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.Jeff Brownhttp://www.blogger.com/profile/13650645104670573315noreply@blogger.com10tag:blogger.com,1999:blog-7833979.post-54063314026029618082008-06-07T10:01:00.002-05:002008-06-07T10:10:17.145-05:00St. Louis Dynamic Language Interest GroupI have created the <a href="http://www.linkedin.com/e/gis/117406/4FF0B85F5118">St. Louis Dynamic Language Interest Group</a> at <a href="http://www.linkedin.com">LinkedIn</a>. 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 <a href="http://www.linkedin.com/e/gis/117406/4FF0B85F5118">LinkedIn</a> and join us.<br /><br />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.<br /><br />If you have any questions about the group in the meantime, please don't hesitate to let me know.<br /><br />Jeff Brown<br />Director - North American Operations<br /><a href="http://www.g2one.com/">http://www.g2one.com/</a>Jeff Brownhttp://www.blogger.com/profile/13650645104670573315noreply@blogger.com0tag:blogger.com,1999:blog-7833979.post-25477518425014848372008-06-04T13:34:00.002-05:002008-06-04T14:00:38.553-05:00New Grails Mail PluginThe new <a href="http://grails.org">Grails</a> 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 <a href="http://grails.org/Mail+Plugin">http://grails.org/Mail+Plugin</a> 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...<br /><br /><pre><br />sendMail { <br /> to 'fred@g2one.com'<br /> subject 'Hello Fred' <br /> body 'How are you?' <br />}<br /></pre><br /><br />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 <a href="http://groovy.codehaus.org/">Groovy</a>. More and more folks are taking advantage of the <a href="http://grails.org/plugins/">Grails Plugin System</a> to easily add capabilities like this to their web apps.<br /><br />Enjoy!Jeff Brownhttp://www.blogger.com/profile/13650645104670573315noreply@blogger.com3tag:blogger.com,1999:blog-7833979.post-85088761073792520402008-05-21T14:26:00.002-05:002008-05-21T14:30:31.386-05:00Groovy Grails Training From G2One and Callista Enterprise<a href="http://www.g2one.com">G2One, Inc.</a> and <a href="http://www.callistaenterprise.se/">Callista Enterprise AB</a> have announced a partnership to support Advanced <a href="http://groovy.codehaus.org">Groovy</a> and <a href="http://grails.org">Grails</a> training in Scandinavia.<br /><br />Göteborg 2008-09-08<br />Stockholm 2008-09-15<br />Malmö 2008-09-22<br /><br />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 <a href="http://www.callistaenterprise.se/download/18.146c1a30118e9c69ac680005494/GroovyGrails.pdf">here</a>. <br /><br />As with all G2One training events, students will receive a free 12 month license for <a href="http://www.jetbrains.com/idea">IntelliJ IDEA</a>. IDEA's <a href="http://www.jetbrains.com/idea/features/groovy_grails.html">JetGroovy</a> brings fantastic support for both Groovy and Grails to the IDE. <br /><br />Please contact us at training at g2one dot com with any training related inquiries.<br /><br />North American dates coming soon...Jeff Brownhttp://www.blogger.com/profile/13650645104670573315noreply@blogger.com0tag:blogger.com,1999:blog-7833979.post-5238969181800653832008-04-30T20:20:00.002-05:002008-04-30T20:35:24.277-05:00Pre JavaOne Groovy/Grails Meetup Next MondayWe have been busy preparing for <a href="http://java.sun.com/javaone/sf/">JavaOne</a> and it is finally almost here. Yay!<br /><br />We hope to see you at the <a href="http://www.g2one.com/meetup/">G2One / NFJS Meetup</a> Monday night. Click the link for all of the details and be sure to click the "<a href="http://g2one.com/meetup/registration/register">register</a>" link. Registration is free and the event promises to be a load of fun. Come hear the latest <a href="http://groovy.codehaus.org/">Groovy</a> and <a href="http://grails.org/">Grails</a> news from <a href="http://www.g2one.com/">G2One</a>, the latest word from the respected <a href="http://www.nofluffjuststuff.com/">NFJS tour</a> and finally a great expert panel discussion. Author signed copies of Scott Davis' <a href="http://pragprog.com/titles/sdgrvr/groovy-recipes">Groovy Recipes</a> book and Venkat Subramaniam's <a href="http://pragprog.com/titles/vslg/programming-groovy">Programming Groovy</a> book will be raffled off.<br /><br />Don't miss it.<br /><br />Between now and then, I hope to see some of you in <a href="http://www.nofluffjuststuff.com/conference/denver/2008/05/index.html">Denver</a> this weekend. :)Jeff Brownhttp://www.blogger.com/profile/13650645104670573315noreply@blogger.com1tag:blogger.com,1999:blog-7833979.post-33580921822729514102008-02-18T09:45:00.002-06:002008-02-18T09:53:02.122-06:00Another Big Week For Groovy And GrailsThis is definitely going to be another big week for Groovy and Grails. The <a href="http://docs.codehaus.org/display/GRAILS/2008/02/18/Grails+1.0.1+Released?nocache">Grails 1.0.1</a> 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!<br /><br />This Wednesday I am heading to the great New York City to speak at <a href="http://www.javasig.com/">their JUG</a> 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 <a href="http://groovygrails.com/gg/2gexperience">The Groovy Grails Experience</a> 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!Jeff Brownhttp://www.blogger.com/profile/13650645104670573315noreply@blogger.com0tag:blogger.com,1999:blog-7833979.post-57730247460163392192008-02-09T14:54:00.001-06:002008-02-09T15:01:11.151-06:00Jeff Brown Interview At Groovy ZoneI had the great pleasure of doing an interview recently with <a href="http://groovy.dzone.com/users/sdevijver">Steven Devijver</a> for <a href="http://groovy.dzone.com/">The Groovy Zone</a>. Today, that interview was published. Check it out at <a href="http://groovy.dzone.com/news/jeff-brown-grails-10-and-beyon">http://groovy.dzone.com/news/jeff-brown-grails-10-and-beyon</a>. In the interview we discussed the <a href="http://grails.org/">Grails 1.0 release</a>, the great plugin story that Grails has to offer, the upcoming<a href="http://groovygrails.com/gg/2gexperience"> Groovy Grails Experience</a> and more. I want to thank Steven for the opportunity.Jeff Brownhttp://www.blogger.com/profile/13650645104670573315noreply@blogger.com2tag:blogger.com,1999:blog-7833979.post-60275930664035251752008-02-07T11:05:00.001-06:002008-02-07T11:42:38.703-06:00The Groovy And Grails Communities Continue To BuzzA lot of things are going on right now in the <a href="http://groovy.codehaus.org">Groovy</a> and <a href="http://grails.org">Grails</a> 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 <a href="http://g2one.com/">G2One</a> and that is really keeping me busy. <br /><br />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!<br /><br />Later this month I am going to have the pleasure of speaking at <a href="http://www.javasig.com/">The New York Java SIG</a> 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.<br /><br />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 <a href="http://groovygrails.com/gg/2gexperience">The Groovy Grails Experience</a> 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 <a href="http://www.nofluffjuststuff.com/">No Fluff Just Stuff</a> 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.Jeff Brownhttp://www.blogger.com/profile/13650645104670573315noreply@blogger.com1tag:blogger.com,1999:blog-7833979.post-31593926632733895772007-12-12T19:35:00.000-06:002007-12-12T19:48:43.912-06:00The Groovy Grails ExperienceThe first major <a href="http://groovy.codehaus.org">Groovy</a> / <a href="http://grails.org">Grails</a> conference in North America is just around the corner. <a href="http://groovygrails.com/gg/2gexperience">The Groovy Grails Experience</a> 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.<br /><br />Check out <a href="http://www.groovygrails.com/gg/conference/speakers?showId=131">the speaker list</a>. 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.<br /><br />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.<br /><br />Good times continue!Jeff Brownhttp://www.blogger.com/profile/13650645104670573315noreply@blogger.com3tag:blogger.com,1999:blog-7833979.post-19574971799737063102007-10-16T08:49:00.000-05:002007-10-16T08:53:14.589-05:00Grails 1.0 RC1 Has Been Released<a href="http://grails.org">Grails</a> 1.0 RC1 has been released! See the <a href="http://docs.codehaus.org/display/GRAILS/1.0-RC1+Release+Notes">release notes</a> for details about many of the new features.<br /><br />This is fantastic news for the Groovy and Grails community.<br /><br />In a few hours I am getting on a plane to London to speak at <a href="http://grails-exchange.com/">The Grails eXchange</a>. I am really looking forward to finally meeting in person some of the folks I have been working with for so long now.Jeff Brownhttp://www.blogger.com/profile/13650645104670573315noreply@blogger.com2tag:blogger.com,1999:blog-7833979.post-47085709657929055782007-09-09T16:06:00.000-05:002007-09-09T16:14:20.164-05:00Maverick On RailsMark Cuban <a href="http://www.blogmaverick.com/2007/08/27/the-internet-is-still-dead-and-boring/">says</a>...<br /><br />"I'm such an exciting guy, I downloaded Ruby on Rails and read the documentation as well. That's what Saturday Nights are for."<br /><br />Maybe Mark will come out to the upcoming <a href="http://www.nofluffjuststuff.com/">NFJS</a> show in <a href="http://www.nofluffjuststuff.com/conference/dallas/2007/10/index.html">Dallas</a> and learn about <a href="http://grails.org">Grails</a>. :)Jeff Brownhttp://www.blogger.com/profile/13650645104670573315noreply@blogger.com0tag:blogger.com,1999:blog-7833979.post-57480706194020143232007-08-07T21:15:00.000-05:002007-08-07T23:16:44.580-05:00Interesting Groovy Loops DetailWhile fixing a bug in <a href="http://grails.org">Grails</a> 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.<br /><br />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...<br /><br /><pre><br />someCollection.each { someElement -><br /> // do something with someElement<br />}<br /></pre><br /><br />That code had been changed to look something like this...<br /><br /><pre><br />for(someElement in someCollection) {<br /> // do something with someElement<br />}<br /></pre><br /><br />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...<br /><br /><pre><br />def listOfClosures = []<br />def numbers = [1, 2, 3]<br />numbers.each { number -><br /> listOfClosures[number] = { println "number is $number" }<br />}<br />listOfClosures[1]()<br />listOfClosures[2]()<br />listOfClosures[3]()<br /></pre><br /><br />As you might guess, the output from that looks like this...<br /><br /><pre><br />number is 1<br />number is 2<br />number is 3<br /></pre><br /><br />Now consider this...<br /><br /><pre><br />def listOfClosures = []<br />def numbers = [1, 2, 3]<br />for (number in numbers) {<br /> listOfClosures[number] = { println "number is $number" }<br />}<br />listOfClosures[1]()<br />listOfClosures[2]()<br />listOfClosures[3]()<br /></pre><br /><br />The output from that looks like this...<br /><br /><pre><br />number is 3<br />number is 3<br />number is 3<br /></pre><br /><br />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.<br /><br />Thanks to <a href="http://headius.blogspot.com/">Charles Nutter</a> and <a href="http://graemerocher.blogspot.com/">Graeme Rocher</a> for helping with that.Jeff Brownhttp://www.blogger.com/profile/13650645104670573315noreply@blogger.com3tag:blogger.com,1999:blog-7833979.post-79454596690096654162007-07-20T17:55:00.000-05:002007-07-20T18:37:33.388-05:00My Apologies To The New York City SIGThis past Wednesday night <a href="http://www.nofluffjuststuff.com/speaker_view.jsp?speakerId=32">Andy Glover</a> and I were scheduled to co-present at <a href="http://www.nyjavasig.com/">The New York Java Special Interest Group</a>. Andy was going to give a 90 minute session on <a href="http://groovy.codehaus.org/">Groovy</a> and I was going to give a 90 minute session on <a href="http://grails.org/">Grails</a>. <br /><br />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.<br /><br />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 <a href="http://www.nofluffjuststuff.com/show_view.jsp?showId=90">NFJS show in Princeton New Jersey</a> the weekend of August 10th. I will not be there myself but my friends <a href="http://www.nofluffjuststuff.com/speaker_view.jsp?speakerId=4738">Jason Rudolph</a>, <a href="http://www.nofluffjuststuff.com/speaker_view.jsp?speakerId=18">Scott Davis</a> and <a href="http://www.nofluffjuststuff.com/speaker_view.jsp?speakerId=11">Venkat Subramanium</a> will all be there with Groovy and Grails sessions.<br /><br />Again, I offer my apologies to everyone who came out to the show Wednesday evening and I hope that you will invite us again.Jeff Brownhttp://www.blogger.com/profile/13650645104670573315noreply@blogger.com0tag:blogger.com,1999:blog-7833979.post-50691965079169656002007-05-19T22:53:00.000-05:002007-05-19T22:57:00.270-05:00Alternate Syntax For URL Mapping In GrailsOne of the cool new features that was introduced with <a href="http://grails.org">Grails</a> 0.5 is <a href="http://grails.org/URL+mapping">Custom URL Mapping</a>. The syntax for declaring the mapping looks something like this...<br /><br /><pre><br />class MyUrlMappings {<br /> static mappings = {<br /> "/product/$id" {<br /> controller = "product"<br /> action = "show"<br /> }<br /><br /> "/$blog/$year/$month/$id" {<br /> controller = "blog"<br /> action = "show"<br /> constraints {<br /> year(matches:/\d{4}/)<br /> month(matches:/\d{2}/)<br /> }<br /> }<br /> }<br />}<br /></pre><br />Since the release we have added support for an alternate syntax (which I happen to like) that looks like this...<br /><pre><br />class MyUrlMappings {<br /> static mappings = {<br /> "/product/$id" (controller:"product", action:"show")<br /><br /> "/$blog/$year/$month/$id" (controller:"blog", action:"show"){<br /> constraints {<br /> year(matches:/\d{4}/)<br /> month(matches:/\d{2}/)<br /> }<br /> }<br /> }<br />}<br /></pre><br />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. :)Jeff Brownhttp://www.blogger.com/profile/13650645104670573315noreply@blogger.com1tag:blogger.com,1999:blog-7833979.post-67047522859400784162007-05-19T22:40:00.000-05:002007-05-19T22:51:39.924-05:00Autism Visibility Continues To Increase<a href="http://www.doverspeedway.com/">Dover Speedway</a> has announced that the <a href="http://www.nascar.com/series/cup/">NEXTEL Cup</a> race coming up there in June will be named “<a href="http://tinyurl.com/yvts4v">The Autism Speaks 400 presented by Visa</a>”. NEXTEL Cup racing is huge here in North America and has a very large fan base. <a href="http://www.autismspeaks.org/">Autism Speaks</a> 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.<br /><br />This is not the first time that autism and automobile racing have crossed paths. <a href="http://www.jamiemcmurray.com/">Jamie McMurray</a> has an autistic niece and partnered with <a href="http://www.autism-society.org/">The Autism Society of American</a> in 2004 when he drove the “Drive For A Cure” car. <a href="http://en.wikipedia.org/wiki/Tony_Renna">Tony Renna</a> drove the “<a href="http://www.cureautismnow.org/">Cure Autism Now</a>” car in 2003. There have been others.<br /><br />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.Jeff Brownhttp://www.blogger.com/profile/13650645104670573315noreply@blogger.com1tag:blogger.com,1999:blog-7833979.post-48659329070152985072007-05-01T19:30:00.000-05:002007-05-01T20:23:22.544-05:00Cool New Features In Grails 0.5<a href="http://grails.org">Grails</a> 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 <a href="http://grails.org/Command+objects+and+Form+Validation">Command Objects</a>, <a href="http://grails.org/GORM+-+Collection+Types#GORM-CollectionTypes-Listsofobjects%28Since0.5%29">List and Map Support in GORM</a> and <a href="http://grails.org/URL+mapping">Custom URL Mappings</a>. 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 <a href="http://grails.org/0.5+Release+Notes">release notes</a> for a more complete list of new features.<br /><br />With the recent release of the <a href="http://docs.codehaus.org/display/GROOVY/2007/04/30/Groovy+1.1-beta-1+with+annotation+support">first beta of Groovy 1.1</a>, things continue to heat up in the Groovy and Grails communities. <br /><br />This year I have been speaking at Java User Groups, internal training events and on the <a href="http://www.nofluffjuststuff.com/">No Fluff Just Stuff Tour</a> 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 <a href="http://en.wikipedia.org/wiki/Domain-specific_programming_language">DSL</a> using <a href="http://www.antlr.org/">Antlr</a> 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.<br /><br />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!<br /><br />More to come... :)Jeff Brownhttp://www.blogger.com/profile/13650645104670573315noreply@blogger.com0tag:blogger.com,1999:blog-7833979.post-1175877958348240172007-04-06T11:33:00.000-05:002007-04-06T11:45:58.360-05:00I Have Been Tagged (Twice)I have been tagged twice recently. First by <a href="http://jasonrudolph.com/blog/2007/03/05/tag-here-goes/">Jason</a> and now by <a href="http://blog.james-carr.org/?p=62">James</a>. I suppose I need to be a good citizen and play along. :)<br /><br />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. :)<br /><br />I am a member of <a href="http://usgo.org/">The American Go Association</a>. 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.<br /><br />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 <a href="http://autismspeaks.org/">Autism Speaks</a>). 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.<br /><br />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.<br /><br />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.<br /><br />There was a time long ago when <a href="http://www.jeffandbetsy.net/jeff/wanted/">I really, really, really needed a haircut</a>. Why didn't anyone approach me and say something like “friends don't let friends have mullets”?<br /><br />Now I am going to throw to <a href="http://blahblahblah.info/">Dean</a>, <a href="http://europetravelogue.com/blog/index.php">Lance</a>, <a href="http://walkingthefringe.blogspot.com/index.html">Brian</a>, <a href="http://stuffthathappens.com/blog/">Eric</a> and <a href="http://nateisright.blogspot.com/index.html">Nate</a>.Jeff Brownhttp://www.blogger.com/profile/13650645104670573315noreply@blogger.com3