<?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/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"><id>tag:blogger.com,1999:blog-4499562010259202212</id><updated>2013-05-21T21:07:58.772-07:00</updated><category term="grails bug workaround" /><category term="grails plugin javascript validation experience" /><category term="groovy interfaces multi methods jruby" /><category term="grails plugins awesomeness" /><category term="java grails hosts ipv6" /><category term="grails groovy iron man" /><category term="grails paypal pro monkey" /><category term="grails plugin javascript validator validation" /><category term="grails job role developer available" /><category term="grails groovy many-to-many collect" /><category term="grails plugin file upload progress bar" /><category term="grails lazy list create dynamic" /><category term="grails validation plugin feeback" /><category term="grails ec2" /><category term="grails live production deployment war size" /><category term="Grails GORM read get" /><category term="amazon RDS stored procedure" /><category term="liferay caching developer mode" /><category term="extra" /><category term="grails" /><category term="grails urlmapping homepage" /><category term="grails plugin community ebook pdf stamper" /><category term="grails groovy errors command object or domain object" /><category term="grails groovy book Graeme Rocher" /><category term="grails rails plugins porting" /><category term="grails groovy gotcha detach hibernate transaction" /><category term="grails admin interface" /><category term="ec2 amazon block store s3" /><category term="grails roles cool" /><category term="groovy grails tips top ten" /><category term="grails plugins communtiy give back" /><category term="validator validation grails plugin javascript" /><category term="YAGNI grails agile" /><category term="grails groovy meta programming format name" /><category term="java regular expressions" /><category term="grails taglib decorator" /><category term="new Domain object save many to many grails gorm" /><title type="text">delahuntyware</title><subtitle type="html">Software engineer by day, web ideas maniac by night.
This Blog is about my experience as a web entrepreneur. The tools i use (grails, groovy, java, css, ec2), the problems i solve, the books i read. Basically an over all brain dump... enjoy :)</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.peterdelahunty.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.peterdelahunty.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default?start-index=26&amp;max-results=25" /><author><name>Peter Delahunty</name><uri>http://www.blogger.com/profile/06472770840257045665</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>52</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/Delahuntyware" /><feedburner:info uri="delahuntyware" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry><id>tag:blogger.com,1999:blog-4499562010259202212.post-6940295855182280272</id><published>2013-02-03T18:28:00.000-08:00</published><updated>2013-02-03T18:28:12.862-08:00</updated><title type="text">Grails Error: No thread-bound request found</title><content type="html">&lt;br /&gt;&lt;pre class="default prettyprint prettyprinted" style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 18px; margin-bottom: 10px; max-height: 600px; overflow: auto; padding: 5px; vertical-align: baseline; width: auto;"&gt;&lt;code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;&lt;span class="typ" style="background-color: transparent; border: 0px; color: #2b91af; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;No&lt;/span&gt;&lt;span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"&gt; thread&lt;/span&gt;&lt;span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;-&lt;/span&gt;&lt;span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;bound request found&lt;/span&gt;&lt;span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;:&lt;/span&gt;&lt;span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="typ" style="background-color: transparent; border: 0px; color: #2b91af; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;Are&lt;/span&gt;&lt;span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"&gt; you referring to request attributes outside of an actual web request&lt;/span&gt;&lt;span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;,&lt;/span&gt;&lt;span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="kwd" style="background-color: transparent; border: 0px; color: darkblue; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;or&lt;/span&gt;&lt;span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"&gt; processing a request outside of the originally receiving thread&lt;/span&gt;&lt;span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;?&lt;/span&gt;&lt;span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="typ" style="background-color: transparent; border: 0px; color: #2b91af; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;If&lt;/span&gt;&lt;span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"&gt; you are actually operating within a web request &lt;/span&gt;&lt;span class="kwd" style="background-color: transparent; border: 0px; color: darkblue; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;and&lt;/span&gt;&lt;span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"&gt; still receive &lt;/span&gt;&lt;span class="kwd" style="background-color: transparent; border: 0px; color: darkblue; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;this&lt;/span&gt;&lt;span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"&gt; message&lt;/span&gt;&lt;span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;,&lt;/span&gt;&lt;span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"&gt; your code &lt;/span&gt;&lt;span class="kwd" style="background-color: transparent; border: 0px; color: darkblue; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;is&lt;/span&gt;&lt;span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"&gt; probably running outside of &lt;/span&gt;&lt;span class="typ" style="background-color: transparent; border: 0px; color: #2b91af; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;DispatcherServlet&lt;/span&gt;&lt;span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;/&lt;/span&gt;&lt;span class="typ" style="background-color: transparent; border: 0px; color: #2b91af; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;DispatcherPortlet&lt;/span&gt;&lt;span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;:&lt;/span&gt;&lt;span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="typ" style="background-color: transparent; border: 0px; color: #2b91af; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;In&lt;/span&gt;&lt;span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="kwd" style="background-color: transparent; border: 0px; color: darkblue; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;this&lt;/span&gt;&lt;span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="kwd" style="background-color: transparent; border: 0px; color: darkblue; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;case&lt;/span&gt;&lt;span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;,&lt;/span&gt;&lt;span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="kwd" style="background-color: transparent; border: 0px; color: darkblue; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;use&lt;/span&gt;&lt;span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="typ" style="background-color: transparent; border: 0px; color: #2b91af; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;RequestContextListener&lt;/span&gt;&lt;span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="kwd" style="background-color: transparent; border: 0px; color: darkblue; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;or&lt;/span&gt;&lt;span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="typ" style="background-color: transparent; border: 0px; color: #2b91af; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;RequestContextFilter&lt;/span&gt;&lt;span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"&gt; to expose the current request&lt;/span&gt;&lt;span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Sometime you get this error with spring security. Most common when upgrading grails because all the dependencies have to be re downloaded.&lt;br /&gt;&lt;br /&gt;To fix just clean and compile your grails project. Then run run-app twice. Seem to fix the issue.&lt;img src="http://feeds.feedburner.com/~r/Delahuntyware/~4/vlV_SE4tLwc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.peterdelahunty.com/feeds/6940295855182280272/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4499562010259202212&amp;postID=6940295855182280272" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/6940295855182280272" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/6940295855182280272" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Delahuntyware/~3/vlV_SE4tLwc/grails-error-no-thread-bound-request.html" title="Grails Error: No thread-bound request found" /><author><name>Peter Delahunty</name><uri>http://www.blogger.com/profile/06472770840257045665</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.peterdelahunty.com/2013/02/grails-error-no-thread-bound-request.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4499562010259202212.post-2276684312317269482</id><published>2013-02-03T16:55:00.000-08:00</published><updated>2013-02-03T16:55:49.047-08:00</updated><title type="text">403 AWS elastics bean stalk</title><content type="html">This is for anyone having a problem with seeing 403 errors on AWS.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-NmHxx1lWiVM/UQ8FelEev5I/AAAAAAAAB1w/YVRVc1Slpj4/s1600/Screen+Shot+2013-02-04+at+11.09.08+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="256" src="http://3.bp.blogspot.com/-NmHxx1lWiVM/UQ8FelEev5I/AAAAAAAAB1w/YVRVc1Slpj4/s320/Screen+Shot+2013-02-04+at+11.09.08+AM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The problem is when your&amp;nbsp;minimum&amp;nbsp;number of instances does not match the availability Zone number. So if one of your instances goes down in the AZ the load balancer seems to still try to send connections to it and that strangely results in a 403.&lt;br /&gt;&lt;br /&gt;So it is easily fixed. Just make sure your min instance count number matches the Any values eg&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Min instance count = 1&lt;br /&gt;AZ = Any1&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Min instance count = 2&lt;br /&gt;AZ = Any2&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Min instance count = 3&lt;br /&gt;AZ = Any3&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hope this helps someone. It was a pain for me to track this down.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;P&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/Delahuntyware/~4/EToG1QEDuJ8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.peterdelahunty.com/feeds/2276684312317269482/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4499562010259202212&amp;postID=2276684312317269482" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/2276684312317269482" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/2276684312317269482" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Delahuntyware/~3/EToG1QEDuJ8/403-aws-elastics-bean-stalk.html" title="403 AWS elastics bean stalk" /><author><name>Peter Delahunty</name><uri>http://www.blogger.com/profile/06472770840257045665</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-NmHxx1lWiVM/UQ8FelEev5I/AAAAAAAAB1w/YVRVc1Slpj4/s72-c/Screen+Shot+2013-02-04+at+11.09.08+AM.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.peterdelahunty.com/2013/02/403-aws-elastics-bean-stalk.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4499562010259202212.post-4039706427151738351</id><published>2011-08-29T18:43:00.000-07:00</published><updated>2011-08-29T18:48:09.834-07:00</updated><title type="text">My latest Web service is LIVE</title><content type="html">It's been a while since i last posted. But i have been busy working on this new service.
&lt;br /&gt;
&lt;br /&gt;&lt;a href="http://www.hugglehub.com"&gt;http://www.hugglehub.com&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;The service is all about making it easy to share you photos with your parents. 
&lt;br /&gt;
&lt;br /&gt;Check it out let me know what you think.&lt;img src="http://feeds.feedburner.com/~r/Delahuntyware/~4/ZxCT-KJ5RLo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.peterdelahunty.com/feeds/4039706427151738351/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4499562010259202212&amp;postID=4039706427151738351" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/4039706427151738351" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/4039706427151738351" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Delahuntyware/~3/ZxCT-KJ5RLo/my-latest-web-service-is-live.html" title="My latest Web service is LIVE" /><author><name>Peter Delahunty</name><uri>http://www.blogger.com/profile/06472770840257045665</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>3</thr:total><feedburner:origLink>http://blog.peterdelahunty.com/2011/08/my-latest-web-service-is-live.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4499562010259202212.post-8116998172964427547</id><published>2011-05-16T06:54:00.001-07:00</published><updated>2011-05-16T07:01:20.647-07:00</updated><title type="text">User tracking logging in Grails</title><content type="html">Hi peeps&lt;br /&gt;&lt;br /&gt;Thought i would just do a quick post about how to create a custom logging filter for logging which pages a user went to.&lt;br /&gt;&lt;br /&gt;First setup log4j config to add a new apppender nd logger called utlog (usage tracking)&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; def utLog = "${System.properties.getProperty('catalina.base')}${File.separator}logs${File.separator}utlog.log"  &lt;br /&gt; println utLog  &lt;br /&gt; log4j = {  &lt;br /&gt;  appenders {  &lt;br /&gt;   rollingFile name: 'utlog', file: utLog, layout: pattern(conversionPattern: '%d{dd-MM-yyyy HH:mm:ss,SSS}|%p|%c{1}|%X{userId}|%X{sessionId}|%m%n'), maxFileSize: '10MB', threshold: org.apache.log4j.Level.DEBUG  &lt;br /&gt;   console name: 'stdout', layout:pattern(conversionPattern: '%d{dd-MM-yyyy HH:mm:ss,SSS}|%p|%c{1}|%X{userId}|%X{sessionId}|%m%n'), threshold: org.apache.log4j.Level.DEBUG  &lt;br /&gt;  }  &lt;br /&gt;  error 'org.codehaus.groovy.grails.web.servlet', // controllers  &lt;br /&gt;      'org.codehaus.groovy.grails.web.pages', // GSP  &lt;br /&gt;      'org.codehaus.groovy.grails.web.sitemesh', // layouts  &lt;br /&gt;      'org.codehaus.groovy.grails.web.mapping.filter', // URL mapping  &lt;br /&gt;      'org.codehaus.groovy.grails.web.mapping', // URL mapping  &lt;br /&gt;      'org.codehaus.groovy.grails.commons', // core / classloading  &lt;br /&gt;      'org.codehaus.groovy.grails.plugins', // plugins  &lt;br /&gt;      'org.codehaus.groovy.grails.orm.hibernate', // hibernate integration  &lt;br /&gt;      'org.springframework',  &lt;br /&gt;      'org.hibernate',  &lt;br /&gt;      'net.sf.ehcache.hibernate'  &lt;br /&gt;  warn 'org.mortbay.log'    &lt;br /&gt;  info utlog: ['ut'],additivity:true  &lt;br /&gt; }  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Next create a filter that uses Spring security plugin to fetch the current logged in user:&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; class UsageTrackingFilters {  &lt;br /&gt;   def springSecurityService  &lt;br /&gt;   private static final Log usagetrackingLog = LogFactory.getLog('ut')  &lt;br /&gt;   def filters = {  &lt;br /&gt;     all(controller: '*', action: '*') {  &lt;br /&gt;       before = {  &lt;br /&gt;         String sessionId = RequestContextHolder.getRequestAttributes()?.getSessionId()  &lt;br /&gt;         if (sessionId) {  &lt;br /&gt;           MDC.put('sessionId', sessionId)  &lt;br /&gt;         }  &lt;br /&gt;         if (springSecurityService.isLoggedIn()) {  &lt;br /&gt;           def userId = springSecurityService.getPrincipal().id  &lt;br /&gt;           MDC.put('userId', userId + "")  &lt;br /&gt;         }else{  &lt;br /&gt;           MDC.put('userId', "0")  &lt;br /&gt;         }  &lt;br /&gt;         usagetrackingLog.info(request.getRequestURI())  &lt;br /&gt;       }  &lt;br /&gt;       after = {  &lt;br /&gt;       }  &lt;br /&gt;       afterView = {  &lt;br /&gt;         MDC.remove('sessionId')  &lt;br /&gt;         MDC.remove('userId')  &lt;br /&gt;       }  &lt;br /&gt;     }  &lt;br /&gt;   }  &lt;br /&gt; }  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That is it&lt;img src="http://feeds.feedburner.com/~r/Delahuntyware/~4/tnBGUcU5FlM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.peterdelahunty.com/feeds/8116998172964427547/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4499562010259202212&amp;postID=8116998172964427547" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/8116998172964427547" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/8116998172964427547" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Delahuntyware/~3/tnBGUcU5FlM/user-tracking-logging-in-grails.html" title="User tracking logging in Grails" /><author><name>Peter Delahunty</name><uri>http://www.blogger.com/profile/06472770840257045665</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>3</thr:total><feedburner:origLink>http://blog.peterdelahunty.com/2011/05/user-tracking-logging-in-grails.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4499562010259202212.post-8277465413015009765</id><published>2011-02-26T20:42:00.000-08:00</published><updated>2011-02-26T20:46:18.878-08:00</updated><title type="text">Setup Amazon linux for Grails</title><content type="html">Install mysql&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;yum install mysql mysql-server mysql-libs&lt;br /&gt;service mysqld start&lt;br /&gt;chkconfig --levels 235 mysqld on&lt;br /&gt;mysql_secure_installation&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Install apache&lt;br /&gt;&lt;br /&gt;sudo yum install httpd httpd-devel&lt;br /&gt;&lt;br /&gt;add /etc/httpd/conf.d/proxy_ajp.conf&lt;br /&gt;&lt;br /&gt;With this in it:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&amp;lt;Ifmodule mod_proxy_ajp.c&amp;gt;&lt;br /&gt;ProxyRequests On&lt;br /&gt;ProxyVia On&lt;br /&gt;&lt;br /&gt;&amp;lt;Location /&amp;gt;&lt;br /&gt;Order allow,deny&lt;br /&gt;Allow from all&lt;br /&gt;ProxyPass ajp://localhost:8009/&lt;br /&gt;ProxyPassReverse ajp://localhost:8009/&lt;br /&gt;&amp;lt;/Location&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/Ifmodule&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/Delahuntyware/~4/k-k-NDGMszg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.peterdelahunty.com/feeds/8277465413015009765/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4499562010259202212&amp;postID=8277465413015009765" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/8277465413015009765" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/8277465413015009765" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Delahuntyware/~3/k-k-NDGMszg/setup-amazon-linux-for-grails.html" title="Setup Amazon linux for Grails" /><author><name>Peter Delahunty</name><uri>http://www.blogger.com/profile/06472770840257045665</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://blog.peterdelahunty.com/2011/02/setup-amazon-linux-for-grails.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4499562010259202212.post-4024927640372038250</id><published>2010-10-20T05:11:00.000-07:00</published><updated>2010-10-20T05:16:48.467-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Grails GORM read get" /><title type="text">Grails GORM trick: Use read() rather than get() on updates</title><content type="html">Hi&lt;br /&gt;&lt;br /&gt;So i discovered that it might be a good idea use read() on your update method.&lt;br /&gt;&lt;br /&gt;So use &lt;br /&gt;&lt;br /&gt;def person = Person.read(params.id)&lt;br /&gt;&lt;br /&gt;instead of &lt;br /&gt;&lt;br /&gt;def person = Person.get(params.id)&lt;br /&gt;&lt;br /&gt;The consequence of this is that hibernate dirty checking is turned off. So to save your domain object you MUST call save(). So if you cancel the update for any reason without calling save() you do not have to to worry about grails persisting things automatically due to dirty checking :)&lt;br /&gt;&lt;br /&gt;Hope this helps&lt;img src="http://feeds.feedburner.com/~r/Delahuntyware/~4/4qiQBajUCWo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.peterdelahunty.com/feeds/4024927640372038250/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4499562010259202212&amp;postID=4024927640372038250" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/4024927640372038250" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/4024927640372038250" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Delahuntyware/~3/4qiQBajUCWo/grails-gorm-trick-use-read-rather-than.html" title="Grails GORM trick: Use read() rather than get() on updates" /><author><name>Peter Delahunty</name><uri>http://www.blogger.com/profile/06472770840257045665</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>3</thr:total><feedburner:origLink>http://blog.peterdelahunty.com/2010/10/grails-gorm-trick-use-read-rather-than.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4499562010259202212.post-1175116450649423509</id><published>2010-10-17T19:03:00.000-07:00</published><updated>2010-10-17T19:26:16.985-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="new Domain object save many to many grails gorm" /><title type="text">GORM gotcha: Many to Many mapping causing new Domain to be saved</title><content type="html">Hi All&lt;br /&gt;&lt;br /&gt;I came across a new Grails GORM subtle gotcha this week.&lt;br /&gt;&lt;br /&gt;I was creating a new Domain object and it was still getting persisted to the database even though i was not calling save().&lt;br /&gt;&lt;br /&gt;This is not normal behavior for NEW objects. As you may or may not be aware this is the behavior when updating objects though. So i was quite surprised by this and did some trials in trying to fix the problem.&lt;br /&gt;&lt;br /&gt;First calling discard() on my NEW object was the first try. But that was a guess and i knew really it would not work. Because that object not yet associated with the session. And it didn't. So i finally found the problem.&lt;br /&gt;&lt;br /&gt;This was all to do the the many to many relationship that was setup on the domain object.&lt;br /&gt;&lt;br /&gt;So for example i have somethings like this:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;class Location {&lt;br /&gt;&lt;br /&gt;static hasMany = [posters:Poster]&lt;br /&gt;&lt;br /&gt;String name&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class Poster {&lt;br /&gt;&lt;br /&gt;static belongsTo = [Location]&lt;br /&gt;&lt;br /&gt;static hasMany = [locations:Location]&lt;br /&gt;&lt;br /&gt;String name&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So in my controller i allow a user to select multiple locations. These locations all get added to the new Poster in this line of code:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;Poster poster = new Poster(params)&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So if i then have some business logic that decides that i do not want to create this new Poster i just need to not call save right. Turns out that is wrong.&lt;br /&gt;&lt;br /&gt;Because of the many to many relationship between Location and Poster. Poster has been assoiated with the locations. So the locations are now dirty and will get persisted at the end of the transaction. This will cascade to my new Poster and save it.&lt;br /&gt;&lt;br /&gt;So to fix this you need to discard the Location objects so they do not save your Poster object.&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;Poster poster = new Poster(params)&lt;br /&gt;&lt;br /&gt;if(businessLogicValidate() == false){&lt;br /&gt;&lt;br /&gt;poster.locations.each{Location l -&amp;gt;&lt;br /&gt;l.discard();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}else{&lt;br /&gt;&lt;br /&gt;poster.save()&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;Hope this helps someone.&lt;img src="http://feeds.feedburner.com/~r/Delahuntyware/~4/yrY-fgkV5ns" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.peterdelahunty.com/feeds/1175116450649423509/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4499562010259202212&amp;postID=1175116450649423509" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/1175116450649423509" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/1175116450649423509" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Delahuntyware/~3/yrY-fgkV5ns/gorm-gotcha-many-to-many-mapping.html" title="GORM gotcha: Many to Many mapping causing new Domain to be saved" /><author><name>Peter Delahunty</name><uri>http://www.blogger.com/profile/06472770840257045665</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://blog.peterdelahunty.com/2010/10/gorm-gotcha-many-to-many-mapping.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4499562010259202212.post-2032515568081702199</id><published>2010-10-14T03:27:00.001-07:00</published><updated>2010-10-14T03:44:39.681-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="amazon RDS stored procedure" /><title type="text">Stored procedures on Amazon RDS</title><content type="html">Been a long time since i blogged but need to document this pain in the arse.&lt;br /&gt;&lt;br /&gt;So for a new project i need to create a mysql function (same for stored proc) on amazon RDS.&lt;br /&gt;&lt;br /&gt;When i tried to install it i got this error:&lt;br /&gt;&lt;br /&gt;ERROR 1419 (HY000) at line 3: You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)&lt;br /&gt;&lt;br /&gt;So to get them to install you need to set that database parameter to ON. However to do that is not so simple.&lt;br /&gt;&lt;br /&gt;Lucky for you people i have found out how to do it and here are the steps:&lt;br /&gt;&lt;br /&gt;1) Install the RDS CLI tools. I installed these on my EC2 instance.&lt;br /&gt;&lt;br /&gt;Download from here:&lt;br /&gt;http://developer.amazonwebservices.com/connect/entry.jspa?categoryID=294&amp;externalID=2928&lt;br /&gt;&lt;br /&gt;They are java based and so you need have Java running. Plus they need your amazon key and secret key. Once you have them installed following the readme do the following:&lt;br /&gt;&lt;br /&gt;Important!! make sure you set the AWS region you are working in. &lt;br /&gt;Eg export EC2_REGION=ap-southeast-1&lt;br /&gt;&lt;br /&gt;2) create a new parameter group&lt;br /&gt;&lt;br /&gt;rds-create-db-parameter-group peters-params -f mysql5.1 -d "peters params"&lt;br /&gt;&lt;br /&gt;3) modify the log_bin_trust_function_creators to be set to ON&lt;br /&gt;&lt;br /&gt;rds-modify-db-parameter-group peters-params --parameters="name=log_bin_trust_function_creators, value=on, method=immediate"&lt;br /&gt;&lt;br /&gt;4) change your running db instance to use the new param group&lt;br /&gt;&lt;br /&gt;rds-modify-db-instance petersdbinstance --db-parameter-group-name=peters-params&lt;br /&gt;&lt;br /&gt;5) restart the instance &lt;br /&gt;&lt;br /&gt;rds-reboot-db-instance petersdbinstance&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;That will allow you to create a function or stored procedure:&lt;br /&gt;&lt;br /&gt;Some point about the function / stored proc:&lt;br /&gt;&lt;br /&gt;You need to specify the DETERMINISTIC stuff and you need to add a DEFINER=CURRENT_USER&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;DELIMITER $$&lt;br /&gt;DROP FUNCTION IF EXISTS `sayhello`$$&lt;br /&gt;CREATE DEFINER=CURRENT_USER FUNCTION `sayhello`(param1 VARCHAR(120))&lt;br /&gt;       RETURNS VARCHAR(120)&lt;br /&gt;NOT DETERMINISTIC&lt;br /&gt;READS SQL DATA       &lt;br /&gt;BEGIN&lt;br /&gt;RETURN CONCAT('Hello, ',s,'!'); &lt;br /&gt;&lt;br /&gt;END$$&lt;br /&gt;DELIMITER ;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This works for me hope it helps&lt;img src="http://feeds.feedburner.com/~r/Delahuntyware/~4/y3YEmAGYdFw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.peterdelahunty.com/feeds/2032515568081702199/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4499562010259202212&amp;postID=2032515568081702199" title="12 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/2032515568081702199" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/2032515568081702199" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Delahuntyware/~3/y3YEmAGYdFw/stored-procedures-on-amazon-rds.html" title="Stored procedures on Amazon RDS" /><author><name>Peter Delahunty</name><uri>http://www.blogger.com/profile/06472770840257045665</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>12</thr:total><feedburner:origLink>http://blog.peterdelahunty.com/2010/10/stored-procedures-on-amazon-rds.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4499562010259202212.post-1330840508001498293</id><published>2009-11-02T18:42:00.000-08:00</published><updated>2009-11-02T21:29:15.917-08:00</updated><title type="text">how to setup clover with multi-module maven project and build with bamboo</title><content type="html">Ok so i figured how to setup clover with maven on a mulit-module project with putting the config in a maven profile:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&amp;lt;profile&amp;gt;&lt;br /&gt;   &amp;lt;id&amp;gt;clover&amp;lt;/id&amp;gt;&lt;br /&gt;   &amp;lt;build&amp;gt;&lt;br /&gt;       &amp;lt;plugins&amp;gt;&lt;br /&gt;           &amp;lt;plugin&amp;gt;&lt;br /&gt;               &amp;lt;groupId&amp;gt;com.atlassian.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;               &amp;lt;artifactId&amp;gt;maven-clover2-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;               &amp;lt;configuration&amp;gt;&lt;br /&gt;                   &amp;lt;targetPercentage&amp;gt;${clover.coverage.percent}&amp;lt;/targetPercentage&amp;gt;&lt;br /&gt;                   &amp;lt;snapshot&amp;gt;/development/build-server/clover/${groupId}-${artifactId}/clover.snapshot&amp;lt;/snapshot&amp;gt;&lt;br /&gt;                   &amp;lt;generateHtml&amp;gt;true&amp;lt;/generateHtml&amp;gt;&lt;br /&gt;                   &amp;lt;generateXml&amp;gt;true&amp;lt;/generateXml&amp;gt;&lt;br /&gt;                   &amp;lt;baseDir&amp;gt;${project.basedir}&amp;lt;/baseDir&amp;gt;&lt;br /&gt;                   &amp;lt;licenseLocation&amp;gt;/development/build-server/clover/clover.license&amp;lt;/licenseLocation&amp;gt;&lt;br /&gt;               &amp;lt;/configuration&amp;gt;&lt;br /&gt;               &amp;lt;executions&amp;gt;&lt;br /&gt;                         &amp;lt;execution&amp;gt;&lt;br /&gt;                             &amp;lt;id&amp;gt;clover&amp;lt;/id&amp;gt;&lt;br /&gt;                             &amp;lt;goals&amp;gt;&lt;br /&gt;                                 &amp;lt;goal&amp;gt;setup&amp;lt;/goal&amp;gt;&lt;br /&gt;                                 &amp;lt;goal&amp;gt;snapshot&amp;lt;/goal&amp;gt;&lt;br /&gt;                             &amp;lt;/goals&amp;gt;&lt;br /&gt;                         &amp;lt;/execution&amp;gt;&lt;br /&gt;                         &amp;lt;execution&amp;gt;&lt;br /&gt;                             &amp;lt;phase&amp;gt;verify&amp;lt;/phase&amp;gt;&lt;br /&gt;                             &amp;lt;goals&amp;gt;&lt;br /&gt;                                 &amp;lt;goal&amp;gt;aggregate&amp;lt;/goal&amp;gt;&lt;br /&gt;                                 &amp;lt;goal&amp;gt;clover&amp;lt;/goal&amp;gt;&lt;br /&gt;                                 &amp;lt;goal&amp;gt;check&amp;lt;/goal&amp;gt;&lt;br /&gt;                             &amp;lt;/goals&amp;gt;&lt;br /&gt;                         &amp;lt;/execution&amp;gt;&lt;br /&gt;                     &amp;lt;/executions&amp;gt;&lt;br /&gt;           &amp;lt;/plugin&amp;gt;&lt;br /&gt;&lt;br /&gt;       &amp;lt;/plugins&amp;gt;&lt;br /&gt;   &amp;lt;/build&amp;gt;&lt;br /&gt;&amp;lt;/profile&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Simply drop that into your profiles section in your pom. You will need to change the paths of where you have put your clover licence and where you want the snapshots to be stored. Then when you want to run it use this command.&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;mvn -P clover install&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Bamboo&lt;br /&gt;&lt;br /&gt;Setup bamboo as normal but make sure you don't let bamboo clear out your build directory each time or clover won't work. So untick the option to clean out the build directory each time.&lt;img src="http://feeds.feedburner.com/~r/Delahuntyware/~4/xrgwnjAyVzo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.peterdelahunty.com/feeds/1330840508001498293/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4499562010259202212&amp;postID=1330840508001498293" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/1330840508001498293" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/1330840508001498293" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Delahuntyware/~3/xrgwnjAyVzo/how-to-setup-clover-with-multi-module.html" title="how to setup clover with multi-module maven project and build with bamboo" /><author><name>Peter Delahunty</name><uri>http://www.blogger.com/profile/06472770840257045665</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>4</thr:total><feedburner:origLink>http://blog.peterdelahunty.com/2009/11/how-to-setup-clover-with-multi-module.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4499562010259202212.post-2032743209017512603</id><published>2009-10-15T15:13:00.000-07:00</published><updated>2009-10-15T15:24:26.590-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="grails groovy iron man" /><title type="text">Grails: the Iron Man suit for the Tony Stark developer</title><content type="html">Just thought i would put a response together for this post:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://slackhacker.wordpress.com/2009/10/15/the-dark-side-of-grails/"&gt;Grails dark side&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In my opinion the Grails sweet spot is for developers who already have years of experience of building web app with spring/hibernate/sitemesh and java.&lt;br /&gt;&lt;br /&gt;Basically it is the "iron man suit" for an already established "Tony Stark" developer. The iron man suit is at its most powerful when it is controlled by Tony Stark. A man who has years of experience of solving problems. The suit simply enhances him :)&lt;br /&gt;&lt;br /&gt;I have years of experience of using the spring/hibernate/sitemesh/java stack along with deploying java web apps on java app servers.  So Grails is my "Iron Man Suit"&lt;br /&gt;&lt;br /&gt;For me Grails is essentially the same core deployed in the same way. The difference is that Grails + Groovy is literally super glue for these components. Almost like comparing assembling your own Ikea furniture vs carving your own out of wood. Except the end quality is even better.&lt;br /&gt;&lt;br /&gt;So thinking that you can get the absolute most out of Grails without knowing anything about spring or hibernate etc is ignorant. And actually being ignorant of the underline technologies  often leads to assumption that a bug with the underline technology (eg hibernate) is a bug with Grails.&lt;img src="http://feeds.feedburner.com/~r/Delahuntyware/~4/PmaivUib2mA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.peterdelahunty.com/feeds/2032743209017512603/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4499562010259202212&amp;postID=2032743209017512603" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/2032743209017512603" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/2032743209017512603" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Delahuntyware/~3/PmaivUib2mA/grails-iron-man-suit-for-tony-stark.html" title="Grails: the Iron Man suit for the Tony Stark developer" /><author><name>Peter Delahunty</name><uri>http://www.blogger.com/profile/06472770840257045665</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.peterdelahunty.com/2009/10/grails-iron-man-suit-for-tony-stark.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4499562010259202212.post-7621863007202970633</id><published>2009-09-16T16:56:00.000-07:00</published><updated>2009-09-16T17:00:50.279-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="liferay caching developer mode" /><title type="text">Turn off caching in Liferay (development mode)</title><content type="html">Hi All&lt;br /&gt;&lt;br /&gt;Long time no post. But here is a little snippit of a trick I discovered but had to do some serious google searches to find.&lt;br /&gt;&lt;br /&gt;To turn off the liferay caching in Liferay for when you are developing all you have to do is this:&lt;br /&gt;&lt;br /&gt;Find this file:&lt;br /&gt;&lt;br /&gt;$LIFERAY_HOME/tomcat-6.0.18/webapps/ROOT/WEB-INF/classes/portal-developer.properties&lt;br /&gt;&lt;br /&gt;Can copy it and rename it to:&lt;br /&gt;&lt;br /&gt;$LIFERAY_HOME/tomcat-6.0.18/webapps/ROOT/WEB-INF/classes/portal-ext.properties&lt;br /&gt;&lt;br /&gt;This will disable all caching in Liferay such as css, javascript and vm templates.&lt;br /&gt;&lt;br /&gt;Hope this helps.&lt;img src="http://feeds.feedburner.com/~r/Delahuntyware/~4/j-eWgvPLiPU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.peterdelahunty.com/feeds/7621863007202970633/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4499562010259202212&amp;postID=7621863007202970633" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/7621863007202970633" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/7621863007202970633" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Delahuntyware/~3/j-eWgvPLiPU/turn-off-caching-in-liferay-development.html" title="Turn off caching in Liferay (development mode)" /><author><name>Peter Delahunty</name><uri>http://www.blogger.com/profile/06472770840257045665</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>3</thr:total><feedburner:origLink>http://blog.peterdelahunty.com/2009/09/turn-off-caching-in-liferay-development.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4499562010259202212.post-6310580821179119358</id><published>2009-07-21T09:50:00.000-07:00</published><updated>2009-07-21T10:13:18.162-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="grails bug workaround" /><title type="text">Workaround to a nasty Grails 1.1.1 bug</title><content type="html">Hi all&lt;br /&gt;&lt;br /&gt;Just wanted to post quickly about a workaround to a Grails bug I dropped into to my application lately. There seems to some strange problem with Grails not binding the GORM methods to the domain objects intermittently.&lt;br /&gt;Eg horrible errors like this&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;groovy.lang.MissingPropertyException: No such property: save for class: XXXXX&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I only seem to get this problem in production on a Tomcat 6.0 server. I super quick fix that seemed to solve it at the time was to restart the tomcat server after a deployment. But that was too shaky for me.&lt;br /&gt;&lt;br /&gt;Unfortunately is happening on a really important piece of my application. When i take payment. So i end up taking payment via my provider Paypal but not saving the transaction details in my own database.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Anyway after some searching around it seems like the problem it might have been fixed in the upcoming Grails 1.1.2&lt;br /&gt;&lt;br /&gt;But for now this seems to do the trick. Someone posted this quick fix on the forums. The problem is with the hibernate only lazily adding the GORM method and some problem with groovy not recognising them.&lt;br /&gt;&lt;br /&gt;So the trick is to get Hibernate plugin to register them at start up. So in your bootstrap.groovy add the following:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;class BootStrap {&lt;br /&gt;&lt;br /&gt;   def grailsApplication&lt;br /&gt;&lt;br /&gt;   def init = {servletContext -&amp;gt;&lt;br /&gt;&lt;br /&gt;     &lt;br /&gt;       switch (grails.util.GrailsUtil.environment) {&lt;br /&gt;         &lt;br /&gt;           case "production":&lt;br /&gt;               grailsApplication.domainClasses.each{&lt;br /&gt;                   def clazz = it.clazz&lt;br /&gt;                   println "Clazz: $clazz count: " + clazz.count();&lt;br /&gt;               }&lt;br /&gt;           break;&lt;br /&gt;         &lt;br /&gt;           case "development":&lt;br /&gt;               // dev stuff&lt;br /&gt;           break;  &lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This simply calls count on all domain objects and prints out the count. You don't have to print out the count it was just nice for me.&lt;br /&gt;&lt;br /&gt;Hope this helps&lt;img src="http://feeds.feedburner.com/~r/Delahuntyware/~4/OqyTz1UtaCk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.peterdelahunty.com/feeds/6310580821179119358/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4499562010259202212&amp;postID=6310580821179119358" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/6310580821179119358" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/6310580821179119358" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Delahuntyware/~3/OqyTz1UtaCk/workaround-to-nasty-grails-111-bug.html" title="Workaround to a nasty Grails 1.1.1 bug" /><author><name>Peter Delahunty</name><uri>http://www.blogger.com/profile/06472770840257045665</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>6</thr:total><feedburner:origLink>http://blog.peterdelahunty.com/2009/07/workaround-to-nasty-grails-111-bug.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4499562010259202212.post-7003515991423528312</id><published>2009-07-07T02:38:00.000-07:00</published><updated>2009-07-07T04:30:45.638-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="grails job role developer available" /><title type="text">Grails developer available: Get them while there hot</title><content type="html">Hi Peeps&lt;br /&gt;&lt;br /&gt;This is just quick shout out to the community. I will be available to start a Grails contract from 20&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;th&lt;/span&gt; July. So if you have any new cool projects &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_1"&gt;coming&lt;/span&gt; up and are looking for a developer then let me know.&lt;br /&gt;&lt;br /&gt;You can get me on peter.delahunty@gmail.com&lt;img src="http://feeds.feedburner.com/~r/Delahuntyware/~4/yfVMElnaIsc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.peterdelahunty.com/feeds/7003515991423528312/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4499562010259202212&amp;postID=7003515991423528312" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/7003515991423528312" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/7003515991423528312" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Delahuntyware/~3/yfVMElnaIsc/grails-developer-available-get-them.html" title="Grails developer available: Get them while there hot" /><author><name>Peter Delahunty</name><uri>http://www.blogger.com/profile/06472770840257045665</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.peterdelahunty.com/2009/07/grails-developer-available-get-them.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4499562010259202212.post-3087942020607876942</id><published>2009-06-30T01:19:00.000-07:00</published><updated>2009-12-04T17:07:45.219-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="grails ec2" /><title type="text">Deploying a Grails app on EC2 from scratch.</title><content type="html">Hi All&lt;br /&gt;&lt;br /&gt;Ok so i have found some time write up how to deploy a Grails app onto EC2. This is a step by step guide to setting up Apache, Tomcat, Mysql, Java on an ubuntu Ec2 Box&lt;br /&gt;&lt;br /&gt;For those who do not know. EC2 is Amazon's (that's right the one famous for books) hosting service of its webservice suite. It allows you to run virtual server images on it amazingly scaleable infrastructure. Plus you only pay for what you use. If your server is up for 4 hours you pay for 4 hours. $0.10 per hour (about). You can build your own server as i will show you in the steps below and manange it on their infrastructure.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;These are the steps i have taken and they work for me. I am sure there are hundreds of ways to skin a cat (so the cat skinners say) but this is my way. Take it or leave it :)&lt;br /&gt;&lt;br /&gt;Pre-Requisites&lt;br /&gt;&lt;br /&gt;1) Get Firefox i am sure you have it already if you don't get it you will need it.  As of writing this i am using 3.0.11 &lt;a href="http://www.mozilla-europe.org/en/firefox/"&gt;download here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2) Install the EC2 Firefox plugin (Elasticfox)  &lt;a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=609"&gt;download here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;3) Install the S3 firefox plugin &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/3247"&gt;download here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4) Open an amazon account. This is a five min job requiring a valid credit card.  Signup &lt;a href="http://aws.amazon.com/"&gt;here&lt;/a&gt;&lt;br /&gt;Once you have an account you then need to open a EC2 account and an S3 account.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;5) Then next step is for you get familiar with the tools. You can do this by following the getting started guides in this ebook.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1797"&gt;Gettings started&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;IMPORTANT !!!&lt;br /&gt;&lt;br /&gt;You need to read the getting started guide and get familiar with things before you read the rest of this blog post. Otherwise it will not make sense. I am assuming from here onwards you have read an tried out the service.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Setting up a server to run a Grails app.&lt;br /&gt;&lt;br /&gt;By now you should have terminated any test instances you had running on EC2 and be ready start a fresh.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;1) Start with a baseline Linux image&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ok i have decided to host my application on Linux basically because there was no descion to be made. I would only ever host a serious website on Linux and never windows.&lt;br /&gt;&lt;br /&gt;The base linux version i used is Ubuntu 8.10 (intrepid) i am also using a 32bit and not 64 bit. You can find the AMI codes here&lt;br /&gt;&lt;br /&gt;&lt;a href="https://help.ubuntu.com/community/EC2StartersGuide"&gt;https://help.ubuntu.com/community/EC2StartersGuide&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I have chosen to go with AMI &lt;span style="font-weight: bold;"&gt;ami-5059be39&lt;/span&gt; because it is based in the US and is 32Bit. If you want to run your servers in Europe then go with this &lt;span style="font-weight: bold;"&gt;ami-80c0e8f4&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ok now you should have a running instance of the ubuntu basic server. Connect to the server using an SSH terminal&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-size:100%;"&gt;Create a directory called downloads in side your home directory /home/ubuntu and cd into it.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;2) Next you want to install Java&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You should be in the downloads directory you created above&lt;br /&gt;&lt;br /&gt;Download java 1.6. Right that now happens to be JDK 6 update 14. To do this i goto the java download &lt;a href="http://java.sun.com/javase/downloads/index.jsp"&gt;website&lt;/a&gt; .&lt;br /&gt;&lt;br /&gt;Choose JDK 6 update 14&lt;br /&gt;Choose linux&lt;br /&gt;Then copy the download link for the NON rpm version the second link&lt;br /&gt;&lt;br /&gt;Now on your EC2 machine run the following command&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;wget &amp;lt;THE JDK DOWNLOAD URL&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This will now download the JDK install file onto the box&lt;br /&gt;&lt;br /&gt;NOTE you might want to rename the file:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;mv &amp;lt;NAME OF THE FILE&amp;gt;  jdk-6u14-linux-i586.bin&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Next copy the file to /usr/local&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;sudo cp jdk-6u14-linux-i586.bin /usr/local&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Change the permissions&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;sudo chmod +x jdk-6u14-linux-i586.bin&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Then run the install file&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;sudo ./jdk-6u14-linux-i586.bin&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This should unpack the java file to this directory /usr/local/jdk1.6.0_14&lt;br /&gt;&lt;br /&gt;Next create a symbolic link to the directory called java&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;sudo ln -s /usr/local/jdk1.6.0_14 /usr/local/java&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That is java installed.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;3) Next install MYSQL&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Download mysql via the same way you downloaded java above using wget you get the download link &lt;a href="http://dev.mysql.com/downloads/mysql/5.1.html#linux"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Choose the Linux (x86) download&lt;br /&gt;&lt;br /&gt;Copy the mysql tar file into /usr/local&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;sudo cp mysql-5.1.35-linux-i686-glibc23.tar.gz /usr/local&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Delete any existing mysql directories. (this maybe optional)&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;sudo rm -rf /etc/mysql&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Next follow these commands to install it. IMPORTANT: Don't follow any of the step that are listed by the mysql_install_db script they will be covered later.&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;sudo groupadd mysql&lt;br /&gt;sudo useradd -g mysql mysql&lt;br /&gt;sudo cp mysql-5.1.35-linux-i686-glibc23.tar.gz /usr/local&lt;br /&gt;sudo cd /usr/local&lt;br /&gt;sudo gunzip mysql-5.1.35-linux-i686-glibc23.tar.gz&lt;br /&gt;sudo tar -xvf mysql-5.1.35-linux-i686-glibc23.tar&lt;br /&gt;sudo mv /usr/local/mysql-5.1.35-linux-i686-glibc23 /usr/local/mysql &lt;br /&gt;sudo cd mysql &lt;br /&gt;sudo mkdir logs&lt;br /&gt;sudo chown -R mysql . &lt;br /&gt;sudo chgrp -R mysql . &lt;br /&gt;sudo scripts/mysql_install_db --user=mysql &lt;br /&gt;sudo chown -R root . &lt;br /&gt;sudo chown -R mysql data &lt;br /&gt;sudo bin/mysqld_safe --user=mysql &amp;amp;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Right now you should have running mysql instance&lt;br /&gt;&lt;br /&gt;Copy the standard startup script into the linux startup area&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;sudo cp /usr/local/mysql/support_files/mysql.server /etc/init.d/mysql&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Setup mysql to run at all levels&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;sudo update-rc.d mysql defaults&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Set a root password&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;sudo /usr/local/mysql/bin/mysqladmin -u root password 'new-password'&lt;br /&gt;sudo /usr/local/mysql/bin/mysqladmin -u root -h 'localhost' password 'new-password'&lt;br /&gt; &lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ok now you have a running mysql instance&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;4) Next you want to move the Mysql installation on to an amazon EBS.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You should already know about an EBS from reading the EC2 getting start guide above.&lt;br /&gt;&lt;br /&gt;Create a new EBS using Elastic fox and attach it to your EC2 instance. You will be asked to enter a device when you are attaching the EBS to your running EC2 instance. Enter the following:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;/dev/sdh&lt;br /&gt;  &lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Once you have done that you want to mount and format that diskspace. I am simply following the instructions found &lt;a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1663"&gt;here &lt;/a&gt;but have modified it bit as my paths are different&lt;br /&gt;&lt;br /&gt;Install XFS. This is a secure file system.&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;sudo apt-get install -y xfsprogs&lt;br /&gt;   &lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Setup the mount and fomat the disk&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;sudo modprobe xfs&lt;br /&gt;sudo mkfs.xfs /dev/sdh&lt;br /&gt;&lt;br /&gt;echo "/dev/sdh /vol xfs noatime 0 0" | sudo tee -a /etc/fstab&lt;br /&gt;sudo mkdir /vol&lt;br /&gt;sudo mount /vol&lt;br /&gt;    &lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;You should now have a new filesystem under /vol&lt;br /&gt;&lt;br /&gt;Stop mysql if running&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;sudo /etc/init.d/mysql stop&lt;br /&gt;    &lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Move all the mysql files&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;sudo mkdir -p /vol/usr/local/mysql&lt;br /&gt;&lt;br /&gt;sudo mv /usr/local/mysql /vol/usr/local&lt;br /&gt;     &lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Remount the mysql directory to the volume&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;sudo mkdir /usr/local/mysql&lt;br /&gt;&lt;br /&gt;echo "/vol/usr/local/mysql /usr/local/mysql     none bind" | sudo tee -a /etc/fstab&lt;br /&gt;sudo mount /usr/local/mysql&lt;br /&gt;&lt;br /&gt;      &lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Restart mysql&lt;br /&gt;&lt;br /&gt;Stop mysql if running&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;sudo /etc/init.d/mysql start&lt;br /&gt;     &lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;You now have mysql running from an EBS&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Setup mysql database user and backup script&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;/usr/local/mysql/bin/mysql -p -u root &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;create database &lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;CREATE DATABASE demodb CHARACTER SET utf8 COLLATE utf8_general_ci; &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;create app user and backup user and give access:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;CREATE USER 'demouser'@'localhost' IDENTIFIED BY 'demouser123';&lt;br /&gt;GRANT ALL PRIVILEGES ON demodb.* TO 'demouser'@'localhost' WITH GRANT OPTION;&lt;br /&gt;&lt;br /&gt;CREATE USER 'backup'@'localhost' IDENTIFIED BY 'backup123';&lt;br /&gt;GRANT LOCK TABLES, SELECT ON demodb.* TO 'backup'@'localhost';&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Setup db backup:&lt;br /&gt;&lt;br /&gt;Download the mysql backup script:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;http://sourceforge.net/projects/automysqlbackup/&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;For putting files in s3 use this&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;http://s3tools.org/s3cmd&lt;br /&gt;&lt;br /&gt;apt-get install s3cmd&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;6) Install Tomcat&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is easy to install&lt;br /&gt;Download tomcat 6 into your /home/ubuntu/downloads using wget&lt;br /&gt;Copy the jar file it to /usr/local&lt;br /&gt;&lt;br /&gt;Use the java jar command to unpack tomcat zip&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;sudo /usr/local/java/bin/jar -xvf /usr/local/tomcatXXX.zip&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Create a symbolic link to Tomcat&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;sudo ln -s /usr/local/tomcatXXXX /usr/local/tomcat&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Next create tomcat user to run tomcat&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;sudo groupadd tomcat&lt;br /&gt;sudo useradd -m -s /bin/bash -g tomcat tomcat&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Change to tomcat user and edit the .profile to add java in the PATH&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;sudo su - tomcat&lt;br /&gt;vi /home/tomcat/.profile&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Edit the file using vi to contain&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;export JAVA_HOME=/usr/local/java&lt;br /&gt;PATH=$JAVA_HOME/bin:$PATH&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;configure the server.xml to use an AJP connector to work with apache.&lt;br /&gt;&lt;br /&gt;save your old /usr/local/tomcat/conf/server.xml to server.xml.orig&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;cp /usr/local/tomcat/conf/server.xml /usr/local/tomcat/conf/server.xml.orig&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;edit a new server.xml&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;vi /usr/local/tomcat/conf/server.xml &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;copy this config in there:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&amp;lt;?xml version='1.0' encoding='utf-8'?&amp;gt;&lt;br /&gt;&amp;lt;Server port=&amp;quot;8005&amp;quot; shutdown=&amp;quot;SHUTDOWN&amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;Listener className=&amp;quot;org.apache.catalina.core.AprLifecycleListener&amp;quot; SSLEngine=&amp;quot;on&amp;quot; /&amp;gt;&lt;br /&gt;  &amp;lt;Listener className=&amp;quot;org.apache.catalina.core.JasperListener&amp;quot; /&amp;gt;&lt;br /&gt;  &amp;lt;Listener className=&amp;quot;org.apache.catalina.mbeans.ServerLifecycleListener&amp;quot; /&amp;gt;&lt;br /&gt;  &amp;lt;Listener className=&amp;quot;org.apache.catalina.mbeans.GlobalResourcesLifecycleListener&amp;quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;Service name=&amp;quot;Catalina&amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;!--&lt;br /&gt;    &amp;lt;Connector port=&amp;quot;8080&amp;quot; protocol=&amp;quot;HTTP/1.1&amp;quot;&lt;br /&gt;               connectionTimeout=&amp;quot;20000&amp;quot;&lt;br /&gt;               redirectPort=&amp;quot;8443&amp;quot; /&amp;gt;&lt;br /&gt;        --&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;Connector      port=&amp;quot;8009&amp;quot;&lt;br /&gt;                                protocol=&amp;quot;AJP/1.3&amp;quot;&lt;br /&gt;                                redirectPort=&amp;quot;8443&amp;quot;&lt;br /&gt;                                connectionTimeout=&amp;quot;300000&amp;quot;&lt;br /&gt;                                maxThreads=&amp;quot;200&amp;quot;&lt;br /&gt;                                backlog=&amp;quot;50&amp;quot;&lt;br /&gt;                                enableLookups=&amp;quot;true&amp;quot;&lt;br /&gt;                                emptySessionPath=&amp;quot;true&amp;quot;&lt;br /&gt;&lt;br /&gt;        /&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;Engine name=&amp;quot;Catalina&amp;quot; defaultHost=&amp;quot;localhost&amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;      &amp;lt;Host name=&amp;quot;localhost&amp;quot;  appBase=&amp;quot;webapps&amp;quot;&lt;br /&gt;            unpackWARs=&amp;quot;true&amp;quot; autoDeploy=&amp;quot;true&amp;quot;&lt;br /&gt;            xmlValidation=&amp;quot;false&amp;quot; xmlNamespaceAware=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;      &amp;lt;/Host&amp;gt;&lt;br /&gt;    &amp;lt;/Engine&amp;gt;&lt;br /&gt;  &amp;lt;/Service&amp;gt;&lt;br /&gt;&amp;lt;/Server&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;That is tomcat setup. You can run it if you like to see it working.&lt;br /&gt;&lt;br /&gt;Now just run tomcat&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;sudo su - tomcat&lt;br /&gt;/usr/local/tomcat/bin/startup.sh&lt;br /&gt;      &lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;6) Install Apache&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is easy&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;sudo apt-get install apache2&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Enable AJP mod&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;sudo a2enmod proxy_ajp&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Create a new site to configure AJP with tomcat. You can change the to whatever you want.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;sudo vi /etc/apache2/sites-available/webapp&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;add the following config to link apache to tomcat&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&amp;lt;ifmodule&amp;gt;&lt;br /&gt;ProxyRequests On&lt;br /&gt;ProxyVia On&lt;br /&gt;&lt;br /&gt;&amp;lt;location&amp;gt;&lt;br /&gt;Order allow,deny&lt;br /&gt;Allow from all&lt;br /&gt;ProxyPass ajp://localhost:8009/&lt;br /&gt;ProxyPassReverse ajp://localhost:8009/&lt;br /&gt;&amp;lt;/location&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/ifmodule&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Enable your site&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;sudo a2ensite webapp&lt;br /&gt;  &lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;disable the default apache config&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;sudo a2dissite default&lt;br /&gt;  &lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;start or restart apache&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;sudo /etc/init.d/apache2 restart&lt;br /&gt;   &lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;That is basic apache installed&lt;br /&gt;&lt;br /&gt;To secure apache with basic authenication:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;sudo mkdir /etc/apache2/passwd&lt;br /&gt;cd /etc/apache2/passwd&lt;br /&gt;sudo htpasswd -c site-access &lt;USERNAME&gt;&lt;br /&gt;&lt;ENTER PASSWORD&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;add these lines to the webapp config to secure:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&amp;lt;Location /&amp;gt;&lt;br /&gt;Order allow,deny&lt;br /&gt;Allow from all&lt;br /&gt;&lt;br /&gt;AuthType Basic&lt;br /&gt;AuthName &amp;quot;Restricted area&amp;quot;&lt;br /&gt;AuthUserFile /etc/apache2/passwd/site-access&lt;br /&gt;Require valid-user&lt;br /&gt;&lt;br /&gt;ProxyPass ajp://localhost:8009/&lt;br /&gt;ProxyPassReverse ajp://localhost:8009/&lt;br /&gt;&amp;lt;/Location&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To enable SSL on the apache instance:&lt;br /&gt;&lt;br /&gt;Enable ssl mod&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;sudo a2enmod ssl&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;generate your .key and .crt files. The company who you bought your SSL certs from should tell you how to do this. &lt;br /&gt;&lt;br /&gt;make a new director to put the .key and .crt file in:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;sudo mkdir /etc/apache2/ssl&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;copy the .key and .crt files into that directory. eg:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;/etc/apache2/ssl/www.mydomain.com.crt&lt;br /&gt;/etc/apache2/ssl/www.mydomain.com.key&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Create a new site to configure ssl. &lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;sudo vi /etc/apache2/sites-available/ssl&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;copy this config&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;DocumentRoot /var/www/&lt;br /&gt;&lt;br /&gt;&amp;lt;IfModule mod_proxy_ajp.c&amp;gt;&lt;br /&gt;&lt;br /&gt;ProxyRequests On&lt;br /&gt;ProxyVia On&lt;br /&gt;&lt;br /&gt;&amp;lt;Location /&amp;gt;&lt;br /&gt;Order allow,deny&lt;br /&gt;Allow from all&lt;br /&gt;#AuthType Basic&lt;br /&gt;#AuthName &amp;quot;Restricted area&amp;quot;&lt;br /&gt;#AuthUserFile /etc/apache2/passwd/site-access&lt;br /&gt;#Require valid-user&lt;br /&gt;ProxyPass ajp://localhost:8009/&lt;br /&gt;ProxyPassReverse ajp://localhost:8009/&lt;br /&gt;&amp;lt;/Location&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/IfModule&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;&lt;br /&gt;SSLEngine On&lt;br /&gt;SSLCertificateFile /etc/apache2/ssl/www.mydomain.com.crt&lt;br /&gt;SSLCertificateKeyFile /etc/apache2/ssl/www.mydomain.com.key&lt;br /&gt;&lt;br /&gt;&amp;lt;/IfModule&amp;gt;&lt;br /&gt;&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Just change the paths at the bottom to point to your .crt and .key files.&lt;br /&gt;&lt;br /&gt;Ok few that was long ish for me to write...&lt;br /&gt;&lt;br /&gt;By now you should have Tomcat running with Apache and Mysql. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;UPDATE:&lt;br /&gt;&lt;br /&gt;Extra steps i take for Grails:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.peterdelahunty.com/2009/06/going-live-with-your-grails-app-part-1.html"&gt;Going live with grails&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hope this helps someone....&lt;img src="http://feeds.feedburner.com/~r/Delahuntyware/~4/A9A_BOW-ibM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.peterdelahunty.com/feeds/3087942020607876942/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4499562010259202212&amp;postID=3087942020607876942" title="16 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/3087942020607876942" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/3087942020607876942" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Delahuntyware/~3/A9A_BOW-ibM/deploying-grails-app-on-ec2-in-from.html" title="Deploying a Grails app on EC2 from scratch." /><author><name>Peter Delahunty</name><uri>http://www.blogger.com/profile/06472770840257045665</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>16</thr:total><feedburner:origLink>http://blog.peterdelahunty.com/2009/06/deploying-grails-app-on-ec2-in-from.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4499562010259202212.post-8777226413114187584</id><published>2009-06-29T08:28:00.000-07:00</published><updated>2009-06-29T08:35:06.500-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="grails paypal pro monkey" /><title type="text">Paypal Pro Plugin documentation done</title><content type="html">Hi&lt;br /&gt;&lt;br /&gt;I have release the Paypal Pro plugin. Basically this is NOT a replacement for the existing Grails paypal plugin. It allows you to directly interface with a Paypal &lt;a href="https://www.paypal.com/uk/cgi-bin/webscr?cmd=_wp-pro-overview-outside"&gt;Webpayment Pro&lt;/a&gt; account. This is a service provided by Paypal that you have to pay for each month but it allows you to take payments on your website via forms on your website without the customer ever getting redirected to Paypal.&lt;br /&gt;&lt;br /&gt;The plugin is all working and i have been using it on &lt;a href="http://www.ebookstamper.com"&gt;www.ebookstamper.com&lt;/a&gt; for the last few weeks.&lt;br /&gt;&lt;br /&gt;Check it out here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://grails.org/plugin/paypal-pro"&gt;http://grails.org/plugin/paypal-pro&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Peace&lt;img src="http://feeds.feedburner.com/~r/Delahuntyware/~4/uuvK4kt2Ex4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.peterdelahunty.com/feeds/8777226413114187584/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4499562010259202212&amp;postID=8777226413114187584" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/8777226413114187584" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/8777226413114187584" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Delahuntyware/~3/uuvK4kt2Ex4/paypal-pro-plugin-documentation-done.html" title="Paypal Pro Plugin documentation done" /><author><name>Peter Delahunty</name><uri>http://www.blogger.com/profile/06472770840257045665</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://blog.peterdelahunty.com/2009/06/paypal-pro-plugin-documentation-done.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4499562010259202212.post-1973523215120862842</id><published>2009-06-18T05:01:00.000-07:00</published><updated>2009-06-18T05:14:53.115-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="grails plugin file upload progress bar" /><title type="text">Grails Super File Upload plugin complete and uploaded (mind the pun!)</title><content type="html">Ho ho ho&lt;br /&gt;&lt;br /&gt;I have uploaded and released my latest Grails plugin&lt;br /&gt;&lt;br /&gt;&lt;a href="http://grails.org/plugin/super-file-upload"&gt;Super File Upload&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;Finally you can easily style your file upload control and have a fully working progress bar with it.&lt;br /&gt;&lt;br /&gt;If you want to see it action then head to my new website &lt;a href="http://www.ebookstamper.com/"&gt;www.ebookstamper.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Enjoy :)&lt;img src="http://feeds.feedburner.com/~r/Delahuntyware/~4/z4uPcV6O9B8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.peterdelahunty.com/feeds/1973523215120862842/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4499562010259202212&amp;postID=1973523215120862842" title="12 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/1973523215120862842" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/1973523215120862842" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Delahuntyware/~3/z4uPcV6O9B8/grails-super-file-upload-complete-and.html" title="Grails Super File Upload plugin complete and uploaded (mind the pun!)" /><author><name>Peter Delahunty</name><uri>http://www.blogger.com/profile/06472770840257045665</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>12</thr:total><feedburner:origLink>http://blog.peterdelahunty.com/2009/06/grails-super-file-upload-complete-and.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4499562010259202212.post-3523195346904059272</id><published>2009-06-12T01:36:00.001-07:00</published><updated>2009-06-12T02:15:16.387-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="grails live production deployment war size" /><title type="text">Going live with your Grails app part 1 of X</title><content type="html">So I thought I would right up some problem/solutions I had with deploying a Grails app into production.&lt;br /&gt;&lt;br /&gt;First step is reducing grails WAR file size.&lt;br /&gt;&lt;br /&gt;I have depolyed my latest app &lt;a href="http://www.ebookstamper.com"&gt;http://www.ebookstamper.com&lt;/a&gt; on Amazon EC2 (i will do a later step by step post for EC2 deployment). After a few round trips i realised that i was getting pi**ed off with the time it was taking to upload my 20-30meg war file to my server. So after a bit of digging around on the web and some trial and error I devised a way to reduce my WAR size. Here are the steps below:&lt;br /&gt;&lt;br /&gt;1) Use Tomcat 6.X&lt;br /&gt;I won't bother giving arguments for using Tomcat 6. Let me just say if you are developing a new app then take it from me this is what you want to be using for your app server. I worked on a large project for the last 12 month getting this website live &lt;a href="http://www.carphonewarehouse.com/"&gt;http://www.carphonewarehouse.com/&lt;/a&gt; and we really squeezed out the performace of Tomcat and the sun JDK1.6 with great results.&lt;br /&gt;&lt;br /&gt;2) Set up a shared library in tomcat&lt;br /&gt;&lt;br /&gt;Make a directory called shared/lib under tomcat home directory&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;mkdir -p $TOMCAT_HOME/shared/lib&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;3) Tell tomcat about this lib&lt;br /&gt;&lt;br /&gt;Find the file $TOMCAT_HOME/conf/catalina.properties&lt;br /&gt;&lt;br /&gt;Change this line&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;shared.loader=&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;to&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;shared.loader=${catalina.base}/shared/lib,${catalina.base}/shared/lib/*.jar&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;4) Build your Grails war file&lt;br /&gt;&lt;br /&gt;Ok first off you should build your grails war file as normal to get all the jars.&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;grails war&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Or if you going to deploy the app as root context "/" on tomcat do this&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;grails war ROOT.war&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The main point of this exercise is to have grails build a complete WAR file including all the jar librarys you need. These jars come from all over. Grails home/dist, Grails home/lib, plugins and your app lib. So instead of you manually going to find all these jar files just have grails do it for you.&lt;br /&gt;&lt;br /&gt;So once you have your WAR file you will have all the jars you need for your app inside the war file in WEB-INF/lib.&lt;br /&gt;&lt;br /&gt;5) Copy all the jar files to $TOMCAT_HOME/shared/lib&lt;br /&gt;&lt;br /&gt;So unpack the war file and copy all the jar files to the $TOMCAT_HOME/shared/lib directory you created earlier. My simple technique for this was.&lt;br /&gt;&lt;br /&gt;a) Upload the ROOT.war file to your server and put it in the $TOMCAT_HOME/webapps directory. This way it is one (a big one) file to upload.&lt;br /&gt;&lt;br /&gt;b) Start tomcat and have it deploy your application. This will get tomcat to unpack the war file for you.&lt;br /&gt;&lt;br /&gt;c) Stop tomat then go into the unpacked war lib directory $TOMCAT_HOME/webapps/ROOT/WEB-INF/lib and move all the jar files in there to $TOMCAT_HOME/shared/lib. You can then delete the contents of webapps.&lt;br /&gt;&lt;br /&gt;6) Next build yourself an empty war file&lt;br /&gt;&lt;br /&gt;Now this is the magic bit that i found somewhere out on the web. The --nojars arguement.&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;grails war --nojars ROOT.war&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The --nojars argument will build a grails war file without any jars in the WEB-INF/lib directory in the war file. You should see that this will reduce the war file size by rather pleaseable amount.&lt;br /&gt;&lt;br /&gt;7) Redeploy your new lightweight ROOT.war on tomcat&lt;br /&gt;You can then redeploy your new war on tomcat and have a new working app&lt;br /&gt;&lt;br /&gt;Next time around you only need to build the war without any jar file.&lt;br /&gt;&lt;br /&gt;Now this should be obvious but i will point it out anyway. If you add a new plugin, upgrade grails or add a new lib jar to your app then you should repeat all of this from the start to avoid class not found problems.&lt;br /&gt;&lt;br /&gt;Enjoy&lt;img src="http://feeds.feedburner.com/~r/Delahuntyware/~4/xG9Xv9_Cg5M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.peterdelahunty.com/feeds/3523195346904059272/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4499562010259202212&amp;postID=3523195346904059272" title="12 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/3523195346904059272" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/3523195346904059272" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Delahuntyware/~3/xG9Xv9_Cg5M/going-live-with-your-grails-app-part-1.html" title="Going live with your Grails app part 1 of X" /><author><name>Peter Delahunty</name><uri>http://www.blogger.com/profile/06472770840257045665</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>12</thr:total><feedburner:origLink>http://blog.peterdelahunty.com/2009/06/going-live-with-your-grails-app-part-1.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4499562010259202212.post-1598627038516459411</id><published>2009-06-11T06:21:00.000-07:00</published><updated>2009-06-11T06:55:03.142-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="grails plugins communtiy give back" /><title type="text">Love Grails? Give something back to the community</title><content type="html">Hi All&lt;br /&gt;&lt;br /&gt;Been thinking today how important it to the success of the Grails eco system that people give back as much as they take.  Grails is simply a revolutionary full stack web development framework. It personally saves me so much development time that it is simply my only choice for web development now.&lt;br /&gt;&lt;br /&gt;Anyway I have been using Grails on and off for about 2-3 years. I think is started dabbling with it from version 0.3 but have seen it grow from strength to strength upto its current release of 1.1.1.&lt;br /&gt;&lt;br /&gt;The projects I built in grails were most beta ideas and most never seen light of day. They are in my great ideas hardrive graveyard. Anyway one of them has finally seen the light of day: &lt;a href="http://www.ebookstamper.com"&gt;www.ebookstamper.com &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Throughout the development of this site I came accross a few missing features in grails that I would only have found from building a commercial website. So I decide to build these features myself in the form of a plugin. I have to tell you it one the best decicions i made.&lt;br /&gt;&lt;br /&gt;Grails makes it so easy to create a new plugin and release it that it seem criminal not to. Anyone can apply for a grails plugin developer account and Graeme will probably grant it in 5 mins from his iphone.  Then you can check in your work and hey presto you can call yourself a grails plugin developer.&lt;br /&gt;&lt;br /&gt;So what can a plugin be. Well anything really. Have you written some code in your Grails app that you think can be made more general. Well do it and refactor it out it into a plugin.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Here are some good ideas for plugins:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Wrap an existing java library as a grails plugin. &lt;/span&gt;&lt;br /&gt;There are so many great java libs out there that do specific cool things. Make them available in grails as a plugin. Some good examples of this already are the amazon s3 plugin or the awesome searchable plugin or even the quartz plugin.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Wrap an existing javascript library&lt;/span&gt;&lt;br /&gt;This the same as the java lib example above. There are some many javascript utils out there. If you use one think about making it into a plugin for grails. I did this with the super file upload plugin i wrote. I also see it with the grails ui plugin.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Wrap up a handler for new protocol&lt;/span&gt;&lt;br /&gt;Have you had to write your own protocol handler for your grails app release it as a plugin. New xml protocols come out all the time.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Wrap up some cool algorithim you have written&lt;/span&gt;&lt;br /&gt;So you have written some code that does something cool. If you think it can be useful to someone else then release it as a plugin.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Create a taglib library&lt;/span&gt;&lt;br /&gt;Have you written some cool tag libs that you use again and again. Why not package them up as a plugin. I have done this with my paypal pro plugin. You can use the tag libs to create credit card fields such as country select box, credit card type select box, and expriy date etc&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Finally rememeber, this all about Karma. If you give good things wil always happen in some shape or form.&lt;br /&gt;&lt;br /&gt;So start today: See what code you can give back to your Grails Communtity :)&lt;br /&gt;&lt;br /&gt;Peace&lt;img src="http://feeds.feedburner.com/~r/Delahuntyware/~4/a41hMW52-5Q" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.peterdelahunty.com/feeds/1598627038516459411/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4499562010259202212&amp;postID=1598627038516459411" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/1598627038516459411" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/1598627038516459411" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Delahuntyware/~3/a41hMW52-5Q/love-grails-give-something-back-to.html" title="Love Grails? Give something back to the community" /><author><name>Peter Delahunty</name><uri>http://www.blogger.com/profile/06472770840257045665</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://blog.peterdelahunty.com/2009/06/love-grails-give-something-back-to.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4499562010259202212.post-745227405026189508</id><published>2009-06-11T04:49:00.000-07:00</published><updated>2009-06-11T05:09:02.995-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="grails plugin community ebook pdf stamper" /><title type="text">My new Grails site finally goes live www.ebookstamper.com</title><content type="html">Hi all&lt;br /&gt;&lt;br /&gt;So i finally put my new grails built website live this week.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ebookstamper.com"&gt;http://www.ebookstamper.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The elevator pitch is:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;On demand stamping of PDF ebooks with your customers name and email&lt;/blockquote&gt;&lt;br /&gt;The long description is:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;A web based service providing on demand stamping of PDF ebooks with your customers name and email. Helps protect your intellectual property by providing a deterrent against file sharing.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;People who write ebooks and self publish will know what I am talking about.&lt;br /&gt;&lt;br /&gt;I have been working on it in my spare time (is there such thing as spare time) for the last few months. Recently I took some quality time out and worked on it full time to get it out the door. The good new is that I have developed 4 grails plugins that have come out of building this website.&lt;br /&gt;&lt;br /&gt;I love grails and it has help me so much in getting things out the door as soon as possible so I feel it is only right to give back to the community. So I have released these four plugins:&lt;br /&gt;&lt;br /&gt;These are:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.grails.org/plugin/javascript-validator"&gt;Javascript validator plugin&lt;/a&gt;&lt;br /&gt;&lt;a href="http://grails.org/plugin/grails-template-engine"&gt;Grails template engine&lt;/a&gt; &lt;a href="http://www.grails.org/plugin/javascript-validator"&gt;plugin&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://grails.org/plugin/super-file-upload"&gt;Super file upload &lt;/a&gt;&lt;a href="http://www.grails.org/plugin/javascript-validator"&gt;plugin&lt;/a&gt;&lt;br /&gt;&lt;a href="http://grails.org/plugin/paypal-pro"&gt;Paypal Pro &lt;/a&gt;&lt;a href="http://www.grails.org/plugin/javascript-validator"&gt;plugin&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Although the code for the last 2 is checked in i have not found time to write up the docs. But will get to that asap. If you want to see the Super file upload plugin (SFU) in action go to my new website above and click on the demo button. The styled red browse button you see there is using the SFU plugin. When you upload a PDF you get the upload progress bar showing too.&lt;br /&gt;&lt;br /&gt;Also I am hosting the whole thing on Amazon EC2 so will write up some posts on running grails apps on EC2. Some ticky bits worth documenting.&lt;br /&gt;&lt;br /&gt;Peace...&lt;img src="http://feeds.feedburner.com/~r/Delahuntyware/~4/0mo1vkhbSKQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.peterdelahunty.com/feeds/745227405026189508/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4499562010259202212&amp;postID=745227405026189508" title="8 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/745227405026189508" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/745227405026189508" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Delahuntyware/~3/0mo1vkhbSKQ/my-new-grails-site-finally-goes-live.html" title="My new Grails site finally goes live www.ebookstamper.com" /><author><name>Peter Delahunty</name><uri>http://www.blogger.com/profile/06472770840257045665</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>8</thr:total><feedburner:origLink>http://blog.peterdelahunty.com/2009/06/my-new-grails-site-finally-goes-live.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4499562010259202212.post-8231507137221493106</id><published>2009-05-27T06:38:00.000-07:00</published><updated>2009-05-27T06:44:41.563-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="grails admin interface" /><title type="text">Instant Admin Interface with Grails 1.1</title><content type="html">Hi All&lt;br /&gt;&lt;br /&gt;I think I have just had a great idea for an instant admin interface for my new Grails app. I have almost completed my new web app and was just thinking that I could really do with simple admin interface. So I came up with this idea.&lt;br /&gt;&lt;br /&gt;I can pull out my current domain classes out into a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;plugin&lt;/span&gt;.  I can then install this &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;plugin&lt;/span&gt; into the main application. Then the main app is back to normal&lt;br /&gt;&lt;br /&gt;Then i can create a new app called XXX-admin. I then install the domain classes &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;plugin&lt;/span&gt; into the admin app then generate scaffold controllers/views for the domain.&lt;br /&gt;&lt;br /&gt;This then gives me an instant admin interface.&lt;br /&gt;&lt;br /&gt;Gonna try this out and will write again about how it goes.&lt;br /&gt;&lt;br /&gt;Peace...&lt;img src="http://feeds.feedburner.com/~r/Delahuntyware/~4/Yms_LI0W3i8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.peterdelahunty.com/feeds/8231507137221493106/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4499562010259202212&amp;postID=8231507137221493106" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/8231507137221493106" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/8231507137221493106" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Delahuntyware/~3/Yms_LI0W3i8/instant-admin-interface-with-grails-11.html" title="Instant Admin Interface with Grails 1.1" /><author><name>Peter Delahunty</name><uri>http://www.blogger.com/profile/06472770840257045665</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>5</thr:total><feedburner:origLink>http://blog.peterdelahunty.com/2009/05/instant-admin-interface-with-grails-11.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4499562010259202212.post-4826549119114859416</id><published>2009-05-26T01:44:00.000-07:00</published><updated>2009-05-26T02:15:06.092-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="grails plugins awesomeness" /><title type="text">Grails magical second act: The plugin ecosystem</title><content type="html">So as you might have gathered I love the Grails framework. The full stack framework is nothing short of magic compared to anything else in its domain. Since the arrival of the core framework (the first act) it has completely transformed my web development: Better, Faster, Smarter,&lt;br /&gt;&lt;br /&gt;Anyway it just occurred to me over the weekend that Grails is &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;in fact&lt;/span&gt; now on its &lt;span style="font-weight: bold;"&gt;second act&lt;/span&gt;. That in someways is more spectacular than the first. So what is this second act that tops the first one.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;plugin&lt;/span&gt; architecture:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I have always thought that the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;plugin&lt;/span&gt; architecture is "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;tres&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;kool&lt;/span&gt;" and I have even written and released my own (&lt;a href="http://www.grails.org/plugin/javascript-validator"&gt;Javascript &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Validator&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://www.grails.org/plugin/grails-template-engine"&gt;Grails Template Engine&lt;/a&gt;). But it wasn't until i used the &lt;a href="http://www.grails.org/plugin/amazon-s3"&gt;S3 &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Plugin&lt;/span&gt;&lt;/a&gt; this weekend that it really dawned on my how powerful the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;plugins&lt;/span&gt; are (and can be).&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://aws.amazon.com/s3/"&gt;S3&lt;/a&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;plugin&lt;/span&gt; is the first "full stack" &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;plugin&lt;/span&gt; that i have used. It comes with a domain class, tag lib and background tasks. All aimed at &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_10"&gt;seamlessly&lt;/span&gt; adding &lt;a href="http://aws.amazon.com/s3/"&gt;S3&lt;/a&gt; support to your application in no time. I took me about 3-4 hours to integrate and test the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;plugin&lt;/span&gt; into my new app.&lt;br /&gt;&lt;br /&gt;With its sync and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;async&lt;/span&gt; modes the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;plugin&lt;/span&gt; is very will written. Also keeping with the Grails philosophy it &lt;span style="font-weight: bold;"&gt;simply sprinkles magic groovy dust&lt;/span&gt; over an existing java framework (&lt;a href="https://jets3t.dev.java.net/"&gt;jets3&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Anyway just thought I would share this with you all. I think that the &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_14"&gt;awesomeness&lt;/span&gt; of the the potential in grails &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;plugins&lt;/span&gt; is just beginning and that we can expect to see some really cool stuff coming.&lt;br /&gt;&lt;br /&gt;Peace...&lt;img src="http://feeds.feedburner.com/~r/Delahuntyware/~4/TBRuP7VO4mc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.peterdelahunty.com/feeds/4826549119114859416/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4499562010259202212&amp;postID=4826549119114859416" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/4826549119114859416" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/4826549119114859416" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Delahuntyware/~3/TBRuP7VO4mc/grails-magical-second-act-plugin.html" title="Grails magical second act: The plugin ecosystem" /><author><name>Peter Delahunty</name><uri>http://www.blogger.com/profile/06472770840257045665</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://blog.peterdelahunty.com/2009/05/grails-magical-second-act-plugin.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4499562010259202212.post-3410555437838068186</id><published>2009-05-21T05:56:00.000-07:00</published><updated>2009-05-21T06:11:10.917-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="grails" /><title type="text">New Grails Plugin Grails Template Engine</title><content type="html">Hello Alpha Geeks&lt;br /&gt;&lt;br /&gt;I put a small grails plugin out today.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.grails.org/plugin/grails-template-engine"&gt;http://www.grails.org/plugin/grails-template-engine&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The plugin simply exposes the GSP render engine as a service for backend GSP template rendering . It also adds a new convenient method to the controllers called renderWithTemplateEngine&lt;br /&gt;&lt;br /&gt;The implementation was mostly lifed from Graeme's mail plugin. Now it is available standalone.&lt;br /&gt;&lt;br /&gt;Hopefully this is useful to someone out there :)&lt;img src="http://feeds.feedburner.com/~r/Delahuntyware/~4/pWszCKWnAKU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.peterdelahunty.com/feeds/3410555437838068186/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4499562010259202212&amp;postID=3410555437838068186" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/3410555437838068186" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/3410555437838068186" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Delahuntyware/~3/pWszCKWnAKU/new-grails-plugin-grails-template.html" title="New Grails Plugin Grails Template Engine" /><author><name>Peter Delahunty</name><uri>http://www.blogger.com/profile/06472770840257045665</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>4</thr:total><feedburner:origLink>http://blog.peterdelahunty.com/2009/05/new-grails-plugin-grails-template.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4499562010259202212.post-8077739526219117360</id><published>2009-05-06T02:29:00.001-07:00</published><updated>2009-05-06T02:45:46.206-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="grails rails plugins porting" /><title type="text">Call to arms for Rails to Grails plugin porting</title><content type="html">One more thing while I am on a role braindumping on my blog.&lt;br /&gt;&lt;br /&gt;I am currently now sharing offices in London with a good friend of mine and others.  Anyway this good friend of mine is a Ruby on Rails Developer and a very good one at that.&lt;br /&gt;&lt;br /&gt;So I quizzed him a bit about Rails to find out some info. Anyway one of the strong points of Rails is its plugins. They have loads and some really really good ones.&lt;br /&gt;&lt;br /&gt;So got me thinking. From what I can see these plugins are all possible in Grails (if they don't already exist) so why don't we replicate them. The Rails guys are basically solving the same problems as the Grails guys and the fact that a Rails plugins exists means that it is a helpful tool to someone. &lt;br /&gt;&lt;br /&gt;So anyway I am going to start this porting off. Here are some of my first targets:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Bitstream Vera Sans Mono'; font-size: 12px; line-height: 17px; white-space: pre;"&gt;&lt;/span&gt;&lt;a href="http://github.com/technoweenie/acts_as_paranoid" target="_blank"&gt;http://github.com/&lt;wbr&gt;technoweenie/acts_as_paranoid&lt;/a&gt;&lt;br /&gt;&lt;a href="http://thoughtbot.com/projects/paperclip" target="_blank"&gt;http://thoughtbot.com/&lt;wbr&gt;projects/paperclip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Next I guess I search for "Top 10 Rails plugins"&lt;br /&gt;&lt;br /&gt;http://thetacom.info/2008/02/17/my-10-favorite-rails-plugins/&lt;br /&gt;&lt;br /&gt;Pete :)&lt;img src="http://feeds.feedburner.com/~r/Delahuntyware/~4/nGqXtT0XcWE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.peterdelahunty.com/feeds/8077739526219117360/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4499562010259202212&amp;postID=8077739526219117360" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/8077739526219117360" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/8077739526219117360" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Delahuntyware/~3/nGqXtT0XcWE/call-to-arms-for-rails-to-grails-plugin.html" title="Call to arms for Rails to Grails plugin porting" /><author><name>Peter Delahunty</name><uri>http://www.blogger.com/profile/06472770840257045665</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>3</thr:total><feedburner:origLink>http://blog.peterdelahunty.com/2009/05/call-to-arms-for-rails-to-grails-plugin.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4499562010259202212.post-7362203843426270327</id><published>2009-05-06T01:58:00.000-07:00</published><updated>2009-05-06T02:28:52.661-07:00</updated><title type="text">Dave Klien reviews my Javascript validator plugin in Groovy Mag (April)</title><content type="html">So having popped my head up after an intensive month or so of major S**t going on in my life and trying to ship my new on-line service (written in grails of course). Anyway I just seen Mr Dave Klien has done a wonderful review of my Javascript Validation grails plug-in. So I bought the mag. It is actually very good so I recommend you do too. Anyway in his own words:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;This plug-in has great potential. It will already save&lt;br /&gt;significant development time in setting up client-side&lt;br /&gt;validation and I’m sure it’s going to keep getting better.&lt;br /&gt;Stop by the Grails Plugin Portal and check it out. You&lt;br /&gt;can leave a comment with enhancement suggestions or&lt;br /&gt;if you’ve tried it out, let others know what you think&lt;br /&gt;with a rating. I’m giving it 5 stars!&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I am really happy about this. It is nice to see that the things you do help other people. I guess that is what the open source community is all about. Anyway just wanted to express another thought.&lt;br /&gt;&lt;br /&gt;I think the best things, the ones that rise above come from passion and believing "there has to be a better way". That's where the grails framework came from, where groovy came from, where Spring came from, Hibernate, hell even Java too one upon a time.&lt;br /&gt;&lt;br /&gt;However another ingredient that means the difference between longevity or 15 seconds of fame is "coming from the trenches"... You can see that with grails.&lt;br /&gt;&lt;br /&gt;Graeme Rocher built grails from is own real life experience of using web frameworks. That is why even now I find little gems of goodness in there. The framework helps you all the way from development to production. That is something special.&lt;br /&gt;&lt;br /&gt;I guess with my own little javascript validator plug-in in a much much smaller way that same is true for me. I needed client side validation and I had used Sprig'svalang before with spring mvc and really missed it with Grails. So I built it. When I say built it a really mean I made the "glue of convenience" that glues together some already established fantastic framework patterns (grails constraints, i18n, commons validator js libs). Then guess what. I actually used it on my own project as a user. I made it fit my own needs while trying to keep it generic. Anyway I think that's why people love it.&lt;br /&gt;&lt;br /&gt;One last final thought... I love this quote just can't remember who said it.&lt;br /&gt;&lt;br /&gt;A reasonable man changes and adapts to the world around him. The unreasonable man changes and adapts the world around him. Therefore all the innovation in the world lies in the hands of the unreasonable man :)&lt;br /&gt;&lt;br /&gt;Ps. I have two new plug ins coming out this week. Again the came from the trenches of a need for them in my own app. I am sure you will love them.&lt;img src="http://feeds.feedburner.com/~r/Delahuntyware/~4/BQPHnJ9JTik" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.peterdelahunty.com/feeds/7362203843426270327/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4499562010259202212&amp;postID=7362203843426270327" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/7362203843426270327" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/7362203843426270327" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Delahuntyware/~3/BQPHnJ9JTik/dave-klien-reviews-my-javascript.html" title="Dave Klien reviews my Javascript validator plugin in Groovy Mag (April)" /><author><name>Peter Delahunty</name><uri>http://www.blogger.com/profile/06472770840257045665</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>4</thr:total><feedburner:origLink>http://blog.peterdelahunty.com/2009/05/dave-klien-reviews-my-javascript.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4499562010259202212.post-3196223814358697703</id><published>2009-05-06T01:53:00.000-07:00</published><updated>2009-05-06T01:58:36.342-07:00</updated><title type="text">Nullable vs Blank sorted i forgot to post about it</title><content type="html">Hi All&lt;br /&gt;&lt;br /&gt;I just realise i forgot to post about the solution to the Nullable Vs Blank problem. Well after consulting lost of people for input I decided on a simple rule.&lt;br /&gt;&lt;h4&gt;If the blank constraint and the nullable constraint are both used for a String attribute then the blank constraint wins.&lt;/h4&gt;The simple solution always wins :) (&lt;a href="http://en.wikipedia.org/wiki/Occam%27s_razor"&gt;Occam's razor&lt;/a&gt;)&lt;img src="http://feeds.feedburner.com/~r/Delahuntyware/~4/DoF0Ndrt9-E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.peterdelahunty.com/feeds/3196223814358697703/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4499562010259202212&amp;postID=3196223814358697703" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/3196223814358697703" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4499562010259202212/posts/default/3196223814358697703" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Delahuntyware/~3/DoF0Ndrt9-E/nullable-vs-blank-sorted-i-forgot-to.html" title="Nullable vs Blank sorted i forgot to post about it" /><author><name>Peter Delahunty</name><uri>http://www.blogger.com/profile/06472770840257045665</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.peterdelahunty.com/2009/05/nullable-vs-blank-sorted-i-forgot-to.html</feedburner:origLink></entry></feed>
