<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Dan Lynn&#187; danlynn.com &#8211; Finding adventure in just about everything</title>
	<atom:link href="http://danlynn.com/author/admin/feed/" rel="self" type="application/rss+xml" />
	<link>http://danlynn.com</link>
	<description>Finding adventure in just about everything</description>
	<lastBuildDate>Thu, 17 Jun 2010 16:47:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Change your current Grails version with a simple shell script</title>
		<link>http://danlynn.com/general/change-your-current-grails-version-with-a-simple-shell-script/</link>
		<comments>http://danlynn.com/general/change-your-current-grails-version-with-a-simple-shell-script/#comments</comments>
		<pubDate>Thu, 17 Jun 2010 16:40:26 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://danlynn.com/?p=138</guid>
		<description><![CDATA[Working with applications on multiple versions of Grails can be a pain. First you have to set your GRAILS_HOME environment variable, and then you have to make sure that the grails shell script (or grails.bat) is in your path. Since I have to switch versions frequently, I whipped up a simple shell script to make [...]]]></description>
			<content:encoded><![CDATA[<p>Working with applications on multiple versions of <a href="http://grails.org/" target="blank">Grails</a> can be a pain. First you have to set your GRAILS_HOME environment variable, and then you have to make sure that the grails shell script (or grails.bat) is in your path. Since I have to switch versions frequently, I whipped up a simple shell script to make this easy. This is *nix specific (and may even be bash-specific), but it works for me.</p>
<h2>Usage</h2>
<pre class="brush: bash;">
$ ./setGrailsVersion 1.3.2
$ grails
Welcome to Grails 1.3.2 - http://grails.org/
Licensed under Apache Standard License 2.0
.......

$ ./setGrailsVersion 1.2.2
$ grails
Welcome to Grails 1.2.2 - http://grails.org/
Licensed under Apache Standard License 2.0
.......
</pre>
<h2>Prerequisites:</h2>
<ul>
<li>Unzip your versions of grails side-by-side in a known directory. I use ~/grailsBase, so a valid install would be ~/grailsBase/grails-1.3.2</li>
<li>Leave your GRAILS_HOME environment variable set to ~/grailsBase/grails</li>
<li>Leave your PATH environment variable with an entry to ~/grailsBase/grails/bin</li>
<li>Save this script along side your installs. For me, this means I save it at ~/grailsBase/setGrailsVersion.sh
</ul>
<h2>Script:</h2>
<pre class="brush: bash;">
#!/bin/sh

##
## Switches grails versions by changing the the symlink ~/grails to a
## ~/grails-$VERSION
##
## Author: Dan Lynn (dan@danlynn.com)
##

if [ -z &quot;$1&quot; ]; then
	cat &lt;&lt;End-of-message
Usage:
	$0 [version]

The version argument must be a valid grails installation and comes in the standard grails versioning scheme.

Examples:
	$0 1.3.2
	$0 1.2.2

End-of-message

	exit 1
fi

DIRNAME=`dirname &quot;$0&quot;`
NEW_GRAILS_HOME=&quot;$DIRNAME/grails-$1&quot;

if [ ! -d $NEW_GRAILS_HOME ]; then
	echo &quot;$NEW_GRAILS_HOME doesn't exist!&quot; &gt;&amp;2
	exit 1
fi

rm &quot;$DIRNAME/grails&quot;
ln -s $NEW_GRAILS_HOME &quot;$DIRNAME/grails&quot;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://danlynn.com/general/change-your-current-grails-version-with-a-simple-shell-script/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Serving Grails static content with UI-Performance and Cloud Foundry</title>
		<link>http://danlynn.com/grails/serving-grails-static-content-with-ui-performance-and-cloud-foundry/</link>
		<comments>http://danlynn.com/grails/serving-grails-static-content-with-ui-performance-and-cloud-foundry/#comments</comments>
		<pubDate>Sun, 14 Feb 2010 23:54:18 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[Grails]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[cloud foundry]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[ebs]]></category>
		<category><![CDATA[ec2]]></category>
		<category><![CDATA[gzip]]></category>
		<category><![CDATA[images]]></category>
		<category><![CDATA[j2ee]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[static content]]></category>
		<category><![CDATA[ui performance]]></category>

		<guid isPermaLink="false">http://danlynn.com/?p=98</guid>
		<description><![CDATA[I am excited about Cloud Foundry. It promises to greatly simplify java application deployment to Amazon&#8217;s Elastic Compute Cloud (EC2). With a few clicks, you can deploy an J2EE application (e.g. Grails) to the container of your choice (Tomcat 5.5, tc Server, and more) on a fresh EC2 Linux instance backed by a MySQL database on Amazon&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>I am excited about <a href="http://www.cloudfoundry.com/" target="_blank">Cloud Foundry</a>. It promises to greatly simplify java application deployment to<a href="http://aws.amazon.com/ec2/" target="_blank"> Amazon&#8217;s Elastic Compute Cloud</a> (EC2). With a few clicks, you can deploy an J2EE application (e.g. <a href="http://grails.org/" target="_blank">Grails</a>) to the container of your choice (<a href="http://tomcat.apache.org/" target="_blank">Tomcat 5.5</a>, <a href="http://www.springsource.com/products/tcserver" target="_blank">tc Server</a>, and more) on a fresh EC2 Linux instance backed by a MySQL database on <a href="http://aws.amazon.com/ebs/" target="_blank">Amazon&#8217;s Elastic Block Store</a> (EBS). It doesn&#8217;t get much easier than this. The instance configuration automatically configures your container behind an Apache instance, which gives you some great options for hosting static content or configuring side-by-side application platforms.</p>
<p>I&#8217;ve been using <a href="http://burtbeckwith.com/blog/" target="_blank">Burt Beckwith</a>&#8217;s <a href="http://www.grails.org/plugin/ui-performance" target="_blank">UI Performance</a> plugin for Grails to bundle and compress my static content (images, js, css) during the build, so I can save on outbound bandwith and improve the response time of my application. In order to take advantage of this build-time optimization, <strong>we need to modify the Apache configuration to serve static content instead of proxying those requests to the container.</strong></p>
<ol>
<li><span style="font-family: Courier, monospace">$ grails install-plugin ui-performance</span></li>
<li>Configure your app to use the plugin&#8217;s taglibs and to bundle resources if necessary. (See <a href="http://www.grails.org/plugin/ui-performance" target="_blank">http://www.grails.org/plugin/ui-performance</a>)</li>
<li>Add a handler for the <span style="font-family: Courier, monospace">CreateWarEnd</span> event in your <span style="font-family: Courier, monospace">scripts/Events.groovy</span> file (make one if you don&#8217;t have one). This handler will package all the bundled and gzipped resources into a static zip file that you can upload to Cloud Foundry:
<pre class="brush: groovy;">
eventCreateWarEnd = {warName, stagingDir -&gt;
    def directory = new File(warName).parent

    ant.zip(destfile:&quot;${directory}/static.zip&quot;) {
        fileset(dir:&quot;${stagingDir}&quot;) {
            include name: &quot;images/**&quot;
            include name: &quot;css/**&quot;
            include name: &quot;js/**&quot;
        }
    }
}
</pre>
</li>
<li>Create a &#8220;container initialization script&#8221; for Cloud Foundry to execute when your instance starts up. This script will tell Apache to directly serve the following directories and to add the appropriate Content-Encoding header for content that is already gzipped. The name doesn&#8217;t really matter at this point, but I called mine <span style="font-family: Courier, monospace">proxyexcludes.sh</span>.
<pre class="brush: groovy;">
cat &gt; /etc/httpd/conf.d/_proxyexcludes.conf &lt;&lt;END
ProxyPass /images !
ProxyPass /css !
ProxyPass /js !

SetEnvIf Request_URI &quot;\\.gz\\.(css|js|jpg|gif|png|ico)\$&quot; already_compressed=true
Header set Content-Encoding gzip env=already_compressed
END
</pre>
<p>I found that keeping this file up to date was easier if I just let grails rebuild it every time after the WAR is created. I modified my <span style="font-family: Courier, monospace">eventCreateWarEnd</span> handler to take care of this for me:</p>
<pre class="brush: groovy; highlight: [13,14,15,16,17,18,19,20,21];">
eventCreateWarEnd = {warName, stagingDir -&gt;
    def directory = new File(warName).parent

    ant.zip(destfile:&quot;${directory}/static.zip&quot;) {
        fileset(dir:&quot;${stagingDir}&quot;) {
            include name: &quot;images/**&quot;
            include name: &quot;css/**&quot;
            include name: &quot;js/**&quot;
        }
    }

    ant.echo &quot;Creating Proxy exclusion list: ${directory}/proxyexcludes.sh&quot;
    new File(&quot;${directory}/proxyexcludes.sh&quot;) &lt;&lt; &quot;&quot;&quot;cat &gt; /etc/httpd/conf.d/_proxyexcludes.conf &lt;&lt;END
ProxyPass /images !
ProxyPass /css !
ProxyPass /js !

SetEnvIf Request_URI &quot;\\.gz\\.(css|js|jpg|gif|png|ico)\$&quot; already_compressed=true
Header set Content-Encoding gzip env=already_compressed
END
&quot;&quot;&quot;

}
</pre>
</li>
<li><span style="font-family: Courier, monospace">$ grails war</span></li>
<li>Upload the static.zip file produced during the build as &#8220;static content&#8221; when you upload your app to Cloud Foundry:
<p><div id="attachment_117" class="wp-caption alignnone" style="width: 310px"><a href="http://danlynn.com/wp-content/cloud_foundry_static_content.jpg"><img class="size-medium wp-image-117" title="Cloud Foundry Upload Static Content" src="http://danlynn.com/wp-content/cloud_foundry_static_content-300x58.jpg" alt="" width="300" height="58" /></a><p class="wp-caption-text">Cloud Foundry Upload Static Content</p></div></li>
<li>When creating a deployment, upload your &#8220;proxyexcludes.sh&#8221; container initialization script:
<p><div id="attachment_114" class="wp-caption alignnone" style="width: 310px"><a href="http://danlynn.com/wp-content/cloud_foundry_init_script.jpg"><img class="size-medium wp-image-114" title="Cloud Foundry Deployment" src="http://danlynn.com/wp-content/cloud_foundry_init_script-300x89.jpg" alt="" width="300" height="89" /></a><p class="wp-caption-text">Cloud Foundry Deployment</p></div></li>
<li>Fire up your instance and check out the performance gains!</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://danlynn.com/grails/serving-grails-static-content-with-ui-performance-and-cloud-foundry/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Server-side Prototype JS in classic ASP</title>
		<link>http://danlynn.com/general/server-side-prototype-js-in-classic-asp/</link>
		<comments>http://danlynn.com/general/server-side-prototype-js-in-classic-asp/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 22:48:08 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[asp]]></category>
		<category><![CDATA[classic]]></category>
		<category><![CDATA[iis]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[jscript]]></category>
		<category><![CDATA[prototype]]></category>

		<guid isPermaLink="false">http://danlynn.com/?p=87</guid>
		<description><![CDATA[Back in 2007, I found myself doing a lot of classic ASP work in VBScript. For anyone who has had to endure this, I created a library to help you out (released under the MIT open source license). Since classic ASP runs under Microsoft Active Scripting, this means you can write ASP pages in page [...]]]></description>
			<content:encoded><![CDATA[<p>Back in 2007, I found myself doing a lot of classic ASP work in VBScript. For anyone who has had to endure this, <a href="/aspprototype/" target="_self">I created a library to help you out</a> (released under the MIT open source license). Since classic ASP runs under <a href="http://en.wikipedia.org/wiki/Active_Scripting" target="_blank">Microsoft Active Scripting</a>, this means you can write ASP pages in page in any supported scripting language; I&#8217;ve even gotten <a href="http://python.org/" target="_blank">Python</a> working under classic ASP.  The library allows you to use a more functional programming idiom on the server-side, thanks the <a href="http://prototypejs.org/" target="_blank">Prototype</a> library and JScript, a supported scripting language. I&#8217;ve merely reposted my original version, but I plan to update it to the latest version of the Prototype library and move the code to either GitHub or Google Code. Until then, <a href="/aspprototype/" target="_self">give it a shot</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://danlynn.com/general/server-side-prototype-js-in-classic-asp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Verified by Visa&#8217;s insecure password requirements</title>
		<link>http://danlynn.com/general/verified-by-visas-insecure-password-requirements/</link>
		<comments>http://danlynn.com/general/verified-by-visas-insecure-password-requirements/#comments</comments>
		<pubDate>Wed, 18 Nov 2009 19:37:17 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://danlynn.com/?p=63</guid>
		<description><![CDATA[Several retailers have signed up for Visa&#8217;s Verified by Visa program, which adds an additional step to the familiar online credit card process. Theoretically, this step makes the transaction more secure by allowing you to specify and use a password in addition to the usual details like &#8220;name on card&#8221; and &#8220;billing address&#8221;. Unfortunately their [...]]]></description>
			<content:encoded><![CDATA[<p>Several retailers have signed up for Visa&#8217;s <a href="https://usa.visa.com/personal/security/vbv/index.html" target="_blank">Verified by Visa</a> program, which adds an additional step to the familiar online credit card process. Theoretically, this step makes the transaction more secure by allowing you to specify and use a password in addition to the usual details like &#8220;name on card&#8221; and &#8220;billing address&#8221;. Unfortunately their password requirements are terrible. Passwords must contain <strong>at least 6 characters</strong> and <strong>at most 8 characters</strong>, must contain <strong>at least one letter</strong> and <strong>at least one number</strong> and <strong>no special characters allowed</strong>.</p>
<p>Here is their javascript password validator:</p>
<pre class="brush: jscript;">

if( (/\W/).test(document.passwdForm.pin1.value) || (document.passwdForm.pin1.value.length &lt; 6) || (document.passwdForm.pin1.value.length &gt; 8 ) )
{
    alert(&quot;Your password does not conform to the Password Policy. Please try again.&quot;);
    document.passwdForm.pin1.focus();
    return false;
}
</pre>
<p>For a feature that supposedly exists to protect my money on the web, this is just pathetic.</pre>
]]></content:encoded>
			<wfw:commentRss>http://danlynn.com/general/verified-by-visas-insecure-password-requirements/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>No Leonids for Littleton</title>
		<link>http://danlynn.com/photography/no-leonids-for-littleton/</link>
		<comments>http://danlynn.com/photography/no-leonids-for-littleton/#comments</comments>
		<pubDate>Tue, 17 Nov 2009 09:55:57 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[photography]]></category>
		<category><![CDATA[astrophotography]]></category>
		<category><![CDATA[leonids]]></category>
		<category><![CDATA[littleton]]></category>
		<category><![CDATA[meteor shower]]></category>

		<guid isPermaLink="false">http://danlynn.com/?p=54</guid>
		<description><![CDATA[Not wanting to drive outside of the city at 2 AM, I figured I&#8217;d try to catch one or two meteors from The Leonids from my backyard. Sadly, all I got was a pretty indigo sky and some nice looking stars. Until next time&#8230;
]]></description>
			<content:encoded><![CDATA[<p>Not wanting to drive outside of the city at 2 AM, I figured I&#8217;d try to catch one or two meteors from <a href="http://en.wikipedia.org/wiki/Leonids">The Leonids</a> from my backyard. Sadly, all I got was a pretty indigo sky and some nice looking stars. Until next time&#8230;</p>
<div id="attachment_55" class="wp-caption alignnone" style="width: 310px"><a href="http://danlynn.com/wp-content/no-meteors-1024x681.jpg" target="_blank"><img class="size-medium wp-image-55" style="border:none" title="no-leonids-for-littleton" src="http://danlynn.com/wp-content/no-meteors-300x199.jpg" alt="No Leonids for Littleton" width="300" height="199" /></a><p class="wp-caption-text">No Leonids for Littleton</p></div>
]]></content:encoded>
			<wfw:commentRss>http://danlynn.com/photography/no-leonids-for-littleton/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Groovy deserialization troubles</title>
		<link>http://danlynn.com/general/groovy-deserialization-troubles/</link>
		<comments>http://danlynn.com/general/groovy-deserialization-troubles/#comments</comments>
		<pubDate>Thu, 05 Nov 2009 18:06:47 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[blob]]></category>
		<category><![CDATA[deserialization]]></category>
		<category><![CDATA[deserialize]]></category>
		<category><![CDATA[gorm]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[serialize]]></category>

		<guid isPermaLink="false">http://danlynn.com/?p=48</guid>
		<description><![CDATA[In a grails application, I needed to persist a complicated expression tree to the database, but I didn&#8217;t want to have Hibernate generate a database table for the information as it would greatly affect read performance (lots of joins) and I don&#8217;t need to have relational access to subsets of the tree. I decided to [...]]]></description>
			<content:encoded><![CDATA[<p>In a <a href="http://www.grails.org/" target="_blank">grails</a> application, I needed to persist a complicated expression tree to the database, but I didn&#8217;t want to have Hibernate generate a database table for the information as it would greatly affect read performance (lots of joins) and I don&#8217;t need to have relational access to subsets of the tree. I decided to serialize the entire tree into a BLOB.</p>
<p>After creating a <a href="https://www.hibernate.org/73.html" target="_blank">Hibernate userType</a> to handle the serialization/deserialization, I ran into a ClassNotFoundException when attempting to deserialize my object.  I found out that this is due to java using the &#8220;last defined ClassLoader&#8221; when deserializing with an ObjectInputStream, which might not be the right ClassLoader in a Groovy environment (see: <a href="http://jira.codehaus.org/browse/GROOVY-1627" target="_blank">http://jira.codehaus.org/browse/GROOVY-1627</a>.</p>
<p>The solution? <strong>Subclass ObjectInputStream</strong> to allow you to pass in a predefined ClassLoader and override the resolveClass(ObjectStream classDesc) to use this ClassLoader parameter:</p>
<pre class="brush: java;">

public class ClassLoaderAwareObjectInputStream extends ObjectInputStream {

 private ClassLoader myClassLoader;

 public ClassLoaderAwareObjectInputStream(ClassLoader myClassLoader) throws IOException, SecurityException {
 super();
 this.myClassLoader = myClassLoader;
 }

 public ClassLoaderAwareObjectInputStream(InputStream in, ClassLoader myClassLoader) throws IOException {
 super(in);
 this.myClassLoader = myClassLoader;
 }

 @Override
 protected Class resolveClass(ObjectStreamClass desc) throws IOException,
 ClassNotFoundException {
 String name = desc.getName();
 return Class.forName(name, false, myClassLoader);
 }
}
</pre>
<p>Thanks to <a href="http://satish.name/?p=66" target="_blank">Satish Gunnu</a> for the tip.</p>
]]></content:encoded>
			<wfw:commentRss>http://danlynn.com/general/groovy-deserialization-troubles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Why I choose to run linux</title>
		<link>http://danlynn.com/general/why-i-choose-to-run-linux/</link>
		<comments>http://danlynn.com/general/why-i-choose-to-run-linux/#comments</comments>
		<pubDate>Tue, 27 Oct 2009 20:42:57 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://danlynn.com/?p=33</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<div id="attachment_34" class="wp-caption alignnone" style="width: 438px"><img class="size-full wp-image-34" title="autorestart" src="http://danlynn.com/wp-content/uploads/autorestart.jpg" alt="Automatic Updates automatically restarts your computer for you" width="428" height="178" /><p class="wp-caption-text">Automatic Updates automatically restarts your computer for you</p></div>
]]></content:encoded>
			<wfw:commentRss>http://danlynn.com/general/why-i-choose-to-run-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Grails GORM and UUIDs</title>
		<link>http://danlynn.com/grails/grails-gorm-and-uuids/</link>
		<comments>http://danlynn.com/grails/grails-gorm-and-uuids/#comments</comments>
		<pubDate>Tue, 27 Oct 2009 18:53:47 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[Grails]]></category>

		<guid isPermaLink="false">http://danlynn.com/?p=39</guid>
		<description><![CDATA[Let&#8217;s say that you&#8217;ve decided you want to add a globally-unique identifier (GUID/UUID) to one of your domain classes. You might want to do this for portability to other systems or for a variety of reasons. Given that some people in the Grails community don&#8217;t recommend using a UUID or string as a primary key, [...]]]></description>
			<content:encoded><![CDATA[<p>Let&#8217;s say that you&#8217;ve decided you want to add a globally-unique identifier (GUID/UUID) to one of your domain classes. You might want to do this for portability to other systems or for a variety of reasons. Given that <a href="http://www.nabble.com/String-as-PK-td25030884.html">some people in the Grails community</a> don&#8217;t recommend using a UUID or string as a primary key, you might find that you want to add a UUID as a separate <a href="http://en.wikipedia.org/wiki/Natural_key">natural key</a> to your class and set it using GORM&#8217;s <a href="http://docs.codehaus.org/display/GRAILS/GORM+-+Events">beforeInsert</a> event hook:</p>
<pre class="brush: groovy; light: true;">
class Person {
    String name
    String uniqueIdentifier

    transient beforeInsert = {
        uniqueIdentifier = java.util.UUID.randomUUID().toString()
    }
}
</pre>
<p>This works great, but if you&#8217;re like me, in that you like to work with test data while developing, you probably have some code in your BootStrap.groovy file that no longer works. The problem is that GORM&#8217;s validate() method does not call event hooks, and that property we just added is not nullable. One small change and we&#8217;re back in business:</p>
<pre class="brush: groovy; highlight: [6]; light: true;">
class Person {
    String name
    String uniqueIdentifier

    stating constraints = {
        uniqueIdentifier(nullable:true)
    }

    transient beforeInsert = {
        uniqueIdentifier = java.util.UUID.randomUUID().toString()
    }
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://danlynn.com/grails/grails-gorm-and-uuids/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Happiness is a 3-minute build</title>
		<link>http://danlynn.com/general/happiness-is-a-3-minute-build/</link>
		<comments>http://danlynn.com/general/happiness-is-a-3-minute-build/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 14:20:37 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[continuous integration]]></category>
		<category><![CDATA[liquibase]]></category>

		<guid isPermaLink="false">http://danlynn.com/?p=27</guid>
		<description><![CDATA[We just recently moved our continuous integration server to new hardware and removed a costly database comparison step, which shortened our build time from 10 minutes to less than 3. Half the time is spent on unit tests, and we include a build versioning step which prepares every build for potential release.
Cutting those seven minutes [...]]]></description>
			<content:encoded><![CDATA[<p>We just recently moved our <a href="http://en.wikipedia.org/wiki/Continuous_integration" target="_blank">continuous integration</a> server to new hardware and removed a costly database comparison step, which shortened our build time from 10 minutes to less than 3. Half the time is spent on unit tests, and we include a build versioning step which prepares every build for potential release.</p>
<p>Cutting those seven minutes out of the feedback loop may not seem like much, but when you consider that we average about 20 builds per day that&#8217;s significant savings, even if there were only one developer waiting on the build results each time. Next up: database versioning using <a href="http://www.liquibase.org/" target="_blank">liquibase</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://danlynn.com/general/happiness-is-a-3-minute-build/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>with spring comes flying weather</title>
		<link>http://danlynn.com/general/swith-spring-comes-flying-weather/</link>
		<comments>http://danlynn.com/general/swith-spring-comes-flying-weather/#comments</comments>
		<pubDate>Tue, 24 Feb 2009 06:17:53 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[paragliding]]></category>

		<guid isPermaLink="false">http://danlynn.com/?p=18</guid>
		<description><![CDATA[I&#8217;m excited for spring to arrive. It&#8217;s been far too long since I&#8217;ve been up in the air without the roar of a jet engine and the annoying beeps and dings of the seatbeat-sign.
]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m excited for spring to arrive. It&#8217;s been far too long since I&#8217;ve been up in the air without the roar of a jet engine and the annoying beeps and dings of the seatbeat-sign.</p>
<div id="attachment_19" class="wp-caption alignnone" style="width: 310px"><img class="size-medium wp-image-19" title="My Wing" src="http://danlynn.com/wp-content/uploads/img_1998-300x200.jpg" alt="My Wing - Advance Epsilon 4" width="300" height="200" /><p class="wp-caption-text">My Wing - Advance Epsilon 4</p></div>
<div id="attachment_20" class="wp-caption alignnone" style="width: 310px"><img class="size-medium wp-image-20" title="Kiting (Boulder - June 2008)" src="http://danlynn.com/wp-content/uploads/img_1999-300x200.jpg" alt="It was too windy to fly that day" width="300" height="200" /><p class="wp-caption-text">It was too windy to fly that day</p></div>
]]></content:encoded>
			<wfw:commentRss>http://danlynn.com/general/swith-spring-comes-flying-weather/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
