<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" gd:etag="W/&quot;CEEGQXYyeCp7ImA9WhRRFEk.&quot;"><id>tag:blogger.com,1999:blog-5035358000171545600</id><updated>2011-11-27T17:10:20.890-08:00</updated><category term="Google Groups" /><category term="continuous integration" /><category term="MVC" /><category term="Intellij IDEA" /><category term="Hibernate" /><category term="AJAX" /><category term="Google calendar" /><category term="Windows" /><category term="Developer workflow" /><category term="Oracle" /><category term="IDE" /><category term="JavaOne" /><category term="gug" /><category term="Test" /><category term="CMDB" /><category term="blob" /><category term="user group" /><category term="IDEA 8" /><category term="Jetty" /><category term="ORM" /><category term="Solaris" /><category term="Web Application" /><category term="Grails" /><category term="Model View Controller" /><category term="OO Programming" /><category term="Spring" /><category term="groovy user's group" /><category term="Android" /><category term="Design Patterns" /><category term="Griffon" /><category term="Struts" /><category term="Servlet Container" /><category term="Object Relational Mapping" /><category term="java" /><category term="jug" /><category term="Javascript" /><category term="programming" /><category term="Sacramento" /><category term="Gmail" /><category term="sacgru" /><category term="hudson" /><category term="configuration management" /><category term="Google" /><category term="Groovy" /><category term="JavaFX" /><category term="Netbeans" /><category term="ATT" /><category term="iPhone" /><category term="CDR" /><category term="G1" /><category term="Maven" /><category term="Controller" /><category term="Eclipse" /><category term="HTML" /><category term="Relational Model" /><category term="Jetbrains" /><category term="DHTML" /><category term="command line" /><category term="california" /><category term="J2EE" /><category term="CommunityOne" /><category term="T-Mobile" /><category term="Object Oriented" /><title>The Capital Code Monkey</title><subtitle type="html">Trivializing the momentous and complicating the obvious...</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://capitalcodemonkey.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://capitalcodemonkey.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>iamsteveholmes</name><uri>http://www.blogger.com/profile/00043395071742403238</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_4bzFoZkOdKE/SRd4tFCTwfI/AAAAAAAAAG0/wlkbAwJOEx0/S220/Steve_SouthPark.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>26</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/TheCapitalCodeMonkey" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="thecapitalcodemonkey" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;D04CR306fyp7ImA9WxBUF08.&quot;"><id>tag:blogger.com,1999:blog-5035358000171545600.post-6331963548175618070</id><published>2010-03-04T09:42:00.000-08:00</published><updated>2010-03-04T10:06:06.317-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-04T10:06:06.317-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="jug" /><category scheme="http://www.blogger.com/atom/ns#" term="Griffon" /><category scheme="http://www.blogger.com/atom/ns#" term="gug" /><category scheme="http://www.blogger.com/atom/ns#" term="Groovy" /><category scheme="http://www.blogger.com/atom/ns#" term="user group" /><category scheme="http://www.blogger.com/atom/ns#" term="Sacramento" /><category scheme="http://www.blogger.com/atom/ns#" term="sacgru" /><title>Andres Almiray presents "Flying with Griffon" at SacGRU tonight</title><content type="html">Andres Almiray will be doing a presentation tonight on Griffon at the local SacGRU (Sacramento Groovy User's) meeting.  Please attend if you would like to learn Java Desktop Development "for Mere Mortals".  Meeting details and the presentation blurb are below:&lt;br /&gt;&lt;br /&gt;Thursday March 4 at 6:30.&lt;br /&gt;&lt;br /&gt;Quilogy &lt;br /&gt;2880 Gateway Oaks Drive, Suite 350 &lt;br /&gt;Sacramento, CA 95833&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Flying with Griffon &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Building a desktop application is a hard task, there are some many things to keep track of that many projects simply fail to meet their goals. Setting up the project structure keeping each artifact on a well identified location given its responsibility and type, defining the base schema for managing the application's life cycle, making sure the build is properly setup, and more. These are recurring tasks that should be handled by a tool or better yet, a framework. Griffon is such a framework. Inspired by the Grails framework Griffon aims to bring the same productivity gains to desktop development&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5035358000171545600-6331963548175618070?l=capitalcodemonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/6lQstQpg-_D-V-MKxeA8iZ5PX1o/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6lQstQpg-_D-V-MKxeA8iZ5PX1o/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/6lQstQpg-_D-V-MKxeA8iZ5PX1o/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6lQstQpg-_D-V-MKxeA8iZ5PX1o/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://capitalcodemonkey.blogspot.com/feeds/6331963548175618070/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5035358000171545600&amp;postID=6331963548175618070" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/6331963548175618070?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/6331963548175618070?v=2" /><link rel="alternate" type="text/html" href="http://capitalcodemonkey.blogspot.com/2010/03/andres-almiray-presents-flying-with.html" title="Andres Almiray presents &quot;Flying with Griffon&quot; at SacGRU tonight" /><author><name>iamsteveholmes</name><uri>http://www.blogger.com/profile/00043395071742403238</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_4bzFoZkOdKE/SRd4tFCTwfI/AAAAAAAAAG0/wlkbAwJOEx0/S220/Steve_SouthPark.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CUINQX45fSp7ImA9WxBQE0g.&quot;"><id>tag:blogger.com,1999:blog-5035358000171545600.post-7166162247521022237</id><published>2010-01-12T19:31:00.001-08:00</published><updated>2010-01-12T19:33:10.025-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-12T19:33:10.025-08:00</app:edited><title>Intellij 9 EAP fix a number of Groovy and Grails issues....</title><content type="html">In case anyone has been using Intellij Idea 9 and been having issues with Groovy/Grails (for instance importing an existing project) I noticed that the latest 9 EAP (93.67) has a number of fixes.  I haven't tested for myself yet whether or not It has fixed my particular issues but it's worth a try...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5035358000171545600-7166162247521022237?l=capitalcodemonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/6cojQLTU__zww5JOCjDuJ_4dgA4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6cojQLTU__zww5JOCjDuJ_4dgA4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/6cojQLTU__zww5JOCjDuJ_4dgA4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6cojQLTU__zww5JOCjDuJ_4dgA4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://capitalcodemonkey.blogspot.com/feeds/7166162247521022237/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5035358000171545600&amp;postID=7166162247521022237" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/7166162247521022237?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/7166162247521022237?v=2" /><link rel="alternate" type="text/html" href="http://capitalcodemonkey.blogspot.com/2010/01/intellij-9-eap-fix-number-of-groovy-and.html" title="Intellij 9 EAP fix a number of Groovy and Grails issues...." /><author><name>iamsteveholmes</name><uri>http://www.blogger.com/profile/00043395071742403238</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_4bzFoZkOdKE/SRd4tFCTwfI/AAAAAAAAAG0/wlkbAwJOEx0/S220/Steve_SouthPark.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;C0QMQnw8eyp7ImA9WxNaEUU.&quot;"><id>tag:blogger.com,1999:blog-5035358000171545600.post-6398975922420299192</id><published>2009-11-25T08:09:00.000-08:00</published><updated>2009-11-25T12:36:23.273-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-25T12:36:23.273-08:00</app:edited><title>Strong Groovy</title><content type="html">Usually Groovy is thought of as a loose, dynamically typed language that is otherwise similar to Java.  Given this, it would make sense to write in Groovy when dynamism is needed an write in Java when you need strong typing, etc. to avoid side effects.  But a great differentiator for groovy over any other dynamic language running on the JVM is that it also has all of Java's support for Strong typing, Generics, immutable objects and the like.  This allows Groovy a tremendous range using dynamism where it makes sense and locking it down where it makes sense to do that.&lt;br /&gt;&lt;br /&gt;Recently I found myself looking for a solution for Value Lists for using in my HTML Select fields.  Initially I went for quick and dirty and created a utility class (a singleton) with a bunch of "value" lists.  Literally lists of NameValue objects with a corresponding java class like:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public class NameValue {&lt;br /&gt;  private String name;&lt;br /&gt;  private String value;&lt;br /&gt;&lt;br /&gt;  public NameValue(String name, String value) {&lt;br /&gt;      this.setName(name);&lt;br /&gt;      this.setValue(value);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public String toString() {&lt;br /&gt;      return getValue();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public String getName() {&lt;br /&gt;      return name;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void setName(String name) {&lt;br /&gt;      this.name = name;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public String getValue() {&lt;br /&gt;      return value;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void setValue(String value) {&lt;br /&gt;      this.value = value;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I'm not sure why I used Java for this considering it was a grails project, but the class would have read better in groovy:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class NameValue {&lt;br /&gt;String name, value&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public String toString() {&lt;br /&gt;      return this.getValue();&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Then I used my Singleton class to populate the lists as so:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public class ValueLists {&lt;br /&gt;  private static ValueLists ourInstance = new ValueLists();&lt;br /&gt;&lt;br /&gt;  public static ValueLists getInstance() {&lt;br /&gt;      return ourInstance;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private List&lt;namevalue&gt; approvals = new ArrayList&lt;namevalue&gt;();&lt;br /&gt;&lt;br /&gt;  public List&lt;namevalue&gt; getApprovals() {&lt;br /&gt;      return this.approvals;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  approvals.add(new NameValue("1", "Yes"));&lt;br /&gt;  approvals.add(new NameValue("0", "No"));&lt;br /&gt;  approvals.add(new NameValue("2", "Exempt"));&lt;br /&gt;}&lt;br /&gt;&lt;/namevalue&gt;&lt;/namevalue&gt;&lt;/namevalue&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;While we're at it.... why not redo this class in groovy:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class ValueLists {&lt;br /&gt;  private static ValueLists ourInstance = new ValueLists();&lt;br /&gt;&lt;br /&gt;  public static ValueLists getInstance() {&lt;br /&gt;      return ourInstance;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private List&lt;namevalue&gt; approvals = [&lt;br /&gt;      new NameValue(name: "1", value: "Yes"),&lt;br /&gt;      new NameValue(name: "0", value: "No"),&lt;br /&gt;      new NameValue(name: "2", value: "Exempt")  &lt;br /&gt;  ]&lt;br /&gt;}&lt;br /&gt;&lt;/namevalue&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Now I can use my Value Lists in my grails app like so:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;g:select name="approval" from="${ValueLists.instance.approvals}" optionkey="name"/&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Simple enough but it occurs to me that the ValueLists ought to be immutable as the lists should never change.  It would then look like:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;@immutable final class ValueLists {&lt;br /&gt;  private static ValueLists ourInstance = new ValueLists();&lt;br /&gt;&lt;br /&gt;  public static ValueLists getInstance() {&lt;br /&gt;      return ourInstance;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private List&lt;namevalue&gt; approvals = [&lt;br /&gt;      new NameValue(name: "1", value: "Yes"),&lt;br /&gt;      new NameValue(name: "0", value: "No"),&lt;br /&gt;      new NameValue(name: "2", value: "Exempt")  &lt;br /&gt;  ]&lt;br /&gt;}&lt;br /&gt;&lt;/namevalue&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;"approvals" (and any other properties) is now treated as private final with a getter.  So my unwary teammates cannot override it.  In addition, "approvals" is wrapped by an immutable wrapper class so my teammates can't get the list of NameValues and change it.&lt;br /&gt;&lt;br /&gt;Of course if you've been working with Java 1.5 or newer for any significant amount of time it probably would have occurred to you that you could have used java's language support for enums.  Well, no need to drop down to Java for this.  My new Groovy Object is as follows(Approval.groovy):&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;enum Approval{&lt;br /&gt;Yes("1", "Yes"),&lt;br /&gt;No("0", "No"),&lt;br /&gt;Exempt("2", "Exempt")&lt;br /&gt;&lt;br /&gt;final String value&lt;br /&gt;final String key&lt;br /&gt;&lt;br /&gt;Approval(String key, String value) {&lt;br /&gt;  this.value = value&lt;br /&gt;  this.key = key&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;String toString() {&lt;br /&gt;  value&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Now following this pattern I can code up all my grails selects as follows:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;g:select name="approval" from="${Approval}" optionkey="key" optionvalue="value"/&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The point is that Groovy is a Strongly typed language as well as it is a Dynamically typed language.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5035358000171545600-6398975922420299192?l=capitalcodemonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/qjQGPsA1wtXF4LrwUhfgvagwShA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qjQGPsA1wtXF4LrwUhfgvagwShA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/qjQGPsA1wtXF4LrwUhfgvagwShA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qjQGPsA1wtXF4LrwUhfgvagwShA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://capitalcodemonkey.blogspot.com/feeds/6398975922420299192/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5035358000171545600&amp;postID=6398975922420299192" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/6398975922420299192?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/6398975922420299192?v=2" /><link rel="alternate" type="text/html" href="http://capitalcodemonkey.blogspot.com/2009/11/strong-groovy.html" title="Strong Groovy" /><author><name>iamsteveholmes</name><uri>http://www.blogger.com/profile/00043395071742403238</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_4bzFoZkOdKE/SRd4tFCTwfI/AAAAAAAAAG0/wlkbAwJOEx0/S220/Steve_SouthPark.jpg" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;C04AR3kyfyp7ImA9WxNVEUQ.&quot;"><id>tag:blogger.com,1999:blog-5035358000171545600.post-9178249060364883879</id><published>2009-10-21T23:08:00.000-07:00</published><updated>2009-10-21T23:12:26.797-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-21T23:12:26.797-07:00</app:edited><title>SacGRU (Sacramento Groovy Users) first meeting tomorrow</title><content type="html">The Sacramento Groovy Users will be having their first meeting tomorrow at Quilogy.  Please come by and meet other enthusiastic Groovy/Grails/Griffon/Gradle/GPars users.  &lt;br /&gt;&lt;br /&gt;Quilogy &lt;br /&gt;2880 Gateway Oaks Drive, Suite 350 &lt;br /&gt;Sacramento, CA 95833 &lt;br /&gt;&lt;br /&gt;6:00 - 9:00 P.M.&lt;br /&gt;&lt;br /&gt;Hope to see you there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5035358000171545600-9178249060364883879?l=capitalcodemonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2ch-g2MJ3AX-Y57wlS_vvdhkLvM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2ch-g2MJ3AX-Y57wlS_vvdhkLvM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/2ch-g2MJ3AX-Y57wlS_vvdhkLvM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2ch-g2MJ3AX-Y57wlS_vvdhkLvM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://capitalcodemonkey.blogspot.com/feeds/9178249060364883879/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5035358000171545600&amp;postID=9178249060364883879" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/9178249060364883879?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/9178249060364883879?v=2" /><link rel="alternate" type="text/html" href="http://capitalcodemonkey.blogspot.com/2009/10/sacgru-sacramento-groovy-users-first.html" title="SacGRU (Sacramento Groovy Users) first meeting tomorrow" /><author><name>iamsteveholmes</name><uri>http://www.blogger.com/profile/00043395071742403238</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_4bzFoZkOdKE/SRd4tFCTwfI/AAAAAAAAAG0/wlkbAwJOEx0/S220/Steve_SouthPark.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CkQNQ3Y9eip7ImA9WxJXEk8.&quot;"><id>tag:blogger.com,1999:blog-5035358000171545600.post-3380859797317341650</id><published>2009-06-04T16:06:00.000-07:00</published><updated>2009-06-05T09:46:32.862-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-05T09:46:32.862-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Test" /><category scheme="http://www.blogger.com/atom/ns#" term="Controller" /><category scheme="http://www.blogger.com/atom/ns#" term="Groovy" /><category scheme="http://www.blogger.com/atom/ns#" term="Grails" /><title>Integration Testing Grails Controllers</title><content type="html">If you are planning on running integration tests on your Grails controllers it would be good to know how to test your controller regardless of whether it simply returns the model or uses the render method.&lt;br /&gt;&lt;br /&gt;When your controller returns a model you can simply test the return type.&lt;br /&gt;&lt;br /&gt;Given:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;def show = {&lt;br /&gt;def bookInstance= Book.get( params.id )&lt;br /&gt;return [ bookInstance: bookInstance] }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;You test it by:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;def model = myController.show()&lt;br /&gt;assertNotNull model.bookInstance&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;or some such.&lt;br /&gt;&lt;br /&gt;If you use the render method in your controller then you would use the ModelAndView object in your controller.&lt;br /&gt;&lt;br /&gt;Given:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;def save = {&lt;br /&gt;def bookInstance = Book.get(params.id)&lt;br /&gt;render(view:'create',model: [ bookInstance : bookInstance ])&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;You can test it as follows:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;bookController.save()&lt;br /&gt;assertNotNull bookController.modelAndView.model.bookInstance&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;There is one nasty caveat to the render method, and that is if you are rendering a template instead of a view.  This is common when you are doing AJAX type calls that only return a partial page.  The problem is that Grails will not populate the modelAndView map at all.  Nor does render provide a return type.&lt;br /&gt;&lt;br /&gt;The answer came from the following mailing list posting:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.nabble.com/Testing-Controller-with-render%28template:....%29-td18757149.html"&gt;http://www.nabble.com/Testing-Controller-with-render(template:....)-td18757149.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Essentially you need to alter the behavior of the render method.  You can do this in the setup as follows:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;def renderMap&lt;br /&gt;&lt;br /&gt;protected void setUp() {&lt;br /&gt;super.setUp()&lt;br /&gt;BookController.metaClass.render = { Map map -&gt;&lt;br /&gt;renderMap = map&lt;br /&gt;}&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Then Given:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;def bookSummary = {&lt;br /&gt;def bookInstance = Book.get(params.id)&lt;br /&gt;render(template: "bookSummary", model: [ bookInstance : bookInstance ])&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;And then you test your model values as follows:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;bookController.bookSummary()&lt;br /&gt;assertNotNull renderMap.model.bookInstance&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;I hope this is helpful.&lt;br /&gt;&lt;br /&gt;Happy Grailing!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5035358000171545600-3380859797317341650?l=capitalcodemonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/bFVbQXUk-6oK_42jUJ7HJyDaQSw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bFVbQXUk-6oK_42jUJ7HJyDaQSw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/bFVbQXUk-6oK_42jUJ7HJyDaQSw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bFVbQXUk-6oK_42jUJ7HJyDaQSw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://capitalcodemonkey.blogspot.com/feeds/3380859797317341650/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5035358000171545600&amp;postID=3380859797317341650" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/3380859797317341650?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/3380859797317341650?v=2" /><link rel="alternate" type="text/html" href="http://capitalcodemonkey.blogspot.com/2009/06/integration-testing-grails-controllers.html" title="Integration Testing Grails Controllers" /><author><name>iamsteveholmes</name><uri>http://www.blogger.com/profile/00043395071742403238</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_4bzFoZkOdKE/SRd4tFCTwfI/AAAAAAAAAG0/wlkbAwJOEx0/S220/Steve_SouthPark.jpg" /></author><thr:total>5</thr:total></entry><entry gd:etag="W/&quot;CkMHRXszfip7ImA9WxJSF04.&quot;"><id>tag:blogger.com,1999:blog-5035358000171545600.post-5280069608328308792</id><published>2009-05-07T13:56:00.000-07:00</published><updated>2009-05-07T14:07:14.586-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-07T14:07:14.586-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="Groovy" /><category scheme="http://www.blogger.com/atom/ns#" term="Intellij IDEA" /><category scheme="http://www.blogger.com/atom/ns#" term="Grails" /><title>Intellij 8.1.1 out with Grails 1.1 support</title><content type="html">Intellij has reclaimed it's crown as uncontested King of Groovy/Grails IDEs with the release of 8.1.1.  As many of you know, the release of Grails 1.1 introduced a number of improvements, in particular changes to dependency management and plugins, the testing plugin integration, etc.  While all these improvements were great, the fantastic support for Groovy/Grails in IDEA broke.  &lt;br /&gt;&lt;br /&gt;Now with release 8.1.1 you can expect all the IntelliGrails goodness to return.  As one who was using the EAP to get Grails 1.1 support I'm also happy to report that the Intellij team was highly responsive to our bug reports in particular the inability to debug integration tests.  It all seems to be working in the last EAP and I'm downloading the Gold release now.&lt;br /&gt;&lt;br /&gt;If I notice anything interesting I'll post again with my experiences.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5035358000171545600-5280069608328308792?l=capitalcodemonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/MK9ABfoHFydFmsDODecBlXjur3Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/MK9ABfoHFydFmsDODecBlXjur3Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/MK9ABfoHFydFmsDODecBlXjur3Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/MK9ABfoHFydFmsDODecBlXjur3Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://capitalcodemonkey.blogspot.com/feeds/5280069608328308792/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5035358000171545600&amp;postID=5280069608328308792" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/5280069608328308792?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/5280069608328308792?v=2" /><link rel="alternate" type="text/html" href="http://capitalcodemonkey.blogspot.com/2009/05/intellij-811-out-with-grails-11-support.html" title="Intellij 8.1.1 out with Grails 1.1 support" /><author><name>iamsteveholmes</name><uri>http://www.blogger.com/profile/00043395071742403238</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_4bzFoZkOdKE/SRd4tFCTwfI/AAAAAAAAAG0/wlkbAwJOEx0/S220/Steve_SouthPark.jpg" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;CUAHSXs9fip7ImA9WxVbFU4.&quot;"><id>tag:blogger.com,1999:blog-5035358000171545600.post-1576669449160364757</id><published>2009-03-31T12:40:00.000-07:00</published><updated>2009-03-31T14:08:58.566-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-31T14:08:58.566-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Windows" /><category scheme="http://www.blogger.com/atom/ns#" term="command line" /><category scheme="http://www.blogger.com/atom/ns#" term="Maven" /><category scheme="http://www.blogger.com/atom/ns#" term="Groovy" /><title>Executing command line scripts from Groovy on Windows</title><content type="html">Today I had the need to create a number of dependencies within my local Maven repository (I know it's a hack you Maven purists, back off).  I decided that I would use Groovy to loop over the jars in the lib directory and create the a dependency for each file.  Groovyists know how easy this is:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;new File('.').eachFile{&lt;br /&gt; //do something&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;And of course I was aware that on Windows you have to use a "cmd /c" prior to your executable.  So my final was going to look like this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;new File('.').eachFile{&lt;br /&gt;    groupId = it.name.substring(0, it.name.size() - 4)&lt;br /&gt;    "cmd /c mvn install:install-file -DgroupId=blahzy.blah-DartifactId=${groupId} -Dversion=9.9.9 -Dpackaging=jar -Dfile=${it.name}".execute().text&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Seems appropriately short and succinct for my groovy instincts to feel okay with it.  Only problem is that it didn't work.  When I would run it the console would freeze and I had no idea what was going on.  After reading through some of the groovy documentation online I found out that if the output is too much the Windows process will just freeze.  Luckily there was a documented "hack" to solve the issue.  My final script:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;new File('.').eachFile{&lt;br /&gt;    groupId = it.name.substring(0, it.name.size() - 4)&lt;br /&gt;    thisCommand = "cmd /c mvn install:install-file -DgroupId=blahzy.blah-DartifactId=${groupId} -Dversion=9.9.9 -Dpackaging=jar -Dfile=${it.name}"&lt;br /&gt;    proc = thisCommand.execute()&lt;br /&gt;    proc.consumeProcessOutput()&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;So I don't get any of the output but it worked so who am I to complain.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5035358000171545600-1576669449160364757?l=capitalcodemonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/AvWpyHBNEftgU2t9T4l-GKQdmqk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AvWpyHBNEftgU2t9T4l-GKQdmqk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/AvWpyHBNEftgU2t9T4l-GKQdmqk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AvWpyHBNEftgU2t9T4l-GKQdmqk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://capitalcodemonkey.blogspot.com/feeds/1576669449160364757/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5035358000171545600&amp;postID=1576669449160364757" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/1576669449160364757?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/1576669449160364757?v=2" /><link rel="alternate" type="text/html" href="http://capitalcodemonkey.blogspot.com/2009/03/executing-command-line-scripts-from.html" title="Executing command line scripts from Groovy on Windows" /><author><name>iamsteveholmes</name><uri>http://www.blogger.com/profile/00043395071742403238</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_4bzFoZkOdKE/SRd4tFCTwfI/AAAAAAAAAG0/wlkbAwJOEx0/S220/Steve_SouthPark.jpg" /></author><thr:total>3</thr:total></entry><entry gd:etag="W/&quot;CEcASHYycSp7ImA9WxRaFEQ.&quot;"><id>tag:blogger.com,1999:blog-5035358000171545600.post-6856506019082862337</id><published>2008-12-16T21:26:00.000-08:00</published><updated>2008-12-16T21:34:09.899-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-16T21:34:09.899-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="california" /><category scheme="http://www.blogger.com/atom/ns#" term="Groovy" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Groups" /><category scheme="http://www.blogger.com/atom/ns#" term="Sacramento" /><category scheme="http://www.blogger.com/atom/ns#" term="Grails" /><title>SacGRU the Sacramento GRoovy (GRails) Users</title><content type="html">I've created a google group for all you interested in the Sacramento Groovy User's Group.  The address is:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://groups.google.com/group/sacgru"&gt;http://groups.google.com/group/sacgru&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you are interested, please sign up so that I can notify you of plans, upcoming events, etc.  I'm very excited at the prospect of bringing the Development Productivity of Groovy and the Grails platform to the Sacramento Area.  Imagine the cost savings to the California State Government if they built all their Web Applications using Grails.  Goodbye 42 Billion dollar debt!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5035358000171545600-6856506019082862337?l=capitalcodemonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/gNxM-od9H2fgTZ39UDeKLZOz4hQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gNxM-od9H2fgTZ39UDeKLZOz4hQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/gNxM-od9H2fgTZ39UDeKLZOz4hQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gNxM-od9H2fgTZ39UDeKLZOz4hQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://capitalcodemonkey.blogspot.com/feeds/6856506019082862337/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5035358000171545600&amp;postID=6856506019082862337" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/6856506019082862337?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/6856506019082862337?v=2" /><link rel="alternate" type="text/html" href="http://capitalcodemonkey.blogspot.com/2008/12/sacgru-sacramento-groovy-grails-users.html" title="SacGRU the Sacramento GRoovy (GRails) Users" /><author><name>iamsteveholmes</name><uri>http://www.blogger.com/profile/00043395071742403238</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_4bzFoZkOdKE/SRd4tFCTwfI/AAAAAAAAAG0/wlkbAwJOEx0/S220/Steve_SouthPark.jpg" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;DkYHQH0zfCp7ImA9WxRaFEQ.&quot;"><id>tag:blogger.com,1999:blog-5035358000171545600.post-777726988335058885</id><published>2008-12-14T13:00:00.000-08:00</published><updated>2008-12-16T22:08:51.384-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-16T22:08:51.384-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Groovy" /><category scheme="http://www.blogger.com/atom/ns#" term="groovy user's group" /><category scheme="http://www.blogger.com/atom/ns#" term="Sacramento" /><category scheme="http://www.blogger.com/atom/ns#" term="Grails" /><title>Who wants a Sacramento Groovy User's Group?</title><content type="html">I've been thinking for months about pursuing creating a Sacramento Groovy User's Group.  Right now I'm trying to gauge the interest.  I've talked to folks at the Sacramento Java User's Group and there was some interest there.  Please ping me if you are in the Sacramento area and something like this would appeal to you.&lt;br /&gt;&lt;br /&gt;My basic plan is to meet once a month and do the following types of sessions:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Vendors coming in pimping their products that use groovy in some way&lt;/li&gt;&lt;li&gt;Developers showing off the work they're doing with Groovy&lt;/li&gt;&lt;li&gt;Talks on various Groovy related technologies (Grails, Griffon, etc)&lt;/li&gt;&lt;li&gt;Open discussion&lt;/li&gt;&lt;li&gt;Lightning talks&lt;/li&gt;&lt;li&gt;Code reviews&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Mini-code camps ("let's build something that does X")&lt;/li&gt;&lt;/ul&gt;...and of course I'm completely open to suggestions on other topics/formats, etc.&lt;br /&gt;&lt;br /&gt;In order to make this work primarily I need interested people.  I've already got ideas for sponsors (facilities, food, etc.).&lt;br /&gt;&lt;br /&gt;Please hit me up if you're interested in participating in any way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5035358000171545600-777726988335058885?l=capitalcodemonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/DIhcaeweHjZpU6QcOHcvUOBU0Ys/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DIhcaeweHjZpU6QcOHcvUOBU0Ys/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/DIhcaeweHjZpU6QcOHcvUOBU0Ys/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DIhcaeweHjZpU6QcOHcvUOBU0Ys/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://capitalcodemonkey.blogspot.com/feeds/777726988335058885/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5035358000171545600&amp;postID=777726988335058885" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/777726988335058885?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/777726988335058885?v=2" /><link rel="alternate" type="text/html" href="http://capitalcodemonkey.blogspot.com/2008/12/who-wants-sacramento-groovy-users-group.html" title="Who wants a Sacramento Groovy User's Group?" /><author><name>iamsteveholmes</name><uri>http://www.blogger.com/profile/00043395071742403238</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_4bzFoZkOdKE/SRd4tFCTwfI/AAAAAAAAAG0/wlkbAwJOEx0/S220/Steve_SouthPark.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0IMQ3o4eCp7ImA9WxRUEUs.&quot;"><id>tag:blogger.com,1999:blog-5035358000171545600.post-8486265321659099221</id><published>2008-11-19T22:50:00.000-08:00</published><updated>2008-11-19T23:19:42.430-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-19T23:19:42.430-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="IDE" /><category scheme="http://www.blogger.com/atom/ns#" term="Eclipse" /><category scheme="http://www.blogger.com/atom/ns#" term="Groovy" /><category scheme="http://www.blogger.com/atom/ns#" term="Intellij IDEA" /><category scheme="http://www.blogger.com/atom/ns#" term="Netbeans" /><category scheme="http://www.blogger.com/atom/ns#" term="Grails" /><title>Netbeans 6.5 Goes Gold and Gets Groovy</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_4bzFoZkOdKE/SSUKhWHmq7I/AAAAAAAAAIg/178KVClTEDg/s1600-h/Netbeans+Splash.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 400px; height: 290px;" src="http://3.bp.blogspot.com/_4bzFoZkOdKE/SSUKhWHmq7I/AAAAAAAAAIg/178KVClTEDg/s400/Netbeans+Splash.JPG" alt="" id="BLOGGER_PHOTO_ID_5270630506896468914" border="0" /&gt;&lt;/a&gt;It's great news that the Netbeans team has announced the release of &lt;a href="http://www.netbeans.org/index.html"&gt;Netbeans 6.5&lt;/a&gt;!  Even better news for the Groovy and Grails (and Griffon) community that there is now a major open-source IDE with Groovy support.  Although an &lt;a href="http://www.jetbrains.com/idea/nextversion/?102508_11120"&gt;Intellij &lt;/a&gt;groupie myself, I used netbeans in the old days when it was Forte and I've watched as it has made major leaps and bounds in terms of speed, usability, and a functionality.  I've also used Netbeans (and Forte for that matter) for J2ME development because at a time it was the best IDE out there for that sort of thing, integrating seamlessly with Sun's J2ME toolkit.  I can't speak to whether or not that is still true having not done any of that sort of development for years.  I always preferred Netbeans to Eclipse because I like how everything in Netbeans feels like it fits together.  I've always felt Eclipse felt a bit like the Frankenstein Monster of Java IDEs as the different plug-ins and such don't look, feel, or work the same.&lt;br /&gt;&lt;br /&gt;Just a few weeks back when it had come out with it's last milestone release, I used Netbeans 6.5 it at a client site to train them in the development of a &lt;a href="http://code.google.com/p/configuration-data-repository/"&gt;Grails application&lt;/a&gt; that I had been working on for them.  Just three of us were able to get it configured (along with Grails, Groovy, and Java) on all the classroom's systems in no time (well maybe an hour or so).  I only had the chance to play with it for a few hours but it seemed completely useable with code highlighting, error checking, code completion and running Grails applications in the IDE itself.  I would also say that the overall look and feel of Netbeans and it's responsiveness were highly improved over older versions.  Older versions always felt clunky to me.&lt;br /&gt;&lt;br /&gt;Netbeans won't be replacing &lt;a href="http://www.jetbrains.com/idea/nextversion/?102508_11120"&gt;Intellij &lt;/a&gt;for me anytime soon but I'm always glad to see competition in the marketplace and more choices for my clients.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5035358000171545600-8486265321659099221?l=capitalcodemonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/P_2kIdXLprFslttt8OgZMSp9sdE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/P_2kIdXLprFslttt8OgZMSp9sdE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/P_2kIdXLprFslttt8OgZMSp9sdE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/P_2kIdXLprFslttt8OgZMSp9sdE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://capitalcodemonkey.blogspot.com/feeds/8486265321659099221/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5035358000171545600&amp;postID=8486265321659099221" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/8486265321659099221?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/8486265321659099221?v=2" /><link rel="alternate" type="text/html" href="http://capitalcodemonkey.blogspot.com/2008/11/netbeans-65-goes-gold-and-gets-groovy.html" title="Netbeans 6.5 Goes Gold and Gets Groovy" /><author><name>iamsteveholmes</name><uri>http://www.blogger.com/profile/00043395071742403238</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_4bzFoZkOdKE/SRd4tFCTwfI/AAAAAAAAAG0/wlkbAwJOEx0/S220/Steve_SouthPark.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_4bzFoZkOdKE/SSUKhWHmq7I/AAAAAAAAAIg/178KVClTEDg/s72-c/Netbeans+Splash.JPG" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUcFSXs9eip7ImA9WxRUEE8.&quot;"><id>tag:blogger.com,1999:blog-5035358000171545600.post-5902713990693533664</id><published>2008-11-18T07:30:00.000-08:00</published><updated>2008-11-18T08:50:18.562-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-18T08:50:18.562-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="OO Programming" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="Object Relational Mapping" /><category scheme="http://www.blogger.com/atom/ns#" term="Design Patterns" /><category scheme="http://www.blogger.com/atom/ns#" term="Relational Model" /><category scheme="http://www.blogger.com/atom/ns#" term="Hibernate" /><category scheme="http://www.blogger.com/atom/ns#" term="Object Oriented" /><category scheme="http://www.blogger.com/atom/ns#" term="ORM" /><category scheme="http://www.blogger.com/atom/ns#" term="Grails" /><title>Is it okay to violate OO or Relational principles when mapping objects to the database?</title><content type="html">This seems to be a big topic in my work life lately.  It was a heated topic at this last Sacramento Java User's group.  I've also been criticized at work for allowing my Domain model to intrude on the Relational model or vice versa when building an application from scratch.  From that point of view I would have to say guilty as charged.&lt;br /&gt;&lt;br /&gt;My opinion is that the goal of using an ORM tool such as hibernate is to simplify the job of translating business object into the relational persistence model.  In the good-old-days I used to seperate my DOAs from my "rich" domain model objects.  My DAOs were essentially dumb objects that were only used to make JDBC queries.  The Domain model was rich with behavior and was not directly influenced by the relational model.  Of course then I had an issue of how the Domain model communicated with these DAOs.  The DAOs weren't really Objects in the pure sense because I had isolated them from implementing any business behavior.&lt;br /&gt;&lt;br /&gt;An ORM purist might argue that you could change the model above by mapping those Domain objects to the relational model.  This is possible and I've worked on a number of projects that did exactly that.  The difficulty there is that you have what I call the "big mapping" layer that deals with the logic of mapping these domain objects to the relational model.  This quickly becomes one of the most complex pieces of the application and usually only one or two experts in that particular ORM tool have any idea of what is really going on.  ORM purists might argue that this is just fine and that you business developers shouldn't need to know what is going on with the persistence layer.  But in practice I have found that those experts disappear and eventually whatever developes are left standing end up inheriting this mapping layer.&lt;br /&gt;&lt;br /&gt;Maybe because of similar experience to mine, the current trend seems to be a "compromised" ORM approach.  If you take the Grails framework as an example (I believe the same tends to hold true for Seam or JEE 5 applications using annotations), the mapping layer is quite simple and is held within the Domain objects themselves.  Although capable of mapping in the same big mapping solution as before, typically a developer builds the Objects before the relational model and the relational model is generated from the Domain objects.  I've found in practice that the Domain model tends to intrude on the Relational model, although the technology doesn't neccessitate this as Grails just uses hibernate under the covers and is certainly capable of using the big mapping approach.&lt;br /&gt;&lt;br /&gt;I would argue that this compromise is the best of all worlds for most situations.  I have found that you are able to achieve an intelligent and simple Domain model and an efficient, normalized relational model.  In this compromised approach, you will almost certainly end up with Domain ojects that don't make a lot of business sense (such as List of Value objects) and with a Relational model that may have compromised certain normative principles to encourage simplification of the mapping.  I argue that this isn't necessarily a bad thing.  What you end up with is a much simpler application that everyone can wrap their heads around which, from my perspective, is the primary purpose anyway.&lt;br /&gt;&lt;br /&gt;What do you all think?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5035358000171545600-5902713990693533664?l=capitalcodemonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ELCNLHvMab_fHnIsCsGrHruycB0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ELCNLHvMab_fHnIsCsGrHruycB0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ELCNLHvMab_fHnIsCsGrHruycB0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ELCNLHvMab_fHnIsCsGrHruycB0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://capitalcodemonkey.blogspot.com/feeds/5902713990693533664/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5035358000171545600&amp;postID=5902713990693533664" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/5902713990693533664?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/5902713990693533664?v=2" /><link rel="alternate" type="text/html" href="http://capitalcodemonkey.blogspot.com/2008/11/is-it-okay-to-violate-oo-or-relational.html" title="Is it okay to violate OO or Relational principles when mapping objects to the database?" /><author><name>iamsteveholmes</name><uri>http://www.blogger.com/profile/00043395071742403238</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_4bzFoZkOdKE/SRd4tFCTwfI/AAAAAAAAAG0/wlkbAwJOEx0/S220/Steve_SouthPark.jpg" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;DEAFRHk8fSp7ImA9WxRVF00.&quot;"><id>tag:blogger.com,1999:blog-5035358000171545600.post-7139957766762888928</id><published>2008-11-14T14:23:00.000-08:00</published><updated>2008-11-14T15:51:55.775-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-14T15:51:55.775-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="Groovy" /><category scheme="http://www.blogger.com/atom/ns#" term="Spring" /><category scheme="http://www.blogger.com/atom/ns#" term="Intellij IDEA" /><category scheme="http://www.blogger.com/atom/ns#" term="Grails" /><title>Grails 1.04 Release Helps Me Finish My Project</title><content type="html">So Graeme Rocher gets back from writing  &lt;a href="http://www.amazon.com/gp/product/1590599950?ie=UTF8&amp;amp;tag=thecapcodmon-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1590599950"&gt;The Definitive Guide to Grails, Second Edition (The Definitive Guide)&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=thecapcodmon-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=1590599950" alt="" style="border: medium none  ! important; margin: 0px ! important;" width="1" border="0" height="1" /&gt; and one week later Grails 1.04 is out.  Now I'm not usually one to upgrade to a new version in the middle of a project but this one contained a fix for the premature end of file error which unfortunately is reported as FATAL.  For those of us who have clients who monitor their logging files spitting out FATAL errors every minute or two results in literally hundreds of emails being sent out to folks.&lt;br /&gt;&lt;br /&gt;So now I'm in a situation where I have dozens of stakeholders sitting around a table and I'm trying to explain to them that this particular FATAL exception is really no big deal and not a threat to the application.  Needless to say this ends up on the issue tracker with a HIGH priority....&lt;br /&gt;&lt;br /&gt;But Grails 1.04 comes along with a &lt;a href="http://jira.codehaus.org/browse/GRAILS-3088"&gt;fix to the this issue&lt;/a&gt;.  No sooner had I read about it then I upgraded.  Curiously enough after I set up &lt;a href="http://www.jetbrains.com/idea/nextversion/?102508_11120"&gt;Intellij (Yes version 8)&lt;/a&gt; with the 1.04 version of Grails it notified me that I was using different versions and did I want to upgrade.  After affirming the upgrade I was ready to try running the application, running all my unit, integration and webtests (functional tests), and now it has been deployed to the client test environment for the QA team.  So far I'm very pleased and haven't hit any regressions (knock on wood).  Great work G2One!  Oops...I mean SpringSource ;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5035358000171545600-7139957766762888928?l=capitalcodemonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/BSZxmpYcR8ZbN4YTSBSVA0Qd4xs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BSZxmpYcR8ZbN4YTSBSVA0Qd4xs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/BSZxmpYcR8ZbN4YTSBSVA0Qd4xs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BSZxmpYcR8ZbN4YTSBSVA0Qd4xs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://capitalcodemonkey.blogspot.com/feeds/7139957766762888928/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5035358000171545600&amp;postID=7139957766762888928" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/7139957766762888928?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/7139957766762888928?v=2" /><link rel="alternate" type="text/html" href="http://capitalcodemonkey.blogspot.com/2008/11/grails-104-release-helps-me-finish-my.html" title="Grails 1.04 Release Helps Me Finish My Project" /><author><name>iamsteveholmes</name><uri>http://www.blogger.com/profile/00043395071742403238</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_4bzFoZkOdKE/SRd4tFCTwfI/AAAAAAAAAG0/wlkbAwJOEx0/S220/Steve_SouthPark.jpg" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;CEYDR3g7eCp7ImA9WxRVFUs.&quot;"><id>tag:blogger.com,1999:blog-5035358000171545600.post-4246004579220002813</id><published>2008-11-12T17:49:00.000-08:00</published><updated>2008-11-12T23:42:56.600-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-12T23:42:56.600-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Jetbrains" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="IDE" /><category scheme="http://www.blogger.com/atom/ns#" term="Groovy" /><category scheme="http://www.blogger.com/atom/ns#" term="Intellij IDEA" /><category scheme="http://www.blogger.com/atom/ns#" term="Grails" /><title>Groovy and Grails support continues to improve with Intellij IDEA 8</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.jetbrains.com/idea/nextversion/?102508_11120"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 197px; height: 168px;" src="http://1.bp.blogspot.com/_4bzFoZkOdKE/SRtCpkFljLI/AAAAAAAAAHw/x3qssdAAJN0/s320/ij8.jpg" alt="" id="BLOGGER_PHOTO_ID_5267877470969105586" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&amp;lt;disclosure&amp;gt;I am a member of the Jetbrains "Seeder Program" which means I could potentially recieve schwag from Jetbrains.  However, everything I write here is purely my opinion with no input for the Jetbrains folks&amp;lt;/disclosure&amp;gt;&lt;br /&gt;&lt;br /&gt;Back in those heady days of IDEA 7.0 all I really cared about was the Groovy and Grails support.  There really wasn't a good IDE for doing Groovy and Grails.  Netbeans was almost non-existent for Groovy and Grails support, the Eclipse Groovy plugin was maybe the best prior to IDEA 7.0 but by their own admission really needed more resources to make it a solid experience.  This maybe wasn't so bad for Groovy because Dynamic OO languages (since Smalltalk) always seemed to be for VI fan-boys.  But Netbeans (and Intellij) had done some work on a Ruby plugin that wasn't Great but was better than anything Groovy had.&lt;br /&gt;&lt;br /&gt;Then months before IDEA 7.0 came out, the Jetbrains folks announced support for a Groovy and Grails plugin for Intellij IDEA.  Oddly enough, just prior to them making the announcement I had written on the forums promising that if they would support Groovy I would pay in advance for a 7.0 license.  I doubt that had a darned thing to do with their decision but seemingly out of the Ether they announce that they are creating a Groovy and Grails plugin.&lt;br /&gt;&lt;br /&gt;I was so freakin' excited I immediately downloaded the source code and built the plugin...I remember it being quite difficult in those days and when I finally figured it out I posted again on their forums explaining to others how to do the same, although I unfortunately got the directions not quite right (oh well...).&lt;br /&gt;&lt;br /&gt;The Groovy and Grails support in 7.0 FAR exceeded my expectations.  Even at launch it was very usable and it continued to improve.  I realized just recently how awesome it was when I was writing a Grails application with webservices in one IDEA window and the Client in the other and I had them both running in debug mode at one point making changes, setting break points...  Just a fantastic experience!&lt;br /&gt;&lt;br /&gt;So as not to disappoint, idea 8.0 is packed full of new features for Groovy and Grails.  But I would still call them incremental.  Perhaps one ommitance is a Grails Webflow visual editor.  I noticed months ago they were doing something like that for Seam and it seemed (no pun intended) like they could have done the same for Grails.  Maybe with Grails it is un-needed as Grails has an easy to use DSL.  Maybe the visual editor would have detracted from rather than improved upon the workflow...&lt;br /&gt;&lt;br /&gt;What has been added?  Features I've already used and really like are the visual Grails plugin manager, Completion for Domain classes' dynamic methods and finders                             and the ability to invoke Grails scripts straight from Intellij.  The funny thing is that none of these features let you do anything that you couldn't do before they just make it so much easier.  Anyone who has been a long time intellij user remembers before intellij when you couldn't use a class from the Java standard libraries without having the Javadocs open because you had no idea what methods their were.  Then intellij came along and we could just press ctrl-space and see a list of all methods.  Now you can do that with dynamic methods added by Grails.  Yes I sit around with my Grails documentation open these days trying to remember which methods I can call.  No longer!  In addition this means less mistakes.  Likewise, the script quick invoker allows you to press ctrl-alt-g and get a text box to invoke grails scripts.  Press your trusty ctl-space buttons and voila!  All the commands are listed out for you.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_4bzFoZkOdKE/SRvZwXRn1iI/AAAAAAAAAIA/wWhKSmnIDRk/s1600-h/rungrailstarget.JPG"&gt;&lt;img style="cursor: pointer; width: 320px; height: 178px;" src="http://2.bp.blogspot.com/_4bzFoZkOdKE/SRvZwXRn1iI/AAAAAAAAAIA/wWhKSmnIDRk/s320/rungrailstarget.JPG" alt="" id="BLOGGER_PHOTO_ID_5268043614044804642" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I really appreciate the attention to detail shown by these changes and the lack of simply adding features that you already got from the command line without improving on them.  My workflow has continued to improve since the first releases of the Groovy and Grails plugin for intellij.  These changes are evolutionary instead of revolutionary but don't let that fool you.  IDEA continues to be far and away the best IDE for Groovy and Grails development.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5035358000171545600-4246004579220002813?l=capitalcodemonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/mLG1fLm2yx97CGkrmwuMnFezyRM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mLG1fLm2yx97CGkrmwuMnFezyRM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/mLG1fLm2yx97CGkrmwuMnFezyRM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mLG1fLm2yx97CGkrmwuMnFezyRM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://capitalcodemonkey.blogspot.com/feeds/4246004579220002813/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5035358000171545600&amp;postID=4246004579220002813" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/4246004579220002813?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/4246004579220002813?v=2" /><link rel="alternate" type="text/html" href="http://capitalcodemonkey.blogspot.com/2008/11/groovy-and-grails-support-continues-to.html" title="Groovy and Grails support continues to improve with Intellij IDEA 8" /><author><name>iamsteveholmes</name><uri>http://www.blogger.com/profile/00043395071742403238</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_4bzFoZkOdKE/SRd4tFCTwfI/AAAAAAAAAG0/wlkbAwJOEx0/S220/Steve_SouthPark.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_4bzFoZkOdKE/SRtCpkFljLI/AAAAAAAAAHw/x3qssdAAJN0/s72-c/ij8.jpg" height="72" width="72" /><thr:total>4</thr:total></entry><entry gd:etag="W/&quot;CUMMQXYzfyp7ImA9WxRVFU8.&quot;"><id>tag:blogger.com,1999:blog-5035358000171545600.post-6006627089740937222</id><published>2008-11-09T10:00:00.000-08:00</published><updated>2008-11-12T12:58:00.887-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-12T12:58:00.887-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Jetbrains" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="IDEA 8" /><category scheme="http://www.blogger.com/atom/ns#" term="IDE" /><category scheme="http://www.blogger.com/atom/ns#" term="Developer workflow" /><category scheme="http://www.blogger.com/atom/ns#" term="Groovy" /><category scheme="http://www.blogger.com/atom/ns#" term="Intellij IDEA" /><category scheme="http://www.blogger.com/atom/ns#" term="Grails" /><title>Intellij IDEA 8 Released</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.jetbrains.com/idea/nextversion/?102508_11120"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 197px; height: 168px;" src="http://1.bp.blogspot.com/_4bzFoZkOdKE/SRtCpkFljLI/AAAAAAAAAHw/x3qssdAAJN0/s320/ij8.jpg" alt="" id="BLOGGER_PHOTO_ID_5267877470969105586" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&amp;lt;disclosure&amp;gt;I am a member of the Jetbrains "Seeder Program" which means I could potentially recieve schwag from Jetbrains.  However, everything I write here is purely my opinion with no input for the Jetbrains folks&amp;lt;/disclosure&amp;gt;&lt;br /&gt;&lt;br /&gt;Jetbrains has released Intellij IDEA 8 with lots of new features.  The interesting thing about IDEA (indeed any of the major Java IDEs) is that it is going to be a different tool to different developers.  In the days of IDEA 2, I loved it purely for it's great Java code completion, refactoring tools, and code analysis.  Later, (I want to say IDEA 4 and 5) I loved it for it's best-in-the-market HTML, XML, Struts,  and Javascript editing because I'm primarily a Enterprise Java Web Application developer.  I was excited about IDEA 7 because it was the best editor for Groovy and Grails which I now use daily.  I can't say I care at all about it's Swing tools, Ruby tools, etc. but there are clearly developers out there that do.&lt;br /&gt;&lt;br /&gt;But that being said, what every developer cares about is having a responsive code editor that works with them at the speed at which they think without being distracted from business issues by the technical issue of how to accomplish something with the editor.  The relationship a developer has with his IDE is lke the relationship between a carpenter and his tools.  If a carpenter has hand picked every tool he uses and has it right where he wants it so that he doesn't even have to think about it as it comes to his hand then his productivity and the quality of his work will be better.  If he is constantly worrying about where his tools are, what tools to use for what tasks, and whether or not his tools will perform appropriately, then his job performance will be degraded.  The carpenter has a system for where he keeps all his hammers, his nails, saws, etc.  The goal is to get to the point where you don't even have to think about it and it is instinctual.  It is also how we train in martial arts.  If you have to think about blocking then you're going to get punched.  If you can make blocking instinctual then you're a lot safer.  A master has honed his skills to the point where even the counter attack is instinctual.&lt;br /&gt;&lt;br /&gt;Which brings me to my point.  Although I have been an avid Intellij IDEA user since IDEA 2, there has at least been the perception that the performance has degraded in certain ways.  Although I think IDEA always performed well compared to other IDEs on the market, I had noticed a number of areas where the performance had become a distraction.  Slow start up times were definately an issue but I can live with that.  Probably the most annoying thing for me were long page rendering when opening a new page or switching from one to another.  Or more commonly, when bringing IDEA back into focus after working with another tool (browser, app server console, etc.).  This coding editor that always worked at the speed at which I thought was becoming senile before it's time.&lt;br /&gt;&lt;br /&gt;It appears that perhaps the most important new feature (to me anyway) is the "reworked engine" that is supposed to improve the performance overall but particularly the startup.  My experience so far has been very positive.  Startup time I can testify has been HUGELY improved.  IDEA parses all your project files, indexing references, creating a cache, etc. to improve performance.  After starting it a couple of times the performance is going to improve because it doesn't have to rebuild all it's indexing and cache.  I can report that with my completely un-scientific test of timing the startup times of IDEA 7.04 and IDEA 8 here are my results:&lt;br /&gt;&lt;br /&gt;IDEA 7.04 - 35 seconds&lt;br /&gt;IDEA 8.0 - 19 seconds&lt;br /&gt;&lt;br /&gt;This was for the same project (a Grails project) and I started both versions a number of times to make sure it wasn't an issue of creating the indexes or cache.  Keep in mind that is for one project and depending on the complexity of your project it may take more or less time.  Also, the first time I started either of them took much longer, like 4 or 5 times longer, while it built the cache, indexes, ect.  It also seemed to make some difference how many tabs I had opened up but not much.&lt;br /&gt;&lt;br /&gt;Checking on other performance, going from page to page seems to be quite zippy.  All the keyboard shortcuts seem to perform instantly.  No problems to report so far when jumping focus from other apps to intellij.  I'll definitely be working with it and commenting on my blog over the next couple of weeks if I notice an issue, but so far very positive!  Great job Jetbrainers...Jetbrainsers...Jetbrainsonians...whatever...&lt;br /&gt;&lt;br /&gt;Next I'll check out the new Groovy and Grails features and report back my experiences there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5035358000171545600-6006627089740937222?l=capitalcodemonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fgM00Uo9zPDMR3By9YW8L4Pschs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fgM00Uo9zPDMR3By9YW8L4Pschs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/fgM00Uo9zPDMR3By9YW8L4Pschs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fgM00Uo9zPDMR3By9YW8L4Pschs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://capitalcodemonkey.blogspot.com/feeds/6006627089740937222/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5035358000171545600&amp;postID=6006627089740937222" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/6006627089740937222?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/6006627089740937222?v=2" /><link rel="alternate" type="text/html" href="http://capitalcodemonkey.blogspot.com/2008/11/intellij-idea-8-released.html" title="Intellij IDEA 8 Released" /><author><name>iamsteveholmes</name><uri>http://www.blogger.com/profile/00043395071742403238</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_4bzFoZkOdKE/SRd4tFCTwfI/AAAAAAAAAG0/wlkbAwJOEx0/S220/Steve_SouthPark.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_4bzFoZkOdKE/SRtCpkFljLI/AAAAAAAAAHw/x3qssdAAJN0/s72-c/ij8.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;Ak4ASXoyeCp7ImA9WxRRGE4.&quot;"><id>tag:blogger.com,1999:blog-5035358000171545600.post-3439075811161274055</id><published>2008-09-30T21:31:00.000-07:00</published><updated>2008-09-30T22:29:08.490-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-30T22:29:08.490-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="T-Mobile" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="iPhone" /><category scheme="http://www.blogger.com/atom/ns#" term="Google calendar" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><category scheme="http://www.blogger.com/atom/ns#" term="Google" /><category scheme="http://www.blogger.com/atom/ns#" term="ATT" /><category scheme="http://www.blogger.com/atom/ns#" term="Gmail" /><category scheme="http://www.blogger.com/atom/ns#" term="G1" /><title>Will the G1 Android Phone be an iPhone Killer?</title><content type="html">...we'll take your calls.  There has been a great deal of comparisons between the humble G1 by HTC and Apple's mighty iPhone.  What caught my attention was the recent talk about how "revolutionary" the iPhone was on the now infamous "&lt;a href="http://www.javaposse.com/"&gt;The Java Posse&lt;/a&gt;" Episode 207 where Joe Nuxoll and Dick Wall seemingly nearly came to blows over whether or not Apple's phone UI was a revolutionary feature, Joe insisting it was and Dick holding his ground that it was an improvement but not revolutionary.&lt;br /&gt;&lt;br /&gt;The argument, at least as made by Java Posse proponents, is that the usability of the iPhone allows user's to do things that they may have never done before, or at least never wanted to do with any prior phone, citing examples such as browsing the internet and text-voice-mail (no idea how this works as I don't own an iPhone).  The point was that it was not the &lt;span style="font-weight: bold;"&gt;features &lt;/span&gt;but the &lt;span style="font-weight: bold;"&gt;implementation &lt;/span&gt;that mattered.  Prior to the iPhone there were many phones with browsers but none that implemented the browsing experience well enough to compel users to use it regularly.  To be fair to Joe and the others, they were not making comparisons between the iPhone and the G1 and Joe (despite being an admitted all-things-apple-fanboy) made the point that he wanted to use it prior to passing judgement.&lt;br /&gt;&lt;br /&gt;However, since the announcement of the G1, there have been numerous articles and blogs written about why the G1 does not measure up to the iPhone or other competitors.  The most agregeous that I saw was one published by Macworld UK called10 fails for the &lt;a href="http://www.macworld.co.uk/ipod-itunes/news/index.cfm?newsid=22985&amp;amp;pagtype=allchandate"&gt;T-Mobile G1 (Google Android phone)&lt;/a&gt;.  In the article, it discusses 10 features that the G1 doesn't have that it should.  According to this article, the G1 fails to measure up because it doesn't have things like Multi-touch, desktop syncing and Exchange email.  These are nice features of the iPhone that the G1 doesn't have, therefore the G1 is inferior.&lt;br /&gt;&lt;br /&gt;I think these folks are missing the point entirely, as Steve Jobs himself said, "&lt;a href="http://www.oreillynet.com/onlamp/blog/2004/08/say_no_by_default.html"&gt;Inovation is not about saying yes to everything.  It is about saying no to all but the most crucial features.&lt;/a&gt;"&lt;a style="font-weight: bold;" href="http://www.oreillynet.com/onlamp/blog/2004/08/say_no_by_default.html"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt; The point is that the G1 will succeed or fail not based on what features it has but based on how well it implements the crucial features.  it doesn't implement multi-touch, well maybe it doesn't need it with the keyboard and scrollball.  It doesn't have Exchange email.  Well for me Gmail is all I need and using Gmail and google Calendar to manage my contacts and schedule sounds like a God-send.  I think Gmail may be the best application ever built, not because it lets me get my email and manage contacts online but because the implementation is freakin' fantastic!  Other application I love are google maps and google calendar, all of which are supposed to have first-class implemenation in Android.  I would be happy NOT to have to use any sort of desktop syncing if it's all automatically synced with my gmail.&lt;br /&gt;&lt;br /&gt;I'm suggesting that you wait until you have held a G1 in your hands and used it for a few days before you make any judgement.  Oh, and as an aside, if Apple/ATT or HTC/T-Mobile would like to send me one of their fine communication devices so that I, as an impartial observer, can write a review on it, I would be willing to bear this cross.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5035358000171545600-3439075811161274055?l=capitalcodemonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/GysxUfLP8wf7RT98m5F8pOPqwms/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GysxUfLP8wf7RT98m5F8pOPqwms/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/GysxUfLP8wf7RT98m5F8pOPqwms/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GysxUfLP8wf7RT98m5F8pOPqwms/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://capitalcodemonkey.blogspot.com/feeds/3439075811161274055/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5035358000171545600&amp;postID=3439075811161274055" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/3439075811161274055?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/3439075811161274055?v=2" /><link rel="alternate" type="text/html" href="http://capitalcodemonkey.blogspot.com/2008/09/will-g1-android-phone-be-iphone-killer.html" title="Will the G1 Android Phone be an iPhone Killer?" /><author><name>iamsteveholmes</name><uri>http://www.blogger.com/profile/00043395071742403238</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_4bzFoZkOdKE/SRd4tFCTwfI/AAAAAAAAAG0/wlkbAwJOEx0/S220/Steve_SouthPark.jpg" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;Ak8FSHc9cCp7ImA9WxRRF0U.&quot;"><id>tag:blogger.com,1999:blog-5035358000171545600.post-5695066596604727632</id><published>2008-09-29T23:55:00.000-07:00</published><updated>2008-09-30T08:33:39.968-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-30T08:33:39.968-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="Javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="MVC" /><category scheme="http://www.blogger.com/atom/ns#" term="AJAX" /><category scheme="http://www.blogger.com/atom/ns#" term="Web Application" /><category scheme="http://www.blogger.com/atom/ns#" term="HTML" /><category scheme="http://www.blogger.com/atom/ns#" term="DHTML" /><category scheme="http://www.blogger.com/atom/ns#" term="Model View Controller" /><category scheme="http://www.blogger.com/atom/ns#" term="Struts" /><title>Do AJAX Web Applications Break the MVC Pattern?</title><content type="html">Recently at work we have been having the discussion about using AJAX (&lt;a href="http://en.wikipedia.org/wiki/AJAX"&gt;Asynchronous Javascript And XML&lt;/a&gt;) to help us out with certain usability issues on some of our applications.  I had an interesting discussion with a colleague about whether or not using AJAX breaks the MVC (&lt;a href="http://en.wikipedia.org/wiki/Model-view-controller"&gt;Model View Controller&lt;/a&gt;) design pattern that we are all so comfortable with.  The application we were discussing was using Struts and so followed the MVC pattern without implementing any of the functionality using AJAX.&lt;br /&gt;&lt;br /&gt;If I understood his argument is was basically that if anything but the controller handles an event then the MVC pattern has been broken.  Clearly we do this in an AJAX application where some user events would be handled by Javascript libraries and others would ultimately make requests to the application and therefore be handled by the controller.&lt;br /&gt;&lt;br /&gt;It seems to me that the same argument could be made of any web application that uses DHTML that reacts to user input.  So even graphical buttons that change state based on whether a user is hovering over it or clicking it is an event that causes a change NOT handled by the controller.  Even something this trivial would break the MVC pattern.&lt;br /&gt;&lt;br /&gt;So maybe the more important question is to what degree or in what fashion is it okay to break or modify the MVC pattern.  From my point of view it makes sense for events that invoke ONLY view logic to be handled by the view.  So to have sort of a "Smart View" instead of the traditional dumb document or form that is usually returned in an MVC web application.  This allows for much more responsive views that will immediately respond to user input.  This level of responsiveness is not generally possible in a web application where events are processed over http.&lt;br /&gt;&lt;br /&gt;So where do you draw the line?  A "Smart View" should only contain view logic. There are obvious security risks to allowing business logic to be handled in the view so obviously that road is closed.  I'm curious if this has been a common theme to others implementing AJAX on their web apps.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5035358000171545600-5695066596604727632?l=capitalcodemonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Sj6Ea69W5Rf7JFobME0b62j0nOM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Sj6Ea69W5Rf7JFobME0b62j0nOM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Sj6Ea69W5Rf7JFobME0b62j0nOM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Sj6Ea69W5Rf7JFobME0b62j0nOM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://capitalcodemonkey.blogspot.com/feeds/5695066596604727632/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5035358000171545600&amp;postID=5695066596604727632" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/5695066596604727632?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/5695066596604727632?v=2" /><link rel="alternate" type="text/html" href="http://capitalcodemonkey.blogspot.com/2008/09/does-ajax-break-mvc-pattern.html" title="Do AJAX Web Applications Break the MVC Pattern?" /><author><name>iamsteveholmes</name><uri>http://www.blogger.com/profile/00043395071742403238</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_4bzFoZkOdKE/SRd4tFCTwfI/AAAAAAAAAG0/wlkbAwJOEx0/S220/Steve_SouthPark.jpg" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;AkAERnk8cCp7ImA9WxdSFE0.&quot;"><id>tag:blogger.com,1999:blog-5035358000171545600.post-2614011101848793803</id><published>2008-05-21T14:41:00.000-07:00</published><updated>2008-05-21T15:25:07.778-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-21T15:25:07.778-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="Groovy" /><category scheme="http://www.blogger.com/atom/ns#" term="Oracle" /><category scheme="http://www.blogger.com/atom/ns#" term="Hibernate" /><category scheme="http://www.blogger.com/atom/ns#" term="Grails" /><category scheme="http://www.blogger.com/atom/ns#" term="CDR" /><category scheme="http://www.blogger.com/atom/ns#" term="blob" /><title>Mapping a document from byte[] to BLOB in Grails on Oracle</title><content type="html">For CDR (&lt;a href="http://code.google.com/p/configuration-data-repository/"&gt;http://code.google.com/p/configuration-data-repository/&lt;/a&gt;) I had to upload a document of any sort into an oracle database.  Using a byte[] type worked just fine with the embedded HSQL database but when I deployed it to Oracle 9i or 11g (that's our platforms) it failed horribly.  This was apparently due to hibernate creating  in Oracle a 'RAW' object with a maximum size of 255.  I'm not an Oracle DBA so I don't know if that is appropriate but it wasn't working.&lt;br /&gt;&lt;br /&gt;My second thought was to change the object type in my domain object to blob:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;static mapping = {&lt;br /&gt;  document type: 'blob'&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;But that didn't work either because it couldn't automatically convert a byte[] to a BLOB.  I was able to find others who had had similar issues on the &lt;a href="http://www.nabble.com/byte---binary-type-to10087268.html#a10111174"&gt;Grails nabble&lt;/a&gt; and a &lt;a href="http://hansonchar.blogspot.com/2005/06/oracle-blob-mapped-to-byte-in.html"&gt;blog posting&lt;/a&gt; by a gentleman named Ryan using hibernate to convert byte[] to BLOB were old (by Grails standards) and I wanted to see if Grails could handle this using the new ORM DSL instead of hibernate mapping files.  This is what I came up with:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import java.sql.Blob&lt;br /&gt;import java.sql.SQLException&lt;br /&gt;import org.hibernate.Hibernate&lt;br /&gt;&lt;br /&gt;class Documentation extends ConfigurationItem {&lt;br /&gt;int docVersion&lt;br /&gt;byte[] document&lt;br /&gt;Blob documentBlob&lt;br /&gt;String fileType&lt;br /&gt;String fileName&lt;br /&gt;String fileSize&lt;br /&gt;String title&lt;br /&gt;String abstraction&lt;br /&gt;DocumentationType documentationType&lt;br /&gt;&lt;br /&gt;Date dateCreated&lt;br /&gt;Date lastUpdated&lt;br /&gt;&lt;br /&gt;static transients = ["document"]&lt;br /&gt;static belongsTo = DocumentationType&lt;br /&gt;static constraints = {&lt;br /&gt;  docVersion(nullable: true)&lt;br /&gt;  document(nullable: true)&lt;br /&gt;  documentBlob(nullable: true)&lt;br /&gt;  fileType(nullable: true)&lt;br /&gt;  fileName(nullable: true)&lt;br /&gt;  fileSize(nullable: true)&lt;br /&gt;  title(nullable: true)&lt;br /&gt;  abstraction(nullable: true)&lt;br /&gt;  documentationType(nullable: true)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static mapping = {&lt;br /&gt;  documentBlob type: 'blob'&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;def getDocument() {&lt;br /&gt;  if (documentBlob == null)&lt;br /&gt;      return null;&lt;br /&gt;  return toByteArray(getDocumentBlob());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;def setDocument(document) {&lt;br /&gt;  setDocumentBlob(Hibernate.createBlob(document));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;boolean equals(obj) {&lt;br /&gt;  if (this == obj) return true;&lt;br /&gt;  if (!obj || obj.class != this.class) return false;&lt;br /&gt;  return id?.equals(obj.id)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int hashCode() {&lt;br /&gt;  return id ? id.hashCode() : super.hashCode()&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private byte[] toByteArray(Blob fromBlob) {&lt;br /&gt;  ByteArrayOutputStream baos = new ByteArrayOutputStream();&lt;br /&gt;  try {&lt;br /&gt;      return toByteArrayImpl(fromBlob, baos);&lt;br /&gt;  } catch (SQLException e) {&lt;br /&gt;      throw new RuntimeException(e);&lt;br /&gt;  } catch (IOException e) {&lt;br /&gt;      throw new RuntimeException(e);&lt;br /&gt;  } finally {&lt;br /&gt;      if (baos != null) {&lt;br /&gt;          try {&lt;br /&gt;              baos.close();&lt;br /&gt;          } catch (IOException ex) {&lt;br /&gt;          }&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private byte[] toByteArrayImpl(Blob fromBlob, ByteArrayOutputStream baos) {&lt;br /&gt;  byte[] buf = new byte[4000];&lt;br /&gt;  InputStream is = fromBlob.getBinaryStream();&lt;br /&gt;  try {&lt;br /&gt;      while (true) {&lt;br /&gt;          int dataSize = is.read(buf);&lt;br /&gt;&lt;br /&gt;          if (dataSize == -1)&lt;br /&gt;              break;&lt;br /&gt;          baos.write(buf, 0, dataSize);&lt;br /&gt;      }&lt;br /&gt;  } finally {&lt;br /&gt;      if (is != null) {&lt;br /&gt;          try {&lt;br /&gt;              is.close();&lt;br /&gt;          } catch (IOException ex) {&lt;br /&gt;              throw ex;&lt;br /&gt;          }&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;  return baos.toByteArray();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;String toString() {&lt;br /&gt;  return "${name}"&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Notice all I had to do was create an ORM mapping for documentBlob.  So far so good!  It seems to be working in our testing in both HSQL and Oracle 9i.  Has anyone else ran into this issue?&lt;br /&gt;&lt;a href="http://www.nabble.com/byte---binary-type-to10087268.html#a10111174"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5035358000171545600-2614011101848793803?l=capitalcodemonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/T_Q0K6uAsFNsspkXR4X1NF_gp6c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/T_Q0K6uAsFNsspkXR4X1NF_gp6c/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/T_Q0K6uAsFNsspkXR4X1NF_gp6c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/T_Q0K6uAsFNsspkXR4X1NF_gp6c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://capitalcodemonkey.blogspot.com/feeds/2614011101848793803/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5035358000171545600&amp;postID=2614011101848793803" title="7 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/2614011101848793803?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/2614011101848793803?v=2" /><link rel="alternate" type="text/html" href="http://capitalcodemonkey.blogspot.com/2008/05/mapping-document-from-byte-to-blob-in.html" title="Mapping a document from byte[] to BLOB in Grails on Oracle" /><author><name>iamsteveholmes</name><uri>http://www.blogger.com/profile/00043395071742403238</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_4bzFoZkOdKE/SRd4tFCTwfI/AAAAAAAAAG0/wlkbAwJOEx0/S220/Steve_SouthPark.jpg" /></author><thr:total>7</thr:total></entry><entry gd:etag="W/&quot;D08EQ307fSp7ImA9WxdSFE0.&quot;"><id>tag:blogger.com,1999:blog-5035358000171545600.post-8100464359554309404</id><published>2008-05-08T15:07:00.000-07:00</published><updated>2008-05-21T14:36:42.305-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-21T14:36:42.305-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="Groovy" /><category scheme="http://www.blogger.com/atom/ns#" term="JavaOne" /><category scheme="http://www.blogger.com/atom/ns#" term="CommunityOne" /><category scheme="http://www.blogger.com/atom/ns#" term="Grails" /><title>Notes from the Groovy and Grails meetup</title><content type="html">I went to the Groovy and Grails meetup which was basically the highlight of CommunityOne, although it wasn't technically part of communityOne. It was put on by No Fluff Just Stuff and G2One.&lt;br /&gt;&lt;br /&gt;It started with Guilluime giving the state of the Union on Groovy and Grails.  Then came folks from LinkedIn talking about their experiences using Grails and finally by Mathew Porter of Contegix talking about why they use Grails internally instead of Rails as they do a tremendous&lt;br /&gt;amount of Rails hosting.  This was very interesting and he made two big points.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Grails scales for less cost (hardware)&lt;/li&gt;&lt;li&gt;The Grails platform is more stable and they don't have to constantly upgrade the technologies, re-train developers, etc.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;After the presentations they formed a panel of No Fluff Just Stuff experts and talked about subjects like the future of Java, where languages fit with the platform, SOA, etc.  It was a lively discussion and interesting to see the experts contemplating the same issues that the rest of us humble developers have.&lt;br /&gt;&lt;br /&gt;It was nice to meet and talk to folks there.  I met Dave Klein JUG leader (from where evades me), Jeff Brown and Guillaume Laforge of G2One fame, Dierk Konig , writer of the fantastic Groovy In Action (GINA) and my beloved Webtest plugin for Grails, and my favorite Tech writer Scott Davis who is also the Chief Editor of aboutgroovy.com (correction, I had before stated that Scott Davis was the CE of groovyblogs.org which is Glen Smith).  All very cool people to talk too and very passionate about groovy and grails.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5035358000171545600-8100464359554309404?l=capitalcodemonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/165f33dyemgARlTtC92rjb1VUBk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/165f33dyemgARlTtC92rjb1VUBk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/165f33dyemgARlTtC92rjb1VUBk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/165f33dyemgARlTtC92rjb1VUBk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://capitalcodemonkey.blogspot.com/feeds/8100464359554309404/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5035358000171545600&amp;postID=8100464359554309404" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/8100464359554309404?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/8100464359554309404?v=2" /><link rel="alternate" type="text/html" href="http://capitalcodemonkey.blogspot.com/2008/05/notes-from-groovy-and-grails-meetup.html" title="Notes from the Groovy and Grails meetup" /><author><name>iamsteveholmes</name><uri>http://www.blogger.com/profile/00043395071742403238</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_4bzFoZkOdKE/SRd4tFCTwfI/AAAAAAAAAG0/wlkbAwJOEx0/S220/Steve_SouthPark.jpg" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;DkMASHY-fSp7ImA9WxdTEkU.&quot;"><id>tag:blogger.com,1999:blog-5035358000171545600.post-8767648492125034970</id><published>2008-05-06T09:15:00.000-07:00</published><updated>2008-05-08T15:07:29.855-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-08T15:07:29.855-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="JavaFX" /><category scheme="http://www.blogger.com/atom/ns#" term="Groovy" /><category scheme="http://www.blogger.com/atom/ns#" term="JavaOne" /><title>JavaOne: Day 1 (Tuesday): Keynote</title><content type="html">Knowledge Dump:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Java is on 3 Billion Devices(mostly phones)&lt;/li&gt;&lt;li&gt;Card scanners, blah blah blah, old news&lt;/li&gt;&lt;li&gt;John Gage just made a joke (sorta) about not having a social security card with an electronic identifier, or as he said:&lt;br /&gt;"Hi, I'm an American, please detonate the closest device."&lt;/li&gt;&lt;li&gt;CO2 sensor, used for mining, etc.  Can be used for monitoring water usage, power usage, unsafe gas levels such as CO2 etc.]&lt;/li&gt;&lt;li&gt;Gas meater can monitor 40 different times of gas&lt;/li&gt;&lt;li&gt;Amazon Kindle (little electronic book) done in Java&lt;/li&gt;&lt;li&gt;Very cool mash-up Demo of a multi-media app done in JavaFX on applet, desktop, and mobile&lt;/li&gt;&lt;li&gt;one thing was cool is that they were able to drag the applet to the desktop and drag photos from the desktop to the application, it felt very integrated&lt;/li&gt;&lt;li&gt;They were having ridiculous network issues, then again so am I&lt;/li&gt;&lt;li&gt;Very cool 3D high-def stuff, very fast, very cool looking stuff&lt;/li&gt;&lt;li&gt;Java 6 update 10 preview release&lt;/li&gt;&lt;li&gt;JavaFX Desktop SDK EAP (July)&lt;/li&gt;&lt;li&gt;JavaFX Desktop 1.0 (Fall)&lt;/li&gt;&lt;li&gt;JavaFX Mobile and TV (Spring 2009)&lt;/li&gt;&lt;li&gt;Glassfish V3 Kernal&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;98KB&lt;/li&gt;&lt;li&gt;Modular Design&lt;/li&gt;&lt;li&gt;Okay I'm a glassfish fanboy&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;48,000,000 JRE downloads a month&lt;/li&gt;&lt;li&gt;Project Hydrazine&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Find&lt;/li&gt;&lt;li&gt;Merge&lt;/li&gt;&lt;li&gt;Deploy&lt;/li&gt;&lt;li&gt;Share&lt;/li&gt;&lt;li&gt;Monetize&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Project Insight&lt;/li&gt;&lt;ul&gt;&lt;li&gt;JavaFX platform will have "Instrumentation", the ability to monitor data of users and passing data to users.&lt;/li&gt;&lt;li&gt;I don't really understand what that means.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Holy Crap, Neil Young is up on stage&lt;/li&gt;&lt;ul&gt;&lt;li&gt;He's talking about how the Blue Ray sound is so much superior to anything prior&lt;/li&gt;&lt;li&gt;He's wearing shades, what the...&lt;/li&gt;&lt;li&gt;That was very cool suff, best Blue Ray Demo Ever&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5035358000171545600-8767648492125034970?l=capitalcodemonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/f7GusQQ5XUKBBOKCYFhvlNsTTEI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/f7GusQQ5XUKBBOKCYFhvlNsTTEI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/f7GusQQ5XUKBBOKCYFhvlNsTTEI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/f7GusQQ5XUKBBOKCYFhvlNsTTEI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://capitalcodemonkey.blogspot.com/feeds/8767648492125034970/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5035358000171545600&amp;postID=8767648492125034970" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/8767648492125034970?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/8767648492125034970?v=2" /><link rel="alternate" type="text/html" href="http://capitalcodemonkey.blogspot.com/2008/05/javaone-day-1-tuesday-keynote.html" title="JavaOne: Day 1 (Tuesday): Keynote" /><author><name>iamsteveholmes</name><uri>http://www.blogger.com/profile/00043395071742403238</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_4bzFoZkOdKE/SRd4tFCTwfI/AAAAAAAAAG0/wlkbAwJOEx0/S220/Steve_SouthPark.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CkMGR3YycCp7ImA9WxZbGUo.&quot;"><id>tag:blogger.com,1999:blog-5035358000171545600.post-1782373474106587785</id><published>2008-04-23T09:51:00.000-07:00</published><updated>2008-04-23T10:07:06.898-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-23T10:07:06.898-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="hudson" /><category scheme="http://www.blogger.com/atom/ns#" term="continuous integration" /><category scheme="http://www.blogger.com/atom/ns#" term="Grails" /><category scheme="http://www.blogger.com/atom/ns#" term="CDR" /><title>Deploying Grails and Hudson on OracleAS 10g R3</title><content type="html">I recently had to deploy &lt;a href="https://hudson.dev.java.net/"&gt;Hudson&lt;/a&gt; (the open-source continuous integration server) and &lt;a href="http://code.google.com/p/configuration-data-repository"&gt;CDR &lt;/a&gt;(a Grails application I built using Grails 1.0.1) at a client site onto OC4J 10g R3.  As many of you old timey Grails developers may know Oracle is documented as having class loading issues with Grails applications.   These issues are captured in an &lt;a href="http://www.oracle.com/technology/pub/articles/grall-grails.html"&gt;Oracle article&lt;/a&gt; written back in 2006.  The fix, as documented by this article, is to set the deployment plan to "Search local classes first".&lt;br /&gt;&lt;br /&gt;Ironically, my Grails application would not load with these settings.  So I tried loading it without changing the deployment plan and Viola!  It loaded with no issues.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.oracle.com/technology/pub/articles/grall-grails.html"&gt;article&lt;/a&gt; did go to some good use, however.  Hudson would not load without changing the setting to "Search local classes first."&lt;br /&gt;&lt;br /&gt;Be warned, the current configuration UI is not identical to the one in the article.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5035358000171545600-1782373474106587785?l=capitalcodemonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HBfGK6xL3G8Xz6g_T4hntZSZvsU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HBfGK6xL3G8Xz6g_T4hntZSZvsU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HBfGK6xL3G8Xz6g_T4hntZSZvsU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HBfGK6xL3G8Xz6g_T4hntZSZvsU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://capitalcodemonkey.blogspot.com/feeds/1782373474106587785/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5035358000171545600&amp;postID=1782373474106587785" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/1782373474106587785?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/1782373474106587785?v=2" /><link rel="alternate" type="text/html" href="http://capitalcodemonkey.blogspot.com/2008/04/deploying-grails-and-hudson-on-oracleas.html" title="Deploying Grails and Hudson on OracleAS 10g R3" /><author><name>iamsteveholmes</name><uri>http://www.blogger.com/profile/00043395071742403238</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_4bzFoZkOdKE/SRd4tFCTwfI/AAAAAAAAAG0/wlkbAwJOEx0/S220/Steve_SouthPark.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CkMASHk_fSp7ImA9WxZbGUo.&quot;"><id>tag:blogger.com,1999:blog-5035358000171545600.post-707935713167140963</id><published>2008-04-22T11:42:00.000-07:00</published><updated>2008-04-23T10:07:29.745-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-23T10:07:29.745-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Servlet Container" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="J2EE" /><category scheme="http://www.blogger.com/atom/ns#" term="Jetty" /><category scheme="http://www.blogger.com/atom/ns#" term="Solaris" /><title>Creating multiple Jetty Server instances</title><content type="html">&lt;p&gt;For my current project I was required to create multiple Jetty Server instances to run different applications and I found the documentation to be lacking.&lt;br /&gt;It's possible that someone documented this somewhere but I couldn't find much info using the normal channels (google searches, etc).&lt;br /&gt;I'm very hopeful that this will start some conversation and people will let me know if there are better ways to do this.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;We're running Jetty on a Solaris 10 instance which I access using SSH.  The requirements I had were:&lt;br /&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Jetty had to run in a shell-less mode.  Meaning that when I logged out the server didn't shut down.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I needed multiple instances of the Server to run different applications.&lt;br /&gt;It wasn't required for them to run in seperate JVMs which frankly I have yet to try.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Running Jetty shell-less is as simple as using the jetty.sh start script.  This is probably obvious to old-time Jetty&lt;br /&gt;users but it took me some researching to find this out.  Starting Jetty this way requires you to be in the $JETTY_HOME directory and sexecute the script as follows:&lt;/p&gt;&lt;p&gt;&lt;code&gt;./bin/jetty.sh start&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;This is a fairly useful script and you can view other useful commands by typing:&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;./bin/jetty.sh&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;&lt;/code&gt;...which will spit out all the usable commands.&lt;/p&gt;&lt;p&gt;Well that was easy enough, so how about starting multiple instances?  Jetty uses the jetty.xml file (sometimes refered to generically as &lt;span style="font-style: italic;"&gt;config.xml&lt;/span&gt;) found in the $JETTY_HOME/&lt;span style="font-style: italic;"&gt;etc &lt;/span&gt;directory as the default configuration file for the server.  You can override the default and pass in multiple files from the command line just by typing their path after the start command:&lt;/p&gt;&lt;p&gt;&lt;code&gt;./bin/jetty.sh start $JETTY_HOME/env/foo.xml $JETTY_HOME/env/bar.xml &lt;/code&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;What will Jetty do with two configuration files?  Well there is line very early in each &lt;span style="font-style: italic;"&gt;config.xml&lt;/span&gt; file that identifies the server instance:&lt;br /&gt;&lt;code&gt;&lt;configure id="Server" class="org.mortbay.jetty.Server"&gt;&lt;/configure&gt;&lt;/code&gt;If the id for each file is the same then Jetty will combine both files.  If they are different then Jetty creates multiple instances.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;So I created a new file called jetty-cdr-instance.xml by copying the jetty.xml file.  The first thing I did was change the line above:&lt;/p&gt;&lt;configure id="CDRServer" class="org.mortbay.jetty.Server"&gt;&lt;/configure&gt;&lt;p&gt;After that all you have to do is look through the file and change ports or whatever other setting you need or want to change.  I changed the port from 8080 to 8081 and changed all the other ports (not sure if I needed to):&lt;br /&gt;&lt;/p&gt;&lt;code&gt;&amp;lt;call name="addConnector"&amp;gt;&lt;br /&gt;&amp;lt;arg&amp;gt;&lt;br /&gt;&amp;lt;new class="org.mortbay.jetty.nio.SelectChannelConnector"&amp;gt;&lt;br /&gt;&amp;lt;set name="port"&amp;gt;&amp;lt;systemproperty name="jetty.port" default="8081"&amp;gt;&amp;lt;/systemproperty&amp;gt;&lt;br /&gt;&amp;lt;set name="maxIdleTime"&amp;gt;30000&amp;lt;/set&amp;gt;&lt;br /&gt;&amp;lt;set name="Acceptors"&amp;gt;2&amp;lt;/set&amp;gt;&lt;br /&gt;&amp;lt;set name="statsOn"&amp;gt;false&amp;lt;/set&amp;gt;&lt;br /&gt;&amp;lt;set name="confidentialPort"&amp;gt;9453&amp;lt;/set&amp;gt;&lt;br /&gt;&amp;lt;set name="lowResourcesConnections"&amp;gt;5000&amp;lt;/set&amp;gt;&lt;br /&gt;&amp;lt;set name="lowResourcesMaxIdleTime"&amp;gt;5000&amp;lt;/set&amp;gt;&lt;br /&gt;&amp;lt;/set&amp;gt;&lt;br /&gt;&amp;lt;/new&amp;gt;&lt;br /&gt;&amp;lt;/arg&amp;gt;&amp;lt;/call&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;p&gt;There are a number of other settings that can be configured but one that is important is where to find deployment archives (WAR files).  By default Jetty looks into the $JETTY_HOME/webapps directory, which is fine for the default instance.  But for my second instance I want to deploy different apps so I created a webapps2 directory and changed the configuration setting:&lt;/p&gt;&lt;code&gt;&amp;lt;call name="addLifeCycle"&amp;gt;&lt;br /&gt;&amp;lt;arg&amp;gt;&lt;br /&gt;&amp;lt;new class="org.mortbay.jetty.deployer.WebAppDeployer"&amp;gt;&lt;br /&gt;&amp;lt;set name="contexts"&amp;gt;&amp;lt;ref id="Contexts"&amp;gt;&amp;lt;/ref&amp;gt;&lt;br /&gt;&amp;lt;set name="webAppDir"&amp;gt;&amp;lt;systemproperty name="jetty.home" default="."&amp;gt;/webapps2&amp;lt;/systemproperty&amp;gt;&lt;br /&gt;&amp;lt;set name="parentLoaderPriority"&amp;gt;false&amp;lt;/set&amp;gt;&lt;br /&gt;&amp;lt;set name="extract"&amp;gt;true&amp;lt;/set&amp;gt;&lt;br /&gt;&amp;lt;set name="allowDuplicates"&amp;gt;false&amp;lt;/set&amp;gt;&lt;br /&gt;&amp;lt;set name="defaultsDescriptor"&amp;gt;&amp;lt;systemproperty name="jetty.home" default="."&amp;gt;/etc/webdefault.xml&amp;lt;/systemproperty&amp;gt;&lt;br /&gt;&amp;lt;/set&amp;gt;&lt;br /&gt;&amp;lt;/set&amp;gt;&lt;br /&gt;&amp;lt;/set&amp;gt;&amp;lt;/new&amp;gt;&amp;lt;/arg&amp;gt;&amp;lt;/call&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;And that's about it!  So now if I feed both files at the command line I get two server instances, one running on the default port 8080 and the other 8081 and each running the applications in their respective webAppDir directory.  But what if I don't want to pass the file names in the command line?&lt;br /&gt;&lt;p&gt;  &lt;span style="font-style: italic;"&gt;I'm sure there is a better way to do this, probably involving the jetty.conf file, but I was unable to find sufficient documentation&lt;/span&gt;.  In the jetty.sh script you will find the lines:&lt;br /&gt;&lt;/p&gt;&lt;code&gt;#####################################################&lt;br /&gt;# Run the standard server if there's nothing else to run&lt;br /&gt;#####################################################&lt;br /&gt;if [ -z "$CONFIGS" ]&lt;br /&gt;then&lt;br /&gt;CONFIGS="${JETTY_HOME}/etc/jetty.xml"&lt;br /&gt;fi&lt;/code&gt;&lt;br /&gt;&lt;p&gt;I changed:&lt;/p&gt;&lt;p&gt;&lt;code&gt;CONFIGS="${JETTY_HOME}/etc/jetty.xml"&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;to:&lt;/p&gt;&lt;p&gt;  &lt;code&gt;CONFIGS="${JETTY_HOME}/etc/jetty.xml ${JETTY_HOME}/etc/jetty-cdr-instance.xml"&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;and now by simply typing:&lt;/p&gt;&lt;p&gt;&lt;code&gt;./bin/jetty.sh&lt;span style="font-family:Georgia,serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;&lt;span style="font-family:Georgia,serif;"&gt;&lt;/span&gt;&lt;/code&gt;I get both instances running.&lt;br /&gt;&lt;/p&gt;And that's it!  I'm still pretty new to administering Jetty so if you know better ways to handle these things please let me know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5035358000171545600-707935713167140963?l=capitalcodemonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/f5N3xVAXxyKRTldFG0vrOJ0xuw0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/f5N3xVAXxyKRTldFG0vrOJ0xuw0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/f5N3xVAXxyKRTldFG0vrOJ0xuw0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/f5N3xVAXxyKRTldFG0vrOJ0xuw0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://capitalcodemonkey.blogspot.com/feeds/707935713167140963/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5035358000171545600&amp;postID=707935713167140963" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/707935713167140963?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/707935713167140963?v=2" /><link rel="alternate" type="text/html" href="http://capitalcodemonkey.blogspot.com/2008/04/creating-multiple-jetty-server.html" title="Creating multiple Jetty Server instances" /><author><name>iamsteveholmes</name><uri>http://www.blogger.com/profile/00043395071742403238</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_4bzFoZkOdKE/SRd4tFCTwfI/AAAAAAAAAG0/wlkbAwJOEx0/S220/Steve_SouthPark.jpg" /></author><thr:total>5</thr:total></entry><entry gd:etag="W/&quot;C0cFRnwyfSp7ImA9WxZbFk4.&quot;"><id>tag:blogger.com,1999:blog-5035358000171545600.post-4460049665967716944</id><published>2008-04-16T11:05:00.000-07:00</published><updated>2008-04-19T11:50:17.295-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-19T11:50:17.295-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Groovy" /><category scheme="http://www.blogger.com/atom/ns#" term="configuration management" /><category scheme="http://www.blogger.com/atom/ns#" term="CMDB" /><category scheme="http://www.blogger.com/atom/ns#" term="Grails" /><title>CDR (Configuration Data Repository) Open Sourced!</title><content type="html">This is big news for me as CDR is the first application that Delegata has open sourced.  It was also my first stab at using Grails for a project that is being used in production.&lt;br /&gt;&lt;br /&gt;CDR is an extremely simple Configuration Management Database.  It is meant to be a starting point for an organization that is taking the initial steps toward getting their Configuration Management under control.  As such, it's not meant to compete with the big CMDB vendors in features and functionality (yet).&lt;br /&gt;&lt;br /&gt;I'm building CDR using the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Grails 1.01&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Jsecurity Plugin (the latest 0.2 snapshot)&lt;/li&gt;&lt;li&gt;Jasper Reports Plugin (0.7.5)&lt;/li&gt;&lt;li&gt;WebTest Plugin(0.3)&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;I'm hoping to post in the coming weeks about some of my experiences, work-arounds, etc.&lt;br /&gt;&lt;br /&gt;Delegata released it under the new BSD license so it can pretty much be used by whoever wants it for whatever purpose they have for it.  Our goal is by open sourcing this product, it will continue to bring value to or clients beyond the initial release as they will be able to take advantage of any improvements made by me or anyone else.&lt;br /&gt;&lt;br /&gt;I am still actively developing CDR, adding tests of all sorts, making UI improvements, and enhancing functionality.  The source is available at:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/configuration-data-repository/"&gt;http://code.google.com/p/configuration-data-repository/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5035358000171545600-4460049665967716944?l=capitalcodemonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/rfMXFmi0PqX-lM8mO_Vm9SB2FPE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rfMXFmi0PqX-lM8mO_Vm9SB2FPE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/rfMXFmi0PqX-lM8mO_Vm9SB2FPE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rfMXFmi0PqX-lM8mO_Vm9SB2FPE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://capitalcodemonkey.blogspot.com/feeds/4460049665967716944/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5035358000171545600&amp;postID=4460049665967716944" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/4460049665967716944?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/4460049665967716944?v=2" /><link rel="alternate" type="text/html" href="http://capitalcodemonkey.blogspot.com/2008/04/cdr-configuration-data-repository-open.html" title="CDR (Configuration Data Repository) Open Sourced!" /><author><name>iamsteveholmes</name><uri>http://www.blogger.com/profile/00043395071742403238</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_4bzFoZkOdKE/SRd4tFCTwfI/AAAAAAAAAG0/wlkbAwJOEx0/S220/Steve_SouthPark.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0YGSHo5cCp7ImA9WxZbE0s.&quot;"><id>tag:blogger.com,1999:blog-5035358000171545600.post-6904914387869789</id><published>2008-04-16T11:01:00.000-07:00</published><updated>2008-04-16T11:05:29.428-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-16T11:05:29.428-07:00</app:edited><title>My latest Blog design, not my first...</title><content type="html">Nor will it be my last.  I've changed the template a half dozen times already and I'm still not satisfied.  The designs are creative but they never really represent my work or myself in any significant way...oh well...I'm sure I'll have a new one next month.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5035358000171545600-6904914387869789?l=capitalcodemonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/mrSWTzcP79ND1ln2kTnRvNLTbto/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mrSWTzcP79ND1ln2kTnRvNLTbto/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/mrSWTzcP79ND1ln2kTnRvNLTbto/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mrSWTzcP79ND1ln2kTnRvNLTbto/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://capitalcodemonkey.blogspot.com/feeds/6904914387869789/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5035358000171545600&amp;postID=6904914387869789" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/6904914387869789?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/6904914387869789?v=2" /><link rel="alternate" type="text/html" href="http://capitalcodemonkey.blogspot.com/2008/04/my-latest-blog-design-not-my-first.html" title="My latest Blog design, not my first..." /><author><name>iamsteveholmes</name><uri>http://www.blogger.com/profile/00043395071742403238</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_4bzFoZkOdKE/SRd4tFCTwfI/AAAAAAAAAG0/wlkbAwJOEx0/S220/Steve_SouthPark.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DEAMRHw9eip7ImA9WB9UF0k.&quot;"><id>tag:blogger.com,1999:blog-5035358000171545600.post-44883609081335139</id><published>2007-12-04T13:46:00.000-08:00</published><updated>2007-12-15T11:26:25.262-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-12-15T11:26:25.262-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="Groovy" /><category scheme="http://www.blogger.com/atom/ns#" term="Struts" /><category scheme="http://www.blogger.com/atom/ns#" term="Grails" /><title>The Joy of Grails</title><content type="html">It's important for developers to have confidence in the tools they use.   For years I have been building web applications using Struts (the 1.x branch).  The nice thing about Struts is that there are examples for almost everything you need to do.  The bad part is that the examples are spread around the internet and the many, many books on Struts (about 3 of which I personally own).  Many of the examples are out of date, there is almost no interaction with the developers or the user community, and if something isn't working properly, you basically have to find a work-around.   I'm not confident that my issues will be fixed prior to releasing my own project.  This isn't a knock at the developers who freely contribute their time, but the platform as a whole was in no way a joy to work with.&lt;br /&gt;&lt;br /&gt;Grails has excellent documentation with A User's Guide, Reference Guide, Quickstart guide, tutorials, you name it.  With Grails, I can jump on the Nabble forum and have complete confidence that others will help me to find an answer.  Graeme Rocher (Grails Project Lead) and other contributors are extremely active on the user group.  In addition, I now have complete confidence that bugs will be fixed timely.  I submitted a fairly serious bug about not being able to instantiate Domain objects in integration tests.  The latest Release Candidate fixed the problem less than two weeks after I submitted it.  In truth, it had probably been fixed long before in the nightly builds but two weeks is a dream come true for my framework of choice.  The result is a platform that I have enough confidence in to recommend within my organization and for our clients.&lt;br /&gt;&lt;br /&gt;This is the way open source ought to be.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5035358000171545600-44883609081335139?l=capitalcodemonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/440a1ovXHmgduXHy9z_mBd8LWTE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/440a1ovXHmgduXHy9z_mBd8LWTE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/440a1ovXHmgduXHy9z_mBd8LWTE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/440a1ovXHmgduXHy9z_mBd8LWTE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://capitalcodemonkey.blogspot.com/feeds/44883609081335139/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5035358000171545600&amp;postID=44883609081335139" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/44883609081335139?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/44883609081335139?v=2" /><link rel="alternate" type="text/html" href="http://capitalcodemonkey.blogspot.com/2007/12/joy-of-grails.html" title="The Joy of Grails" /><author><name>iamsteveholmes</name><uri>http://www.blogger.com/profile/00043395071742403238</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_4bzFoZkOdKE/SRd4tFCTwfI/AAAAAAAAAG0/wlkbAwJOEx0/S220/Steve_SouthPark.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;C08GRHY-eCp7ImA9WxZbE08.&quot;"><id>tag:blogger.com,1999:blog-5035358000171545600.post-6137993602508182626</id><published>2007-12-03T17:53:00.000-08:00</published><updated>2008-04-15T21:57:05.850-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-15T21:57:05.850-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="california" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>Blog Purpose</title><content type="html">&lt;p&gt;I've never done any blogging because I didn't see the point of it.  I get plenty of value from reading other blogs, primarily Java or other technical blogs, but why bother?&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I'm planning on using this blog as a source of documenting my work with various technologies that I'm using to "deliver solutions" to clients, which, as an employee of &lt;a href="http://www.delegata.com/"&gt;Delegata&lt;/a&gt;, is primarily California State Agencies. Anyone who knows me knows I do more than my fair share of complaining about the government (particularly the government of California, my beloved home).  So I figure it's my duty to use tools, technologies, patterns and processes that enable State Agencies to  accomplish the work they have been tasked to do by the legislature and the people of this State.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;I'm also  hoping to inspire some dialog with others who have a similar purpose within their organization. By sharing experiences, perhaps others will find my experiences useful for whatever problems they are trying to solve.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;And maybe there's other benefits I'm just not seeing at this point...&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5035358000171545600-6137993602508182626?l=capitalcodemonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/gpt6vKeUA2aX1TdBk75JiKI3yZE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gpt6vKeUA2aX1TdBk75JiKI3yZE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/gpt6vKeUA2aX1TdBk75JiKI3yZE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gpt6vKeUA2aX1TdBk75JiKI3yZE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://capitalcodemonkey.blogspot.com/feeds/6137993602508182626/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5035358000171545600&amp;postID=6137993602508182626" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/6137993602508182626?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5035358000171545600/posts/default/6137993602508182626?v=2" /><link rel="alternate" type="text/html" href="http://capitalcodemonkey.blogspot.com/2007/12/blog-purpose.html" title="Blog Purpose" /><author><name>iamsteveholmes</name><uri>http://www.blogger.com/profile/00043395071742403238</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_4bzFoZkOdKE/SRd4tFCTwfI/AAAAAAAAAG0/wlkbAwJOEx0/S220/Steve_SouthPark.jpg" /></author><thr:total>0</thr:total></entry></feed>

