<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4059581333784029364</id><updated>2012-01-26T11:50:51.718-08:00</updated><category term='shares'/><category term='emc'/><category term='macos'/><category term='quartz'/><category term='postgres'/><category term='display'/><category term='chkconfig'/><category term='trading'/><category term='C'/><category term='junit'/><category term='tails'/><category term='war'/><category term='prime'/><category term='grails'/><category term='yum'/><category term='css'/><category term='ejb'/><category term='ati'/><category term='mocking'/><category term='spring'/><category term='spaces'/><category term='forwarding'/><category term='eclipse'/><category term='raid'/><category term='webtest'/><category term='setupX'/><category term='xml'/><category term='checkbox'/><category term='statistic'/><category term='scala'/><category term='reviews'/><category term='threads'/><category term='ssd'/><category term='java'/><category term='timemachine'/><category term='vmware'/><category term='security'/><category term='mojo'/><category term='wordlist'/><category term='maven2'/><category term='intellij'/><category term='groovysh'/><category term='bash'/><category term='rocks'/><category term='tmp36'/><category term='swt'/><category term='cts'/><category term='ear'/><category term='webservice'/><category term='radeon'/><category term='gpu'/><category term='java6'/><category term='build'/><category term='groovy'/><category term='bamboo'/><category term='html'/><category term='odd'/><category term='metaclass'/><category term='ssl'/><category term='dsl'/><category term='xandr'/><category term='cdk'/><category term='rocks reinstall'/><category term='testing'/><category term='ubuntu'/><category term='superduper'/><category term='oscar3'/><category term='prototype'/><category term='json'/><category term='subversion'/><category term='date_trunc'/><category term='google'/><category term='yui'/><category term='hpc'/><category term='loop'/><category term='bitcoin'/><category term='cluster'/><category term='perl'/><category term='jira'/><category term='medplan'/><category term='export'/><category term='http'/><category term='osx'/><category term='bitmining'/><category term='minix'/><category term='griffon'/><category term='inchi'/><category term='node'/><category term='feedback'/><category term='plugin'/><category term='helper'/><category term='script'/><category term='tuning'/><category term='parallel'/><category term='nfs'/><category term='smurf'/><category term='jmx'/><category term='markup'/><category term='database'/><category term='apache'/><category term='arduino'/><category term='linux'/><category term='ethernet'/><category term='kinesis'/><category term='hibernate'/><category term='math'/><category term='ajax'/><category term='ckeditor'/><category term='binbase'/><category term='pubchem'/><category term='ssh'/><category term='mtgox'/><category term='config'/><category term='log4j'/><category term='xorg'/><category term='rcp'/><category term='regex'/><category term='builder'/><category term='jquery'/><category term='sql'/><category term='virtual host'/><category term='jboss'/><category term='index'/><category term='weird'/><category term='fail'/><category term='java script'/><category term='grails groovy file download java'/><category term='profile'/><title type='text'>Coding and More</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default?start-index=101&amp;max-results=100'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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>115</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-1927978431565928684</id><published>2012-01-26T11:47:00.000-08:00</published><updated>2012-01-26T11:47:22.160-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reviews'/><category scheme='http://www.blogger.com/atom/ns#' term='feedback'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>grails plugins and feedback</title><content type='html'>once in a while I get emails like this, which makes me really happy to put effort into open source projects.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Hi Gert,&lt;br /&gt;&lt;br /&gt;I'm fairly new to Grails and Java and I've been using your Grails jprogress plugin the past few days and it works great - thanks.&lt;br /&gt;&lt;br /&gt;I wanted to update the message text as a process went along but didn't see that featured defined in the service.  I assumed that you were using the jProgressBar java class and that I could define it's setString method but as I look around I don't think that's the case.  Is there a way to do that with your plugin?&lt;br /&gt;&lt;br /&gt;Thanks,&lt;br /&gt;&lt;br /&gt;Greg&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;obviously it also means I need todo some more stuff to keep people happy, hence even less spare time for other stuff :(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-1927978431565928684?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/1927978431565928684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2012/01/grails-plugins-and-feedback.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/1927978431565928684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/1927978431565928684'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2012/01/grails-plugins-and-feedback.html' title='grails plugins and feedback'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-5135066224034242808</id><published>2011-12-14T15:33:00.000-08:00</published><updated>2011-12-14T15:33:30.770-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fail'/><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><category scheme='http://www.blogger.com/atom/ns#' term='ckeditor'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>CKEditor plugin + grails submitTorRemote == fail</title><content type='html'>so people in my office talked to me now a couple of times that they like to have a formating option for text in the comment field.&lt;br /&gt;&lt;br /&gt;So my first thought was to use the mighty ckeditor and there is a grail plugin already around. SO we should be done with this in 5 minutes...&lt;br /&gt;&lt;br /&gt;Wrong it took a bit longer, since my form kept refusing to save my content and always reported the original content instead.&lt;br /&gt;&lt;br /&gt;After quite a bit of googleling and the mandatory &lt;br /&gt;&lt;blockquote&gt;I'm pissed about grails beer, this time it was a nice Aventinius&lt;/blockquote&gt;&lt;br /&gt;I found a solution to make it work.&lt;br /&gt;&lt;br /&gt;Basically if you want to use CKEditor with JQuery you need to update it fields before (the plugin should really handle this! Do you hear me? I mean I fixed to many plugins by now...) &lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;g:form name=&amp;quot;createNewComment&amp;quot; id=&amp;quot;createNewComment&amp;quot; controller=&amp;quot;comment&amp;quot;&amp;gt;&lt;br /&gt;   &lt;br /&gt;&lt;br /&gt;        &amp;lt;ckeditor:editor height=&amp;quot;300px&amp;quot; width=&amp;quot;80%&amp;quot; name=&amp;quot;text  &amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;            test&lt;br /&gt;        &amp;lt;/ckeditor:editor&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;g:hiddenField name=&amp;quot;id&amp;quot; value=&amp;quot;${id}&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;g:hiddenField name=&amp;quot;type&amp;quot; value=&amp;quot;${type}&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;g:hiddenField name=&amp;quot;destination&amp;quot; value=&amp;quot;${destination}&amp;quot;/&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;g:javascript&amp;gt;&lt;br /&gt;        function CKupdate() {&lt;br /&gt;            for (instance in CKEDITOR.instances)&lt;br /&gt;                CKEDITOR.instances[instance].updateElement();&lt;br /&gt;            return true;&lt;br /&gt;        }&lt;br /&gt;    &amp;lt;/g:javascript&amp;gt;&lt;br /&gt;&lt;br /&gt;            &amp;lt;g:submitToRemote before=&amp;quot;CKupdate();&amp;quot; class=&amp;quot;save&amp;quot; action=&amp;quot;saveAjax&amp;quot; update=&amp;quot;${destination}&amp;quot; value=&amp;quot;save comment&amp;quot;/&amp;gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&amp;lt;/g:form&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;And this is all, now before we press the button, we always call the method to update the editor and everybody is happy...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-5135066224034242808?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/5135066224034242808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2011/12/ckeditor-plugin-grails-submittorremote.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/5135066224034242808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/5135066224034242808'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2011/12/ckeditor-plugin-grails-submittorremote.html' title='CKEditor plugin + grails submitTorRemote == fail'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-239250239218685573</id><published>2011-12-09T14:19:00.000-08:00</published><updated>2011-12-09T14:19:48.844-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='minix'/><title type='text'>jQuery + grails and my missing buttons...</title><content type='html'>currently I'm switching miniX over to use jQueryUi style buttons, since this makes life so much easier to maintain them.&lt;br /&gt;&lt;br /&gt;Except during my event processing my buttons keep disappearing, which is rater annoying, to say at least.&lt;br /&gt;&lt;br /&gt;Couple of hours later I finally found a crude but working solution. I just create a simple event handler, which re renders all by buttons...&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$(document).ajaxComplete(function() {&lt;br /&gt;    $("input:submit, a.button, input:button, div.qq-upload-button").button()&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;$(document).ready(function() {&lt;br /&gt;    $("input:submit, a.button, input:button, div.qq-upload-button").button()&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-239250239218685573?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/239250239218685573/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2011/12/jquery-grails-and-my-missing-buttons.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/239250239218685573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/239250239218685573'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2011/12/jquery-grails-and-my-missing-buttons.html' title='jQuery + grails and my missing buttons...'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-5877741603792458299</id><published>2011-11-30T16:49:00.000-08:00</published><updated>2011-11-30T16:49:52.406-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>scala and instanceOf -</title><content type='html'>I'm for some reason a fan of instanceOf in java and just love to be able to check at runtime of what kind a class is and do some action depending on this outcome.&lt;br /&gt;&lt;br /&gt;But sometimes it's a bit tedios. For example&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;Object a = new String("tada");&lt;br /&gt;Object result = null; &lt;br /&gt;&lt;br /&gt;if(a instanceOf Number){&lt;br /&gt;  result = "its a number";&lt;br /&gt;}&lt;br /&gt;else if(a instanceOf String){&lt;br /&gt;  result = "its a string";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;System.out.println(result);&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;ok it's a silly example, now the pretty scala approach using match&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt; var a:Any = "tada..."&lt;br /&gt;&lt;br /&gt;      val result = a match {&lt;br /&gt;        case n:Number =&gt; "it's a number"&lt;br /&gt;        case s:String =&gt; "it's a string"&lt;br /&gt;      }&lt;br /&gt;      println(result)&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;oh so pretty and easy to read.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-5877741603792458299?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/5877741603792458299/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2011/11/scala-and-instanceof.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/5877741603792458299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/5877741603792458299'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2011/11/scala-and-instanceof.html' title='scala and instanceOf -'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-6329779186209983100</id><published>2011-11-28T16:40:00.000-08:00</published><updated>2011-11-28T16:40:13.922-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>casting and scala</title><content type='html'>since a couple of month's I work more and more with scala and really start to like this language. But some of the concepts are really confusing and make me wounder if this really is necceasary.&lt;br /&gt;&lt;br /&gt;A prime example would be the whole casting of variables.  &lt;br /&gt;&lt;br /&gt;In java you simple do:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;String value = (String)object;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;now in scala&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;val value:String = object.asInstanceOf[String]&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;now I admit it looks very clean, but sure took a while to find this one little details.&lt;br /&gt;&lt;br /&gt;Otherwise it's always better to use matchers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-6329779186209983100?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/6329779186209983100/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2011/11/casting-and-scala.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/6329779186209983100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/6329779186209983100'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2011/11/casting-and-scala.html' title='casting and scala'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-4896007190022146593</id><published>2011-11-04T09:35:00.000-07:00</published><updated>2011-11-04T09:36:37.044-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='http'/><category scheme='http://www.blogger.com/atom/ns#' term='rocks'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='cluster'/><category scheme='http://www.blogger.com/atom/ns#' term='virtual host'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><title type='text'>rocks linux - virtual hosts with apache</title><content type='html'>currently I have a cluster setup in the office with about 5 nodes and a bit over 50 cpus, so this morning I decided to rebuild some of the nodes, since I needed to make some changes to the cluster.  &lt;br /&gt;&lt;br /&gt;20 minutes into this procedure, I keep getting odd error messages, like file 'update.img' not found and so.&lt;br /&gt;&lt;br /&gt;So while backtracking the latest changes I did to the server. I realized that I setup 20 virtual hosts in the apache configuration, which ended up screwing with the kickstart configuration. It turns out that the order of the virtual host seems to quite important and that the kickstart configuration always needs to be first, and than you have to define the other virtual hosts.&lt;br /&gt;&lt;br /&gt;Example of a virtual host configuration, which allows the kickstart configuration to work,&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;vim /etc/httpd/conf.d/rocks.conf&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;actual file:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;IfModule mod_mime.c&amp;gt;&lt;br /&gt;AddHandler cgi-script .cgi&lt;br /&gt;&amp;lt;/IfModule&amp;gt;&lt;br /&gt;&lt;br /&gt;UseCanonicalName Off&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;DirectoryIndex index.cgi&lt;br /&gt;&lt;br /&gt;&amp;lt;Directory "/var/www/html"&amp;gt;&lt;br /&gt;Options FollowSymLinks Indexes ExecCGI&lt;br /&gt;AllowOverride None&lt;br /&gt;Order allow,deny&lt;br /&gt;Allow from all&lt;br /&gt;&amp;lt;/Directory&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;Directory "/var/www/html/proc"&amp;gt;&lt;br /&gt;Options FollowSymLinks Indexes ExecCGI&lt;br /&gt;AllowOverride None&lt;br /&gt;Order deny,allow&lt;br /&gt;Allow from 10.1.0.0/255.255.0.0&lt;br /&gt;Allow from 127.0.0.1&lt;br /&gt;Deny from all&lt;br /&gt;&amp;lt;/Directory&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;Directory "/var/www/html/pxelinux"&amp;gt;&lt;br /&gt;Options FollowSymLinks Indexes ExecCGI&lt;br /&gt;AllowOverride None&lt;br /&gt;Order deny,allow&lt;br /&gt;Allow from 10.1.0.0/255.255.0.0&lt;br /&gt;Allow from 127.0.0.1&lt;br /&gt;Deny from all&lt;br /&gt;&amp;lt;/Directory&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;ServerName kickstart.host.com&lt;br /&gt;DocumentRoot "/var/www/html"&lt;br /&gt;&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;ServerName virtual.host.com&lt;br /&gt;DocumentRoot "/var/www/cts/html"&lt;br /&gt;&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-4896007190022146593?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/4896007190022146593/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2011/11/rocks-linux-virtual-hosts-with-apache.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/4896007190022146593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/4896007190022146593'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2011/11/rocks-linux-virtual-hosts-with-apache.html' title='rocks linux - virtual hosts with apache'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-5772061944587921821</id><published>2011-11-02T14:42:00.000-07:00</published><updated>2011-11-02T14:42:49.996-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quartz'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>grails quartz plugin - don't repeat jobs</title><content type='html'>well it might be obvious, but sometimes you just want to execute a simple job once during the startup and than let them be.&lt;br /&gt;&lt;br /&gt;For an example I needed this to synchronize a database and run statistics over it. So the simples trigger I could come up with, was&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;    static triggers = {&lt;br /&gt;        simple name: 'synchronize', startDelay: 60000, repeatCount: 0&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;An alternative way could had been todo schedule the job during the startup phase&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;SynchronizeExperimentJob.triggerNow([experimentId: id, database: database])&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;this line should be put into your bootstrapping file.&lt;br /&gt;&lt;br /&gt;Personally I feel the trigger is more elegant.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-5772061944587921821?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/5772061944587921821/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2011/11/grails-quartz-plugin-dont-repeat-jobs.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/5772061944587921821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/5772061944587921821'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2011/11/grails-quartz-plugin-dont-repeat-jobs.html' title='grails quartz plugin - don&apos;t repeat jobs'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-954212656995103650</id><published>2011-11-01T11:40:00.000-07:00</published><updated>2011-11-01T11:40:51.764-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kinesis'/><title type='text'>kinesis avantage pro - day one</title><content type='html'>so the keyboard got finally delivered and now Im in the progress of learning typing again and to say i'm inefficient is quite and understatement. I mean the layout is so weird and my hands feel way to big for this keyboard and i'm constantly hunting for the letters.&lt;br /&gt;&lt;br /&gt;most frustrating things so far:&lt;br /&gt;&lt;br /&gt;- only one space button instead of two&lt;br /&gt;- i'm using muscles in my hand I never used before, I'm actually getting sore from typing after just a minute or two&lt;br /&gt;- the enter button is in the most awkward spot ever, why cant the keyboard be a bit wider, so that there can be a dedicated enter button to be hit with my right pinky and a dedicated backspace button for the left pinky&lt;br /&gt;- the right side of the keyboard if way more confusing than the left side&lt;br /&gt;- the buttons are just a touch to large&lt;br /&gt;- no dedicated number block, only a funky food pedal to switch some buttons around&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-954212656995103650?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/954212656995103650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2011/11/kinesis-avantage-pro-day-one.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/954212656995103650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/954212656995103650'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2011/11/kinesis-avantage-pro-day-one.html' title='kinesis avantage pro - day one'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-1251958656132225171</id><published>2011-10-27T20:35:00.000-07:00</published><updated>2011-10-27T20:35:04.778-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rocks'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><category scheme='http://www.blogger.com/atom/ns#' term='yum'/><title type='text'>rocks 5.4 cluster - installing subversion</title><content type='html'>sometimes the most trivial things turn out to be rather interessting.&lt;br /&gt;&lt;br /&gt;For example my latest drama with rocks was that I just needed subversion, to convert one of my BinBase images to a development image for BinBase.&lt;br /&gt;&lt;br /&gt;Little did I know, that in the rocks 5.4 version, the installer fails to provide you with the base repository. Quality control anyone?&lt;br /&gt;&lt;br /&gt;Anyway, to get your yum to work, as exspected. Just open your&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;/etc/yum.conf&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;file and add the following section&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;[base]&lt;br /&gt;name=CentOS-$releasever - Base&lt;br /&gt;mirrorlist=http://mirrorlist.centos.org/?release=$releasever&amp;arch=$basearch&amp;repo=os&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;at the end of the file and than you can install subversion like always using:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;yum -y install subversion&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-1251958656132225171?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/1251958656132225171/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2011/10/rocks-54-cluster-installing-subversion.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/1251958656132225171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/1251958656132225171'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2011/10/rocks-54-cluster-installing-subversion.html' title='rocks 5.4 cluster - installing subversion'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-1170729083976502050</id><published>2011-10-26T20:20:00.000-07:00</published><updated>2011-10-26T20:20:20.083-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='weird'/><category scheme='http://www.blogger.com/atom/ns#' term='odd'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='smurf'/><category scheme='http://www.blogger.com/atom/ns#' term='tails'/><title type='text'>google is weird...</title><content type='html'>ok I love the autocomplete function in google, but sometimes it just results in to odd of search recommendations...&lt;br /&gt;&lt;br /&gt;example:&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/-dGEZRRNaPeE/TqjNjNO0pSI/AAAAAAAAB5s/ZMbedvZdAwY/s1600/smurfs.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="238" src="http://3.bp.blogspot.com/-dGEZRRNaPeE/TqjNjNO0pSI/AAAAAAAAB5s/ZMbedvZdAwY/s320/smurfs.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The fun part is that robin and I were actually researching for smurf costumes (it's bring your smurf to school day on monday...), but that the first suggestion  on 'do sm...'&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;do smurfs have tails&lt;/blockquote&gt;&lt;br /&gt;I really did not see that comming&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-1170729083976502050?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/1170729083976502050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2011/10/google-is-weird.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/1170729083976502050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/1170729083976502050'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2011/10/google-is-weird.html' title='google is weird...'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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/-dGEZRRNaPeE/TqjNjNO0pSI/AAAAAAAAB5s/ZMbedvZdAwY/s72-c/smurfs.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-9023771952457403785</id><published>2011-10-21T14:39:00.000-07:00</published><updated>2011-10-21T14:39:08.238-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='date_trunc'/><category scheme='http://www.blogger.com/atom/ns#' term='postgres'/><title type='text'>grouping dates in postgres using date_trunc</title><content type='html'>well recently I started to write some statistics functions for my&amp;nbsp;&lt;a href="http://code.google.com/p/minix"&gt;miniX&lt;/a&gt;&amp;nbsp;application and so I was woundering, how can you easily execute queries like:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;give me the count of object for the last 24h grouped by hour&lt;/blockquote&gt;&lt;br /&gt;which should be rather simple, if you know about the functions 'date_trunc' in postgres.&lt;br /&gt;&lt;br /&gt;So 5 minutes later some sql appeared...&lt;br /&gt;&lt;br /&gt;&lt;code&gt;       &lt;br /&gt;"select max(object_count) as object,date_trunc('hour',created_at) as date from bbstatistic_snapshot where object_name = ? and created_at between ? and ? group by date_trunc('hour',created_at) order by date_trunc('hour',created_at)"        &lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;which works rather well and get's the job done, but the speed is a touch slow.&lt;br /&gt;&lt;br /&gt;Results should look like:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; object |        date         &lt;br /&gt;--------+---------------------&lt;br /&gt;   1742 | 2011-10-13 15:00:00&lt;br /&gt;   1742 | 2011-10-13 16:00:00&lt;br /&gt;   1742 | 2011-10-13 17:00:00&lt;br /&gt;   1742 | 2011-10-13 18:00:00&lt;br /&gt;   2102 | 2011-10-13 19:00:00&lt;br /&gt;   2102 | 2011-10-13 20:00:00&lt;br /&gt;   2057 | 2011-10-13 21:00:00&lt;br /&gt;   1899 | 2011-10-13 22:00:00&lt;br /&gt;   1803 | 2011-10-13 23:00:00&lt;br /&gt;   1742 | 2011-10-14 00:00:00&lt;br /&gt;   1742 | 2011-10-14 01:00:00&lt;br /&gt;   1742 | 2011-10-14 02:00:00&lt;br /&gt;   1742 | 2011-10-14 03:00:00&lt;br /&gt;   1742 | 2011-10-14 04:00:00&lt;br /&gt;   1742 | 2011-10-14 05:00:00&lt;br /&gt;   1742 | 2011-10-14 06:00:00&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-9023771952457403785?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/9023771952457403785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2011/10/grouping-dates-in-postgres-using.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/9023771952457403785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/9023771952457403785'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2011/10/grouping-dates-in-postgres-using.html' title='grouping dates in postgres using date_trunc'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-5273796360990670536</id><published>2011-10-19T11:54:00.001-07:00</published><updated>2011-10-19T11:54:30.178-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rocks reinstall'/><title type='text'>reinstalling a compute node in rocks</title><content type='html'>this is actually a no brainer, but since I barely ever have todo it, here is the procedure:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;log onto compute node&lt;/li&gt;&lt;li&gt;execute&amp;nbsp;&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;pre&gt;/boot/kickstart/cluster-kickstart-pxe&lt;/pre&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;wait for the install to finish&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;that's it&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-5273796360990670536?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/5273796360990670536/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2011/10/reinstalling-compute-node-in-rocks.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/5273796360990670536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/5273796360990670536'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2011/10/reinstalling-compute-node-in-rocks.html' title='reinstalling a compute node in rocks'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-2503073328410250977</id><published>2011-10-11T12:53:00.000-07:00</published><updated>2011-10-11T12:53:58.083-07:00</updated><title type='text'>cron - useful triggers</title><content type='html'>just a nice list of commonly used cron triggers I keep forgetting.&lt;br /&gt;&lt;br /&gt;Cron Expression to fire the trigger every five minutes:&lt;br /&gt;0 0/5 * * * ?&lt;br /&gt;(e.g. 3:00:00, 3:05:00, 3:10:00&lt;br /&gt;&lt;br /&gt;Cron Expression to fire the trigger every hour:&lt;br /&gt;0 0 * * * ?&lt;br /&gt;&lt;br /&gt;Cron Expression to fire the trigger every two Hours:&lt;br /&gt;0 0 0/2 * * ?&lt;br /&gt;&lt;br /&gt;Cron expression to fire the trigger every Four Hours:&lt;br /&gt;0 0 0/4 * * ?&lt;br /&gt;&lt;br /&gt;Cron Expression to fire the trigger every 10 Minutes 20 Seconds:&lt;br /&gt;20 0/10 * * * ?&lt;br /&gt;(e.g. 10:00:20, 10:10:20, 10:20:20)&lt;br /&gt;&lt;br /&gt;Every half an hour between 1 AM to 7 AM on 20th of Every Month&lt;br /&gt;0 0/30 1-7 5, 20 * ?&lt;br /&gt;(e.g. 2010-07-20 1:00:00, 2010-07-20 1:30:00m 2010-07-20 2:00:00)&lt;br /&gt;&lt;br /&gt;Cron Expression to fire the trigger on the 25th Minute from 1 AM to 5 PM on every Monday and Wednesday&lt;br /&gt;0 25 1-5 ? * MON,WED&lt;br /&gt;&lt;br /&gt;Cron Expression to fire the trigger at Noon every day&lt;br /&gt;0 0 12 * * ?&lt;br /&gt;&lt;br /&gt;Cron Expression to fire the trigger at Noon every day only in 2010&lt;br /&gt;0 0 12 * * 2010&lt;br /&gt;&lt;br /&gt;Cron Expression to fire the trigger Every 10 minutes between 9 AM to 5 PM (until 5:50) Every Day&lt;br /&gt;0 0/10 9, 17 * * ?&lt;br /&gt;&lt;br /&gt;Cron Expression to fire the trigger at 2:30 PM on the last Saturday of every month.&lt;br /&gt;0 30 14 ? * 7L&lt;br /&gt;&lt;br /&gt;Cron Expression to fire the trigger at 7:10 AM every Monday, Tuesday, Wednesday, Thursday and Friday&lt;br /&gt;0 10 7 ? * MON-FRI&lt;br /&gt;&lt;br /&gt;Cron Expression to fire the trigger at 2:10 PM and at 2:40 PM every Sunday in the month of July.&lt;br /&gt;0 10,40 14 ? 7 SUN&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;source:&amp;nbsp;&lt;a href="http://sanjaal.com/java/tag/cron-expression-to-fire-the-trigger-every-hour/"&gt;cron-expression-to-fire-the-trigger-every-hour&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-2503073328410250977?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/2503073328410250977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2011/10/cron-useful-triggers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/2503073328410250977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/2503073328410250977'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2011/10/cron-useful-triggers.html' title='cron - useful triggers'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-5439713339528096907</id><published>2011-08-10T12:54:00.000-07:00</published><updated>2011-08-10T12:54:38.532-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='helper'/><category scheme='http://www.blogger.com/atom/ns#' term='script'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>groovy - a quick way to copy a list of files to the local directory</title><content type='html'>don't we love these tasks? We get a list of files to look at and they are in a directory with thousands of other files and now we need to copy them one, by one, by one and there is no clear patter, which could ease the pain of doing so.&lt;br /&gt;&lt;br /&gt;But like always there is a simple groovy way todo this in a quicker fashion.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;def values = [&lt;br /&gt;1333020,&lt;br /&gt;1332872,&lt;br /&gt;1332428,&lt;br /&gt;1332280,&lt;br /&gt;1331984,&lt;br /&gt;1331836,&lt;br /&gt;1331688,&lt;br /&gt;1331540&lt;br /&gt;]&lt;br /&gt;&lt;br /&gt;values.each{def value -&amp;gt&lt;br /&gt;new File("${value}.xml") &amp;lt;&amp;lt; new File("/Users/****/Documents/metadata/${value}.xml").text&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;this does simplify your life once in a while to copy a quick list of text files to a different folder.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-5439713339528096907?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/5439713339528096907/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2011/08/groovy-quick-way-to-copy-list-of-files.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/5439713339528096907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/5439713339528096907'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2011/08/groovy-quick-way-to-copy-list-of-files.html' title='groovy - a quick way to copy a list of files to the local directory'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-567389741775002045</id><published>2011-08-09T15:12:00.000-07:00</published><updated>2011-08-09T15:12:33.255-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='forwarding'/><category scheme='http://www.blogger.com/atom/ns#' term='ssh'/><title type='text'>remote ssh forwarding</title><content type='html'>for some reason I always forget the syntax to forward a port on my server to my local system to work remotely from home on some of my webapps.&lt;br /&gt;&lt;br /&gt;Now to not forget it again, I shall write it down on my blog, so I can just look at it...&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt; ssh -L port:remoteServer:port remoteServer&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;now this let's me access the 'port' on my 'remoteServer' on my local system and work on the webapp. Now I just have to rewrite all the absolute paths to relative paths, so that I can find my css stylesheets too...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-567389741775002045?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/567389741775002045/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2011/08/remote-ssh-forwarding.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/567389741775002045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/567389741775002045'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2011/08/remote-ssh-forwarding.html' title='remote ssh forwarding'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-8628499414660145663</id><published>2011-08-08T16:17:00.000-07:00</published><updated>2011-08-08T16:17:57.618-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='checkbox'/><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>grails + jquery + checkboxes</title><content type='html'>sometimes forms based on checkboxes can be rather annoying. An example would be that this is the return of a standard html checkbox,&lt;br /&gt;&lt;br /&gt;html defined checkboxes:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;g:checkBox name=&amp;quot;compare&amp;quot; id=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;g:checkBox name=&amp;quot;compare&amp;quot; id=&amp;quot;2&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;g:checkBox name=&amp;quot;compare&amp;quot; id=&amp;quot;3&amp;quot;/&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;result of the send parameters to the server:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;    def compareBins = {&lt;br /&gt;        println params&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;out:&lt;br /&gt;&lt;br /&gt;compare:[on, on, on]&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;now this is rather useless, we rather would see the id of the checkbox in the result. So let's call jQuery to the rescue and see how it can save out day!&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;    jQuery(document).ready(function() {&lt;br /&gt;        $('input:checkbox').each(&lt;br /&gt;        function() {&lt;br /&gt;            $(this).click(function() {&lt;br /&gt;&lt;br /&gt;                if (this.checked) {&lt;br /&gt;                    var value = $(this).attr('id');&lt;br /&gt;                    $(this).val(value);&lt;br /&gt;                }&lt;br /&gt;            });&lt;br /&gt;        }&lt;br /&gt;        );&lt;br /&gt;    });&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and promptly we have the following result if all 3 boxes are selected&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;compare:[1,2,3]&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;or if 1 and 3 are selected&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;compare:[1,3]&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;so we can actually tell, which elements where checked instead of getting just 'on'&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-8628499414660145663?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/8628499414660145663/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2011/08/grails-jquery-checkboxes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/8628499414660145663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/8628499414660145663'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2011/08/grails-jquery-checkboxes.html' title='grails + jquery + checkboxes'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-3731606774611294838</id><published>2011-08-04T15:57:00.000-07:00</published><updated>2011-08-04T15:58:15.862-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ethernet'/><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='json'/><category scheme='http://www.blogger.com/atom/ns#' term='tmp36'/><title type='text'>Arduino + Ethernet Shield + Temperature 2</title><content type='html'>After monitoring the thermometer for a couple of hours, it turned out the temperature sensor is a bit off. About 2.5 degrees.&lt;br /&gt;At least compared to me being cold and a good old HG thermometer.&lt;br /&gt;&lt;br /&gt;Now this meant we need some improvement in our little thermometer or better, let's find a way to calibrate it.&lt;br /&gt;&lt;br /&gt;So looking around in the tool box I quickly discovered a potentiometer and some more cables and thought, we can wire this to another pin and scale it to +/- 5 degree celsius and apply this correction.&lt;br /&gt;&lt;br /&gt;This is how it roughly looks now:&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/-9pl4u3iNMUA/TjsjNu-T_hI/AAAAAAAAB4E/---InQogQpk/s1600/layout_bb.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="214" width="320" src="http://3.bp.blogspot.com/-9pl4u3iNMUA/TjsjNu-T_hI/AAAAAAAAB4E/---InQogQpk/s320/layout_bb.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;And the new code to apply the correction settings is here&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;#include &amp;lt;Ethernet.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };&lt;br /&gt;byte ip[] = { 192,168,1, 2 };&lt;br /&gt;&lt;br /&gt;Server server(80);&lt;br /&gt;&lt;br /&gt;float coreVoltage = 5.0;&lt;br /&gt;float correctionScale = 10; //in degree celsius +/- half scale&lt;br /&gt;&lt;br /&gt;void setup()&lt;br /&gt;{&lt;br /&gt;// start the Ethernet connection and the server:&lt;br /&gt;Ethernet.begin(mac, ip);&lt;br /&gt;server.begin();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void loop()&lt;br /&gt;{&lt;br /&gt;// listen for incoming clients&lt;br /&gt;Client client = server.available();&lt;br /&gt;if (client) {&lt;br /&gt;// an http request ends with a blank line&lt;br /&gt;boolean currentLineIsBlank = true;&lt;br /&gt;while (client.connected()) {&lt;br /&gt;if (client.available()) {&lt;br /&gt;char c = client.read();&lt;br /&gt;// if you've gotten to the end of the line (received a newline&lt;br /&gt;// character) and the line is blank, the http request has ended,&lt;br /&gt;// so you can send a reply&lt;br /&gt;if (c == '\n' &amp;&amp; currentLineIsBlank) {&lt;br /&gt;// send a standard http response header&lt;br /&gt;client.println("HTTP/1.1 200 OK");&lt;br /&gt;client.println("Content-Type: application/json");&lt;br /&gt;client.println();&lt;br /&gt;&lt;br /&gt;// output the value of each analog input pin&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//read twice to improve precission&lt;br /&gt;float voltageSensor = analogRead(0);&lt;br /&gt;voltageSensor = analogRead(0) * coreVoltage;&lt;br /&gt;&lt;br /&gt;//get temperature of the potentio meter&lt;br /&gt;float voltagePotentioMeter = analogRead(1);&lt;br /&gt;voltagePotentioMeter = analogRead(1)*coreVoltage/1000;&lt;br /&gt;&lt;br /&gt;float debugVotlage = voltagePotentioMeter;&lt;br /&gt;&lt;br /&gt;//scale it to +/- 1/2 coreVoltage&lt;br /&gt;voltagePotentioMeter = voltagePotentioMeter - (coreVoltage/2);&lt;br /&gt;&lt;br /&gt;//calculate the correction value in celsius, based on our scale&lt;br /&gt;float correctionValue = voltagePotentioMeter * correctionScale / coreVoltage ;&lt;br /&gt;&lt;br /&gt;voltageSensor /= 1024.0; &lt;br /&gt;&lt;br /&gt;//temperature calculation&lt;br /&gt;float temperatureC = (voltageSensor - 0.5) * 100 + correctionValue;  //converting from 10 mv per degree wit 500 mV offset&lt;br /&gt;float temperatureF = (temperatureC * 9.0 / 5.0) + 32.0;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;client.print("sensor {");&lt;br /&gt;&lt;br /&gt;client.print("temperature_voltage:");&lt;br /&gt;client.print(voltageSensor);&lt;br /&gt;client.print(",");&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;client.print("temperature_celsius:");&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;client.print(temperatureC);&lt;br /&gt;client.print(",");&lt;br /&gt;&lt;br /&gt;client.print("temperature_fahrenheit:");&lt;br /&gt;&lt;br /&gt;client.print(temperatureF);&lt;br /&gt;client.print(",");&lt;br /&gt;&lt;br /&gt;client.print("temperature_correction:");&lt;br /&gt;&lt;br /&gt;client.print(correctionValue);&lt;br /&gt;client.print(",");&lt;br /&gt;&lt;br /&gt;client.print("voltage_potentiometer:");&lt;br /&gt;client.print(debugVotlage);&lt;br /&gt;client.print("}");&lt;br /&gt;&lt;br /&gt;break;&lt;br /&gt;}&lt;br /&gt;if (c == '\n') {&lt;br /&gt;// you're starting a new line&lt;br /&gt;currentLineIsBlank = true;&lt;br /&gt;} &lt;br /&gt;else if (c != '\r') {&lt;br /&gt;// you've gotten a character on the current line&lt;br /&gt;currentLineIsBlank = false;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;// give the web browser time to receive the data&lt;br /&gt;delay(1);&lt;br /&gt;// close the connection:&lt;br /&gt;client.stop();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Also since we want to keep track of the correction values, we updated the expected json string a bit to reflect the changes in our implementation.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;sensor {temperature_voltage:0.75,temperature_celsius:21.98,temperature_fahrenheit:71.56,temperature_correction:-3.22,voltage_potentiometer:0.89}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I have to say, I'm really start to enjoy playing with this little thing. The next step should be have the transmission of several sensors done wirelessly over XBees and to send them to one central location...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-3731606774611294838?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/3731606774611294838/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2011/08/arduino-ethernet-shield-temperature-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/3731606774611294838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/3731606774611294838'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2011/08/arduino-ethernet-shield-temperature-2.html' title='Arduino + Ethernet Shield + Temperature 2'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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/-9pl4u3iNMUA/TjsjNu-T_hI/AAAAAAAAB4E/---InQogQpk/s72-c/layout_bb.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-516397540587178879</id><published>2011-08-04T13:03:00.000-07:00</published><updated>2011-08-04T13:19:43.474-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='json'/><title type='text'>Ardunio + Ethernet shield</title><content type='html'>After I received the ethernet shield, my first task was it to figure out how to monitor the temperature in my office over the network and possible in a way, which allows me to store this result in a database.&lt;br /&gt;&lt;br /&gt;So this got me thinking, JSON is the way togo.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;easy to create&lt;/li&gt;&lt;li&gt;easy to read&lt;/li&gt;&lt;li&gt;possible to be understood without an interpreter&lt;/li&gt;&lt;li&gt;very&amp;nbsp;lightweight&lt;/li&gt;&lt;li&gt;everybody uses it&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;So let's see how the code would look for the arduino&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#include &amp;lt;spi.h&amp;gt;&lt;br /&gt;#include &amp;lt;ethernet.h&amp;gt;&lt;br /&gt;&lt;br /&gt;byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };&lt;br /&gt;byte ip[] = { 192,168,1, 2 };&lt;br /&gt;&lt;br /&gt;Server server(80);&lt;br /&gt;&lt;br /&gt;void setup()&lt;br /&gt;{&lt;br /&gt;// start the Ethernet connection and the server:&lt;br /&gt;Ethernet.begin(mac, ip);&lt;br /&gt;server.begin();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void loop()&lt;br /&gt;{&lt;br /&gt;// listen for incoming clients&lt;br /&gt;Client client = server.available();&lt;br /&gt;if (client) {&lt;br /&gt;// an http request ends with a blank line&lt;br /&gt;boolean currentLineIsBlank = true;&lt;br /&gt;while (client.connected()) {&lt;br /&gt;if (client.available()) {&lt;br /&gt;char c = client.read();&lt;br /&gt;// if you've gotten to the end of the line (received a newline&lt;br /&gt;// character) and the line is blank, the http request has ended,&lt;br /&gt;// so you can send a reply&lt;br /&gt;if (c == '\n' &amp;amp;&amp;amp; currentLineIsBlank) {&lt;br /&gt;// send a standard http response header&lt;br /&gt;client.println("HTTP/1.1 200 OK");&lt;br /&gt;client.println("Content-Type: application/json");&lt;br /&gt;client.println();&lt;br /&gt;&lt;br /&gt;// output the value of each analog input pin&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//read twice to improve precission&lt;br /&gt;float voltage = analogRead(0) * 5.0;&lt;br /&gt;voltage = analogRead(0) * 5.0;&lt;br /&gt;&lt;br /&gt;voltage /= 1024.0; &lt;br /&gt;&lt;br /&gt;float temperatureC = (voltage - 0.5) * 100 ;  //converting from 10 mv per degree wit 500 mV offset&lt;br /&gt;float temperatureF = (temperatureC * 9.0 / 5.0) + 32.0;&lt;br /&gt;&lt;br /&gt;client.print("sensor {");&lt;br /&gt;&lt;br /&gt;client.print("temperature_voltage:");&lt;br /&gt;client.print(voltage);&lt;br /&gt;client.print(",");&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;client.print("temperature_celsius:");&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;client.print(temperatureC);&lt;br /&gt;client.print(",");&lt;br /&gt;&lt;br /&gt;client.print("temperature_fahrenheit:");&lt;br /&gt;&lt;br /&gt;client.print(temperatureF);&lt;br /&gt;client.print("}");&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;break;&lt;br /&gt;}&lt;br /&gt;if (c == '\n') {&lt;br /&gt;// you're starting a new line&lt;br /&gt;currentLineIsBlank = true;&lt;br /&gt;} &lt;br /&gt;else if (c != '\r') {&lt;br /&gt;// you've gotten a character on the current line&lt;br /&gt;currentLineIsBlank = false;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;// give the web browser time to receive the data&lt;br /&gt;delay(1);&lt;br /&gt;// close the connection:&lt;br /&gt;client.stop();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/ethernet.h&gt;&lt;/spi.h&gt;&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;now this was rather simple and results in the following json string on port 80 of the arduino address&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;sensor {temperature_voltage:0.74,temperature_celsius:24.22,temperature_fahrenheit:75.59}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Now back to my actual project, trying to monitor the PH value and ammonia value with an arduino and adjust the ph, if needed...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-516397540587178879?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/516397540587178879/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2011/08/ardunio-ethernet-shield.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/516397540587178879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/516397540587178879'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2011/08/ardunio-ethernet-shield.html' title='Ardunio + Ethernet shield'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-8224579853852029702</id><published>2011-08-02T15:43:00.000-07:00</published><updated>2011-08-02T15:53:30.291-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='medplan'/><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><category scheme='http://www.blogger.com/atom/ns#' term='prototype'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>MedPlan</title><content type='html'>Over the last couple of days I was thinking about creating a small grails to show the speed of development with grails. The goal was to create an application in less than 24h, which is able to track your medications and at the same time has some important features.&lt;br /&gt;&lt;br /&gt;The original idea came from spending the last 5 days with my wife's sick sister and see how difficult and confusing it was to track all her different medications. Specially since there were 3 people involved doing this and nobody really know, which medications did she already receive.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What does the user want:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;easily enter a new prescription&lt;/li&gt;&lt;li&gt;see which medications have been taken&lt;/li&gt;&lt;li&gt;show when to take a medication&lt;/li&gt;&lt;li&gt;show the medication's in form of a calendar&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;What did I want as a developer:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;easy to use&lt;/li&gt;&lt;li&gt;multi user access&lt;/li&gt;&lt;li&gt;ajax driven/jquery&lt;/li&gt;&lt;li&gt;calendar interface&lt;/li&gt;&lt;li&gt;auto complete&lt;/li&gt;&lt;li&gt;multi platform support (ipad/windows/linux/osx)&lt;/li&gt;&lt;li&gt;able to run without a tomcat installation&lt;/li&gt;&lt;li&gt;don't look like a standard grails scaffolding application&lt;/li&gt;&lt;li&gt;use as few mouse clicks as possible&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;how does it look after 16h of work?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-hzDC3th_EGw/Tjh8jM9pskI/AAAAAAAAB3s/VC2iBgMwKQo/s1600/1.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="194" src="http://4.bp.blogspot.com/-hzDC3th_EGw/Tjh8jM9pskI/AAAAAAAAB3s/VC2iBgMwKQo/s320/1.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;weekly overview&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-0x4fIdGnzYg/Tjh8q4wmbiI/AAAAAAAAB30/zslQqsyff3Y/s1600/2.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="194" src="http://4.bp.blogspot.com/-0x4fIdGnzYg/Tjh8q4wmbiI/AAAAAAAAB30/zslQqsyff3Y/s320/2.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;prescription overview&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-i9tR71oS_Os/Tjh9OYtDXZI/AAAAAAAAB38/Tb48XD3pCBg/s1600/3.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="194" src="http://3.bp.blogspot.com/-i9tR71oS_Os/Tjh9OYtDXZI/AAAAAAAAB38/Tb48XD3pCBg/s320/3.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;adding a prescription&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;b&gt;What is missing?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I think at this point in time the application does what it's supposed todo, but some nice features would be:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;iPad support as a native application&lt;/li&gt;&lt;li&gt;internationalization&lt;/li&gt;&lt;li&gt;share your&amp;nbsp;prescription&amp;nbsp;plan with another user&lt;/li&gt;&lt;li&gt;send out an email, 30 minutes before a medication has to be used&lt;/li&gt;&lt;li&gt;soap/rest based access&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Where can I get it?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;You can download the application &lt;a href="http://code.google.com/p/medplan/"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-8224579853852029702?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/8224579853852029702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2011/08/medplan.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/8224579853852029702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/8224579853852029702'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2011/08/medplan.html' title='MedPlan'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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://4.bp.blogspot.com/-hzDC3th_EGw/Tjh8jM9pskI/AAAAAAAAB3s/VC2iBgMwKQo/s72-c/1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-4269023284433438801</id><published>2011-07-25T16:57:00.000-07:00</published><updated>2011-07-25T16:58:06.763-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emc'/><category scheme='http://www.blogger.com/atom/ns#' term='export'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='metaclass'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>grails - export plugin, at dynamically more attributes</title><content type='html'>&lt;b&gt;What is this about?&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;currently I'm writing on a little tech study application, called times. Which can be accessed &lt;a href="http://code.google.com/p/times"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This application is a very simplistic timetracker, but allows me to play with some api's I normally don't use or to simply test some grails functions.&lt;br /&gt;&lt;br /&gt;Right now I had a simple idea.&lt;br /&gt;&lt;br /&gt;I want to export all my data, using the &lt;a href="http://www.grails.org/plugin/export"&gt;grails export plugin&lt;/a&gt;, without cluttering my database model with dozens of attributes, which will never be queried. I also did not want to create pojo's, just for the export. Instead I decided to play a bit with the EMC MetaClass again and see if, we can do this on the fly.&lt;br /&gt;&lt;br /&gt;Example:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;def exports = []&lt;br /&gt;&lt;br /&gt;def fields = ["name","organization","project","beginDate","endDate","timeSpend"]&lt;br /&gt;def labels = ["name":"Name","organization":"Organization","project":"Project","beginDate":"Start","endDate":"Finished","timeSpend":"Durations (s)"]&lt;br /&gt;Task.list().each {Task t -&gt;&lt;br /&gt;if (t.endDate != null) {&lt;br /&gt;t.metaClass.timeSpend = (t.endDate.time - t.beginDate.time)/1000&lt;br /&gt;&lt;br /&gt;exports.add(t)&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;exportService.export(params.format, response.outputStream, exports,fields,labels, [:], [:])&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;this registers the attribute 'timeSpend' to the lifespan of the Task instance 't'. Which is only be required during the export.&lt;br /&gt;&lt;br /&gt;The important line is&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;t.metaClass.timeSpend = (t.endDate.time - t.beginDate.time)/1000&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Short, it can simplify your life a bit and reduces the need of introducing a pojo, just to export data or to permanently add this object to your database. Specially since it's a calculated value and can be regenerated on the fly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-4269023284433438801?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/4269023284433438801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2011/07/grails-export-plugin-at-dynamically.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/4269023284433438801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/4269023284433438801'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2011/07/grails-export-plugin-at-dynamically.html' title='grails - export plugin, at dynamically more attributes'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-7489528725878829787</id><published>2011-07-18T11:44:00.000-07:00</published><updated>2011-07-18T11:44:17.280-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='radeon'/><category scheme='http://www.blogger.com/atom/ns#' term='ati'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='gpu'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>openCl - not recognizing GPU, during remote logins</title><content type='html'>in the last couple of days I had some issues with my Ubuntu/Ati GPU based calculation units. They refused to execute any calculations, whenever I tried to use SSH to run them.&lt;br /&gt;&lt;br /&gt;So a bit of googleling later I found the following informations in a hidden pdf:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;a. Add the following lines at the end of /etc/gdm/Init/Default, &lt;br /&gt;before the exit 0, to modify the security settings, allowing remote &lt;br /&gt;sessions to access the X server and ensuring that remote sessions have &lt;br /&gt;access to the necessary device files when communicating with the GPU:&lt;br /&gt;xhost +&lt;br /&gt;chmod uog+rw /dev/ati/card*&lt;br /&gt;b. If you normally use bash, add the following line to the end of &lt;br /&gt;/etc/bashrc file to ensure remote sessions know which X server to &lt;br /&gt;access.&lt;br /&gt;case $DISPLAY in ’’) export DISPLAY=:0;; *) ;; esac&lt;br /&gt;NOTE: ’ ’ are two single quotes, not a single double-quot&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Taken from:&lt;br /&gt;&lt;br /&gt;http://developer.amd.com/sdks/AMDAPPSDK/assets/App_Note-Running_AMD_APP_Apps_Remotely.pdf&lt;br /&gt;&lt;br /&gt;Now everything works fine and all is dandy again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-7489528725878829787?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/7489528725878829787/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2011/07/opencl-not-recognizing-gpu-during.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/7489528725878829787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/7489528725878829787'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2011/07/opencl-not-recognizing-gpu-during.html' title='openCl - not recognizing GPU, during remote logins'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-2480421684323373667</id><published>2011-07-10T21:20:00.000-07:00</published><updated>2011-07-10T21:20:32.153-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='trading'/><category scheme='http://www.blogger.com/atom/ns#' term='bitcoin'/><category scheme='http://www.blogger.com/atom/ns#' term='json'/><category scheme='http://www.blogger.com/atom/ns#' term='mtgox'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Groovy HTTP Builder- fetching JSON data over post and supply parameters</title><content type='html'>Right now I'm playing around with the MtGox api to issue online transactions to buy and sell bitcoins. Yes I'm still obsessed with these and don't think this is going to change anytime soon, since It's starting to actually generate money.&lt;br /&gt;&lt;br /&gt;But the big pain right now is that you have togo to so many different websites todo a simple transaction and I really want to have this all combined in one single tool.&lt;br /&gt;&lt;br /&gt;So the api exspects from you to be queried over post arguments and the first thing which came to my mind was to use the fantastic HttpBuilder in groovy.&lt;br /&gt;&lt;br /&gt;so let's define a simple method to simplify life a bit for us&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;private executeQuery(Map parameter, String path) {&lt;br /&gt;&lt;br /&gt;def http = new HTTPBuilder("https://mtgox.com/")&lt;br /&gt;&lt;br /&gt;def result = ""&lt;br /&gt;http.post(body: parameter, path: path, requestContentType: URLENC) { resp, json -&gt;&lt;br /&gt;&lt;br /&gt;if (resp.statusLine.statusCode == 200) {&lt;br /&gt;result = json&lt;br /&gt;}&lt;br /&gt;else {&lt;br /&gt;result = false&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;return result&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and a second method to actually call this&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;def getCurrentBalance() {&lt;br /&gt;&lt;br /&gt;if (MtGoxAccessHandler.isConfigured()) {&lt;br /&gt;def values = executeQuery([&lt;br /&gt;&lt;br /&gt;name: MtGoxAccessHandler.getUserName(), &lt;br /&gt;pass: MtGoxAccessHandler.getPassword()], &lt;br /&gt;"/code/getFunds.php")&lt;br /&gt;&lt;br /&gt;return [usd: values.usds, coins: values.btcs]&lt;br /&gt;}&lt;br /&gt;else {&lt;br /&gt;return false&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The class MtGoxAccessHandler is just a little helper, which stores the username and password and allows me to simplify the code a bit and easy testing.&lt;br /&gt;&lt;br /&gt;This post is also related to the google code project &lt;a href="http://code.google.com/p/deepbitview/"&gt;DeepBitView&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-2480421684323373667?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/2480421684323373667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2011/07/groovy-http-builder-fetching-json-data.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/2480421684323373667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/2480421684323373667'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2011/07/groovy-http-builder-fetching-json-data.html' title='Groovy HTTP Builder- fetching JSON data over post and supply parameters'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-2595824389042907212</id><published>2011-07-04T14:27:00.000-07:00</published><updated>2011-07-04T14:27:27.354-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='bitcoin'/><category scheme='http://www.blogger.com/atom/ns#' term='ssl'/><category scheme='http://www.blogger.com/atom/ns#' term='json'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='bitmining'/><title type='text'>JSON and SSL in groovy, how to ignore certificates</title><content type='html'>In the last couple of days I became more and more interested in bitmining and the first thing I noticed was the utter lack of integrated tools and hence statistics I would like to associated with my miners.&lt;br /&gt;&lt;br /&gt;This resulted in me creating a tiny grails application to synchronzie my &lt;a href="http://deepbit.org/"&gt;deepbit&lt;/a&gt; statistics with the current market data from &lt;a href="https://mtgox.com/"&gt;mtgox&lt;/a&gt; to calculate at which point it becomes pointless to mine these thing. I basically hope that this pays for the 700$ for my 2x6950 radeons and associated cooling the 100+F heat we have here in California.&lt;br /&gt;&lt;br /&gt;Now originally you could assume that this is rather straightforward. After all you got json data, which just need to be parsed.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Map jsonArray = JSON.parse(new InputStreamReader(new URL("https://mtgox.com/code/data/ticker.php").openStream()))&lt;br /&gt;&lt;br /&gt;println jsonArray&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;but sadly the java ssl security manager does not agree here with us and tosses a fit..&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target&lt;br /&gt;at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)&lt;br /&gt;at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1649)&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Now java is kinda smart, if want's to force you install a security certificate from the server you access and authorize yourself. But sometimes you don't want this. In this case it's overkill, since we are having a readonly transaction. &lt;br /&gt;&lt;br /&gt;So what has to be done?&lt;br /&gt;&lt;br /&gt;you need to create your own security manager implementation. Which basically is a 3 step procedure&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;implement an interface&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;class TrustManager implements X509TrustManager {&lt;br /&gt;&lt;br /&gt;public java.security.cert.X509Certificate[] getAcceptedIssuers() {&lt;br /&gt;return null;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void checkClientTrusted(&lt;br /&gt;java.security.cert.X509Certificate[] certs, String authType) {&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void checkServerTrusted(&lt;br /&gt;java.security.cert.X509Certificate[] certs, String authType) {&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;register the interface and update the context configuration&lt;br /&gt;&lt;code&gt;&lt;br /&gt;TrustManager[] trustAllCerts = new TrustManager[1]&lt;br /&gt;&lt;br /&gt;trustAllCerts[0] =  new TrustManager()&lt;br /&gt;try {&lt;br /&gt;SSLContext sc = SSLContext.getInstance("SSL");&lt;br /&gt;sc.init(null, trustAllCerts, new java.security.SecureRandom());&lt;br /&gt;HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());&lt;br /&gt;} catch (Exception e) {&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;and continue like always with your json script&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Map jsonArray = JSON.parse(new InputStreamReader(new URL("https://mtgox.com/code/data/ticker.php").openStream()))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;and the result should be now the current ticker for the USD to BitCoin exchange rate.&lt;/span&gt;&lt;ol&gt;&lt;/ol&gt;&lt;div&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;{"ticker":{"high":15.4989,"low":13.31415,"avg":14.726503862,"vol":42862,"last":13.31415,"buy":13.331,"sell":13.35999}}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-2595824389042907212?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/2595824389042907212/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2011/07/json-and-ssl-in-groovy-how-to-ignore.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/2595824389042907212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/2595824389042907212'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2011/07/json-and-ssl-in-groovy-how-to-ignore.html' title='JSON and SSL in groovy, how to ignore certificates'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-784977570680284434</id><published>2011-06-22T15:47:00.000-07:00</published><updated>2011-06-22T15:47:25.473-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='markup'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='builder'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl'/><title type='text'>groovy - parsing reading builder content from an external file</title><content type='html'>we all know that groovy builders are great and fun and can make your life so much easier.&lt;br /&gt;&lt;br /&gt;For example if you want to create a simple xml file in your groovy script you can just do the following&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;def writer = new StringWriter()&lt;br /&gt;def xml = new MarkupBuilder(writer)&lt;br /&gt;xml.records() {&lt;br /&gt;  car(name:'HSV Maloo', make:'Holden', year:2006) {&lt;br /&gt;    country('Australia')&lt;br /&gt;    record(type:'speed', 'Production Pickup Truck with speed of 271kph')&lt;br /&gt;  }&lt;br /&gt;  car(name:'P50', make:'Peel', year:1962) {&lt;br /&gt;    country('Isle of Man')&lt;br /&gt;    record(type:'size', 'Smallest Street-Legal Car at 99cm wide and 59 kg in weight')&lt;br /&gt;  }&lt;br /&gt;  car(name:'Royale', make:'Bugatti', year:1931) {&lt;br /&gt;    country('France')&lt;br /&gt;    record(type:'price', 'Most Valuable Car at $15 million')&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;looks easy and is easy. But now you come to the point where you think. Mhm it would be nice, if I could just read the builder code from an external file and generate the xml on the fly using this. For example you have to generate an xml configuration file and rather simplify this process using groovy and this has to be done more than once...&lt;br /&gt;&lt;br /&gt;After a couple of hours googleing the best solution I came up with, was to provide your own binding to the builder, which simplified things quite a bit.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;class XmlBinding extends Binding{&lt;br /&gt; def builder&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; Object getVariable(String name) {&lt;br /&gt;  return { Object... args -&gt;  builder.invokeMethod(name,args) }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;let's assume we like to read the following builder code, defined in a file named 'test.groovy'&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;   config{&lt;br /&gt;    bin{&lt;br /&gt;     allow(minimumClassSize:1)&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;which all you need to do, now you could for example have a main method somewhere containing this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  def groovyScriptContent = new File("test.groovy").text&lt;br /&gt;  def writer = new StringWriter()&lt;br /&gt;  def xml = new MarkupBuilder(writer)&lt;br /&gt;  def binding = new XmlBinding()&lt;br /&gt;  binding.builder = xml&lt;br /&gt;  &lt;br /&gt;  def dslScript = new GroovyShell().parse(groovyScriptContent)&lt;br /&gt;  dslScript.binding =  binding&lt;br /&gt;  dslScript.run()&lt;br /&gt;  &lt;br /&gt;  println writer.toString()&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and as a result it generates the following xml document&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;config&amp;gt;&lt;br /&gt;  &amp;lt;bin&amp;gt;&lt;br /&gt;    &amp;lt;allow minimumClassSize=&amp;#39;1&amp;#39; /&amp;gt;&lt;br /&gt;  &amp;lt;/bin&amp;gt;&lt;br /&gt;&amp;lt;/config&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-784977570680284434?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/784977570680284434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2011/06/groovy-parsing-reading-builder-content.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/784977570680284434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/784977570680284434'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2011/06/groovy-parsing-reading-builder-content.html' title='groovy - parsing reading builder content from an external file'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-7468053319864443323</id><published>2011-03-17T10:52:00.000-07:00</published><updated>2011-03-17T10:52:12.556-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vmware'/><title type='text'>vmware fusion - changing nat address range on the host</title><content type='html'>recently I was installing a lot of vmware virtual machines on 3 different macs to test some binbase issues and it turns out the vmware fusion assigns a random iprange on every box.&lt;br /&gt;&lt;br /&gt;Rather annoying if you virtual machine needs a fixed IP, thank you rocks guys for this...&lt;br /&gt;&lt;br /&gt;Anyway to change the vmnet8 interface configuration you need to modify the following files:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;sudo vim /Library/Application\ Support/VMware\ Fusion/vmnet8/nat.conf&lt;br /&gt;sudo vim /Library/Application\ Support/VMware\ Fusion/vnetworking&lt;br /&gt;sudo vim /Library/Application\ Support/VMware\ Fusion/vmnet8/dhcpd.conf&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and update the default range with you wished range.&lt;br /&gt;&lt;br /&gt;afterwards execute:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;./boot.sh --restart&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;in the directory:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt; /Library/Application\ Support/VMware\ Fusion/&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and you should be good togo!&lt;br /&gt;&lt;br /&gt;More about this can be found at &lt;a href="http://blog.mclaughlinsoftware.com/2010/03/01/vmware-fusion-nat/"&gt;http://blog.mclaughlinsoftware.com/2010/03/01/vmware-fusion-nat/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-7468053319864443323?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/7468053319864443323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2011/03/vmware-fusion-changing-nat-address.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/7468053319864443323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/7468053319864443323'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2011/03/vmware-fusion-changing-nat-address.html' title='vmware fusion - changing nat address range on the host'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-3218505331379369543</id><published>2011-02-10T12:02:00.001-08:00</published><updated>2011-02-10T12:02:59.422-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spaces'/><category scheme='http://www.blogger.com/atom/ns#' term='osx'/><title type='text'>locking an application to a space in OSX Snowleopard</title><content type='html'>since i have several monitors connected to my max I like to have some apps always in one window on the same screen and not have to keep searching for it.&lt;br /&gt;&lt;br /&gt;Most importantly I always want to keep my browser and terminal on the right screen and on the left screen I have several different IDE's.&lt;br /&gt;&lt;br /&gt;Like...&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;eclipse in space 1&lt;/li&gt;&lt;li&gt;intellij in space 2&lt;/li&gt;&lt;li&gt;etc&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;solution?&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Arial, Helvetica, Georgia, sans-serif; font-size: 12px; line-height: 18px;"&gt;&lt;ol&gt;&lt;li&gt;Go to your&amp;nbsp;&lt;strong&gt;System Preferences&lt;/strong&gt;&amp;nbsp;and enable&amp;nbsp;&lt;strong&gt;Spaces&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;Now, in the box in the middle of the Spaces settings that says&amp;nbsp;&lt;strong&gt;Application Assignments&lt;/strong&gt;, add an application using the + button.&lt;/li&gt;&lt;li&gt;Just navigate to the chosen program in your Applications folder.&lt;/li&gt;&lt;li&gt;Now the trick here is in the Space column to choose&amp;nbsp;&lt;span style="text-decoration: underline;"&gt;&lt;strong&gt;Every Space&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;from the picklist.&lt;/li&gt;&lt;li&gt;rinse and repeat for all applications&lt;/li&gt;&lt;/ol&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-3218505331379369543?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/3218505331379369543/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2011/02/locking-application-to-space-in-osx.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/3218505331379369543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/3218505331379369543'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2011/02/locking-application-to-space-in-osx.html' title='locking an application to a space in OSX Snowleopard'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-4036511773370501459</id><published>2010-12-21T12:37:00.000-08:00</published><updated>2010-12-21T12:37:03.851-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='chkconfig'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='jboss'/><title type='text'>registering jboss to start by default and comforms to chkconfig</title><content type='html'>currently I had yet another binbase install and it turned out that my standard jboss script is not chkconfig compatible.&lt;br /&gt;&lt;br /&gt;So it was time todo a rewrite&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#! /bin/bash&lt;br /&gt;#&lt;br /&gt;# network Bring up/down jboss&lt;br /&gt;#&lt;br /&gt;# chkconfig: 345 20 80&lt;br /&gt;# description: Starts and stops the jboss server&lt;br /&gt;#&lt;br /&gt;# /etc/rc.d/init.d/jboss&lt;br /&gt;# See how we were called.&lt;br /&gt;&lt;br /&gt;#define where jboss is - this is the directory containing directories log, bin, conf etc&lt;br /&gt;JBOSS_HOME=/share/apps/jboss&lt;br /&gt;&lt;br /&gt;#define the user under which jboss will run, or use 'RUNASIS' to run as the current user&lt;br /&gt;JBOSS_USER=${JBOSS_USER:-"root"}&lt;br /&gt;&lt;br /&gt;#make sure java is in your path&lt;br /&gt;JAVAPTH=/usr/java/latest/bin/java&lt;br /&gt;&lt;br /&gt;#configuration to use, usually one of 'minimal', 'default', 'all'&lt;br /&gt;JBOSS_CONF=${JBOSS_CONF:-"all"}&lt;br /&gt;JBOSS_HOST=0.0.0.0&lt;br /&gt;&lt;br /&gt;JBOSS_CONSOLE=$JBOSS_HOME/console.log&lt;br /&gt;#if JBOSS_HOST specified, use -b to bind jboss services to that address&lt;br /&gt;JBOSS_BIND_ADDR=${JBOSS_HOST:+"-b $JBOSS_HOST"}&lt;br /&gt;&lt;br /&gt;#define the classpath for the shutdown class&lt;br /&gt;JBOSSCP=${JBOSSCP:-"$JBOSS_HOME/bin/shutdown.jar:$JBOSS_HOME/client/jnet.jar"}&lt;br /&gt;&lt;br /&gt;#define the script to use to start jboss&lt;br /&gt;JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh -c $JBOSS_CONF $JBOSS_BIND_ADDR"}&lt;br /&gt;&lt;br /&gt;if [ "$JBOSS_USER" = "RUNASIS" ]; then&lt;br /&gt;  SUBIT=""&lt;br /&gt;else&lt;br /&gt;  SUBIT="su - $JBOSS_USER -c "&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;if [ -n "$JBOSS_CONSOLE" -a ! -d "$JBOSS_CONSOLE" ]; then&lt;br /&gt;  # ensure the file exists&lt;br /&gt;  touch $JBOSS_CONSOLE&lt;br /&gt;  if [ ! -z "$SUBIT" ]; then&lt;br /&gt;    chown $JBOSS_USER $JBOSS_CONSOLE&lt;br /&gt;  fi&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-4036511773370501459?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/4036511773370501459/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/12/registering-jboss-to-start-by-default.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/4036511773370501459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/4036511773370501459'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/12/registering-jboss-to-start-by-default.html' title='registering jboss to start by default and comforms to chkconfig'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-5216161838073380747</id><published>2010-12-18T01:13:00.000-08:00</published><updated>2010-12-18T01:13:47.531-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='binbase'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='config'/><title type='text'>grails - providing your own plugins configuration</title><content type='html'>sometimes you want to share some services in a plugin, which needs to be configured at runtime.&lt;br /&gt;&lt;br /&gt;The easiest way is to provide a simple file in the grails conf diretory of your plugin and just read it and access it at runtime.&lt;br /&gt;&lt;br /&gt;How to?&lt;br /&gt;&lt;br /&gt;our little helper:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;package binbase.core&lt;br /&gt;&lt;br /&gt;import grails.util.GrailsUtil&lt;br /&gt;import org.codehaus.groovy.grails.commons.GrailsApplication&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Created by IntelliJ IDEA.&lt;br /&gt; * User: wohlgemuth&lt;br /&gt; * Date: 12/18/10&lt;br /&gt; * Time: 1:00 AM&lt;br /&gt; * To change this template use File | Settings | File Templates.&lt;br /&gt; */&lt;br /&gt;class BinBaseConfigReader {&lt;br /&gt;&lt;br /&gt;  private static ConfigObject config = initialize()&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * initializes the object&lt;br /&gt;   * @return&lt;br /&gt;   */&lt;br /&gt;  static ConfigObject initialize() {&lt;br /&gt;    return new ConfigSlurper().parse(new GroovyClassLoader(BinBaseConfigReader.class.getClassLoader()).loadClass('BinBaseConfig'))&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * returns the server&lt;br /&gt;   * @return&lt;br /&gt;   */&lt;br /&gt;  static String getServer() {&lt;br /&gt;    if (GrailsUtil.getEnvironment().equals(GrailsApplication.ENV_TEST)) {&lt;br /&gt;      return config.binbase.test.server.toString()&lt;br /&gt;    }&lt;br /&gt;    else if (GrailsUtil.getEnvironment().equals(GrailsApplication.ENV_DEVELOPMENT)) {&lt;br /&gt;      return config.binbase.development.server.toString()&lt;br /&gt;    }&lt;br /&gt;    else if (GrailsUtil.getEnvironment().equals(GrailsApplication.ENV_PRODUCTION)) {&lt;br /&gt;      return config.binbase.production.server.toString()&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;    else {&lt;br /&gt;      throw new RuntimeException("unexspected enviroment found")&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;our configuration&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;/**&lt;br /&gt; * this file contains the binbase configuration for this plugin.&lt;br /&gt; *&lt;br /&gt; */&lt;br /&gt;binbase {&lt;br /&gt;  production {&lt;br /&gt;    key = "dasdasd"&lt;br /&gt;    server = "10.1.1.1"&lt;br /&gt;  }&lt;br /&gt;  test {&lt;br /&gt;    key = "dasdasd"&lt;br /&gt;    server = "10.2.2.2"&lt;br /&gt;  }&lt;br /&gt;  development {&lt;br /&gt;    key = "dasdasd"&lt;br /&gt;    server = "127.0.0.1"&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and to access it in your, say spring configuration?&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  jndiBinBaseTemplate(org.springframework.jndi.JndiTemplate) {&lt;br /&gt;&lt;br /&gt;    environment = [&lt;br /&gt;            "java.naming.factory.initial": "org.jnp.interfaces.NamingContextFactory",&lt;br /&gt;            "java.naming.factory.url.pkgs": "org.jboss.naming:org.jnp.interfaces",&lt;br /&gt;            "java.naming.provider.url": "${BinBaseConfigReader.getServer()}:1099".toString()&lt;br /&gt;    ]&lt;br /&gt;  }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;easy, isn't it?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-5216161838073380747?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/5216161838073380747/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/12/grails-providing-your-own-plugins.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/5216161838073380747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/5216161838073380747'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/12/grails-providing-your-own-plugins.html' title='grails - providing your own plugins configuration'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-5399991582823788319</id><published>2010-12-18T00:06:00.000-08:00</published><updated>2010-12-18T00:06:36.776-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ejb'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='mocking'/><title type='text'>grails - testing service, which accesses ejb's</title><content type='html'>this night I just wanted to write a quick grails plugin to access my BinBase database system.&lt;br /&gt;&lt;br /&gt;Since I'm a smart developer I start with a simple spring dsl file and write a test.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;// Place your Spring DSL code here&lt;br /&gt;beans = {&lt;br /&gt;&lt;br /&gt;  jndiBinBaseTemplate(org.springframework.jndi.JndiTemplate) {&lt;br /&gt;&lt;br /&gt;    environment = [&lt;br /&gt;            "java.naming.factory.initial": "org.jnp.interfaces.NamingContextFactory",&lt;br /&gt;            "java.naming.factory.url.pkgs": "org.jboss.naming:org.jnp.interfaces",&lt;br /&gt;            "java.naming.provider.url": "localhost:1099"&lt;br /&gt;    ]&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * connection to the cluster configuration&lt;br /&gt;   */&lt;br /&gt;  clusterConfigService(SimpleRemoteStatelessSessionProxyFactoryBean) { bean -&gt;&lt;br /&gt;    businessInterface = "edu.ucdavis.genomics.metabolomics.binbase.cluster.ejb.delegate.ClusterConfigService"&lt;br /&gt;    jndiName = "clusterservice/ClusterConfigServiceBean/remote"&lt;br /&gt;    jndiTemplate = ref(jndiBinBaseTemplate)&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}            &lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and the test code is simple enough&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;class BinBaseSchedulingServiceTests extends GroovyTestCase {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  ClusterConfigService clusterConfigService&lt;br /&gt;&lt;br /&gt;  protected void setUp() {&lt;br /&gt;    super.setUp()&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  protected void tearDown() {&lt;br /&gt;    super.tearDown()&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void testTest(){&lt;br /&gt;    assertTrue(clusterConfigService.username != null)&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;the variable 'ClusterConfigService' is an stateless session bean in a jboss container and I know it works...&lt;br /&gt;&lt;br /&gt;except grails is complaining:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'clusterConfigService': Invocation of init method failed; nested exception is javax.naming.NameNotFoundException: Name [clusterservice/ClusterConfigServiceBean/remote] not bound; 0 bindings: []&lt;br /&gt; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1412)&lt;br /&gt; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)&lt;br /&gt; at org.codehaus.groovy.grails.commons.spring.ReloadAwareAutowireCapableBeanFactory.doCreateBean(ReloadAwareAutowireCapableBeanFactory.java:135)&lt;br /&gt; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)&lt;br /&gt; at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)&lt;br /&gt; at &lt;br /&gt;....lots and lots of more...&lt;br /&gt;Caused by: javax.naming.NameNotFoundException: Name [clusterservice/ClusterConfigServiceBean/remote] not bound; 0 bindings: []&lt;br /&gt; at org.springframework.mock.jndi.SimpleNamingContext.lookup(SimpleNamingContext.java:132)&lt;br /&gt; at javax.naming.InitialContext.lookup(InitialContext.java:392)&lt;br /&gt; at org.springframework.jndi.JndiTemplate$1.doInContext(JndiTemplate.java:154)&lt;br /&gt; at org.springframework.jndi.JndiTemplate.execute(JndiTemplate.java:87)&lt;br /&gt; at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:152)&lt;br /&gt; at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:178)&lt;br /&gt; at org.springframework.jndi.JndiLocatorSupport.lookup(JndiLocatorSupport.java:95)&lt;br /&gt; at org.springframework.jndi.JndiObjectLocator.lookup(JndiObjectLocator.java:105)&lt;br /&gt; at org.springframework.ejb.access.AbstractRemoteSlsbInvokerInterceptor.lookup(AbstractRemoteSlsbInvokerInterceptor.java:100)&lt;br /&gt; at org.springframework.ejb.access.AbstractSlsbInvokerInterceptor.refreshHome(AbstractSlsbInvokerInterceptor.java:122)&lt;br /&gt; at &lt;br /&gt;...lots and lots of more...&lt;br /&gt;[23:59:35,938] [ERROR] [main] [StackTrace] [Sanitizing stacktrace:]&lt;br /&gt;javax.naming.NameNotFoundException: Name [clusterservice/ClusterConfigServiceBean/remote] not bound; 0 bindings: []&lt;br /&gt; at org.springframework.mock.jndi.SimpleNamingContext.lookup(SimpleNamingContext.java:132)&lt;br /&gt; at javax.naming.InitialContext.lookup(InitialContext.java:392)&lt;br /&gt; at org.springframework.jndi.JndiTemplate$1.doInContext(JndiTemplate.java:154)&lt;br /&gt; at org.springframework.jndi.JndiTemplate.execute(JndiTemplate.java:87)&lt;br /&gt; at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:152)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;mhm doesn't make much sense. Reason for the failure is that grails decides to mock the access, which is normally ok. But in our case really really not desired.&lt;br /&gt;&lt;br /&gt;After all we want to access the application server context!&lt;br /&gt;&lt;br /&gt;But it keeps jumping to the 'org.springframework.mock.jndi.SimpleNamingContext' mocking context.&lt;br /&gt;&lt;br /&gt;So the only solution is this slightly dirty hack...&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;/***&lt;br /&gt; * we do not need mocking in this plugin...&lt;br /&gt; */&lt;br /&gt;if (org.springframework.mock.jndi.SimpleNamingContextBuilder.currentContextBuilder) {&lt;br /&gt;  org.springframework.mock.jndi.SimpleNamingContextBuilder.currentContextBuilder.deactivate()&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and promptly it passes.&lt;br /&gt;&lt;br /&gt;Since we only want to change this for test cases, we add yet another conditon and our resources.groovy file ends up looking like&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import org.springframework.ejb.access.SimpleRemoteStatelessSessionProxyFactoryBean&lt;br /&gt;import grails.util.GrailsUtil&lt;br /&gt;import org.codehaus.groovy.grails.commons.GrailsApplication&lt;br /&gt;&lt;br /&gt;/** *&lt;br /&gt; * we do not need mocking in this plugin...&lt;br /&gt; */&lt;br /&gt;if (GrailsUtil.getEnvironment().equals(GrailsApplication.ENV_TEST)) {&lt;br /&gt;  println "warning disabling mocking context!!! to make remote ejb's work"&lt;br /&gt;  if (org.springframework.mock.jndi.SimpleNamingContextBuilder.currentContextBuilder) {&lt;br /&gt;    org.springframework.mock.jndi.SimpleNamingContextBuilder.currentContextBuilder.deactivate()&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Place your Spring DSL code here&lt;br /&gt;beans = {&lt;br /&gt;&lt;br /&gt;  jndiBinBaseTemplate(org.springframework.jndi.JndiTemplate) {&lt;br /&gt;&lt;br /&gt;    environment = [&lt;br /&gt;            "java.naming.factory.initial": "org.jnp.interfaces.NamingContextFactory",&lt;br /&gt;            "java.naming.factory.url.pkgs": "org.jboss.naming:org.jnp.interfaces",&lt;br /&gt;            "java.naming.provider.url": "eros.fiehnlab.ucdavis.edu:1099"&lt;br /&gt;    ]&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * connection to the cluster configuration&lt;br /&gt;   */&lt;br /&gt;  clusterConfigService(SimpleRemoteStatelessSessionProxyFactoryBean) { bean -&gt;&lt;br /&gt;    businessInterface = "edu.ucdavis.genomics.metabolomics.binbase.cluster.ejb.delegate.ClusterConfigService"&lt;br /&gt;    jndiName = "clusterservice/ClusterConfigServiceBean/remote"&lt;br /&gt;    jndiTemplate = ref(jndiBinBaseTemplate)&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}             &lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-5399991582823788319?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/5399991582823788319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/12/grails-testing-service-which-accesses.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/5399991582823788319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/5399991582823788319'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/12/grails-testing-service-which-accesses.html' title='grails - testing service, which accesses ejb&apos;s'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-966996649212301584</id><published>2010-12-16T09:59:00.000-08:00</published><updated>2010-12-16T10:01:51.612-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webtest'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='junit'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='grails groovy file download java'/><title type='text'>Grails 1.3.5 webtests - custom steps to reset the database</title><content type='html'>once in a while I have the trouble that I want to reset the complete database during webtests or to make a snapshot of the current database while running the test.&lt;br /&gt;&lt;br /&gt;So we use the great dbunit plugin to dump the database in one step:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import javax.sql.DataSource&lt;br /&gt;import grails.plugin.remotecontrol.RemoteControl&lt;br /&gt;import org.dbunit.database.DatabaseConnection&lt;br /&gt;import org.dbunit.dataset.IDataSet&lt;br /&gt;import org.dbunit.database.IDatabaseConnection&lt;br /&gt;import org.dbunit.dataset.xml.FlatXmlDataSet&lt;br /&gt;/**&lt;br /&gt;* Created by IntelliJ IDEA.&lt;br /&gt;* User: wohlgemuth&lt;br /&gt;* Date: Nov 24, 2010&lt;br /&gt;* Time: 3:46:47 PM&lt;br /&gt;* To change this template use File | Settings | File Templates.&lt;br /&gt;*/&lt;br /&gt;class DumpDatabaseStep extends com.canoo.webtest.steps.Step {&lt;br /&gt;&lt;br /&gt;String fileName = "result.xml"&lt;br /&gt;/**&lt;br /&gt;* resets the database&lt;br /&gt;*/&lt;br /&gt;void doExecute() {&lt;br /&gt;&lt;br /&gt;RemoteControl remote = new RemoteControl()&lt;br /&gt;try {&lt;br /&gt;&lt;br /&gt;def outputFile = fileName&lt;br /&gt;remote {&lt;br /&gt;File file = new File("target/test-reports/data")&lt;br /&gt;file.mkdirs()&lt;br /&gt;&lt;br /&gt;DataSource dataSource = ctx.dataSource&lt;br /&gt;&lt;br /&gt;IDatabaseConnection connection = new DatabaseConnection(dataSource.connection)&lt;br /&gt;&lt;br /&gt;IDataSet fullDataSet = connection.createDataSet()&lt;br /&gt;&lt;br /&gt;File out = new File(file, outputFile)&lt;br /&gt;&lt;br /&gt;int counter = 1;&lt;br /&gt;&lt;br /&gt;boolean run = out.exists()&lt;br /&gt;while (run) {&lt;br /&gt;out = new File(file, "${counter}-${outputFile}")&lt;br /&gt;&lt;br /&gt;run = out.exists()&lt;br /&gt;if (counter == 100) {&lt;br /&gt;println "killed after 100 runs.."&lt;br /&gt;run = false&lt;br /&gt;}&lt;br /&gt;counter++&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;FlatXmlDataSet.write(fullDataSet, new FileOutputStream(out))&lt;br /&gt;&lt;br /&gt;null&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;catch (Exception e) {&lt;br /&gt;e.printStackTrace()&lt;br /&gt;&lt;br /&gt;throw e&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and also to reset the complete database in another step&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import grails.plugin.remotecontrol.RemoteControl&lt;br /&gt;import javax.sql.DataSource&lt;br /&gt;import groovy.sql.Sql&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* simple step which resets the complete database&lt;br /&gt;*/&lt;br /&gt;class ResetDatabaseStep extends com.canoo.webtest.steps.Step {&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* resets the database&lt;br /&gt;*/&lt;br /&gt;void doExecute() {&lt;br /&gt;&lt;br /&gt;try {&lt;br /&gt;DbUnitOperator.create()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;RemoteControl remote = new RemoteControl()&lt;br /&gt;&lt;br /&gt;remote.exec {&lt;br /&gt;try {&lt;br /&gt;DataSource dataSource = ctx.dataSource&lt;br /&gt;Sql sql = Sql.newInstance(dataSource)&lt;br /&gt;&lt;br /&gt;sql.execute("DROP SEQUENCE MINIX_ID")&lt;br /&gt;sql.execute("CREATE SEQUENCE MINIX_ID START WITH  1000 INCREMENT BY 1")&lt;br /&gt;}&lt;br /&gt;catch (Exception e) {&lt;br /&gt;e.printStackTrace()&lt;br /&gt;throw e&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;catch (Exception e) {&lt;br /&gt;println "error: ${e.getMessage()}"&lt;br /&gt;e.printStackTrace()&lt;br /&gt;throw new RuntimeException(e)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-966996649212301584?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/966996649212301584/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/12/grails-135-webtests-custom-steps-to.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/966996649212301584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/966996649212301584'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/12/grails-135-webtests-custom-steps-to.html' title='Grails 1.3.5 webtests - custom steps to reset the database'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-4483547344166595716</id><published>2010-12-16T09:52:00.000-08:00</published><updated>2010-12-16T10:02:42.344-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webtest'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='junit'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Grails 1.3.5 webtests and JQuery trouble</title><content type='html'>recently I migrated my prototype code over to JQuery and promptly all my webtest's failed with a lot of error messages and exceptions.&lt;br /&gt;&lt;br /&gt;Like:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;"TypeError: Cannot find function createComment in  &lt;br /&gt;object [object]. (FunctionalTestCase.groovy#372)"&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;So during some googeling I found these reports:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ultralord.za.net/2010/11/23/fighting-with-grails-1-3-xwebtest-3-0-0-and-jquery/"&gt;old htmlunit version&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://old.nabble.com/Problem-with-jQuery-and-HtmlUnit-2.4-td21931584.html"&gt;replacing version&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Which led to me reporting:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://grails.1312388.n4.nabble.com/grails-1-3-5-webtest-jquery-fail-td3077828.html"&gt;my approach&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and the final solution was to put this into your 'BuildConfig.groovy'&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;plugin("webtest") {&lt;br /&gt;test('net.sourceforge.htmlunit:htmlunit:2.8-SNAPSHOT') {&lt;br /&gt;excludes 'xalan'&lt;br /&gt;excludes 'xml-apis'&lt;br /&gt;}&lt;br /&gt;test('com.canoo.webtest:webtest:3.1-SNAPSHOT') {&lt;br /&gt;excludes 'xalan'&lt;br /&gt;excludes 'xml-apis'&lt;br /&gt;}&lt;br /&gt;test('xalan:xalan:2.7.0') {&lt;br /&gt;excludes 'xml-apis'&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-4483547344166595716?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/4483547344166595716/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/12/grails-135-wetbests-and-jquery-trouble.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/4483547344166595716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/4483547344166595716'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/12/grails-135-wetbests-and-jquery-trouble.html' title='Grails 1.3.5 webtests and JQuery trouble'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-5992832853896032794</id><published>2010-11-23T15:25:00.000-08:00</published><updated>2010-11-23T15:25:37.705-08:00</updated><title type='text'>grails many to many</title><content type='html'>currently grails many to many relation ships are giving me a lot of grief with exceptions like&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;org.hibernate.StaleObjectStateException:&lt;br /&gt;Row was updated or deleted by another transaction (or unsaved-value mapping was &lt;br /&gt;incorrect): [ClassName#id]&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;or constraint excpetions.&lt;br /&gt;&lt;br /&gt;Which all turned out to be related that the optimistic locking fails from time to time and needs to be disabled.&lt;br /&gt;With version = false in the domain mapping.&lt;br /&gt;&lt;br /&gt;References:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/1750894/disabling-locking-for-non-critical-grails-gorm-domain-classes"&gt;disable optimistic locking&lt;/a&gt;&lt;br /&gt;&lt;a href="http://dante.cassanego.net/?p=147"&gt;delete many to many relations&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-5992832853896032794?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/5992832853896032794/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/11/grails-many-to-many.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/5992832853896032794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/5992832853896032794'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/11/grails-many-to-many.html' title='grails many to many'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-452259097480572064</id><published>2010-09-30T00:43:00.000-07:00</published><updated>2010-09-30T00:43:10.650-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='statistic'/><category scheme='http://www.blogger.com/atom/ns#' term='binbase'/><title type='text'>BinBase - generate histograms</title><content type='html'>sql statements to generate histograms, to learn more about your data&lt;br /&gt;&lt;br /&gt;similarity&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;select count("range"),"range" from &lt;br /&gt;(&lt;br /&gt;    select&lt;br /&gt;        case &lt;br /&gt;            when match &gt; 500 and match &lt;= 550 then '501 - 550'             when match &gt; 550 and match &lt;= 600 then '550 - 600'             when match &gt; 600 and match &lt;= 650 then '600 - 650'             when match &gt; 650 and match &lt;= 700 then '650 - 700'             when match &gt; 700 and match &lt;= 750 then '700 - 750'            when match &gt; 750 and match &lt;= 800 then '750 - 800'            when match &gt; 800 and match &lt;= 850 then '800 - 850'            when match &gt; 850 and match &lt;= 900 then '850 - 900'            when match &gt; 900 and match &lt;= 950 then '900 - 950'            when match &gt; 950 and match &lt;= 1000 then '950 - 1000'         end             AS "range" from spectra a, bin b where a.bin_id = b.bin_id and b.export = 'FALSE')a group by "range"&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;purity&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;select count("range"),"range" from &lt;br /&gt;(&lt;br /&gt;    select&lt;br /&gt;        case &lt;br /&gt;            when a.purity &gt; 0 and a.purity &lt;= 0.1 then '0 - 0.1'             when a.purity &gt; 0.1 and a.purity &lt;= 0.5 then '0.1 - 0.5'             when a.purity &gt; 0.5 and a.purity &lt;= 0.9 then '0.5 - 0.9'             when a.purity &gt; 0.9 and a.purity &lt;= 1.3 then '0.9 - 1.3'             when a.purity &gt; 1.3 and a.purity &lt;= 1.7 then '1.3 - 1.7'            when a.purity &gt; 1.7 and a.purity &lt;= 2.1 then '1.7 - 2.1'            when a.purity &gt; 2.1 and a.purity &lt;= 2.5 then '2.1 - 2.5'            when a.purity &gt; 2.5  then '&gt; 2.5'&lt;br /&gt;         end &lt;br /&gt;            AS "range" from spectra a, bin b where a.bin_id = b.bin_id and b.export = 'TRUE'&lt;br /&gt;)&lt;br /&gt;a group by "range"&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;signal noise&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-452259097480572064?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/452259097480572064/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/09/binbase-generate-histograms.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/452259097480572064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/452259097480572064'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/09/binbase-generate-histograms.html' title='BinBase - generate histograms'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-3042419171838521707</id><published>2010-09-28T12:46:00.001-07:00</published><updated>2010-09-28T12:46:31.268-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='binbase'/><title type='text'>BinBase - reset database</title><content type='html'>simple sql script to reset the binbase database&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;delete from bin where bin_id not in (select bin_id from standard)&lt;br /&gt;GO&lt;br /&gt;delete from spectra where bin_id not in (select bin_id from standard)&lt;br /&gt;GO&lt;br /&gt;delete from correction_data&lt;br /&gt;GO&lt;br /&gt;delete from samples where sample_id not in (select sample_id from bin)&lt;br /&gt;GO&lt;br /&gt;delete from rawdata&lt;br /&gt;GO&lt;br /&gt;delete from result_link&lt;br /&gt;GO&lt;br /&gt;delete from result&lt;br /&gt;GO&lt;br /&gt;delete from runtime&lt;br /&gt;GO&lt;br /&gt;delete from quantification&lt;br /&gt;GO&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-3042419171838521707?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/3042419171838521707/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/09/binbase-reset-database.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/3042419171838521707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/3042419171838521707'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/09/binbase-reset-database.html' title='BinBase - reset database'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-7750350020796861811</id><published>2010-09-27T20:15:00.001-07:00</published><updated>2010-09-28T12:41:52.265-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='statistic'/><category scheme='http://www.blogger.com/atom/ns#' term='binbase'/><title type='text'>BinBase - simulate the sifter algorithm directly on the database</title><content type='html'>currently I'm generating statistics for the BinBase system and so needed to simulate the annotation algorithm in sql.&lt;br /&gt;&lt;br /&gt;It was rather simple....&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;-- 0.05 settings&lt;br /&gt;select &lt;br /&gt;count(*) as "count", &lt;br /&gt;lower('0 &lt; 0.05') as purity,    lower('&gt; 500') as signalNoise,&lt;br /&gt;lower('&gt; 800') as similarity&lt;br /&gt;&lt;br /&gt;from spectra where purity &gt; 0 and purity &lt; 0.05 and signal_noise &gt; 500 and match &gt; 800&lt;br /&gt;&lt;br /&gt;UNION&lt;br /&gt;&lt;br /&gt;select &lt;br /&gt;count(*) as "count", &lt;br /&gt;lower('0 &lt; 0.05') as purity,    lower('&gt; 50 &amp;&amp; &lt; 500') as signalNoise,    lower('&gt; 700') as similarity&lt;br /&gt;&lt;br /&gt;from spectra where purity &gt; 0 and purity &lt; 0.05 and signal_noise &gt; 50 and signal_noise &lt;= 500 and match &gt; 700&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;UNION&lt;br /&gt;&lt;br /&gt;select &lt;br /&gt;count(*) as "count", &lt;br /&gt;lower('0 &lt; 0.05') as purity,    lower('&gt; 5 &amp;&amp; &lt; 50') as signalNoise,    lower('&gt; 600') as similarity&lt;br /&gt;&lt;br /&gt;from spectra where purity &gt; 0 and purity &lt; 0.05 and signal_noise &gt; 5 and signal_noise &lt;= 50 and match &gt; 600&lt;br /&gt;&lt;br /&gt;-- 0.3 settings&lt;br /&gt;&lt;br /&gt;UNION&lt;br /&gt;&lt;br /&gt;select &lt;br /&gt;count(*) as "count", &lt;br /&gt;lower('0 &lt; 0.3') as purity,    lower('&gt; 500') as signalNoise,&lt;br /&gt;lower('&gt; 700') as similarity&lt;br /&gt;&lt;br /&gt;from spectra where purity &gt; 0 and purity &lt; 0.3 and signal_noise &gt; 500 and match &gt; 700&lt;br /&gt;&lt;br /&gt;UNION&lt;br /&gt;&lt;br /&gt;select &lt;br /&gt;count(*) as "count", &lt;br /&gt;lower('0 &lt; 0.3') as purity,    lower('&gt; 50 &amp;&amp; &lt; 500') as signalNoise,    lower('&gt; 600') as similarity&lt;br /&gt;&lt;br /&gt;from spectra where purity &gt; 0 and purity &lt; 0.3 and signal_noise &gt; 50 and signal_noise &lt;= 500 and match &gt; 600&lt;br /&gt;&lt;br /&gt;UNION&lt;br /&gt;&lt;br /&gt;select &lt;br /&gt;count(*) as "count", &lt;br /&gt;lower('0 &lt; 0.3') as purity,    lower('&gt; 5 &amp;&amp; &lt; 50') as signalNoise,    lower('&gt; 500') as similarity&lt;br /&gt;&lt;br /&gt;from spectra where purity &gt; 0 and purity &lt; 0.03 and signal_noise &gt; 5 and signal_noise &lt;= 50 and match &gt; 500&lt;br /&gt;&lt;br /&gt;-- all ither settings&lt;br /&gt;&lt;br /&gt;UNION&lt;br /&gt;&lt;br /&gt;select &lt;br /&gt;count(*) as "count", &lt;br /&gt;lower('&gt; 0.3') as purity,&lt;br /&gt;lower('&gt; 500') as signalNoise,&lt;br /&gt;lower('&gt; 600') as similarity&lt;br /&gt;&lt;br /&gt;from spectra where purity &gt; 0.3 and signal_noise &gt; 500 and match &gt; 600&lt;br /&gt;&lt;br /&gt;UNION&lt;br /&gt;&lt;br /&gt;select &lt;br /&gt;count(*) as "count", &lt;br /&gt;lower('&gt; 0.3') as purity,&lt;br /&gt;lower('&gt; 50 &amp;&amp; &lt; 500') as signalNoise,    lower('&gt; 500') as similarity&lt;br /&gt;&lt;br /&gt;from spectra where purity &gt; 0.3 and signal_noise &gt; 50 and signal_noise &lt;= 500 and match &gt; 500&lt;br /&gt;&lt;br /&gt;UNION&lt;br /&gt;&lt;br /&gt;select &lt;br /&gt;count(*) as "count", &lt;br /&gt;lower('&gt; 0.3') as purity,&lt;br /&gt;lower('&gt; 5 &amp;&amp; &lt; 50') as signalNoise,    lower('&gt; 450') as similarity&lt;br /&gt;&lt;br /&gt;from spectra where purity &gt; 0.03 and signal_noise &gt; 5 and signal_noise &lt;= 50 and match &gt; 450&lt;br /&gt;&lt;br /&gt;-- total --&lt;br /&gt;&lt;br /&gt;union&lt;br /&gt;&lt;br /&gt;select &lt;br /&gt;count(*) as "count", &lt;br /&gt;lower('no filter') as purity,&lt;br /&gt;lower('no filter') as signalNoise,&lt;br /&gt;lower('no filter') as similarity&lt;br /&gt;&lt;br /&gt;from spectra &lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;leco 2.22 settings&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;-- 0.1 settings&lt;br /&gt;select &lt;br /&gt;count(*) as "count", &lt;br /&gt;lower('0 &lt; 0.1') as purity,    lower('&gt; 250') as signalNoise,&lt;br /&gt;lower('&gt; 800') as similarity&lt;br /&gt;&lt;br /&gt;from spectra where purity &gt; 0 and purity &lt; 0.1 and signal_noise &gt; 250 and match &gt; 800&lt;br /&gt;&lt;br /&gt;UNION&lt;br /&gt;&lt;br /&gt;select &lt;br /&gt;count(*) as "count", &lt;br /&gt;lower('0 &lt; 0.1') as purity,    lower('&gt; 25 &amp;&amp; &lt; 250') as signalNoise,    lower('&gt; 700') as similarity&lt;br /&gt;&lt;br /&gt;from spectra where purity &gt; 0 and purity &lt; 0.1 and signal_noise &gt; 25 and signal_noise &lt;= 250 and match &gt; 700&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;UNION&lt;br /&gt;&lt;br /&gt;select &lt;br /&gt;count(*) as "count", &lt;br /&gt;lower('0 &lt; 0.1') as purity,    lower('&gt;35 &amp;&amp; &lt; 25') as signalNoise,    lower('&gt; 600') as similarity&lt;br /&gt;&lt;br /&gt;from spectra where purity &gt; 0 and purity &lt; 0.1 and signal_noise &gt; 3 and signal_noise &lt;= 25 and match &gt; 600&lt;br /&gt;&lt;br /&gt;-- 1.5 settings&lt;br /&gt;&lt;br /&gt;UNION&lt;br /&gt;&lt;br /&gt;select &lt;br /&gt;count(*) as "count", &lt;br /&gt;lower('0 &lt; 1.5') as purity,    lower('&gt; 250') as signalNoise,&lt;br /&gt;lower('&gt; 700') as similarity&lt;br /&gt;&lt;br /&gt;from spectra where purity &gt; 0 and purity &lt; 1.5 and signal_noise &gt; 250 and match &gt; 700&lt;br /&gt;&lt;br /&gt;UNION&lt;br /&gt;&lt;br /&gt;select &lt;br /&gt;count(*) as "count", &lt;br /&gt;lower('0 &lt; 1.5') as purity,    lower('&gt; 25 &amp;&amp; &lt; 250') as signalNoise,    lower('&gt; 600') as similarity&lt;br /&gt;&lt;br /&gt;from spectra where purity &gt; 0 and purity &lt; 1.5 and signal_noise &gt; 25 and signal_noise &lt;= 250 and match &gt; 600&lt;br /&gt;&lt;br /&gt;UNION&lt;br /&gt;&lt;br /&gt;select &lt;br /&gt;count(*) as "count", &lt;br /&gt;lower('0 &lt; 1.5') as purity,    lower('&gt; 3 &amp;&amp; &lt; 25') as signalNoise,    lower('&gt; 500') as similarity&lt;br /&gt;&lt;br /&gt;from spectra where purity &gt; 0 and purity &lt; 1.5 and signal_noise &gt; 3 and signal_noise &lt;= 25 and match &gt; 500&lt;br /&gt;&lt;br /&gt;-- all other settings&lt;br /&gt;&lt;br /&gt;UNION&lt;br /&gt;&lt;br /&gt;select &lt;br /&gt;count(*) as "count", &lt;br /&gt;lower('&gt; 1.5') as purity,&lt;br /&gt;lower('&gt; 250') as signalNoise,&lt;br /&gt;lower('&gt; 600') as similarity&lt;br /&gt;&lt;br /&gt;from spectra where purity &gt; 1.5 and signal_noise &gt; 250 and match &gt; 600&lt;br /&gt;&lt;br /&gt;UNION&lt;br /&gt;&lt;br /&gt;select &lt;br /&gt;count(*) as "count", &lt;br /&gt;lower('&gt; 1.5') as purity,&lt;br /&gt;lower('&gt; 3 &amp;&amp; &lt; 250') as signalNoise,    lower('&gt; 500') as similarity&lt;br /&gt;&lt;br /&gt;from spectra where purity &gt; 1.5 and signal_noise &gt; 3 and signal_noise &lt;= 250 and match &gt; 500&lt;br /&gt;&lt;br /&gt;UNION&lt;br /&gt;&lt;br /&gt;-- total --&lt;br /&gt;&lt;br /&gt;select &lt;br /&gt;count(*) as "count", &lt;br /&gt;lower('no filter') as purity,&lt;br /&gt;lower('no filter') as signalNoise,&lt;br /&gt;lower('no filter') as similarity&lt;br /&gt;&lt;br /&gt;from spectra &lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and as query to filter polysiloxanes out of the result for leco 2.22&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-- 0.1 settings&lt;br /&gt;select &lt;br /&gt;count(*) as "count", &lt;br /&gt;lower('0 &lt; 0.1') as purity, lower('&gt; 250') as signalNoise,&lt;br /&gt;lower('&gt; 800') as similarity&lt;br /&gt;&lt;br /&gt;from spectra a, bin b  where a.purity &gt; 0 and a.purity &lt; 0.1 and a.signal_noise &gt; 250 and match &gt; 800 and a.bin_id = b.bin_id and b.export = 'TRUE'&lt;br /&gt;&lt;br /&gt;UNION&lt;br /&gt;&lt;br /&gt;select &lt;br /&gt;count(*) as "count", &lt;br /&gt;lower('0 &lt; 0.1') as purity, lower('&gt; 25 &amp;&amp; &lt; 250') as signalNoise, lower('&gt; 700') as similarity&lt;br /&gt;&lt;br /&gt;from spectra a, bin b  where a.purity &gt; 0 and a.purity &lt; 0.1 and a.signal_noise &gt; 25 and a.signal_noise &lt;= 250 and match &gt; 700 and a.bin_id = b.bin_id and b.export = 'TRUE'&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;UNION&lt;br /&gt;&lt;br /&gt;select &lt;br /&gt;count(*) as "count", &lt;br /&gt;lower('0 &lt; 0.1') as purity, lower('&gt;35 &amp;&amp; &lt; 25') as signalNoise, lower('&gt; 600') as similarity&lt;br /&gt;&lt;br /&gt;from spectra a, bin b  where a.purity &gt; 0 and a.purity &lt; 0.1 and a.signal_noise &gt; 3 and a.signal_noise &lt;= 25 and match &gt; 600 and a.bin_id = b.bin_id and b.export = 'TRUE'&lt;br /&gt;&lt;br /&gt;-- 1.5 settings&lt;br /&gt;&lt;br /&gt;UNION&lt;br /&gt;&lt;br /&gt;select &lt;br /&gt;count(*) as "count", &lt;br /&gt;lower('0 &lt; 1.5') as purity, lower('&gt; 250') as signalNoise,&lt;br /&gt;lower('&gt; 700') as similarity&lt;br /&gt;&lt;br /&gt;from spectra a, bin b  where a.purity &gt; 0 and a.purity &lt; 1.5 and a.signal_noise &gt; 250 and match &gt; 700 and a.bin_id = b.bin_id and b.export = 'TRUE'&lt;br /&gt;&lt;br /&gt;UNION&lt;br /&gt;&lt;br /&gt;select &lt;br /&gt;count(*) as "count", &lt;br /&gt;lower('0 &lt; 1.5') as purity, lower('&gt; 25 &amp;&amp; &lt; 250') as signalNoise, lower('&gt; 600') as similarity&lt;br /&gt;&lt;br /&gt;from spectra a, bin b  where a.purity &gt; 0 and a.purity &lt; 1.5 and a.signal_noise &gt; 25 and a.signal_noise &lt;= 250 and match &gt; 600 and a.bin_id = b.bin_id and b.export = 'TRUE'&lt;br /&gt;&lt;br /&gt;UNION&lt;br /&gt;&lt;br /&gt;select &lt;br /&gt;count(*) as "count", &lt;br /&gt;lower('0 &lt; 1.5') as purity, lower('&gt; 3 &amp;&amp; &lt; 25') as signalNoise, lower('&gt; 500') as similarity&lt;br /&gt;&lt;br /&gt;from spectra a, bin b  where a.purity &gt; 0 and a.purity &lt; 1.5 and a.signal_noise &gt; 3 and a.signal_noise &lt;= 25 and match &gt; 500 and a.bin_id = b.bin_id and b.export = 'TRUE'&lt;br /&gt;&lt;br /&gt;-- all other settings&lt;br /&gt;&lt;br /&gt;UNION&lt;br /&gt;&lt;br /&gt;select &lt;br /&gt;count(*) as "count", &lt;br /&gt;lower('&gt; 1.5') as purity,&lt;br /&gt;lower('&gt; 250') as signalNoise,&lt;br /&gt;lower('&gt; 600') as similarity&lt;br /&gt;&lt;br /&gt;from spectra a, bin b  where a.purity &gt; 1.5 and a.signal_noise &gt; 250 and match &gt; 600 and a.bin_id = b.bin_id and b.export = 'TRUE'&lt;br /&gt;&lt;br /&gt;UNION&lt;br /&gt;&lt;br /&gt;select &lt;br /&gt;count(*) as "count", &lt;br /&gt;lower('&gt; 1.5') as purity,&lt;br /&gt;lower('&gt; 3 &amp;&amp; &lt; 250') as signalNoise, lower('&gt; 500') as similarity&lt;br /&gt;&lt;br /&gt;from spectra a, bin b  where a.purity &gt; 1.5 and a.signal_noise &gt; 3 and a.signal_noise &lt;= 250 and match &gt; 500 and a.bin_id = b.bin_id and b.export = 'TRUE'&lt;br /&gt;&lt;br /&gt;UNION&lt;br /&gt;&lt;br /&gt;-- total --&lt;br /&gt;&lt;br /&gt;select &lt;br /&gt;count(*) as "count", &lt;br /&gt;lower('no filter') as purity,&lt;br /&gt;lower('no filter') as signalNoise,&lt;br /&gt;lower('no filter') as similarity&lt;br /&gt;&lt;br /&gt;from spectra a, bin b where a.bin_id = b.bin_id and b.export = 'TRUE'&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-7750350020796861811?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/7750350020796861811/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/09/binbase-simulate-sifter-algorithm.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/7750350020796861811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/7750350020796861811'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/09/binbase-simulate-sifter-algorithm.html' title='BinBase - simulate the sifter algorithm directly on the database'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-897823953642803054</id><published>2010-09-22T11:14:00.000-07:00</published><updated>2010-09-23T16:00:02.089-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='binbase'/><title type='text'>BinBase queries</title><content type='html'>short overview of binbase queries to generate statistics&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;count of spectra&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;select count(*) from spectra a, samples b where  a.sample_id = b.sample_id and visible = 'TRUE'&lt;br /&gt;&lt;br /&gt;&lt;b&gt;count of spectra with no annotations&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;select count(*) from spectra a, samples b where  a.sample_id = b.sample_id and visible = 'TRUE' and bin_id is null&lt;br /&gt;&lt;br /&gt;&lt;b&gt;count of samples&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;select count(*) from samples where visibile = 'TRUE'&lt;br /&gt;&lt;br /&gt;&lt;b&gt;known species&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;select distinct value from sample_info a, meta_key b where a.key_id = b.key_id and b.key = 'Species'&lt;br /&gt;&lt;br /&gt;&lt;b&gt;count of species&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;select count(distinct value) from sample_info a, meta_key b where a.key_id = b.key_id and b.key = 'Species'&lt;br /&gt;&lt;br /&gt;&lt;b&gt;sample count for species&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;select count(a.sample_id),a.value from sample_info a, meta_key b,samples c where a.key_id = b.key_id and b.key = 'Species' and a.sample_id = c.sample_id and c.visible = 'TRUE' group by a.value&lt;br /&gt;&lt;br /&gt;&lt;b&gt;bin generation by species&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;select a.value,count(d.spectra_id) from sample_info a, meta_key b,samples c,bin d where a.key_id = b.key_id and b.key = 'Species' and a.sample_id = c.sample_id and d.sample_id = c.sample_id group by a.value&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ri correction successful&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;select count(*) from samples where visible = 'TRUE' and correction_failed = 'FALSE'&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ri correction successful&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;select count(*) from samples where visible = 'TRUE' and correction_failed = 'FALSE'&lt;br /&gt;&lt;br /&gt;&lt;b&gt;named bins&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;select count(bin_id) from bin where name = TO_CHAR(bin_id,'FM9999999999')&lt;br /&gt;&lt;br /&gt;&lt;b&gt;distribution of similarities&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;select count("range"),"range" from (&lt;br /&gt;select&lt;br /&gt;    case&lt;br /&gt;        when match &gt;= 0 and match &lt;= 100 then '0 - 100'         when match &gt; 100 and match &lt;= 200 then '101 - 200'        when match &gt; 200 and match &lt;= 300 then '201 - 300'        when match &gt; 300 and match &lt;= 400 then '301 - 400'        when match &gt; 400 and match &lt;= 500 then '401 - 500'        when match &gt; 500 and match &lt;= 600 then '501 - 600'        when match &gt; 600 and match &lt;= 700 then '601 - 700'        when match &gt; 700 and match &lt;= 800 then '701 - 800'        when match &gt; 800 and match &lt;= 900 then '801 - 900'        when match &gt; 900 and match &lt;= 1000 then '901 - 1000'    end AS "range" from spectra ) agroup by "range"&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-897823953642803054?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/897823953642803054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/09/binbase-queries.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/897823953642803054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/897823953642803054'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/09/binbase-queries.html' title='BinBase queries'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-5472420053852775517</id><published>2010-09-08T12:28:00.000-07:00</published><updated>2011-08-02T15:56:17.523-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails groovy file download java'/><title type='text'>grails - provide a dynamically generated file as download</title><content type='html'>today I had the rather simple request&lt;br /&gt;&lt;br /&gt;generate a file on the fly and provide it as download.&lt;br /&gt;&lt;br /&gt;Well the easiest solution was to just create a closure in a controller and set the content type in there.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;def download = {&lt;br /&gt;&lt;br /&gt;File file = new File(params.file)&lt;br /&gt;response.setHeader "Content-disposition", "attachment; filename=${file.name}.txt"&lt;br /&gt;response.contentType = 'text-plain'&lt;br /&gt;response.outputStream &amp;lt;&amp;lt; file.text     response.outputStream.flush()    }  &lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-5472420053852775517?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/5472420053852775517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/09/grails-provide-dynamically-generate.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/5472420053852775517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/5472420053852775517'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/09/grails-provide-dynamically-generate.html' title='grails - provide a dynamically generated file as download'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-2740826056018671243</id><published>2010-08-25T17:11:00.000-07:00</published><updated>2010-08-25T17:12:04.624-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>dynamic fields with groovy</title><content type='html'>one of the features I love is to just define new fields in objects whenever I want.&lt;br /&gt;&lt;br /&gt;like:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;def test = ["a","b","c,"]&lt;br /&gt;&lt;br /&gt;Object a = new Object()&lt;br /&gt;&lt;br /&gt;test.each{&lt;br /&gt;&lt;br /&gt;a.metaClass."${it}" = it&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;generates te following fields in the object a&lt;br /&gt;&lt;br /&gt;a.a = "a"&lt;br /&gt;a.b = "b"&lt;br /&gt;a.c = "c"&lt;br /&gt;&lt;br /&gt;works incredible well with the grails export plugin :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-2740826056018671243?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/2740826056018671243/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/08/dynamic-fields-with-groovy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/2740826056018671243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/2740826056018671243'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/08/dynamic-fields-with-groovy.html' title='dynamic fields with groovy'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-6482253686558991259</id><published>2010-07-23T14:14:00.001-07:00</published><updated>2010-07-23T14:14:40.763-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='loop'/><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><title type='text'>Bash - One line based For Loop</title><content type='html'>today I needed to start 40 jobs in a row and the easiest way I could think about was to use a one line bash script todo this for me&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;for i in `seq 40`; do ./node.sh; done&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;tada...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-6482253686558991259?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/6482253686558991259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/07/bash-one-line-based-for-loop.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/6482253686558991259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/6482253686558991259'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/07/bash-one-line-based-for-loop.html' title='Bash - One line based For Loop'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-7727632362630607396</id><published>2010-07-13T19:39:00.000-07:00</published><updated>2010-07-13T19:57:57.918-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cts'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='macos'/><category scheme='http://www.blogger.com/atom/ns#' term='pubchem'/><category scheme='http://www.blogger.com/atom/ns#' term='osx'/><title type='text'>finding all external reference names in pubchem sdf files</title><content type='html'>currently I'm working on a simple way to find all external reference names in the pubchem sdf files. Which is rather trivial, but time consuming:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;cat *.sdf | grep PUBCHEM_EXT_DATASOURCE_NAME -A 1 | grep -v PUBCHEM_EXT_DATASOURCE_NAME | grep -v '\-\-' | sort | uniq&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;once this finished it should give us a list of all possible data sources from pubchem as a unique list of names.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;...&lt;br /&gt;Ambinter&lt;br /&gt;Burnham Center for Chemical Genomics&lt;br /&gt;Calbiochem&lt;br /&gt;CC_PMLSC&lt;br /&gt;ChEBI&lt;br /&gt;ChemSpider&lt;br /&gt;DiscoveryGate&lt;br /&gt;Emory University Molecular Libraries Screening Center&lt;br /&gt;InFarmatik&lt;br /&gt;KUMGM&lt;br /&gt;LipidMAPS&lt;br /&gt;MICAD&lt;br /&gt;MLSMR&lt;br /&gt;MMDB&lt;br /&gt;MTDP&lt;br /&gt;Nature Chemical Biology&lt;br /&gt;NCGC&lt;br /&gt;NIAID&lt;br /&gt;NMMLSC&lt;br /&gt;NMRShiftDB&lt;br /&gt;ORST SMALL MOLECULE SCREENING CENTER&lt;br /&gt;PCMD&lt;br /&gt;ProbeDB&lt;br /&gt;Prous Science Drugs of the Future&lt;br /&gt;R&amp;D Chemicals&lt;br /&gt;Sigma-Aldrich&lt;br /&gt;Specs&lt;br /&gt;SRMLSC&lt;br /&gt;Structural Genomics Consortium&lt;br /&gt;The Scripps Research Institute Molecular Screening Center&lt;br /&gt;Thomson Pharma&lt;br /&gt;UM-BBD&lt;br /&gt;UPCMLD&lt;br /&gt;...&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-7727632362630607396?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/7727632362630607396/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/07/finding-all-external-reference-names-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/7727632362630607396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/7727632362630607396'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/07/finding-all-external-reference-names-in.html' title='finding all external reference names in pubchem sdf files'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-7074983462772397335</id><published>2010-07-05T15:45:00.001-07:00</published><updated>2010-07-05T15:45:08.885-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>ubuntu - stucked in graphical mode without an editor</title><content type='html'>well for some reason I thought it was smart to install on a freshly installed ubuntu linux server the gdm package in a VMWare console.&lt;br /&gt;&lt;br /&gt;20 Seconds later it turned out that I had&lt;br /&gt;&lt;br /&gt;- no terminal application&lt;br /&gt;- could not switch to a virtual terminal, vmware kept ignoring the commands&lt;br /&gt;- had ssh disabled&lt;br /&gt;&lt;br /&gt;short I was stuck. Till I remembered to write a simple script to just install xterm and execute it. But wait I need to enter parameters and passwords after the prompt.&lt;br /&gt;&lt;br /&gt;Quick forward&lt;br /&gt;&lt;br /&gt;#! /bin/bash&lt;br /&gt;echo 'password' | sudo -S apt-get --yes install xterm &gt; log.txt&lt;br /&gt;&lt;br /&gt;as script in a simple text file, which was set to be executable gave me all I need to install my xterm and be happy again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-7074983462772397335?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/7074983462772397335/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/07/ubuntu-stucked-in-graphical-mode.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/7074983462772397335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/7074983462772397335'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/07/ubuntu-stucked-in-graphical-mode.html' title='ubuntu - stucked in graphical mode without an editor'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-2810893474861473850</id><published>2010-06-22T06:09:00.000-07:00</published><updated>2010-06-22T06:09:20.812-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jmx'/><category scheme='http://www.blogger.com/atom/ns#' term='jboss'/><title type='text'>making a jmx depend on an ear</title><content type='html'>this morning I discovered that my JBoss application server sometimes deploys my jmx beans before a depending ear. The fix is like always easy just define in your jboss-service.xml&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;server&amp;gt;&lt;br /&gt;        &amp;lt;mbean&lt;br /&gt;                code=&amp;quot;edu.ucdavis.genomics.metabolomics.binbase.bci.server.jmx.LifeTimeEvictionPolicyConfigJMX&amp;quot;&lt;br /&gt;                name=&amp;quot;binbase.cache:service=LifeTimeEvictionPolicy&amp;quot;&amp;gt;&lt;br /&gt; &amp;lt;depends&amp;gt;jboss.j2ee:ear=clusterservice.ear&amp;lt;/depends&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/mbean&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-2810893474861473850?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/2810893474861473850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/06/making-jmx-depend-on-ear.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/2810893474861473850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/2810893474861473850'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/06/making-jmx-depend-on-ear.html' title='making a jmx depend on an ear'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-57103156169898411</id><published>2010-06-17T00:37:00.000-07:00</published><updated>2010-06-17T00:37:15.681-07:00</updated><title type='text'>Getting the hostname for the local machine</title><content type='html'>there are always the simple things which I'm getting stuck with, sometimes simple things like just getting the hostname for a local ip address in java.&lt;br /&gt;&lt;br /&gt;solutions:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;InetAddress addr = InetAddress.getLocalHost();&lt;br /&gt;String hostName = addr.getCanonicalHostName();&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-57103156169898411?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/57103156169898411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/06/getting-hostname-for-local-machine.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/57103156169898411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/57103156169898411'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/06/getting-hostname-for-local-machine.html' title='Getting the hostname for the local machine'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-5513398892759963811</id><published>2010-06-16T15:26:00.001-07:00</published><updated>2010-06-16T15:26:06.822-07:00</updated><title type='text'></title><content type='html'>sure shortly after the iPad with the unlimited dataplan got released, they change the plan to&lt;br /&gt;&lt;br /&gt;2GB A month&lt;br /&gt;&lt;br /&gt;what a joke...&lt;br /&gt;&lt;br /&gt;Data per month Price per month&lt;br /&gt;250MB/month $14.99&lt;br /&gt;2GB/month $25.00&lt;br /&gt;&lt;br /&gt;now I'm glad that I cancelled my pre order for one. What do 2GB give me these times? Nothing...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-5513398892759963811?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/5513398892759963811/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/06/sure-shortly-after-ipad-with-unlimited.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/5513398892759963811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/5513398892759963811'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/06/sure-shortly-after-ipad-with-unlimited.html' title=''/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-3387690985921652594</id><published>2010-05-13T12:04:00.001-07:00</published><updated>2010-05-13T12:05:19.266-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='osx'/><title type='text'>renaming all files in a directory</title><content type='html'>some of the simple things in live&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;for x in *.php5; do n=${x/.php5/.php}; mv $x $n; done&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;taken from here&lt;br /&gt;&lt;br /&gt;http://www.debianadmin.com/rename-multiple-files-to-another-extension-in-linux.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-3387690985921652594?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/3387690985921652594/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/05/renaming-all-files-in-directory.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/3387690985921652594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/3387690985921652594'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/05/renaming-all-files-in-directory.html' title='renaming all files in a directory'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-5378487347659242963</id><published>2010-05-07T10:56:00.000-07:00</published><updated>2010-05-07T10:56:25.543-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='postgres'/><title type='text'>moving indexes in postgres to a new tablespace</title><content type='html'>Recently I upgraded my server and added a SSD raid system of 3 128GB disks and for obvious reasons want to have my indexes on it. So the first step was to create a new tablespace&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;create tablespace 'name' owner 'owner' location 'directory'&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and than creating a quick script to move all the indexes&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;select 'ALTER INDEX '||indexname||' SET TABLESPACE compoundindex ;' from pg_catalog.pg_indexes where schemaname = 'public' order by tablename;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;which than just needs to be executed&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-5378487347659242963?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/5378487347659242963/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/05/moving-indexes-in-postgres-to-new.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/5378487347659242963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/5378487347659242963'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/05/moving-indexes-in-postgres-to-new.html' title='moving indexes in postgres to a new tablespace'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-6494895700453081593</id><published>2010-05-04T23:17:00.001-07:00</published><updated>2010-05-04T23:17:59.627-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>using perl to replace all occurences of a word with another in large files</title><content type='html'>rather simple, we want to replace all occurences of the word 'volatile' with 'volatile2' in a large text file and so just execute&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;perl -i -p -e 's{volatile}{volatile2}g' /mnt/storage/data/export&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I can't believe I'm using perl again...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-6494895700453081593?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/6494895700453081593/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/05/using-perl-to-replace-all-occurences-of.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/6494895700453081593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/6494895700453081593'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/05/using-perl-to-replace-all-occurences-of.html' title='using perl to replace all occurences of a word with another in large files'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-7745498995081111641</id><published>2010-05-04T14:16:00.000-07:00</published><updated>2010-05-04T14:16:43.684-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='binbase'/><title type='text'>flushing BinBase</title><content type='html'>once in a while you think you want to reprocess all data in a binbase database and for this reason you want to flush all the content except the retention index standards. This should never be required, but if you decided to regenerate all the bins with different settings, well you gotta do what you gotta do.&lt;br /&gt;&lt;br /&gt;here is a quick sql script todo this for you&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;delete from comments&lt;br /&gt;&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;delete from sample_info&lt;br /&gt;&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;delete from meta_key&lt;br /&gt;&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;delete from metainformation&lt;br /&gt;&lt;br /&gt;go &lt;br /&gt;&lt;br /&gt;delete from runtime&lt;br /&gt;&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;delete from bin_compare&lt;br /&gt;&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;delete from virtual_bin&lt;br /&gt;&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;delete from bin a where a.bin_id not in (select bin_id from standard)&lt;br /&gt;&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;delete from samples a where a.sample_id not in (select sample_id from bin)&lt;br /&gt;&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;delete from reference_class&lt;br /&gt;&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;delete from reference&lt;br /&gt;&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;delete from result_link&lt;br /&gt;&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;delete from bin_ratio&lt;br /&gt;&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;delete from bin_references&lt;br /&gt;&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;delete from classification&lt;br /&gt;&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;delete from  configuration where configuration_id not in (select configuration_id from samples)&lt;br /&gt;&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;delete from spectra where sample_id not in (select sample_id from samples)&lt;br /&gt;&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;delete from qualitycontrol&lt;br /&gt;&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;delete from result&lt;br /&gt;&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;delete from standard_hist&lt;br /&gt;&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;delete from structure&lt;br /&gt;&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;delete from substance_classes&lt;br /&gt;&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;delete from synonyme&lt;br /&gt;&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;delete from user_validation&lt;br /&gt;&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;delete from substance_classes&lt;br /&gt;&lt;br /&gt;go&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-7745498995081111641?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/7745498995081111641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/05/flushing-binbase.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/7745498995081111641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/7745498995081111641'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/05/flushing-binbase.html' title='flushing BinBase'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-2383537342503191842</id><published>2010-03-24T16:41:00.000-07:00</published><updated>2010-03-24T16:41:00.103-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='griffon'/><title type='text'>griffon</title><content type='html'>The last couple of days I spend with developing a quick application in griffon and have to say this is a rather impressive framework.. Specially since it's a young framework with a version of 0.3&lt;br /&gt;&lt;br /&gt;what I like?&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;using the grails approach&lt;/li&gt;&lt;li&gt;very simple to use&lt;/li&gt;&lt;li&gt;saves a lot of time in the initial setup of the project&lt;/li&gt;&lt;li&gt;clear separation into controller/model/views&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;what I'm missing?&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;better support in IDE's&lt;/li&gt;&lt;li&gt;no SWT support&lt;/li&gt;&lt;li&gt;no gorm (it will come sooner or later)&lt;/li&gt;&lt;li&gt;documentation, with the current documentation i can't use it for production code&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-2383537342503191842?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/2383537342503191842/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/03/griffon.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/2383537342503191842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/2383537342503191842'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/03/griffon.html' title='griffon'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-227881424161421749</id><published>2010-03-11T22:22:00.000-08:00</published><updated>2010-03-11T23:58:07.842-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wordlist'/><category scheme='http://www.blogger.com/atom/ns#' term='groovysh'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>i just love groovy for tasks like this...</title><content type='html'>sometimes you have these annoying little tasks on your hands and I always forget the bash syntax and it’s been a while since I seriously played with python.&lt;br /&gt;&lt;br /&gt;So I thought, hey let’s try groovysh.&lt;br /&gt;&lt;br /&gt;task?&lt;br /&gt;&lt;br /&gt;&lt;ul style="list-style-type: disc"&gt;&lt;li&gt;read wordlist&lt;/li&gt;&lt;li&gt;convert to lowercase&lt;/li&gt;&lt;li&gt;remove parts of words&lt;/li&gt;&lt;/ul&gt;solution&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;new File("en_US.dic").text.split("\n").each{ new File("result.txt").append "${it.split("/")[0].toLowerCase()}\n" }&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;ok after a bit more coding I actually wrote a groovy script&lt;br /&gt;&lt;br /&gt;&lt;ul style="list-style-type: disc"&gt;&lt;li&gt;read file&lt;/li&gt;&lt;li&gt;read file with words we do not want in word list&lt;/li&gt;&lt;li&gt;convert all values to lowercase&lt;/li&gt;&lt;li&gt;remove duplicated values&lt;/li&gt;&lt;li&gt;save to output file&lt;/li&gt;&lt;/ul&gt;really nothing fancy, but get’s the job done and took like 3 minutes to write and won’t be used again.&lt;br /&gt;&lt;br /&gt;Set&amp;lt;String&amp;gt; cache = new HashSet&amp;lt;String&amp;gt;()&lt;br /&gt;Set&amp;lt;String&amp;gt; result = new HashSet&amp;lt;String&amp;gt;()&lt;br /&gt;&lt;br /&gt;new File(“whitelist.txt”).text.split(“\n”).each{ it.split("\t").eachWithIndex{&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;String s, int index -&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;if(index &amp;gt; 0){&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;cache.add(s.toLowerCase())&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;new File(“blacklist.txt”).text.split(“\n”).each{&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;if(cache.contains(it.toLowerCase()) == false){ &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;result.add(it.toLowerCase())&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;File out = new File("wordlist.txt")&lt;br /&gt;&lt;br /&gt;result.each{&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;out.append it&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;out.append "\n"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-227881424161421749?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/227881424161421749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/03/i-just-love-groovy-for-tasks-like-this.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/227881424161421749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/227881424161421749'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/03/i-just-love-groovy-for-tasks-like-this.html' title='i just love groovy for tasks like this...'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-4597171645602745011</id><published>2010-03-10T16:51:00.000-08:00</published><updated>2010-03-10T17:25:21.363-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cdk'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>calculating exact molare masses using the cdk 1.3.1</title><content type='html'>I needed a simple way to calculate the exact mass for a couple of millions compounds and so decided to give it another try with the CDK.&lt;br /&gt;&lt;br /&gt;After googleing a bit I found something what put me in the right direction and worked with the current version of the cdk, so it was rather simple&lt;br /&gt; &lt;br /&gt;class ConvertInchi {&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * converts an inchi code to a molare mass&lt;br /&gt;   * @param inchi&lt;br /&gt;   * @return&lt;br /&gt;   */&lt;br /&gt;  public static double convertInchiToMolareMass(String inchi) {&lt;br /&gt;&lt;br /&gt;    IMolecularFormula moleculeFormula = MolecularFormulaManipulator.getMolecularFormula(convertInchiToMolecularFormula(inchi),DefaultChemObjectBuilder.getInstance())&lt;br /&gt;&lt;br /&gt;    return MolecularFormulaManipulator.getTotalExactMass(moleculeFormula)&lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   *&lt;br /&gt;   * converts an inchi to a molecular formula&lt;br /&gt;   * @param&lt;br /&gt;   inchi&lt;br /&gt;   * @return&lt;br /&gt;   */&lt;br /&gt;  public static String convertInchiToMolecularFormula(String inchi) {&lt;br /&gt;    return inchi.split("/")[1]&lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-4597171645602745011?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/4597171645602745011/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/03/calculating-exact-molare-masses-using.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/4597171645602745011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/4597171645602745011'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/03/calculating-exact-molare-masses-using.html' title='calculating exact molare masses using the cdk 1.3.1'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-1851605154331051603</id><published>2010-03-05T15:37:00.000-08:00</published><updated>2010-03-05T16:52:25.690-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='tuning'/><category scheme='http://www.blogger.com/atom/ns#' term='index'/><category scheme='http://www.blogger.com/atom/ns#' term='binbase'/><category scheme='http://www.blogger.com/atom/ns#' term='postgres'/><title type='text'>Postgres - partial indexes and sort indexes</title><content type='html'>this morning it was a sad moment. Normally people ask me all the time about SQL optimization or SQL tuning or when to create an index and so on.&lt;br /&gt;&lt;br /&gt;This morning i had another DOOOH moment.&lt;br /&gt;&lt;br /&gt;Basically while trying to optimize BinBase even further I noticed that some queries take an absurd amount of time to finish. Like 500 seconds to query the bin table.&lt;br /&gt;&lt;br /&gt;So I started to investigate and discovered that some of my queries are using seq scans over huge tables. For no apparent reason.&lt;br /&gt;&lt;br /&gt;It turned out that the sort column was not indexed...&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;CREATE INDEX bin_retention_index ON bin (retention_index ASC NULLS LAST);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;which was greatly improved after executing this statement.&lt;br /&gt;&lt;br /&gt;Now there was still a huge wait time for a certain query&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;explain select * from BIN where bin_id not in ( SELECT bin_id from SPECTRA where sample_id = 1630733 and bin_id is not null )ORDER BY retention_index ASC&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and it turned out that indexes were never used for the 'is not null' part. After some research and a lot of head scratching it turned out that postgres supports partial indexes for exactly this case.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;create index spectra_bin_id_partial_is_not_null on spectra (bin_id) where bin_id is not null&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Now afterward we some improvement but the actually slow data access is caused by something else. We always need the complete table - a few compounds and this operation takes some time.&lt;br /&gt;&lt;br /&gt;Time to optimize the internal database lookup...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-1851605154331051603?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/1851605154331051603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/03/postgres-partial-indexes-and-sort.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/1851605154331051603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/1851605154331051603'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/03/postgres-partial-indexes-and-sort.html' title='Postgres - partial indexes and sort indexes'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-6398685662108255353</id><published>2010-03-04T14:30:00.000-08:00</published><updated>2010-03-04T14:30:15.673-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rocks'/><category scheme='http://www.blogger.com/atom/ns#' term='node'/><category scheme='http://www.blogger.com/atom/ns#' term='cluster'/><category scheme='http://www.blogger.com/atom/ns#' term='threads'/><category scheme='http://www.blogger.com/atom/ns#' term='parallel'/><title type='text'>rocks linux cluster - adding a new parallel environment</title><content type='html'>by default rocks ships with a couple of environments, which execute stuff on different nodes. But sometimes you just want to have a node all to your self and take over all it's slots.&lt;br /&gt;&lt;br /&gt;Todo this you can just create a new environment and which gives you a defined number of cpus for a specified job.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;create a file which describes the paralell environment like this&lt;/li&gt;&lt;code&gt;&lt;br&gt;pe_name            threaded&lt;br&gt;slots              999&lt;br&gt;user_lists         NONE&lt;br&gt;xuser_lists        NONE&lt;br&gt;start_proc_args    /bin/true&lt;br&gt;stop_proc_args     /bin/true&lt;br&gt;allocation_rule    $pe_slots&lt;br&gt;control_slaves     FALSE&lt;br&gt;job_is_first_task  TRUE&lt;br&gt;urgency_slots      min&lt;br&gt;accounting_summary FALSE&lt;br&gt;&lt;br&gt;&lt;/code&gt;&lt;li&gt;register this on the head node&lt;/li&gt;&lt;code&gt;&lt;br&gt;qconf -Ap file.txt&lt;br&gt;&lt;br&gt;&lt;/code&gt;&lt;li&gt;add it to the list of available envionments&lt;/li&gt;&lt;code&gt;&lt;br&gt;qconf -mq all.q&lt;br&gt;pe_list               make mpich mpi orte threaded&lt;br&gt;&lt;br&gt;&lt;/code&gt;&lt;li&gt;test it with qlogin&lt;/li&gt;&lt;code&gt;&lt;br&gt;qlogin -pe threaded 4&lt;/code&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-6398685662108255353?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/6398685662108255353/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/03/rocks-linux-cluster-adding-new-parallel.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/6398685662108255353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/6398685662108255353'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/03/rocks-linux-cluster-adding-new-parallel.html' title='rocks linux cluster - adding a new parallel environment'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-4643316467156121703</id><published>2010-03-03T14:38:00.000-08:00</published><updated>2010-03-03T14:38:09.848-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tuning'/><category scheme='http://www.blogger.com/atom/ns#' term='index'/><category scheme='http://www.blogger.com/atom/ns#' term='setupX'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>SetupX - tuning and the missing indexes</title><content type='html'>after analyzing a couple of hundred sql statements in setupx I noticed that there is no real use of indexes for some reason. Why there are no indexes escapes my mind, but since we prefer higher query speed I suggest the creation of the following indexes (which are far from perfect)&lt;br /&gt;&lt;br /&gt;create index pubdata_relatedExperimentID_index on pubdata(relatedExperimentID)&lt;br /&gt;create index NCBIClassifierID_ncbiID_index on NCBIClassifierID(ncbiID)&lt;br /&gt;create index formobject_question_index on formobject(question)&lt;br /&gt;create index formobject_discriminator_index on formobject(discriminator)&lt;br /&gt;create index formobject_value_index on formobject(value(100))    &lt;br /&gt;create index query_querytype_index on query(querytype)&lt;br /&gt;create index query_userid_index on query(userID)&lt;br /&gt;create index datafile_source_index on datafile (source)&lt;br /&gt;create index cache_experiment_id_index on cache (experimentID)&lt;br /&gt;create index user_password_index on user (passwd)&lt;br /&gt;create index user_username_index on user (username)&lt;br /&gt;create index BlockedIP_blockedIp_index on BlockedIP(blockedIP)&lt;br /&gt;&lt;br /&gt;this should improve the performance nicely and is currently being applied to our production system.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-4643316467156121703?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/4643316467156121703/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/03/setupx-tuning-and-missing-indexes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/4643316467156121703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/4643316467156121703'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/03/setupx-tuning-and-missing-indexes.html' title='SetupX - tuning and the missing indexes'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-4072534975204449198</id><published>2010-03-03T10:37:00.000-08:00</published><updated>2010-03-03T10:39:26.292-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='setupX'/><title type='text'>SetupX - rawdata access</title><content type='html'>ever had the desire to access the rawdata in SetupX, because the gui doesn't give you easy or access at all to it?&lt;br /&gt;&lt;br /&gt;First you need to understand what's happening in the background. The used approache for setupx looks like a mapping from a tree to a table structure. Which is a valid approach and keeps it very flexible in therory, but is not a real pratical solution. Specially since it's a real pain to write queries for.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Get all species:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;select distinct value from formobject where question = 'species' and value != ''&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;Get all organs:&lt;br /&gt;&lt;i&gt;&lt;br /&gt;select distinct lower(value) from formobject where question in ( 'organ','organ name','Organs','Organ specification' ) and value != ''&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;we need to use lower, cause people have a 'strange' way of spelling things&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;work in progress!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-4072534975204449198?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/4072534975204449198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/03/setupx-rawdata-access.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/4072534975204449198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/4072534975204449198'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/03/setupx-rawdata-access.html' title='SetupX - rawdata access'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-3310120679038553141</id><published>2010-03-02T15:42:00.000-08:00</published><updated>2010-03-02T15:42:43.513-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='webservice'/><category scheme='http://www.blogger.com/atom/ns#' term='java6'/><category scheme='http://www.blogger.com/atom/ns#' term='jboss'/><title type='text'>jboss 4.2.1GA and Java6 and jboss based webservice</title><content type='html'>thanks to this &lt;a href="https://jira.jboss.org/jira/browse/JBWS-1439"&gt;report&lt;/a&gt; I was able to fix this issue. Well it's not a fix, it's a workaround...&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: Arial, sans-serif; font-size: 12px;"&gt;&lt;div class="action-details" style="background-color: #f0f0f0; padding-bottom: 5px; padding-left: 2px; padding-right: 2px; padding-top: 5px; text-align: left;"&gt;&lt;a href="https://jira.jboss.org/jira/secure/ViewProfile.jspa?name=arielah"&gt;Ariela Hui&lt;/a&gt;&amp;nbsp;-&amp;nbsp;&lt;span class="subText" style="font-size: 10px;"&gt;&lt;span class="date" style="color: #336699;"&gt;13/Aug/08 04:23 PM&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="action-body" style="margin-bottom: 2px; margin-left: 2px; margin-right: 2px; margin-top: 2px;"&gt;I was able to solve this problem. This is what environment I have:&lt;br /&gt;winXP&lt;br /&gt;JDK 1.6.0&lt;br /&gt;JBoss 4.2.1&lt;br /&gt;&lt;br /&gt;In the [jboss_home]/lib/endorsed add:&lt;br /&gt;jaxb-api.jar&lt;br /&gt;jboss-jaxrpc.jar&lt;br /&gt;jboss-jaxws.jar&lt;br /&gt;jboss-saaj.jar&lt;br /&gt;&lt;br /&gt;copy them from [jboss_home]/server/default/lib&lt;br /&gt;&lt;br /&gt;I've also added to endored jboss-logging-spi.jar&lt;br /&gt;This I copied from jboss-5.0.0 client folder.&amp;nbsp;&lt;/div&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-3310120679038553141?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/3310120679038553141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/03/jboss-421ga-and-java6-and-jboss-based.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/3310120679038553141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/3310120679038553141'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/03/jboss-421ga-and-java6-and-jboss-based.html' title='jboss 4.2.1GA and Java6 and jboss based webservice'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-1762640860568905746</id><published>2010-03-01T10:43:00.000-08:00</published><updated>2010-03-01T10:43:54.701-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rocks'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='cluster'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>scala/groovy on rocks linux</title><content type='html'>well since there is not scala/groovy roll for rocks we need to install it the traditional way.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;go into the directory /shared/apps on the frontend&lt;/li&gt;&lt;li&gt;if apps doesn't exist create it&lt;/li&gt;&lt;li&gt;copy your scala/groovy tgz there&lt;/li&gt;&lt;li&gt;gunzip and untar it&lt;/li&gt;&lt;li&gt;edit your extend-compute.xml as shown &lt;a href="http://codingandmore.blogspot.com/2010/02/rocks-linux-cluster-mounting-nfs-share.html"&gt;here&lt;/a&gt;&lt;/li&gt;&lt;li&gt;add a new file modification section like this&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;file name="/etc/profile" mode="append"&amp;gt;&lt;br /&gt;&lt;br /&gt;GROOVY_HOME=/share/apps/groovy&lt;br /&gt;SCALA_HOME=/share/apps/scala&lt;br /&gt;&lt;br /&gt;export GROOVY_HOME&lt;br /&gt;export SCALA_HOME&lt;br /&gt;&lt;br /&gt;PATH=$GROOVY_HOME/bin:$PATH&lt;br /&gt;PATH=$SCALA_HOME/bin:$PATH&lt;br /&gt;&lt;br /&gt;export PATH&lt;br /&gt;&lt;br /&gt;&amp;lt;/file&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;rebuild your dist as shown&amp;nbsp;&lt;a href="http://codingandmore.blogspot.com/2010/02/rocks-linux-cluster-mounting-nfs-share.html"&gt;here&lt;/a&gt;&lt;/li&gt;&lt;li&gt;reinstall you nodes as shown&amp;nbsp;&lt;a href="http://codingandmore.blogspot.com/2010/02/rocks-linux-cluster-mounting-nfs-share.html"&gt;here&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-1762640860568905746?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/1762640860568905746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/03/scalagroovy-on-rocks-linux.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/1762640860568905746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/1762640860568905746'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/03/scalagroovy-on-rocks-linux.html' title='scala/groovy on rocks linux'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-8743674783007288982</id><published>2010-02-26T21:20:00.000-08:00</published><updated>2010-02-28T22:04:18.854-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='regex'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>backup! we got REG Expressions!</title><content type='html'>recently I got an interesting task handed&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;please extract all words out of a text...&lt;/i&gt;&lt;/blockquote&gt;ok simple enough, we know regular expression and we know word boundaries.&lt;br /&gt;&lt;br /&gt;So we just do&lt;br /&gt;&lt;code&gt;&lt;br /&gt;\b\w+\b&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and&amp;nbsp;this simple expression applied to the following sentence&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;Glucose (Glc), a monosaccharide (or simple sugar) also...&lt;/b&gt;&lt;/blockquote&gt;gives us the following list&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Glucose&lt;/li&gt;&lt;li&gt;Glc&lt;/li&gt;&lt;li&gt;a&lt;/li&gt;&lt;li&gt;monosaccharide&lt;/li&gt;&lt;li&gt;or simple&lt;/li&gt;&lt;li&gt;sugar&lt;/li&gt;&lt;li&gt;also&lt;/li&gt;&lt;/ul&gt;Sadly the sentence didn't stop at this and continued to include the following tricky statement...&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;...including as much as possible chemical names&lt;/i&gt;&lt;/blockquote&gt;Ok time to read on the reg expressions in &lt;a href="http://naleid.com/blog/2008/05/19/dont-fear-the-regexp/"&gt;groovy&lt;/a&gt; and &lt;a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html"&gt;java&lt;/a&gt; &lt;br /&gt;Now let's discover a regular expression which helps us with this.&lt;br /&gt;&lt;br /&gt;Ok let's try this again with a different sentence&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;...as glucose, only one of which (D-glucose) is biologically...&lt;/b&gt;&lt;/blockquote&gt;our first expression would miss&lt;br /&gt;&lt;ul&gt;&lt;li&gt;D-glucose&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;and return for this&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;D&lt;/li&gt;&lt;li&gt;glucose&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;so we need to modify it a bit to include the first seperation. So it becomes&lt;/div&gt;&lt;br /&gt;&lt;code&gt;\b(\w\-)*\w+\b&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and the day is saved till we try a new sentence and try to discover compounds like&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;1,3-Diaminopropane&lt;/li&gt;&lt;li&gt;N-(3S-hydroxydecanoyl)-L-serine&lt;/li&gt;&lt;li&gt;3,9-divinyl-2,4,8,10-tetraoxaspiro[5.5]undecane&lt;/li&gt;&lt;li&gt;2-(allyloxy)-1,3,5-trimethylbenzene&lt;/li&gt;&lt;li&gt;3-hydroxy-2-butanone&lt;/li&gt;&lt;li&gt;3,3'-Oxybis(1-propene)&lt;/li&gt;&lt;li&gt;1,1,1,2,2,3,3,4,4-nonafluoro-4-(1,1,2,2,3,3,4,4,4-nonafluorobutoxy)butane&lt;/li&gt;&lt;li&gt;2-(Formamido)-N1-(5-phospho-D-ribosyl)acetamidine&lt;/li&gt;&lt;li&gt;1,6,9,13-tetraoxadispiro[4.2.4.2]tetradecane&lt;/li&gt;&lt;li&gt;3-(N, N-Diethylamino)-1-propylamine&lt;/li&gt;&lt;li&gt;D-Glucose&lt;/li&gt;&lt;li&gt;(R)-3-Hydroxybutyric acid&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Or to make it more realistic, find all the words in this completely pointless and scientific wrong text&lt;/div&gt;&lt;blockquote&gt;&lt;blockquote&gt;&lt;i&gt;&amp;nbsp;bunch of rumble to find 1,3-Diaminopropane in D-Glucose and 1,1,1,2,2,3,3,4,4-nonafluoro-4-(1,1,2,2,3,3,4,4,4-nonafluorobutoxy)butane.&lt;/i&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;i&gt;&amp;nbsp;It's also nice to have 3,3'-Oxybis(1-propene) or (R)-3-Hydroxybutyric acid. Last bot not least I'm a huge fan or 3,9-divinyl-2,4,8,10-tetraoxaspiro[5.5]undecane.&lt;/i&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;i&gt;&amp;nbsp;Also it's a great feeling if we can find (glucose) in brakets without finding statement like (help i'm surrounded by brackets).&lt;/i&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;b&gt;So do you see a pattern here?&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;everything in () or [] or {} can be part of a chemical so we use ((\[.*\])|(\(.*\))) for this part&amp;nbsp;&lt;/li&gt;&lt;li&gt;everything separated by a ',' and followed by another character ending with a dash can be a chemical, so we use (\w+(,\w+)*\-) for this part&lt;/li&gt;&lt;li&gt;it ends all with a word \w+ or a ) (masked as \) )&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;so this expression would work for all these&lt;/div&gt;&lt;code&gt;&lt;span class="Apple-style-span" style="text-decoration: line-through;"&gt;&lt;br /&gt;&lt;/span&gt; (\([\w\+]+(,\w+)*\)-)?\b[(\w+(,\w+[\'])*\-)*((\[.*\])|(\(.*\))|(\{.*\}))*\w+]+(\b)( (acid)|(anhydride)|(\sbenzoate)|(\sketone)|(\sether)|(\sester)|(\scyanide))?&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;except&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;i&gt;3-(N, N-Diethylamino)-1-propylamine&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;glucose instead we get 'glucose)'&lt;/i&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;no solution for the 1 or 2 yet. Still trying to figure it out.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;now the nicest thing is the groovy closure + match example to get all the content in a text.&lt;/div&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;def match = (text =~ pattern)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;congrats now all you words are in the match variable! Text is just a string containing our text.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-8743674783007288982?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/8743674783007288982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/02/backup-we-got-reg-expressions.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/8743674783007288982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/8743674783007288982'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/02/backup-we-got-reg-expressions.html' title='backup! we got REG Expressions!'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-7040265172628121341</id><published>2010-02-24T23:09:00.000-08:00</published><updated>2010-02-27T16:38:58.737-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hpc'/><category scheme='http://www.blogger.com/atom/ns#' term='shares'/><category scheme='http://www.blogger.com/atom/ns#' term='rocks'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='cluster'/><category scheme='http://www.blogger.com/atom/ns#' term='nfs'/><title type='text'>rocks linux cluster - mounting an nfs share on all nodes</title><content type='html'>after setting up the latest cluster I tried to provide to all nodes a couple of nfs shares, since user demanded this.&lt;br /&gt;&lt;br /&gt;Well in rocks linux it's rather simple, once you understand the concept behind.&lt;br /&gt;&lt;br /&gt;So a step to step tutorial.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;go to the profile directory&lt;/li&gt;&lt;code&gt;cd /export/rocks/install/site-profiles/5.3/nodes/&lt;/code&gt;&lt;li&gt;make a copy of the skeleton file&lt;/li&gt;&lt;code&gt;cp skeleton.xml extend-compute.xml&lt;/code&gt;&lt;li&gt;edit file to tell it that we need to create a directory and add a line to the fstab. The right place for this is in the post section&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;mkdir -p /mnt/share&lt;br /&gt;&lt;br /&gt;&amp;lt;file name="/etc/fstab" mode="append"&amp;gt;&lt;br /&gt;server:/mount /mnt/share nfs defaults 0 0  &lt;br /&gt;&amp;lt;/file&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;change back to the main install dir&lt;/li&gt;&lt;code&gt;cd /export/rocks/install&lt;/code&gt;&lt;li&gt;rebuild rocks distibution&lt;/li&gt;&lt;code&gt;rocks create distro&lt;/code&gt;&lt;li&gt;rebuild nodes&lt;/li&gt;&lt;code&gt;ssh compute-0-0 '/boot/kickstart/cluster-kickstart'&lt;/code&gt; &lt;/ul&gt;&lt;br /&gt;congratulations if you did everything right your node should now boot up and have a directory mounted.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-7040265172628121341?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/7040265172628121341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/02/rocks-linux-cluster-mounting-nfs-share.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/7040265172628121341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/7040265172628121341'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/02/rocks-linux-cluster-mounting-nfs-share.html' title='rocks linux cluster - mounting an nfs share on all nodes'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-4898138854758100215</id><published>2010-02-24T18:37:00.000-08:00</published><updated>2010-02-24T18:37:38.654-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='prime'/><category scheme='http://www.blogger.com/atom/ns#' term='binbase'/><category scheme='http://www.blogger.com/atom/ns#' term='threads'/><category scheme='http://www.blogger.com/atom/ns#' term='math'/><title type='text'>playing around with threads</title><content type='html'>currently I got back to my hobby and play a bit with multithreading to tune an algorithm.&lt;br /&gt;&lt;br /&gt;So the first step was to write a smpl class to test if the threading api works on my system and what is better than to calculate primes?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import java.util.concurrent.ExecutorService;&lt;br /&gt;import java.util.concurrent.Executors;&lt;br /&gt;import java.util.concurrent.TimeUnit;&lt;br /&gt;&lt;br /&gt;public class Test {&lt;br /&gt;&lt;br /&gt; public static void main(String args[]) throws InterruptedException {&lt;br /&gt;&lt;br /&gt;  ExecutorService service = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());&lt;br /&gt;  for (int i = 0; i &lt; 500000000; i++) {   final int postion = i;   service.execute(new Runnable() {    @Override    public void run() {     try {      int i = postion;      int i1 = (int) Math.ceil(Math.sqrt(i));      boolean isPrimeNumber = false;      while (i1 &gt; 1) {&lt;br /&gt;&lt;br /&gt;       if ((i != i1) &amp;&amp; (i % i1 == 0)) {&lt;br /&gt;        isPrimeNumber = false;&lt;br /&gt;        break;&lt;br /&gt;       }&lt;br /&gt;       else if (!isPrimeNumber) {&lt;br /&gt;        isPrimeNumber = true;&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       --i1;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      if (isPrimeNumber) {&lt;br /&gt;       System.out.println(Thread.currentThread().getName() + " - prime " + i);&lt;br /&gt;      }&lt;br /&gt;      &lt;br /&gt;     }&lt;br /&gt;     catch (Exception e) {&lt;br /&gt;      e.printStackTrace();&lt;br /&gt;     }&lt;br /&gt;    }&lt;br /&gt;   });&lt;br /&gt;  }&lt;br /&gt;  service.shutdown();&lt;br /&gt;  service.awaitTermination(4000, TimeUnit.DAYS);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;and the output is nicely:&lt;br /&gt;&lt;br /&gt;pool-1-thread-2 - prime 469237&lt;br /&gt;pool-1-thread-2 - prime 469241&lt;br /&gt;pool-1-thread-2 - prime 469253&lt;br /&gt;pool-1-thread-4 - prime 466553&lt;br /&gt;pool-1-thread-4 - prime 469267&lt;br /&gt;pool-1-thread-4 - prime 469279&lt;br /&gt;pool-1-thread-2 - prime 469283&lt;br /&gt;pool-1-thread-3 - prime 467869&lt;br /&gt;pool-1-thread-3 - prime 469303&lt;br /&gt;pool-1-thread-2 - prime 469321&lt;br /&gt;&lt;br /&gt;while all 4 CPU's are at 100% use.&lt;br /&gt;&lt;br /&gt;translation, java executor api seems to work quite well.&lt;br /&gt;&lt;br /&gt;Now time to tune the binbase algorithm...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-4898138854758100215?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/4898138854758100215/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/02/playing-around-with-threads.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/4898138854758100215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/4898138854758100215'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/02/playing-around-with-threads.html' title='playing around with threads'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-7910471259840749976</id><published>2010-02-20T23:28:00.000-08:00</published><updated>2010-03-01T23:05:39.074-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='postgres'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>postgres and insert performance with grails</title><content type='html'>recently I spend a lot of time tuning a postgres database and an algorithm (based on grails) to try to insert 80M chemical compounds into a database with reference checks and assurance for there uniqueness.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The main issue is that the inserts get slower and slower over time and end up taking to long. To improve the performance we started with the following approach:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;more memory&lt;/li&gt;&lt;li&gt;database indexes (obvious)&lt;/li&gt;&lt;li&gt;flush the hibernate session all 100 inserts&lt;/li&gt;&lt;li&gt;flush the grails cache all 100 inserts&lt;/li&gt;&lt;li&gt;tune several postgres parameters&lt;/li&gt;&lt;li&gt;re index the database all 10k inserts&lt;/li&gt;&lt;li&gt;enable vacuum on a 10k row basis&lt;/li&gt;&lt;li&gt;enable analyze on a 10k row basis&lt;/li&gt;&lt;li&gt;set auto vacuum to check all 10 minutes&lt;/li&gt;&lt;/ul&gt;But after all this work we are still stuck with a problem, the inserts get gradually slower over time, which can be related to the index building time. &lt;br /&gt;&lt;br /&gt;Graph over 1M inserts: TODO, it's still in the calculation...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-7910471259840749976?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/7910471259840749976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/02/postgres-and-insert-performance-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/7910471259840749976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/7910471259840749976'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/02/postgres-and-insert-performance-with.html' title='postgres and insert performance with grails'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-3573739029542895718</id><published>2010-02-09T11:28:00.000-08:00</published><updated>2010-03-01T23:05:09.068-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='postgres'/><title type='text'>Postgres and utf8</title><content type='html'>Recently I discovered that my postgres datbase is not running with UTF-8 support which causes all kinds of headdache,&lt;br /&gt;&lt;br /&gt;so what do you have todo to change this?&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;backup your database&lt;/li&gt;&lt;li&gt;set Lang to:&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; line-height: 16px;"&gt;LANG =&amp;nbsp;&lt;em style="font-style: normal; font-weight: bold;"&gt;en_US&lt;/em&gt;.&lt;em style="font-style: normal; font-weight: bold;"&gt;UTF&lt;/em&gt;-8&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; line-height: 16px;"&gt;execute initdb&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; line-height: 16px;"&gt;recreate the database and specify the encoding:&amp;nbsp;createdb --encoding=unicode&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; line-height: 16px;"&gt;import your data&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;you should now have a working utf-8 database&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-3573739029542895718?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/3573739029542895718/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/02/postgres-and-utf8.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/3573739029542895718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/3573739029542895718'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/02/postgres-and-utf8.html' title='Postgres and utf8'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-1403530052523687232</id><published>2010-02-03T21:06:00.001-08:00</published><updated>2010-02-03T21:10:52.699-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='cdk'/><category scheme='http://www.blogger.com/atom/ns#' term='oscar3'/><title type='text'>muss das sein?</title><content type='html'>[INFO] [compiler:compile]&lt;br /&gt;[INFO] Compiling 399 source files to /Users/wohlgemuth/Documents/workspace-private/oscar3-chem/branches/cdk-1.3.1/target/classes&lt;br /&gt;[INFO] ------------------------------------------------------------------------&lt;br /&gt;[ERROR] BUILD FAILURE&lt;br /&gt;[INFO] ------------------------------------------------------------------------&lt;br /&gt;[INFO] Compilation failure&lt;br /&gt;Failure executing javac, but could not parse the error:&lt;br /&gt;An exception has occurred in the compiler (1.5.0_20). Please file a bug at the Java Developer Connection (http://java.sun.com/webapps/bugreport) &amp;nbsp;after checking the Bug Parade for duplicates. Include your program and the following diagnostic in your report. &amp;nbsp;Thank you.&lt;br /&gt;com.sun.tools.javac.code.Symbol$CompletionFailure: file org/openscience/cdk/annotations/TestClass.class not found&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Failure executing javac, but could not parse the error:&lt;br /&gt;An exception has occurred in the compiler (1.5.0_20). Please file a bug at the Java Developer Connection (http://java.sun.com/webapps/bugreport) &amp;nbsp;after checking the Bug Parade for duplicates. Include your program and the following diagnostic in your report. &amp;nbsp;Thank you.&lt;br /&gt;com.sun.tools.javac.code.Symbol$CompletionFailure: file org/openscience/cdk/annotations/TestClass.class not found&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I mean common, do I really have to deal with compiler bugs now...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;correction&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;nvm forgot the cdk annotations library....&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-1403530052523687232?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/1403530052523687232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/02/muss-das-sein.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/1403530052523687232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/1403530052523687232'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/02/muss-das-sein.html' title='muss das sein?'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-6233597544927278989</id><published>2010-02-03T13:34:00.000-08:00</published><updated>2010-02-03T13:34:43.992-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cdk'/><category scheme='http://www.blogger.com/atom/ns#' term='maven2'/><title type='text'>cdk-maven-mojos</title><content type='html'>recently I'm doing an awful lot with the CDK library and since I always 'like' to work with maven I thought it's time to write a couple of mojos to help me with the CDK work.&lt;br /&gt;&lt;br /&gt;The first one of the list is a &amp;nbsp;mojo which deploys the cdk library to my local maven repository and can be found under &lt;a href="https://code.google.com/p/cdk-maven-mojos/"&gt;google code&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;There are most likely more mojo's to come as I work more and more with the cdk.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-6233597544927278989?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/6233597544927278989/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/02/cdk-maven-mojos.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/6233597544927278989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/6233597544927278989'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/02/cdk-maven-mojos.html' title='cdk-maven-mojos'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-8353466121366448001</id><published>2010-02-02T01:54:00.000-08:00</published><updated>2010-02-02T12:39:46.858-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='inchi'/><category scheme='http://www.blogger.com/atom/ns#' term='regex'/><title type='text'>regular expression for common chemical identifiers</title><content type='html'>This is basically a small collection for regular expressions which I use from time to time to distinguish chemical identifiers. Please feel free to add more to the list to make it grow and more complete.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The first line is the name, the second is the valid groovy/java version. All are validate with at least thousand examples&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;std inchi&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;InChI=1S/([^/]+)(?:/[^/]+)*\\S&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;std inchiKey&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;[A-Z]{14}-[A-Z]{10}-[A-Z,0-9]&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;CAS&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;\\d{1,7}-\\d\\d-\\d&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Tahoma,Verdana,Arial,Helvetica,sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 11px; line-height: 14px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;KEGG&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;C\d{5}&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;LipidMaps&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;LMFA[0-9]{8}&lt;br /&gt;&lt;br /&gt;&lt;b&gt;HMDB&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;HMDB[0-9]*&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-8353466121366448001?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/8353466121366448001/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/02/regular-expression-for-common-chemical.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/8353466121366448001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/8353466121366448001'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/02/regular-expression-for-common-chemical.html' title='regular expression for common chemical identifiers'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-2544987631846080233</id><published>2010-01-24T00:16:00.000-08:00</published><updated>2010-01-25T22:00:23.622-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='postgres'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>how to handle 400 Billion rows in postgress</title><content type='html'>well currently I try to optimize an denoising and replacement algorithm. This includes calculating ion traces over thousands files which have 20k peaks or 1 Million ions each.&lt;br /&gt;To make this more challenging we don't do this once, we do it during every BinBase export. Since this is the base algorithm for the Zero replacement.&lt;br /&gt;&lt;br /&gt;Short we do the same calculation over and over again, like to calculate the minimum intensity for 100 files between 15 and 20 seconds for the ion 87.&lt;br /&gt;&lt;br /&gt;Short this shouts use a SQL database.&lt;br /&gt;&lt;br /&gt;Now how much data do we have?&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;40k files&lt;/li&gt;&lt;li&gt;each file has around 20k spectra&lt;/li&gt;&lt;li&gt;each spectra has up to 500 ion&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;which translates into&lt;br /&gt;&lt;br /&gt;&lt;b&gt;400 000 000 000 rows&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Performance Issues and how to make Postgres handle this amount of data&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The first attempt was to just store all these files into a single table using hibernate&lt;b&gt;. &lt;/b&gt;Which caused an OutOfMemory exception, surprise surprise.&lt;br /&gt;&lt;br /&gt;So the next attempt was to use a stateless session which worked quite well and up to 1 Billion rows we had a query speed of under 20ms. Quite nice for no tuning of the database. But once we hit a bit over 1 Billions rows the query speed got worse and worse. Shor this was not an acceptable solution.&lt;br /&gt;&lt;br /&gt;So we tried to use partions with postgres and define one table for each ion, inheriting from a master table.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Table "public.iontrace"&lt;br /&gt;Column   |       Type       | Modifiers &lt;br /&gt;------------+------------------+-----------&lt;br /&gt;id         | bigint           | not null&lt;br /&gt;intensity  | double precision | &lt;br /&gt;ion        | integer          | &lt;br /&gt;spectra_id | bigint           | &lt;br /&gt;Indexes:&lt;br /&gt;"iontrace_pkey" PRIMARY KEY, btree (id)&lt;br /&gt;Foreign-key constraints:&lt;br /&gt;"fk4f93923dc3b62c9a" FOREIGN KEY (spectra_id) REFERENCES spectra(id)&lt;br /&gt;Rules:&lt;br /&gt;rule_index_iontrace_100 AS&lt;br /&gt;ON INSERT TO iontrace&lt;br /&gt;WHERE new.ion = 100 DO INSTEAD  INSERT INTO iontrace_100 (id, intensity, ion, spectra_id) &lt;br /&gt;VALUES (new.id, new.intensity, new.ion, new.spectra_id)&lt;br /&gt;rule_index_iontrace_101 AS&lt;br /&gt;ON INSERT TO iontrace&lt;br /&gt;WHERE new.ion = 101 DO INSTEAD  INSERT INTO iontrace_101 (id, intensity, ion, spectra_id) &lt;br /&gt;VALUES (new.id, new.intensity, new.ion, new.spectra_id)&lt;br /&gt;rule_index_iontrace_102 AS&lt;br /&gt;ON INSERT TO iontrace&lt;br /&gt;WHERE new.ion = 102 DO INSTEAD  INSERT INTO iontrace_102 (id, intensity, ion, spectra_id) &lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;which didn't work with hibernate. It kept complaining about &lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;so we had to write our own batcher as was &lt;a href="http://stackoverflow.com/questions/83093/hibernate-insert-batch-with-postgresql"&gt;described&lt;/a&gt; here&lt;br /&gt;&lt;br /&gt;a bit later we rewrote the example to actually work, since the field batch size is set to private.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;/**&lt;br /&gt;* hibernate partion batcher&lt;br /&gt;*/&lt;br /&gt;public class HibernatePartionBatcher extends BatchingBatcher {&lt;br /&gt;&lt;br /&gt;public HibernatePartionBatcher(org.hibernate.jdbc.ConnectionManager connectionManager, org.hibernate.Interceptor interceptor) {&lt;br /&gt;super(connectionManager, interceptor)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;protected void doExecuteBatch(PreparedStatement ps) throws SQLException, HibernateException {&lt;br /&gt;&lt;br /&gt;//use reflections to access the private field of the super class ugly but neccessaery&lt;br /&gt;Field field = this.getClass().getSuperclass().getDeclaredField("batchSize")&lt;br /&gt;field.setAccessible(true)&lt;br /&gt;&lt;br /&gt;int value = field.getInt(this)&lt;br /&gt;&lt;br /&gt;if (value != 0) {&lt;br /&gt;try {&lt;br /&gt;ps.executeBatch()&lt;br /&gt;}&lt;br /&gt;catch (RuntimeException re) {&lt;br /&gt;throw re;&lt;br /&gt;}&lt;br /&gt;finally {&lt;br /&gt;field.setInt(this, 0)&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* hibernate factory to intitialize the factory&lt;br /&gt;*/&lt;br /&gt;public class HibernatePartitionBatcherFactory extends BatchingBatcherFactory {&lt;br /&gt;&lt;br /&gt;public HibernatePartitionBatcherFactory() {&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public org.hibernate.jdbc.Batcher createBatcher(org.hibernate.jdbc.ConnectionManager connectionManager, org.hibernate.Interceptor interceptor) {&lt;br /&gt;return new HibernatePartionBatcher(connectionManager, interceptor);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and to register this in our groovy script&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;def hibProps = [&lt;br /&gt;"hibernate.jdbc.factory_class": HibernatePartitionBatcherFactory.class.getName()&lt;br /&gt;]&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;A first test with just a single sample reveals that we are executing a sequential scan over all partions.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;explain SELECT * from iontrace where ion = 105;&lt;br /&gt;QUERY PLAN                                                  &lt;br /&gt;-------------------------------------------------------------------------------------------------------------&lt;br /&gt;Result  (cost=0.00..1163.25 rows=3374 width=28)&lt;br /&gt;-&amp;gt;  Append  (cost=0.00..1163.25 rows=3374 width=28)&lt;br /&gt;-&amp;gt;  Seq Scan on iontrace  (cost=0.00..10.46 rows=7 width=28)&lt;br /&gt;Filter: (ion = 105)&lt;br /&gt;-&amp;gt;  Index Scan using index_iontrace_20 on iontrace_20 iontrace  (cost=0.00..1.57 rows=7 width=28)&lt;br /&gt;Index Cond: (ion = 105)&lt;br /&gt;-&amp;gt;  Index Scan using index_iontrace_21 on iontrace_21 iontrace  (cost=0.00..1.57 rows=7 width=28)&lt;br /&gt;Index Cond: (ion = 105)&lt;br /&gt;-&amp;gt;  Index Scan using index_iontrace_22 on iontrace_22 iontrace  (cost=0.00..1.57 rows=7 width=28)&lt;br /&gt;Index Cond: (ion = 105)&lt;br /&gt;-&amp;gt;  Index Scan using index_iontrace_23 on iontrace_23 iontrace  (cost=0.00..1.57 rows=7 width=28)&lt;br /&gt;Index Cond: (ion = 105)&lt;br /&gt;-&amp;gt;  Index Scan using index_iontrace_24 on iontrace_24 iontrace  (cost=0.00..1.57 rows=7 width=28)&lt;br /&gt;Index Cond: (ion = 105)&lt;br /&gt;-&amp;gt;  Index Scan using index_iontrace_25 on iontrace_25 iontrace  (cost=0.00..1.57 rows=7 width=28)&lt;br /&gt;Index Cond: (ion = 105)&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;to avoid this you have to change a parameter in postgresql.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;SET constraint_exclusion = on;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and the new result shows that we only work on the correct partition now&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;explain SELECT * from iontrace where ion = 105;&lt;br /&gt;QUERY PLAN                                                  &lt;br /&gt;-------------------------------------------------------------------------------------------------------------&lt;br /&gt;Result  (cost=0.00..13.03 rows=14 width=28)&lt;br /&gt;-&amp;gt;  Append  (cost=0.00..13.03 rows=14 width=28)&lt;br /&gt;-&amp;gt;  Seq Scan on iontrace  (cost=0.00..10.46 rows=7 width=28)&lt;br /&gt;Filter: (ion = 105)&lt;br /&gt;-&amp;gt;  Index Scan using index_iontrace_105 on iontrace_105 iontrace  (cost=0.00..2.57 rows=7 width=28)&lt;br /&gt;Index Cond: (ion = 105)&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;it still executes a sequential scan, but now it only does it on the correct partion with the stored data.&lt;br /&gt;&lt;br /&gt;Now to reduce the likelihood for an index scan over the database we will define indexes on all the table (the script at the end of this post does this for you)&lt;br /&gt;&lt;br /&gt;the new query plan is&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;explain SELECT * from iontrace where ion = 105;&lt;br /&gt;QUERY PLAN                                                  &lt;br /&gt;-------------------------------------------------------------------------------------------------------------&lt;br /&gt;Result  (cost=0.00..4.15 rows=14 width=28)&lt;br /&gt;-&amp;gt;  Append  (cost=0.00..4.15 rows=14 width=28)&lt;br /&gt;-&amp;gt;  Index Scan using index_iontrace_ion on iontrace  (cost=0.00..1.57 rows=7 width=28)&lt;br /&gt;Index Cond: (ion = 105)&lt;br /&gt;-&amp;gt;  Index Scan using index_iontrace_105 on iontrace_105 iontrace  (cost=0.00..2.57 rows=7 width=28)&lt;br /&gt;Index Cond: (ion = 105)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The result is slightly different since we generate by now more data in the database. Sorry for that. But you can see that the query plan is much more efficient with the index.&lt;br /&gt;&lt;br /&gt;Important is that you need an index for ion on every partition and on the main 'iontrace' table, if you don't have an index on the main table you will keep getting sequential scans.&lt;br /&gt;&lt;br /&gt;The next snatch we encountered was the speed of the actual data insert. Since the check constraints seem to be rather slow and expensive.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;First this is a hibernate insert on the main datatable:&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;LOG:  duration: 8.961 ms  statement: EXECUTE &lt;unnamed&gt;  [PREPARE:  insert into IonTrace (intensity, ion, spectra_id, id) values ($1, $2, $3, $4)]&lt;br /&gt;LOG:  duration: 8.951 ms  statement: EXECUTE &lt;unnamed&gt;  [PREPARE:  insert into IonTrace (intensity, ion, spectra_id, id) values ($1, $2, $3, $4)]&lt;br /&gt;LOG:  duration: 8.966 ms  statement: EXECUTE &lt;unnamed&gt;  [PREPARE:  insert into IonTrace (intensity, ion, spectra_id, id) values ($1, $2, $3, $4)]&lt;br /&gt;&lt;/unnamed&gt;&lt;/unnamed&gt;&lt;/unnamed&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Second this is plain old sql inserted into the main iontrace table:&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;LOG:  duration: 6.608 ms  statement: EXECUTE &lt;unnamed&gt;  [PREPARE:  insert into iontrace(id, intensity, ion, spectra_id) values (nextval('SEQ_TRACE'),1418.0,237,700013)]&lt;br /&gt;LOG:  duration: 6.610 ms  statement: EXECUTE &lt;unnamed&gt;  [PREPARE:  insert into iontrace(id, intensity, ion, spectra_id) values (nextval('SEQ_TRACE'),1373.0,238,700013)]&lt;br /&gt;LOG:  duration: 6.605 ms  statement: EXECUTE &lt;unnamed&gt;  [PREPARE:  insert into iontrace(id, intensity, ion, spectra_id) values (nextval('SEQ_TRACE'),1383.0,239,700013)]&lt;br /&gt;&lt;/unnamed&gt;&lt;/unnamed&gt;&lt;/unnamed&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Third this is plain old sql inserted in each partition:&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;LOG:  duration: 0.055 ms  statement: EXECUTE &lt;unnamed&gt;  [PREPARE:  insert into iontrace_475(id, intensity, ion, spectra_id) values (nextval('SEQ_TRACE'),27.0,475,680203)]&lt;br /&gt;LOG:  duration: 0.058 ms  statement: EXECUTE &lt;unnamed&gt;  [PREPARE:  insert into iontrace_489(id, intensity, ion, spectra_id) values (nextval('SEQ_TRACE'),13.0,489,680203)]&lt;br /&gt;LOG:  duration: 0.051 ms  statement: EXECUTE &lt;unnamed&gt;  [PREPARE:  insert into iontrace_496(id, intensity, ion, spectra_id) values (nextval('SEQ_TRACE'),13.0,496,680203)]&lt;br /&gt;LOG:  duration: 0.138 ms  statement: EXECUTE &lt;unnamed&gt;  [PREPARE:  insert into Spectra (file_id, retentionTime, id) values ($1, $2, $3)]&lt;br /&gt;&lt;/unnamed&gt;&lt;/unnamed&gt;&lt;/unnamed&gt;&lt;/unnamed&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;From this we can see that it makes the most sense to use plain sql to insert the data into the related partitions and to avoid the checks during the insert phase.&lt;br /&gt;&lt;br /&gt;For this we used the following approach&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;//build the ion trace&lt;br /&gt;Statement statement = session.connection().createStatement()&lt;br /&gt;&lt;br /&gt;for (int mass = 0; mass &amp;lt; mz.length; mass++) {           if (mass &amp;gt;= beginMass &amp;amp;&amp;amp; mass &amp;lt;= endMass) {             if (intensity[mass] &amp;gt; 0) {&lt;br /&gt;IonTrace trace = new IonTrace(ion: mz[mass], intensity: intensity[mass])&lt;br /&gt;trace.spectra = spectra&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;statement.addBatch("insert into iontrace(id, intensity, ion, spectra_id) values (nextval('SEQ_TRACE'),${intensity[mass]},${(int)(mz[mass])},${spectra.id})")&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;statement.executeBatch()&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;which worked quite well. As a conclusion I removed the complete hibernate layer from this application, since we lost most of it's benefits by now.&lt;br /&gt;&lt;br /&gt;To further optimize the insert speed we replace the Statements with PreparedStatements, which improves the speed of the insert by close to 50%.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;LOG:  duration: 0.035 ms  statement: EXECUTE &lt;unnamed&gt;  [PREPARE:  insert into iontrace_127(id, intensity, ion, spectra_id) values (nextval('seq_trace'),$1,$2,$3)]&lt;br /&gt;LOG:  duration: 0.035 ms  statement: EXECUTE &lt;unnamed&gt;  [PREPARE:  insert into iontrace_127(id, intensity, ion, spectra_id) values (nextval('seq_trace'),$1,$2,$3)]&lt;br /&gt;LOG:  duration: 0.035 ms  statement: EXECUTE &lt;unnamed&gt;  [PREPARE:  insert into iontrace_127(id, intensity, ion, spectra_id) values (nextval('seq_trace'),$1,$2,$3)]&lt;br /&gt;&lt;/unnamed&gt;&lt;/unnamed&gt;&lt;/unnamed&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Storage&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;as you can imagine this amount of rows can take up quite some space. An initial estimate say it's roughly 20TB with the current table schema.&lt;br /&gt;&lt;br /&gt;Which is 20 times more than the files occupy on the harddrive.&lt;br /&gt;&lt;br /&gt;So what can you do to keep the storage space down&lt;br /&gt;&lt;ul&gt;&lt;li&gt;use the smallest possible data types possible&lt;/li&gt;&lt;li&gt;only index what is necessary to be index&lt;/li&gt;&lt;li&gt;remove columns which are not necessary, like we don't need a primary key on the ion trace table&lt;/li&gt;&lt;li&gt;estimate your possible amount of data stored in the database, like we won't store billions of spectra, so we can use integer instead of bigint&lt;/li&gt;&lt;li&gt;store intensities as integer and not as double.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;To estimate the required storage we used the following function, which roughly gives us storage capacity for 4 years of netcdf files.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;netcdf-repository=# SELECT pg_size_pretty(pg_database_size('netcdf-repository')/(select count(*) from netcdf)* 40000) as "estimated database size";&lt;br /&gt; estimated database size &lt;br /&gt;-------------------------&lt;br /&gt; 16 TB&lt;br /&gt;(1 row)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;And a server for this would currently cost around 7000$&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-END-&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-2544987631846080233?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/2544987631846080233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/01/how-to-handle-400-billion-rows-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/2544987631846080233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/2544987631846080233'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/01/how-to-handle-400-billion-rows-in.html' title='how to handle 400 Billion rows in postgress'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-3306294493862647424</id><published>2010-01-22T15:31:00.000-08:00</published><updated>2010-01-22T16:49:14.465-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='jboss'/><title type='text'>protecting jboss</title><content type='html'>&lt;b&gt;Protecting JBoss&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;in the last couple of weeks we released more and more of our BinBase Tools to make it able to actually work with the database. Which means we have to protect our data better.&lt;br /&gt;&lt;br /&gt;Since I had no time at work for this and JBoss doesn't provide a convenient way, well I decided to write a little tool which does this for me.&lt;br /&gt;&lt;br /&gt;So I created yet another google code project, called 'jboss-ip-filter', which basically does nothing else than providing an interceptor, which intercepts all method calls and check's if the ip is in a list of registered IP Address.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Features&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;protect ejb3.x services&lt;/li&gt;&lt;li&gt;protect ejb2.x services&lt;/li&gt;&lt;li&gt;ip can be defined as regular expression to support subnets&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Configuration/Installation&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;First you need to download the latest release and copy it into the jboss library directory of your choosen configuration.&lt;br /&gt;&lt;br /&gt;Afterwards you need to register the interceptor in the jboss configuration.&lt;br /&gt;&lt;br /&gt;Example&lt;br /&gt;&lt;br /&gt;vim /usr/local/jboss/server/all/conf/standardjboss.xml&lt;br /&gt;&lt;br /&gt;Go to the part about the container configurations and register the interceptor in the first position for every ejb configuration you want to protect.&lt;br /&gt;&lt;br /&gt;The name of the class is: 'com.blogspot.codingandmore.jboss.filter.SessionInterceptor'&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;container-configuration&amp;gt;&lt;br /&gt;&amp;lt;container-name&amp;gt;Standard CMP 2.x EntityBean&amp;lt;/container-name&amp;gt;&lt;br /&gt;&amp;lt;call-logging&amp;gt;false&amp;lt;/call-logging&amp;gt;&lt;br /&gt;&amp;lt;invoker-proxy-binding-name&amp;gt;entity-unified-invoker&amp;lt;/invoker-proxy-binding-name&amp;gt;&lt;br /&gt;&amp;lt;sync-on-commit-only&amp;gt;false&amp;lt;/sync-on-commit-only&amp;gt;&lt;br /&gt;&amp;lt;insert-after-ejb-post-create&amp;gt;false&amp;lt;/insert-after-ejb-post-create&amp;gt;&lt;br /&gt;&amp;lt;call-ejb-store-on-clean&amp;gt;true&amp;lt;/call-ejb-store-on-clean&amp;gt;&lt;br /&gt;&amp;lt;container-interceptors&amp;gt;&lt;br /&gt;&amp;lt;interceptor&amp;gt;com.blogspot.codingandmore.jboss.filter.SessionInterceptor&amp;lt;/interceptor&amp;gt;&lt;br /&gt;&amp;lt;interceptor&amp;gt;org.jboss.ejb.plugins.ProxyFactoryFinderInterceptor&amp;lt;/interceptor&amp;gt;&lt;br /&gt;&amp;lt;interceptor&amp;gt;org.jboss.ejb.plugins.LogInterceptor&amp;lt;/interceptor&amp;gt;&lt;br /&gt;&amp;lt;interceptor&amp;gt;org.jboss.ejb.plugins.SecurityInterceptor&amp;lt;/interceptor&amp;gt;&lt;br /&gt;&amp;lt;interceptor&amp;gt;org.jboss.ejb.plugins.TxInterceptorCMT&amp;lt;/interceptor&amp;gt;&lt;br /&gt;&amp;lt;interceptor&amp;gt;org.jboss.ejb.plugins.CallValidationInterceptor&amp;lt;/interceptor&amp;gt;&lt;br /&gt;&amp;lt;interceptor&amp;gt;org.jboss.ejb.plugins.EntityCreationInterceptor&amp;lt;/interceptor&amp;gt;&lt;br /&gt;&amp;lt;interceptor&amp;gt;org.jboss.ejb.plugins.EntityLockInterceptor&amp;lt;/interceptor&amp;gt;&lt;br /&gt;&amp;lt;interceptor&amp;gt;org.jboss.ejb.plugins.EntityInstanceInterceptor&amp;lt;/interceptor&amp;gt;&lt;br /&gt;&amp;lt;interceptor&amp;gt;org.jboss.ejb.plugins.EntityReentranceInterceptor&amp;lt;/interceptor&amp;gt;&lt;br /&gt;&amp;lt;interceptor&amp;gt;org.jboss.resource.connectionmanager.CachedConnectionInterceptor&amp;lt;/interceptor&amp;gt;&lt;br /&gt;&amp;lt;interceptor&amp;gt;org.jboss.ejb.plugins.EntitySynchronizationInterceptor&amp;lt;/interceptor&amp;gt;&lt;br /&gt;&amp;lt;interceptor&amp;gt;org.jboss.ejb.plugins.cmp.jdbc.JDBCRelationInterceptor&amp;lt;/interceptor&amp;gt;&lt;br /&gt;&amp;lt;/container-interceptors&amp;gt;&lt;br /&gt;&amp;lt;instance-pool&amp;gt;org.jboss.ejb.plugins.EntityInstancePool&amp;lt;/instance-pool&amp;gt;&lt;br /&gt;&amp;lt;instance-cache&amp;gt;org.jboss.ejb.plugins.InvalidableEntityInstanceCache&amp;lt;/instance-cache&amp;gt;&lt;br /&gt;&amp;lt;persistence-manager&amp;gt;org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager&amp;lt;/persistence-manager&amp;gt;&lt;br /&gt;&amp;lt;locking-policy&amp;gt;org.jboss.ejb.plugins.lock.QueuedPessimisticEJBLock&amp;lt;/locking-policy&amp;gt;&lt;br /&gt;&amp;lt;container-cache-conf&amp;gt;&lt;br /&gt;&amp;lt;cache-policy&amp;gt;org.jboss.ejb.plugins.LRUEnterpriseContextCachePolicy&amp;lt;/cache-policy&amp;gt;&lt;br /&gt;&amp;lt;cache-policy-conf&amp;gt;&lt;br /&gt;&amp;lt;min-capacity&amp;gt;50&amp;lt;/min-capacity&amp;gt;&lt;br /&gt;&amp;lt;max-capacity&amp;gt;1000000&amp;lt;/max-capacity&amp;gt;&lt;br /&gt;&amp;lt;overager-period&amp;gt;300&amp;lt;/overager-period&amp;gt;&lt;br /&gt;&amp;lt;max-bean-age&amp;gt;600&amp;lt;/max-bean-age&amp;gt;&lt;br /&gt;&amp;lt;resizer-period&amp;gt;400&amp;lt;/resizer-period&amp;gt;&lt;br /&gt;&amp;lt;max-cache-miss-period&amp;gt;60&amp;lt;/max-cache-miss-period&amp;gt;&lt;br /&gt;&amp;lt;min-cache-miss-period&amp;gt;1&amp;lt;/min-cache-miss-period&amp;gt;&lt;br /&gt;&amp;lt;cache-load-factor&amp;gt;0.75&amp;lt;/cache-load-factor&amp;gt;&lt;br /&gt;&amp;lt;/cache-policy-conf&amp;gt;&lt;br /&gt;&amp;lt;/container-cache-conf&amp;gt;&lt;br /&gt;&amp;lt;container-pool-conf&amp;gt;&lt;br /&gt;&amp;lt;MaximumSize&amp;gt;100&amp;lt;/MaximumSize&amp;gt;&lt;br /&gt;&amp;lt;/container-pool-conf&amp;gt;&lt;br /&gt;&amp;lt;commit-option&amp;gt;B&amp;lt;/commit-option&amp;gt;&lt;br /&gt;&amp;lt;/container-configuration&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;After this is done you need to restart your server and it should generate a property in the start directory after the next reboot. In this directory you configure your ip address. To be allowed.&lt;br /&gt;&lt;br /&gt;For example if you started the server in the bin directory, the file will be found there&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;vim /usr/local/jboss/bin/ip-filter-config.properties&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The ip address of the local host is always registered.&lt;br /&gt;&lt;br /&gt;These following two lines allow it the host '128.120.136.154' to connect but refuses connections from any other hosts to the ejb's.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;128.120.136.154 = true&lt;br /&gt;\b(?:\d{1,3}\.){3}\d{1,3}\b = false&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;If you encounter any problems, please don't hesitate to contact me and I try to help with the encountered problems.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-3306294493862647424?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/3306294493862647424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2010/01/protecting-jboss.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/3306294493862647424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/3306294493862647424'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2010/01/protecting-jboss.html' title='protecting jboss'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-8492617601625102075</id><published>2009-12-11T22:09:00.000-08:00</published><updated>2009-12-11T22:09:46.828-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='maven2'/><category scheme='http://www.blogger.com/atom/ns#' term='build'/><title type='text'>maven assembly plugin</title><content type='html'>sometimes you run into the issue that you want to generate jars for a simple project. For example when you want to create an executable jar for each method with a main class.&lt;br /&gt;&lt;br /&gt;What do you do?&lt;br /&gt;&lt;br /&gt;you call the maven assembly plugin to the rescue and define several executions&lt;br /&gt;&lt;br /&gt; &amp;lt;plugin&amp;gt;&lt;br /&gt;    &amp;lt;artifactId&amp;gt;maven-assembly-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&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;MatchLibrary&amp;lt;/id&amp;gt;&lt;br /&gt;      &amp;lt;phase&amp;gt;package&amp;lt;/phase&amp;gt;&lt;br /&gt;      &amp;lt;goals&amp;gt;&lt;br /&gt;       &amp;lt;goal&amp;gt;single&amp;lt;/goal&amp;gt;&lt;br /&gt;      &amp;lt;/goals&amp;gt;&lt;br /&gt;      &amp;lt;configuration&amp;gt;&lt;br /&gt;&lt;br /&gt;       &amp;lt;archive&amp;gt;&lt;br /&gt;        &amp;lt;manifest&amp;gt;&lt;br /&gt;         &amp;lt;mainClass&amp;gt;edu.ucdavis.genomics.metabolomics.binbase.binbase.external.tools.api.library.impl.application.ApplicationServerLibraryMatchingImplementation&amp;lt;/mainClass&amp;gt;&lt;br /&gt;         &amp;lt;packageName&amp;gt;edu.ucdavis.genomics.metabolomics.binbase.binbase.external.tools.api.library.impl.application&amp;lt;/packageName&amp;gt;&lt;br /&gt;         &amp;lt;addClasspath&amp;gt;true&amp;lt;/addClasspath&amp;gt;&lt;br /&gt;        &amp;lt;/manifest&amp;gt;&lt;br /&gt;        &amp;lt;manifestEntries&amp;gt;&lt;br /&gt;         &amp;lt;mode&amp;gt;development&amp;lt;/mode&amp;gt;&lt;br /&gt;         &amp;lt;url&amp;gt;${pom.url}&amp;lt;/url&amp;gt;&lt;br /&gt;        &amp;lt;/manifestEntries&amp;gt;&lt;br /&gt;        &amp;lt;manifestFile&amp;gt;src/main/resources/manifest/ApplicationServerLibraryMatchingImplementation.MF&amp;lt;/manifestFile&amp;gt;&lt;br /&gt;       &amp;lt;/archive&amp;gt;&lt;br /&gt;       &amp;lt;descriptors&amp;gt;&lt;br /&gt;        &amp;lt;descriptor&amp;gt;src/main/descriptor/jar.xml&amp;lt;/descriptor&amp;gt;&lt;br /&gt;       &amp;lt;/descriptors&amp;gt;&lt;br /&gt;       &amp;lt;finalName&amp;gt;MatchLibrary&amp;lt;/finalName&amp;gt;&lt;br /&gt;       &amp;lt;manifestFile&amp;gt;src/main/resources/manifest/ApplicationServerLibraryMatchingImplementation.MF&amp;lt;/manifestFile&amp;gt;&lt;br /&gt;      &amp;lt;/configuration&amp;gt;&lt;br /&gt;     &amp;lt;/execution&amp;gt;&lt;br /&gt;&lt;br /&gt;     &amp;lt;execution&amp;gt;&lt;br /&gt;      &amp;lt;id&amp;gt;RegisterLibrary&amp;lt;/id&amp;gt;&lt;br /&gt;      &amp;lt;phase&amp;gt;package&amp;lt;/phase&amp;gt;&lt;br /&gt;      &amp;lt;goals&amp;gt;&lt;br /&gt;       &amp;lt;goal&amp;gt;single&amp;lt;/goal&amp;gt;&lt;br /&gt;      &amp;lt;/goals&amp;gt;&lt;br /&gt;      &amp;lt;configuration&amp;gt;&lt;br /&gt;&lt;br /&gt;       &amp;lt;archive&amp;gt;&lt;br /&gt;        &amp;lt;manifest&amp;gt;&lt;br /&gt;         &amp;lt;mainClass&amp;gt;edu.ucdavis.genomics.metabolomics.binbase.binbase.external.tools.api.library.impl.RegisterLibraryImpl&amp;lt;/mainClass&amp;gt;&lt;br /&gt;         &amp;lt;packageName&amp;gt;edu.ucdavis.genomics.metabolomics.binbase.binbase.external.tools.api.library.impl&amp;lt;/packageName&amp;gt;&lt;br /&gt;         &amp;lt;addClasspath&amp;gt;true&amp;lt;/addClasspath&amp;gt;&lt;br /&gt;        &amp;lt;/manifest&amp;gt;&lt;br /&gt;        &amp;lt;manifestEntries&amp;gt;&lt;br /&gt;         &amp;lt;mode&amp;gt;development&amp;lt;/mode&amp;gt;&lt;br /&gt;         &amp;lt;url&amp;gt;${pom.url}&amp;lt;/url&amp;gt;&lt;br /&gt;        &amp;lt;/manifestEntries&amp;gt;&lt;br /&gt;        &amp;lt;manifestFile&amp;gt;src/main/resources/manifest/RegisterLibrary.MF&amp;lt;/manifestFile&amp;gt;&lt;br /&gt;       &amp;lt;/archive&amp;gt;&lt;br /&gt;       &amp;lt;descriptors&amp;gt;&lt;br /&gt;        &amp;lt;descriptor&amp;gt;src/main/descriptor/jar.xml&amp;lt;/descriptor&amp;gt;&lt;br /&gt;       &amp;lt;/descriptors&amp;gt;&lt;br /&gt;       &amp;lt;finalName&amp;gt;RegisterLibrary&amp;lt;/finalName&amp;gt;&lt;br /&gt;       &amp;lt;manifestFile&amp;gt;src/main/resources/manifest/RegisterLibrary.MF&amp;lt;/manifestFile&amp;gt;&lt;br /&gt;      &amp;lt;/configuration&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;and this generates two executable jars for us.&lt;br /&gt;&lt;br /&gt;The used assembly descriptor is&lt;br /&gt;&lt;br /&gt;&amp;lt;assembly&amp;gt;&lt;br /&gt;  &amp;lt;formats&amp;gt;&lt;br /&gt;    &amp;lt;format&amp;gt;jar&amp;lt;/format&amp;gt;&lt;br /&gt;  &amp;lt;/formats&amp;gt;&lt;br /&gt;  &amp;lt;includeBaseDirectory&amp;gt;false&amp;lt;/includeBaseDirectory&amp;gt;&lt;br /&gt;  &amp;lt;fileSets&amp;gt;&lt;br /&gt;    &amp;lt;fileSet&amp;gt;&lt;br /&gt;      &amp;lt;directory&amp;gt;target/classes&amp;lt;/directory&amp;gt;&lt;br /&gt;      &amp;lt;outputDirectory&amp;gt;/&amp;lt;/outputDirectory&amp;gt;&lt;br /&gt;    &amp;lt;/fileSet&amp;gt;&lt;br /&gt;  &amp;lt;/fileSets&amp;gt;&lt;br /&gt;  &amp;lt;dependencySets&amp;gt;&lt;br /&gt;    &amp;lt;dependencySet&amp;gt;&lt;br /&gt;      &amp;lt;outputDirectory&amp;gt;/&amp;lt;/outputDirectory&amp;gt;&lt;br /&gt;      &amp;lt;unpack&amp;gt;true&amp;lt;/unpack&amp;gt;&lt;br /&gt;      &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt;&lt;br /&gt;    &amp;lt;/dependencySet&amp;gt;&lt;br /&gt;  &amp;lt;/dependencySets&amp;gt;&lt;br /&gt;&amp;lt;/assembly&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-8492617601625102075?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/8492617601625102075/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2009/12/maven-assembly-plugin.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/8492617601625102075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/8492617601625102075'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2009/12/maven-assembly-plugin.html' title='maven assembly plugin'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-5989917160632744475</id><published>2009-12-08T18:45:00.000-08:00</published><updated>2009-12-08T18:45:33.221-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mojo'/><category scheme='http://www.blogger.com/atom/ns#' term='maven2'/><category scheme='http://www.blogger.com/atom/ns#' term='jboss'/><title type='text'>jboss maven plugin</title><content type='html'>since I have issues with jboss jar and maven since I can remember I started to develop a small mojo to deal with this for me.&lt;br /&gt;&lt;br /&gt;All it basically does is to parse the local jboss installation and depoys the files in the local repository.&lt;br /&gt;&lt;br /&gt;Simple and efficient.&lt;br /&gt;&lt;br /&gt;It can be found &lt;a href="http://code.google.com/p/jboss-maven-mojo/"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-5989917160632744475?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/5989917160632744475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2009/12/jboss-maven-plugin.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/5989917160632744475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/5989917160632744475'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2009/12/jboss-maven-plugin.html' title='jboss maven plugin'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-6804897060618537284</id><published>2009-11-18T01:06:00.000-08:00</published><updated>2010-03-01T23:07:32.039-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='binbase'/><category scheme='http://www.blogger.com/atom/ns#' term='postgres'/><title type='text'>SQL - small mistakes, big impact</title><content type='html'>the last couple of days I was fighting with a database which became slower and slower and slower and now needed close to 24h to execute a rather simple query...&lt;br /&gt;&lt;br /&gt;After working for hours on different parameters and tuning the database, including setting up a spare server to see if a dump and restore fixes the issues I got the time down to 5 minutes.&lt;br /&gt;&lt;br /&gt;Sounds good?&lt;br /&gt;&lt;br /&gt;well not really since I needed an execution in the range of a couple of seconds. So I actually looked at the sql statement which caused issues and found a gigantic error in it...&lt;br /&gt;&lt;br /&gt;the statement:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;select * from BIN where bin_id not in ( SELECT bin_id from SPECTRA where sample_id = 424105 AND SPECTRA.bin_id = BIN.bin_id)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and the correct statement would be:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;select * from BIN a where a.bin_id not in ( SELECT bin_id from SPECTRA where sample_id = 424105 and bin_id is not null) ORDER BY retention_index ASC&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;the problem?&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;SPECTRA.bin_id = BIN.bin_id&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;this little part is totally wrong in the whole statement and causes a seq scan over a table with 70 Million entries against a table with 6000 entries. It does nothing for the queries and I guess it was left over from a copy/paste accident 6 years ago when I wrote this script originally.&lt;br /&gt;&lt;br /&gt;let's compare some numbers:&lt;br /&gt;&lt;br /&gt;explain before:&lt;br /&gt;&lt;br /&gt;Seq Scan on bin  (cost=0.00..459513.42 rows=3044 width=1290)&lt;br /&gt;SubPlan&lt;br /&gt;Filter: (NOT (subplan))&lt;br /&gt;-&amp;gt;  Bitmap Heap Scan on spectra  (cost=75.20..75.42 rows=2 width=8)&lt;br /&gt;Recheck Cond: ((sample_id = 424105::double precision) AND (bin_id = ($0)::double precision))&lt;br /&gt;-&amp;gt;  BitmapAnd  (cost=75.20..75.20 rows=2 width=0)&lt;br /&gt;-&amp;gt;  Bitmap Index Scan on spectra_sample_id  (cost=0.00..18.99 rows=5696 width=0)&lt;br /&gt;-&amp;gt;  Bitmap Index Scan on spectra_binid  (cost=0.00..56.18 rows=17658 width=0)&lt;br /&gt;Index Cond: (sample_id = 424105::double precision)&lt;br /&gt;Index Cond: (bin_id = ($0)::double precision)&lt;br /&gt;&lt;br /&gt;explain after:&lt;br /&gt;&lt;br /&gt;Sort  (cost=1765.47..1766.23 rows=3044 width=1290)&lt;br /&gt;Sort Key: retention_index&lt;br /&gt;-&amp;gt;  Seq Scan on bin a  (cost=647.21..1747.86 rows=3044 width=1290)&lt;br /&gt;Filter: (NOT (hashed subplan))&lt;br /&gt;SubPlan&lt;br /&gt;-&amp;gt;  Index Scan using spectra_sample_id on spectra  (cost=0.00..646.42 rows=3138 width=8)&lt;br /&gt;Index Cond: (sample_id = 424105::double precision)&lt;br /&gt;Filter: (bin_id IS NOT NULL)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;in real world number this translates to 24 hours before statement compared to 4 seconds after statement...&lt;br /&gt;...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-6804897060618537284?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/6804897060618537284/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2009/11/sql-small-mistakes-big-impact.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/6804897060618537284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/6804897060618537284'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2009/11/sql-small-mistakes-big-impact.html' title='SQL - small mistakes, big impact'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-520337257104943329</id><published>2009-11-17T16:43:00.000-08:00</published><updated>2009-11-17T16:43:25.023-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maven2'/><category scheme='http://www.blogger.com/atom/ns#' term='profile'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='osx'/><title type='text'>maven2 - choose dependcies based on platform</title><content type='html'>today I run into an old friend. I was compiling my stuff happily under oxs and building eclipse plugins with maven2 and the psteclipse plugin, which I by now more or less rewrote and adapted to my project to perform as good as possible. Anyway, basically I encountered the issue that eclipse ships with different dependencies under osx/win32 and linux.&lt;br /&gt;&lt;br /&gt;So promptly it fails to compile under linux...&lt;br /&gt;&lt;br /&gt;solution for this problem?&lt;br /&gt;&lt;br /&gt;maven2 profiles, your best friend for cross platform development. They actually allow you define dependencies based on the current platform.&lt;br /&gt;&lt;br /&gt;Example for out case would be:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;   &amp;lt;profiles&amp;gt;&lt;br /&gt;        &amp;lt;profile&amp;gt;&lt;br /&gt;            &amp;lt;id&amp;gt;dev-windows&amp;lt;/id&amp;gt;&lt;br /&gt;&lt;br /&gt;            &amp;lt;dependencies&amp;gt;&lt;br /&gt;            &amp;lt;/dependencies&amp;gt;&lt;br /&gt;&lt;br /&gt;            &amp;lt;activation&amp;gt;&lt;br /&gt;                &amp;lt;activeByDefault&amp;gt;true&amp;lt;/activeByDefault&amp;gt;&lt;br /&gt;                &amp;lt;os&amp;gt;&lt;br /&gt;                    &amp;lt;family&amp;gt;windows&amp;lt;/family&amp;gt;&lt;br /&gt;                &amp;lt;/os&amp;gt;&lt;br /&gt;            &amp;lt;/activation&amp;gt;&lt;br /&gt;        &amp;lt;/profile&amp;gt;&lt;br /&gt;        &amp;lt;profile&amp;gt;&lt;br /&gt;            &amp;lt;id&amp;gt;dev-mac&amp;lt;/id&amp;gt;&lt;br /&gt;            &amp;lt;dependencies&amp;gt;&lt;br /&gt;                &amp;lt;dependency&amp;gt;&lt;br /&gt;                        &amp;lt;groupId&amp;gt;psteclipse&amp;lt;/groupId&amp;gt;&lt;br /&gt;                        &amp;lt;artifactId&amp;gt;org.eclipse.swt.cocoa.macosx&amp;lt;/artifactId&amp;gt;&lt;br /&gt;                        &amp;lt;version&amp;gt;3.5.1&amp;lt;/version&amp;gt;&lt;br /&gt;                        &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;&lt;br /&gt;                &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;br /&gt;            &amp;lt;/dependencies&amp;gt;&lt;br /&gt;&lt;br /&gt;            &amp;lt;activation&amp;gt;&lt;br /&gt;                &amp;lt;activeByDefault&amp;gt;false&amp;lt;/activeByDefault&amp;gt;&lt;br /&gt;                &amp;lt;os&amp;gt;&lt;br /&gt;                    &amp;lt;family&amp;gt;mac&amp;lt;/family&amp;gt;&lt;br /&gt;                &amp;lt;/os&amp;gt;&lt;br /&gt;            &amp;lt;/activation&amp;gt;&lt;br /&gt;        &amp;lt;/profile&amp;gt;&lt;br /&gt;        &amp;lt;profile&amp;gt;&lt;br /&gt;            &amp;lt;id&amp;gt;dev-linux&amp;lt;/id&amp;gt;&lt;br /&gt;&lt;br /&gt;            &amp;lt;dependencies&amp;gt;&lt;br /&gt;                &amp;lt;dependency&amp;gt;&lt;br /&gt;                        &amp;lt;groupId&amp;gt;psteclipse&amp;lt;/groupId&amp;gt;&lt;br /&gt;                        &amp;lt;artifactId&amp;gt;org.eclipse.swt.gtk.linux.x86&amp;lt;/artifactId&amp;gt;&lt;br /&gt;                        &amp;lt;version&amp;gt;3.5.1&amp;lt;/version&amp;gt;&lt;br /&gt;                        &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;&lt;br /&gt;                &amp;lt;/dependency&amp;gt;&lt;br /&gt;            &amp;lt;/dependencies&amp;gt;&lt;br /&gt;&lt;br /&gt;            &amp;lt;activation&amp;gt;&lt;br /&gt;                &amp;lt;activeByDefault&amp;gt;false&amp;lt;/activeByDefault&amp;gt;&lt;br /&gt;                &amp;lt;os&amp;gt;&lt;br /&gt;                    &amp;lt;name&amp;gt;linux&amp;lt;/name&amp;gt;&lt;br /&gt;                &amp;lt;/os&amp;gt;&lt;br /&gt;            &amp;lt;/activation&amp;gt;&lt;br /&gt;        &amp;lt;/profile&amp;gt;&lt;br /&gt;    &amp;lt;/profiles&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;And sets a different library for osx and linux. Sweet!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-520337257104943329?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/520337257104943329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2009/11/maven2-choose-dependcies-based-on.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/520337257104943329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/520337257104943329'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2009/11/maven2-choose-dependcies-based-on.html' title='maven2 - choose dependcies based on platform'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-2186969036163439789</id><published>2009-11-11T21:43:00.000-08:00</published><updated>2009-11-11T21:43:06.086-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><title type='text'>hibernate - configure caching</title><content type='html'>since the hibernate tools for eclipse need to have the caching enabled, something I'm not the biggest fan off for several reason.&lt;br /&gt;&lt;br /&gt;Well&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  &amp;lt;property name=&amp;quot;hibernate.cache.provider_class&amp;quot;&amp;gt;&lt;br /&gt;   org.hibernate.cache.EhCacheProvider&lt;br /&gt;  &amp;lt;/property&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;property name=&amp;quot;hibernate.cache.use_second_level_cache&amp;quot;&amp;gt;true&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name=&amp;quot;hibernate.cache.use_query_cache&amp;quot;&amp;gt;true&amp;lt;/property&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;so this makes the binbase configuration run in the eclipse tools.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-2186969036163439789?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/2186969036163439789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2009/11/hibernate-configure-caching.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/2186969036163439789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/2186969036163439789'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2009/11/hibernate-configure-caching.html' title='hibernate - configure caching'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-8387479670963662681</id><published>2009-11-02T13:02:00.000-08:00</published><updated>2009-11-02T13:02:12.952-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='rcp'/><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='log4j'/><category scheme='http://www.blogger.com/atom/ns#' term='swt'/><title type='text'>Log4J and eclipse</title><content type='html'>sometimes you want to use the log4j system instead of the internal eclipse provide logging framework.&lt;br /&gt;&lt;br /&gt;The use of this is rather simple and straight forwarded. You only need to register an ILogListener at the platform object and implement it.&lt;br /&gt;&lt;br /&gt;An example would be:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;package edu.ucdavis.genomics.metabolomics.binbase.gui.swt.logging;&lt;br /&gt;&lt;br /&gt;import org.apache.log4j.Logger;&lt;br /&gt;import org.eclipse.core.runtime.ILogListener;&lt;br /&gt;import org.eclipse.core.runtime.IStatus;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * used to forward eclipse logging to log4j&lt;br /&gt; * &lt;br /&gt; * @author wohlgemuth&lt;br /&gt; * &lt;br /&gt; */&lt;br /&gt;public class Log4JListener implements ILogListener {&lt;br /&gt;&lt;br /&gt; static Logger LOGGER = Logger.getLogger(Log4JListener.class);&lt;br /&gt;&lt;br /&gt; public void logging(IStatus status, String plugin) {&lt;br /&gt;  if (status.getSeverity() == IStatus.WARNING) {&lt;br /&gt;   if (status.getException() == null) {&lt;br /&gt;    LOGGER.warn(status.getMessage() + "(" + status.getCode() + ")");&lt;br /&gt;   } else {&lt;br /&gt;    LOGGER.warn(status.getMessage() + "(" + status.getCode() + ")",&lt;br /&gt;      status.getException());&lt;br /&gt;   }&lt;br /&gt;  } else if (status.getSeverity() == IStatus.ERROR) {&lt;br /&gt;   if (status.getException() == null) {&lt;br /&gt;    LOGGER&lt;br /&gt;      .error(status.getMessage() + "(" + status.getCode()&lt;br /&gt;        + ")");&lt;br /&gt;   } else {&lt;br /&gt;    LOGGER.error(&lt;br /&gt;      status.getMessage() + "(" + status.getCode() + ")",&lt;br /&gt;      status.getException());&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;  } else if (status.getSeverity() == IStatus.INFO) {&lt;br /&gt;   if (status.getException() == null) {&lt;br /&gt;    LOGGER.info(status.getMessage() + "(" + status.getCode() + ")");&lt;br /&gt;   } else {&lt;br /&gt;    LOGGER.info(status.getMessage() + "(" + status.getCode() + ")",&lt;br /&gt;      status.getException());&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and to register it&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  this.listener = new Log4JListener();&lt;br /&gt;  Platform.addLogListener(this.listener);&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-8387479670963662681?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/8387479670963662681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2009/11/log4j-and-eclipse.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/8387479670963662681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/8387479670963662681'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2009/11/log4j-and-eclipse.html' title='Log4J and eclipse'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-5386917402064611944</id><published>2009-10-27T12:44:00.000-07:00</published><updated>2009-10-27T12:44:48.102-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='swt'/><title type='text'>Eclipse SWT 3.5 and an annoying change...</title><content type='html'>after I moved a part of my software over to eclipse 3.5 to take advantage of bug fixes and new features I noticed that some of my dialogs don't work anymore.&lt;br /&gt;&lt;br /&gt;For example the login dialog has 2 fiels. A username and a password. These fields are defiend like this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt; password = new Text(content, SWT.BORDER | SWT.PASSWORD);&lt;br /&gt; user = new Text(content, SWT.BORDER);&lt;br /&gt;&lt;br /&gt; user.addKeyListener(this);&lt;br /&gt; password.addKeyListener(this);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and in the key listener I validate the inputs. But with version 3.5 key listener won't work on password fields anymore and I didn't find any documentation about it. So instead you need to use a modify listener now&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt; password.addModifyListener(new ModifyListener() {&lt;br /&gt;    &lt;br /&gt;  public void modifyText(ModifyEvent e) {&lt;br /&gt;  }&lt;br /&gt; });&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-5386917402064611944?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/5386917402064611944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2009/10/eclipse-swt-35-and-annoying-change.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/5386917402064611944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/5386917402064611944'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2009/10/eclipse-swt-35-and-annoying-change.html' title='Eclipse SWT 3.5 and an annoying change...'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-8921898946284182906</id><published>2009-10-23T16:17:00.000-07:00</published><updated>2009-10-23T16:17:36.706-07:00</updated><title type='text'>duplicating a disk under OSX</title><content type='html'>since my laptop has no cd drive anymore I have no the need of cloning all my cd's with my mac pro.&lt;br /&gt;&lt;br /&gt;How to do this?&lt;br /&gt;&lt;br /&gt;1. Insert CD/DVD source&lt;br /&gt;2. Fire up a Terminal, you can then determine the device that is you CD/DVD drive using the following command:&lt;br /&gt;&lt;pre&gt;$ drutil status&lt;br /&gt; Vendor   Product           Rev&lt;br /&gt; MATSHITA DVD-R   UJ-835E   GAND&lt;br /&gt;&lt;br /&gt;           Type: DVD-ROM              Name: /dev/disk1&lt;br /&gt;      Cur Write:    8x DVD          Sessions: 1&lt;br /&gt;      Max Write:    8x DVD            Tracks: 1&lt;br /&gt;   Overwritable:   00:00:00         blocks:        0 /   0.00MB /   0.00MiB&lt;br /&gt;     Space Free:   00:00:00         blocks:        0 /   0.00MB /   0.00MiB&lt;br /&gt;     Space Used:  364:08:27         blocks:  1638627 /   3.36GB /   3.13GiB&lt;br /&gt;    Writability:&lt;br /&gt;      Book Type: DVD-ROM&lt;br /&gt;&lt;/pre&gt;3. Umount the disk with the following command:&lt;br /&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;$ diskutil unmountDisk /dev/disk1&lt;br /&gt;Disk /dev/disk1 unmounted&lt;br /&gt;&lt;/pre&gt;4. Create the &lt;span class="caps"&gt;ISO&lt;/span&gt; file with the dd utility (may take some time):&lt;br /&gt;&lt;pre&gt;$ dd if=/dev/disk1 of=file.iso bs=2048&lt;br /&gt;&lt;/pre&gt;5. Test the &lt;span class="caps"&gt;ISO&lt;/span&gt; image by mounting the new file (or open with Finder):&lt;br /&gt;&lt;pre&gt;$ hdid file.iso&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;taken from &lt;a href="http://www.slashdotdash.net/2006/08/14/create-iso-cd-dvd-image-with-mac-os-x-tiger-10-4/"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-8921898946284182906?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/8921898946284182906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2009/10/duplicating-disk-under-osx.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/8921898946284182906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/8921898946284182906'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2009/10/duplicating-disk-under-osx.html' title='duplicating a disk under OSX'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-8599850676436990317</id><published>2009-10-16T16:28:00.000-07:00</published><updated>2009-10-16T16:28:48.662-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ssd'/><category scheme='http://www.blogger.com/atom/ns#' term='osx'/><title type='text'>OSX - upgraded my macbook pro to an SSD and the differences</title><content type='html'>After long considerations I updated my macbook pro to a SSD, from corsair. Since the price seemed to be not to outragios.&lt;br /&gt;&lt;br /&gt;Now the tests are clear:&lt;br /&gt;&lt;br /&gt;SSD&lt;br /&gt;&lt;b&gt;&lt;br /&gt;Drive Type  CORSAIR CMFSSD-128GBG2D&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Disk Test&amp;nbsp;&amp;nbsp;&amp;nbsp; 173.68&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sequential&amp;nbsp;&amp;nbsp;&amp;nbsp; 132.15&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Uncached Write&amp;nbsp;&amp;nbsp;&amp;nbsp; 143.67&amp;nbsp;&amp;nbsp;&amp;nbsp; 88.21 MB/sec [4K blocks]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Uncached Write&amp;nbsp;&amp;nbsp;&amp;nbsp; 101.53&amp;nbsp;&amp;nbsp;&amp;nbsp; 57.44 MB/sec [256K blocks]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Uncached Read&amp;nbsp;&amp;nbsp;&amp;nbsp; 94.19&amp;nbsp;&amp;nbsp;&amp;nbsp; 27.56 MB/sec [4K blocks]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Uncached Read&amp;nbsp;&amp;nbsp;&amp;nbsp; 351.79&amp;nbsp;&amp;nbsp;&amp;nbsp; 176.81 MB/sec [256K blocks]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Random&amp;nbsp;&amp;nbsp;&amp;nbsp; 253.29&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Uncached Write&amp;nbsp;&amp;nbsp;&amp;nbsp; 121.43&amp;nbsp;&amp;nbsp;&amp;nbsp; 12.85 MB/sec [4K blocks]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Uncached Write&amp;nbsp;&amp;nbsp;&amp;nbsp; 196.26&amp;nbsp;&amp;nbsp;&amp;nbsp; 62.83 MB/sec [256K blocks]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Uncached Read&amp;nbsp;&amp;nbsp;&amp;nbsp; 1503.47&amp;nbsp;&amp;nbsp;&amp;nbsp; 10.65 MB/sec [4K blocks]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Uncached Read&amp;nbsp;&amp;nbsp;&amp;nbsp; 556.60&amp;nbsp;&amp;nbsp;&amp;nbsp; 103.28 MB/sec [256K blocks]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Drive Type  ST9500325AS&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;Disk Test&amp;nbsp;&amp;nbsp; &amp;nbsp;43.26&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Sequential&amp;nbsp;&amp;nbsp; &amp;nbsp;80.53&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Uncached Write&amp;nbsp;&amp;nbsp; &amp;nbsp;78.89&amp;nbsp;&amp;nbsp; &amp;nbsp;48.44 MB/sec [4K blocks]&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Uncached Write&amp;nbsp;&amp;nbsp; &amp;nbsp;68.76&amp;nbsp;&amp;nbsp; &amp;nbsp;38.91 MB/sec [256K blocks]&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Uncached Read&amp;nbsp;&amp;nbsp; &amp;nbsp;77.68&amp;nbsp;&amp;nbsp; &amp;nbsp;22.73 MB/sec [4K blocks]&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Uncached Read&amp;nbsp;&amp;nbsp; &amp;nbsp;104.42&amp;nbsp;&amp;nbsp; &amp;nbsp;52.48 MB/sec [256K blocks]&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Random&amp;nbsp;&amp;nbsp; &amp;nbsp;29.57&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Uncached Write&amp;nbsp;&amp;nbsp; &amp;nbsp;10.43&amp;nbsp;&amp;nbsp; &amp;nbsp;1.10 MB/sec [4K blocks]&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Uncached Write&amp;nbsp;&amp;nbsp; &amp;nbsp;73.40&amp;nbsp;&amp;nbsp; &amp;nbsp;23.50 MB/sec [256K blocks]&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Uncached Read&amp;nbsp;&amp;nbsp; &amp;nbsp;64.02&amp;nbsp;&amp;nbsp; &amp;nbsp;0.45 MB/sec [4K blocks]&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Uncached Read&amp;nbsp;&amp;nbsp; &amp;nbsp;98.74&amp;nbsp;&amp;nbsp; &amp;nbsp;18.32 MB/sec [256K blocks]&lt;br /&gt;&lt;br /&gt;I think these result's speak for them self!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-8599850676436990317?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/8599850676436990317/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2009/10/osx-upgraded-my-macbook-pro-to-ssd-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/8599850676436990317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/8599850676436990317'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2009/10/osx-upgraded-my-macbook-pro-to-ssd-and.html' title='OSX - upgraded my macbook pro to an SSD and the differences'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-5087070669856236254</id><published>2009-10-16T11:07:00.000-07:00</published><updated>2009-10-16T11:07:04.235-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='osx'/><title type='text'>my trouble with snowleopard and java5</title><content type='html'>well snow leopard messed up my java installation.&lt;br /&gt;&lt;br /&gt;Luckily there is an easy fix to it!&lt;br /&gt;&lt;br /&gt;taken from &lt;a href="http://wiki.oneswarm.org/index.php/OS_X_10.6_Snow_Leopard"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;cd /tmp/&lt;br /&gt;curl -o java.1.5.0-leopard.tar.gz http://www.cs.washington.edu/homes/isdal/snow_leopard_workaround/java.1.5.0-leopard.tar.gz&lt;br /&gt;tar -xvzf java.1.5.0-leopard.tar.gz&lt;br /&gt;sudo mv 1.5.0 /System/Library/Frameworks/JavaVM.framework/Versions/1.5.0-leopard&lt;br /&gt;cd /System/Library/Frameworks/JavaVM.framework/Versions/&lt;br /&gt;sudo rm 1.5.0&lt;br /&gt;sudo ln -s 1.5.0-leopard 1.5.0&lt;br /&gt;open "/Applications/Utilities/Java Preferences.app"&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and move java5 to the top.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-5087070669856236254?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/5087070669856236254/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2009/10/my-trouble-with-snowleopard-and-java5.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/5087070669856236254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/5087070669856236254'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2009/10/my-trouble-with-snowleopard-and-java5.html' title='my trouble with snowleopard and java5'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-7309344602240896597</id><published>2009-10-07T15:59:00.001-07:00</published><updated>2009-10-07T15:59:46.203-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>calculating the variance - groovy style</title><content type='html'>just had to calculate some variances in a flexible way and like always groovy comes to the rescue.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  static double variance(def population) {&lt;br /&gt;    long n = 0&lt;br /&gt;    double mean = 0&lt;br /&gt;    double s = 0.0&lt;br /&gt;&lt;br /&gt;    population.each {double x -&gt;&lt;br /&gt;      n++;&lt;br /&gt;      double delta = x - mean&lt;br /&gt;      mean += delta / n&lt;br /&gt;      s += delta * (x - mean)&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    (s / (n - 1))&lt;br /&gt;  }&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-7309344602240896597?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/7309344602240896597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2009/10/calculating-variance-groovy-style.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/7309344602240896597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/7309344602240896597'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2009/10/calculating-variance-groovy-style.html' title='calculating the variance - groovy style'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-7160137783347666130</id><published>2009-09-17T13:26:00.000-07:00</published><updated>2009-09-17T13:26:26.087-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Strange XMLParser behaviour - Groovy 1.6.4</title><content type='html'>ell right now I'm stumbling over a small thing in groovy and don't understand why this is happening.&lt;br /&gt;&lt;br /&gt;So this is my code:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;new StreamingMarkupBuilder().bind({&lt;br /&gt;&lt;br /&gt;      sop(desc: "generated for quantification") {&lt;br /&gt;        transform(sizedown: 0, attributes: "height", combine: true) {&lt;br /&gt;          header{&lt;br /&gt;            param(value:"retention_index")&lt;br /&gt;            param(value:"quantmass")&lt;br /&gt;            param(value:"id")&lt;br /&gt;            param(value:"spectra")&lt;br /&gt;          }&lt;br /&gt;        }&lt;br /&gt;      }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;simple enough.&lt;br /&gt;&lt;br /&gt;And that's the code to test it&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;    def parser = new XmlParser().parse(source.getStream())&lt;br /&gt;&lt;br /&gt;    assertTrue parser.@desc != null&lt;br /&gt;&lt;br /&gt;    assertTrue parser.transform != null&lt;br /&gt;&lt;br /&gt;    assertTrue Integer.parseInt(parser.transform.@sizedown[0]) == 0&lt;br /&gt;    assertTrue parser.transform.@attributes[0] == "height"&lt;br /&gt;    assertTrue parser.transform.@combine[0] == "true"&lt;br /&gt;&lt;br /&gt;    assertTrue parser.transform.header.param[0].@value == "retention_index"&lt;br /&gt;    assertTrue parser.transform.header.param[1].@value == "quantmass"&lt;br /&gt;    assertTrue parser.transform.header.param[2].@value == "id"&lt;br /&gt;    assertTrue parser.transform.header.param[3].@value == "spectra"&lt;br /&gt;&lt;br /&gt;    assertTrue parser.transform.header.param.size() == 4&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;also pretty straight forward.&lt;br /&gt;&lt;br /&gt;Now why is this part different...&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;transform(sizedown: 0, attributes: "height", combine: true)&lt;br /&gt;&lt;br /&gt;    assertTrue Integer.parseInt(parser.transform.@sizedown[0]) == 0&lt;br /&gt;    assertTrue parser.transform.@attributes[0] == "height"&lt;br /&gt;    assertTrue parser.transform.@combine[0] == "true" &lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and my attributes are returned as an array list compared to&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;          header{&lt;br /&gt;            param(value:"retention_index")&lt;br /&gt;            param(value:"quantmass")&lt;br /&gt;            param(value:"id")&lt;br /&gt;            param(value:"spectra")&lt;br /&gt;          }&lt;br /&gt;&lt;br /&gt;    assertTrue parser.transform.header.param[0].@value == "retention_index"&lt;br /&gt;    assertTrue parser.transform.header.param[1].@value == "quantmass"&lt;br /&gt;    assertTrue parser.transform.header.param[2].@value == "id"&lt;br /&gt;    assertTrue parser.transform.header.param[3].@value == "spectra"&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;where the attributes are returned as simple string. I has to be something obvious, but right now I'm not getting it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-7160137783347666130?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/7160137783347666130/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2009/09/strange-xmlparser-behaviour-groovy-164.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/7160137783347666130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/7160137783347666130'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2009/09/strange-xmlparser-behaviour-groovy-164.html' title='Strange XMLParser behaviour - Groovy 1.6.4'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-2531955639094092757</id><published>2009-09-16T12:04:00.000-07:00</published><updated>2009-09-16T12:04:44.664-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>XMLMarkupBuilder in groovy.</title><content type='html'>Since a while i wanted to find a reason to play with the xml markup builders in groovy, since I think they are an awesome idea.&lt;br /&gt;So I gave it a shot&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;    def document = new StreamingMarkupBuilder().bind({&lt;br /&gt;&lt;br /&gt;      config {&lt;br /&gt;        parameter {&lt;br /&gt;          param(name: "java.naming.provider.url", value: "127.0.0.1", public:true)&lt;br /&gt;          param(name: "java.naming.factory.initial", value: "org.jnp.interfaces.NamingContextFactory", public:true)&lt;br /&gt;          param(name: "java.naming.factory.url.pkgs", value: "org.jboss.naming:org.jnp.interfaces", public:true)&lt;br /&gt;          param(name: "edu.ucdavis.genomics.metabolomics.util.status.ReportFactory", value: "edu.ucdavis.genomics.metabolomics.binbase.cluster.status.EJBReportFactory")&lt;br /&gt;          param(name: "edu.ucdavis.genomics.metabolomics.util.thread.locking.LockableFactory", value: "edu.ucdavis.genomics.metabolomics.binbase.cluster.locking.EJBLockingFactory")&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;      }&lt;br /&gt;    })&lt;br /&gt;&lt;br /&gt;    println document&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and the result is&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;config&amp;gt;&amp;lt;parameter&amp;gt;&amp;lt;param name='java.naming.provider.url' value='127.0.0.1' public='true'/&amp;gt;&amp;lt;param name='java.naming.factory.initial' value='org.jnp.interfaces.NamingContextFactory'/&amp;gt;&amp;lt;param name='java.naming.factory.url.pkgs' value='org.jboss.naming:org.jnp.interfaces'/&amp;gt;&amp;lt;param name='edu.ucdavis.genomics.metabolomics.util.status.ReportFactory' value='edu.ucdavis.genomics.metabolomics.binbase.cluster.status.EJBReportFactory'/&amp;gt;&amp;lt;param name='edu.ucdavis.genomics.metabolomics.util.thread.locking.LockableFactory' value='edu.ucdavis.genomics.metabolomics.binbase.cluster.locking.EJBLockingFactory'/&amp;gt;&amp;lt;/parameter&amp;gt;&amp;lt;/config&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Neat! This was very simple and the validation of the code happens at runtime. The only uggly part is that idea shows this part in red brackets&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt; public:true&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;since public is a keyword of java/groovy. But it does compile...&lt;br /&gt;&lt;br /&gt;Guess I have to change my api a bit to avoid this uggly keyword or at least make it optional.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-2531955639094092757?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/2531955639094092757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2009/09/xmlmarkupbuilder-in-groovy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/2531955639094092757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/2531955639094092757'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2009/09/xmlmarkupbuilder-in-groovy.html' title='XMLMarkupBuilder in groovy.'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-3171346637539475159</id><published>2009-09-15T16:57:00.000-07:00</published><updated>2009-09-15T17:00:42.260-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='intellij'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Groovy 1.6.4 + IntelliJ8 + Groovy Plugin - nullpointer</title><content type='html'>For soem reason I keep get nullpointer exception with IntelliJ, which have nothing todo with my code.&lt;br /&gt;They only happen if I execute the project from intelliJ out.&lt;br /&gt;&lt;br /&gt;example for this would be:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt; src/example/dsl/quant.dsl&lt;br /&gt;Caught: java.lang.NullPointerException&lt;br /&gt;java.lang.NullPointerException&lt;br /&gt; at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:39)&lt;br /&gt; at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:40)&lt;br /&gt; at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:117)&lt;br /&gt; at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)&lt;br /&gt; at edu.ucdavis.genomics.metabolomics.binbase.quantificator.dsl.QuantificatorDSL.run(QuantificatorDSL.groovy:45)&lt;br /&gt; at edu.ucdavis.genomics.metabolomics.binbase.quantificator.dsl.QuantificatorDSL$run.call(Unknown Source)&lt;br /&gt; at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:40)&lt;br /&gt; at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:117)&lt;br /&gt; at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)&lt;br /&gt; at edu.ucdavis.genomics.metabolomics.binbase.quantificator.dsl.QuantificatorDSL.main(QuantificatorDSL.groovy:33)&lt;br /&gt; at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;br /&gt; at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)&lt;br /&gt; at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)&lt;br /&gt; at java.lang.reflect.Method.invoke(Method.java:592)&lt;br /&gt; at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)&lt;br /&gt; at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)&lt;br /&gt; at groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1296)&lt;br /&gt; at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:719)&lt;br /&gt; at groovy.lang.GroovyShell.runScriptOrMainOrTestOrRunnable(GroovyShell.java:262)&lt;br /&gt; at groovy.lang.GroovyShell.run(GroovyShell.java:218)&lt;br /&gt; at groovy.lang.GroovyShell.run(GroovyShell.java:147)&lt;br /&gt; at groovy.ui.GroovyMain.processOnce(GroovyMain.java:493)&lt;br /&gt; at groovy.ui.GroovyMain.run(GroovyMain.java:308)&lt;br /&gt; at groovy.ui.GroovyMain.process(GroovyMain.java:294)&lt;br /&gt; at groovy.ui.GroovyMain.processArgs(GroovyMain.java:111)&lt;br /&gt; at groovy.ui.GroovyMain.main(GroovyMain.java:92)&lt;br /&gt; at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;br /&gt; at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)&lt;br /&gt; at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)&lt;br /&gt; at java.lang.reflect.Method.invoke(Method.java:592)&lt;br /&gt; at org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:108)&lt;br /&gt; at org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:130)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Now this exception does not occur, if I make a complete rebuild.&lt;br /&gt;&lt;br /&gt;For some reason it is not able to initialize a class if it defined in another source file. More about this is written &lt;a href="http://codingandmore.blogspot.com/2009/09/groovy-156-and-delegates.html"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-3171346637539475159?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/3171346637539475159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2009/09/groovy-164-intellij8-groovy-plugin.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/3171346637539475159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/3171346637539475159'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2009/09/groovy-164-intellij8-groovy-plugin.html' title='Groovy 1.6.4 + IntelliJ8 + Groovy Plugin - nullpointer'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-4739496427720458328</id><published>2009-09-10T06:47:00.000-07:00</published><updated>2009-09-10T06:50:24.306-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl'/><title type='text'>groovy 1.5.6 and delegates</title><content type='html'>while trying to write a DSL I discovered an annoying bug in groovy 1.5.6, I guess. Basically if I define a delegate for a closure it has to be in the same file as the closure. If i define it in another file I always get a nullpointer exception...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;example:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;class MyDelegate {&lt;br /&gt; def test() {&lt;br /&gt;  println "tada"&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static ExpandoMetaClass createEMC(Class clazz, Closure cl) {&lt;br /&gt; ExpandoMetaClass emc = new ExpandoMetaClass(clazz, false)&lt;br /&gt;&lt;br /&gt; cl(emc)&lt;br /&gt;&lt;br /&gt; emc.initialize()&lt;br /&gt; return emc&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Script dslScript = new GroovyShell().parse("test{\ntest()\n}")&lt;br /&gt;&lt;br /&gt;dslScript.metaClass = createEMC(dslScript.class, {&lt;br /&gt; ExpandoMetaClass emc -&gt;&lt;br /&gt;&lt;br /&gt; emc.test = {&lt;br /&gt;&lt;br /&gt;  Closure closure -&gt;&lt;br /&gt;  closure.delegate = new MyDelegate()&lt;br /&gt;  closure.resolveStrategy = Closure.DELEGATE_FIRST&lt;br /&gt;&lt;br /&gt;  try {&lt;br /&gt;    closure()&lt;br /&gt;  }&lt;br /&gt;  catch (Exception e) {&lt;br /&gt;    e.printStackTrace()&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;})&lt;br /&gt;dslScript.run()&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;this works fine. Now if I move the class 'MyDelegate' to it's own file I end up with the following exception.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;java.lang.NullPointerException&lt;br /&gt;      at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.getDelegateMethod(ClosureMetaClass.java:207)&lt;br /&gt;      at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:280)&lt;br /&gt;      at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnCurrentN(ScriptBytecodeAdapter.java:78)&lt;br /&gt;      at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnCurrent0(ScriptBytecodeAdapter.java:112)&lt;br /&gt;      at Script1$_run_closure1.doCall(Script1.groovy:2)&lt;br /&gt;      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;br /&gt;      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)&lt;br /&gt;      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)&lt;br /&gt;      at java.lang.reflect.Method.invoke(Method.java:585)&lt;br /&gt;      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)&lt;br /&gt;      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230)&lt;br /&gt;      at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:248)&lt;br /&gt;      at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnCurrentN(ScriptBytecodeAdapter.java:78)&lt;br /&gt;      at Script1$_run_closure1.doCall(Script1.groovy)&lt;br /&gt;      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;br /&gt;      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)&lt;br /&gt;      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)&lt;br /&gt;      at java.lang.reflect.Method.invoke(Method.java:585)&lt;br /&gt;      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)&lt;br /&gt;      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230)&lt;br /&gt;      at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:248)&lt;br /&gt;      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756)&lt;br /&gt;      at org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.java:778)&lt;br /&gt;      at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:758)&lt;br /&gt;      at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytecodeAdapter.java:170)&lt;br /&gt;      at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeClosure(ScriptBytecodeAdapter.java:605)&lt;br /&gt;      at edu.ucdavis.genomics.metabolomics.binbase.quantificator.dsl.Tester$_run_closure1_closure2.doCall(Tester.groovy:38)&lt;br /&gt;      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;br /&gt;      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)&lt;br /&gt;      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)&lt;br /&gt;      at java.lang.reflect.Method.invoke(Method.java:585)&lt;br /&gt;      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)&lt;br /&gt;      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230)&lt;br /&gt;      at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:248)&lt;br /&gt;      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756)&lt;br /&gt;      at groovy.lang.Closure.call(Closure.java:292)&lt;br /&gt;      at org.codehaus.groovy.runtime.metaclass.ClosureMetaMethod.invoke(ClosureMetaMethod.java:72)&lt;br /&gt;      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230)&lt;br /&gt;      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912)&lt;br /&gt;      at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)&lt;br /&gt;      at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnCurrentN(ScriptBytecodeAdapter.java:78)&lt;br /&gt;      at Script1.run(Script1.groovy:1)&lt;br /&gt;      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;br /&gt;      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)&lt;br /&gt;      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)&lt;br /&gt;      at java.lang.reflect.Method.invoke(Method.java:585)&lt;br /&gt;      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)&lt;br /&gt;      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230)&lt;br /&gt;      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912)&lt;br /&gt;      at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)&lt;br /&gt;      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756)&lt;br /&gt;      at org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.java:778)&lt;br /&gt;      at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:758)&lt;br /&gt;      at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytecodeAdapter.java:170)&lt;br /&gt;      at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethod0(ScriptBytecodeAdapter.java:198)&lt;br /&gt;      at edu.ucdavis.genomics.metabolomics.binbase.quantificator.dsl.Tester.run(Tester.groovy:45)&lt;br /&gt;      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;br /&gt;      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)&lt;br /&gt;      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)&lt;br /&gt;      at java.lang.reflect.Method.invoke(Method.java:585)&lt;br /&gt;      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)&lt;br /&gt;      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230)&lt;br /&gt;      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912)&lt;br /&gt;      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756)&lt;br /&gt;      at org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.java:778)&lt;br /&gt;      at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:758)&lt;br /&gt;      at org.codehaus.groovy.runtime.InvokerHelper.runScript(InvokerHelper.java:401)&lt;br /&gt;      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;br /&gt;      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)&lt;br /&gt;      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)&lt;br /&gt;      at java.lang.reflect.Method.invoke(Method.java:585)&lt;br /&gt;      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)&lt;br /&gt;      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230)&lt;br /&gt;      at groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1105)&lt;br /&gt;      at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:749)&lt;br /&gt;      at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytecodeAdapter.java:170)&lt;br /&gt;      at edu.ucdavis.genomics.metabolomics.binbase.quantificator.dsl.Tester.main(Tester.groovy)&lt;br /&gt;      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;br /&gt;      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)&lt;br /&gt;      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)&lt;br /&gt;      at java.lang.reflect.Method.invoke(Method.java:585)&lt;br /&gt;      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)&lt;br /&gt;      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230)&lt;br /&gt;      at groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1105)&lt;br /&gt;      at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:749)&lt;br /&gt;      at groovy.lang.GroovyShell.runMainOrTestOrRunnable(GroovyShell.java:244)&lt;br /&gt;      at groovy.lang.GroovyShell.run(GroovyShell.java:218)&lt;br /&gt;      at groovy.lang.GroovyShell.run(GroovyShell.java:147)&lt;br /&gt;      at groovy.ui.GroovyMain.processOnce(GroovyMain.java:493)&lt;br /&gt;      at groovy.ui.GroovyMain.run(GroovyMain.java:308)&lt;br /&gt;      at groovy.ui.GroovyMain.process(GroovyMain.java:294)&lt;br /&gt;      at groovy.ui.GroovyMain.processArgs(GroovyMain.java:111)&lt;br /&gt;      at groovy.ui.GroovyMain.main(GroovyMain.java:92)&lt;br /&gt;      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;br /&gt;      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)&lt;br /&gt;      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)&lt;br /&gt;      at java.lang.reflect.Method.invoke(Method.java:585)&lt;br /&gt;      at org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:101)&lt;br /&gt;      at org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:130)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;time to give groovy 1.6.4 a try and maybe migrate my project over to it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-4739496427720458328?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/4739496427720458328/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2009/09/groovy-156-and-delegates.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/4739496427720458328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/4739496427720458328'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2009/09/groovy-156-and-delegates.html' title='groovy 1.5.6 and delegates'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-8372238237589949700</id><published>2009-09-09T13:00:00.000-07:00</published><updated>2009-09-09T13:10:02.276-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='binbase'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl'/><title type='text'>DSL - love or hate?</title><content type='html'>recently I started to work more with DSL's (domain specific language) since I wanted to go away from doing everything in XML.&lt;br /&gt;&lt;br /&gt;The approach of XML is great, but I'm not a big fan of the overhead with it.&lt;br /&gt;&lt;br /&gt;So the first approach was to create a DSL for the BinBase system, precisely to provide the user with a really simple way of calculating an experiment.&lt;br /&gt;&lt;br /&gt;It should look something like this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;/**&lt;br /&gt; * our quantification dsl&lt;br /&gt; */&lt;br /&gt;quantify {&lt;br /&gt;&lt;br /&gt;  //define the name of the setup&lt;br /&gt;  name "quantification for ${new Date()}"&lt;br /&gt;&lt;br /&gt;  //define the samples for the calculations&lt;br /&gt;  sample "sample 1"&lt;br /&gt;  sample "sample 2"&lt;br /&gt;  sample "sample 3"&lt;br /&gt;  sample "sample 4"&lt;br /&gt;  sample "sample 5"&lt;br /&gt;  sample "sample 6"&lt;br /&gt;  sample "sample 7"&lt;br /&gt;  sample "sample 8"&lt;br /&gt;  sample "sample 9"&lt;br /&gt;  sample "sample 10"&lt;br /&gt;&lt;br /&gt;  //defines the bins in the table&lt;br /&gt;  bin 321, 22.0&lt;br /&gt;  bin 322&lt;br /&gt;  bin 323&lt;br /&gt;  bin 324&lt;br /&gt;  bin 325, 22.0&lt;br /&gt;&lt;br /&gt;  //report definition&lt;br /&gt;  report {&lt;br /&gt;&lt;br /&gt;    sizeDown 50&lt;br /&gt;&lt;br /&gt;    format "xls"&lt;br /&gt;&lt;br /&gt;    replace true&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;And the result should calculate the data, send them to the cluster and generates a quantification report. If this all works out the way we want it. We will than adapt it to schedule BinBase experiment's this way.&lt;br /&gt;&lt;br /&gt;My current fazit is that I love the idea of DSL's, but hate the implementations of it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-8372238237589949700?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/8372238237589949700/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2009/09/dsl-love-or-hate.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/8372238237589949700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/8372238237589949700'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2009/09/dsl-love-or-hate.html' title='DSL - love or hate?'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-1564131760156133201</id><published>2009-09-09T11:56:00.000-07:00</published><updated>2009-09-09T11:58:47.290-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jboss'/><title type='text'>jboss - binding to all registered network cards</title><content type='html'>The JBoss Application server binds only to the local interface '127.0.0.1' since the version 4.0&lt;br /&gt;&lt;br /&gt;Since this is not desired in a production system you can override this feature with the '-b' command.&lt;br /&gt;&lt;br /&gt;An example to start jboss in the all configuration and bound to all registered interfaces would be&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;sh run.sh -b 0.0.0.0 -c all&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-1564131760156133201?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/1564131760156133201/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2009/09/jboss-binding-to-all-registered-network.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/1564131760156133201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/1564131760156133201'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2009/09/jboss-binding-to-all-registered-network.html' title='jboss - binding to all registered network cards'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-2038191207628732489</id><published>2009-09-03T12:28:00.000-07:00</published><updated>2009-09-03T12:29:59.877-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maven2'/><title type='text'>creating a project with maven2</title><content type='html'>it is kinda pathetic I'm using maven since several years now and just can't remember this one command.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;mvn archetype:create -DgroupId=myGroup -DartifactId=myArtifact&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;so I write it down here to make it easier for me to lookup.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-2038191207628732489?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/2038191207628732489/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2009/09/creating-project-with-maven2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/2038191207628732489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/2038191207628732489'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2009/09/creating-project-with-maven2.html' title='creating a project with maven2'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-3113543789128984952</id><published>2009-09-02T15:11:00.001-07:00</published><updated>2009-09-02T15:12:01.906-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='osx'/><title type='text'>osx -  set disk as startup disk via terminal</title><content type='html'>to set a disk as startup disk is quite simple just execute:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;sudo bless -mount /Volumes/"name of your startup disk" -setBoot&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-3113543789128984952?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/3113543789128984952/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2009/09/osx-set-disk-as-startup-disk-via.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/3113543789128984952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/3113543789128984952'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2009/09/osx-set-disk-as-startup-disk-via.html' title='osx -  set disk as startup disk via terminal'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-2530740855806636281</id><published>2009-09-01T10:09:00.000-07:00</published><updated>2009-09-01T10:10:44.482-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>run-app vs run-war</title><content type='html'>the main differences between these two commands is that:&lt;br /&gt;&lt;br /&gt;run-app runs a grails applications and allows the reloading from resources&lt;br /&gt;run-war generates a war file and runs the war file, so no reloading of resources.&lt;br /&gt;&lt;br /&gt;Short during development you want to use run-app.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-2530740855806636281?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/2530740855806636281/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2009/09/run-app-vs-run-war.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/2530740855806636281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/2530740855806636281'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2009/09/run-app-vs-run-war.html' title='run-app vs run-war'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-7047660081408670632</id><published>2009-08-31T11:59:00.000-07:00</published><updated>2009-08-31T12:02:20.278-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='maven2'/><category scheme='http://www.blogger.com/atom/ns#' term='war'/><category scheme='http://www.blogger.com/atom/ns#' term='ear'/><category scheme='http://www.blogger.com/atom/ns#' term='jboss'/><title type='text'>maven2 - define the context root of an webapp</title><content type='html'>Basically I have an application (ear) based on several jars and a war which I want to easily access with a context root of my choice.&lt;br /&gt;&lt;br /&gt;Solution:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;   &amp;lt;plugin&amp;gt;&lt;br /&gt;    &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;    &amp;lt;artifactId&amp;gt;maven-ear-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;    &amp;lt;configuration&amp;gt;&lt;br /&gt;     &amp;lt;archive&amp;gt;&lt;br /&gt;      &amp;lt;manifest&amp;gt;&lt;br /&gt;       &amp;lt;addClasspath&amp;gt;true&amp;lt;/addClasspath&amp;gt;&lt;br /&gt;      &amp;lt;/manifest&amp;gt;&lt;br /&gt;     &amp;lt;/archive&amp;gt;&lt;br /&gt;     &amp;lt;jboss&amp;gt;&lt;br /&gt;      &amp;lt;version&amp;gt;4&amp;lt;/version&amp;gt;&lt;br /&gt;     &amp;lt;/jboss&amp;gt;&lt;br /&gt;     &amp;lt;bundleFileName&amp;gt;&lt;br /&gt;      binbase-quality-control.ear&lt;br /&gt;     &amp;lt;/bundleFileName&amp;gt;&lt;br /&gt;&lt;br /&gt;     &amp;lt;modules&amp;gt;&lt;br /&gt;      &amp;lt;webModule&amp;gt;&lt;br /&gt;       &amp;lt;groupId&amp;gt;edu.ucdavis.genomics.metabolomics.binbase.quality&lt;br /&gt;       &amp;lt;/groupId&amp;gt;&lt;br /&gt;       &amp;lt;artifactId&amp;gt;quality-war&amp;lt;/artifactId&amp;gt;&lt;br /&gt;       &amp;lt;contextRoot&amp;gt;/quality-war&amp;lt;/contextRoot&amp;gt;&lt;br /&gt;      &amp;lt;/webModule&amp;gt;&lt;br /&gt;     &amp;lt;/modules&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;/configuration&amp;gt;&lt;br /&gt;   &amp;lt;/plugin&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-7047660081408670632?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/7047660081408670632/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2009/08/maven2-define-context-root-of-webapp.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/7047660081408670632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/7047660081408670632'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2009/08/maven2-define-context-root-of-webapp.html' title='maven2 - define the context root of an webapp'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-7951320600976712943</id><published>2009-08-09T14:20:00.000-07:00</published><updated>2009-08-09T14:26:32.530-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='xandr'/><category scheme='http://www.blogger.com/atom/ns#' term='display'/><category scheme='http://www.blogger.com/atom/ns#' term='xorg'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Method "ApplyConfiguration" with signature "" on interface "org.gnome.SettingsDaemon.XRANDR" doesn't exist</title><content type='html'>today I wanted todo nothing else than the change the primaery output of my laptop to the 40" display attached over DVI to watch movies on it.&lt;br /&gt;&lt;br /&gt;Sadly since ubuntu 8.something I kept getting the following error message&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Method "ApplyConfiguration" with signature "" on interface "org.gnome.SettingsDaemon.XRANDR" doesn't exist&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;So I upgraded to the newest ubuntu version. Didn't make it much better. So I could had given up here and start shouting all kinds off stuff about linux or trying to make it work.&lt;br /&gt;&lt;br /&gt;So here is the solution:&lt;br /&gt;&lt;br /&gt;the gui is basically broken and you need to execute the commands to adjust everything your self. Using 'xandr'&lt;br /&gt;&lt;br /&gt;for example to turn off a monitor:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;xandr --output LVDS --off&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;or to change the resolution&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;xandr --output DVI-0 --mode 1360x768 --pos 0x0&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;2 minutes later I had my configuration up and running.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-7951320600976712943?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/7951320600976712943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2009/08/method-applyconfiguration-with.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/7951320600976712943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/7951320600976712943'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2009/08/method-applyconfiguration-with.html' title='Method &quot;ApplyConfiguration&quot; with signature &quot;&quot; on interface &quot;org.gnome.SettingsDaemon.XRANDR&quot; doesn&apos;t exist'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-2444912208493291609</id><published>2009-08-04T12:33:00.000-07:00</published><updated>2009-08-04T12:37:58.788-07:00</updated><title type='text'>synchornized groovy</title><content type='html'>Today I discovered the question:&lt;br /&gt;&lt;br /&gt;I want to have a websites which fires calculations to a database server, but the controller should only execute one calculation at a time&lt;br /&gt;&lt;br /&gt;how do you do this?&lt;br /&gt;&lt;br /&gt;The first approach was to try to queue the ajax calls, which obviously won't work if two people run calculations at the same time.&lt;br /&gt;&lt;br /&gt;So plan b was to use synchronized groovy code.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  /**&lt;br /&gt;   * does the actual calculation&lt;br /&gt;   */&lt;br /&gt;  def calculate_ajax = {&lt;br /&gt;&lt;br /&gt;    assert params.database != null, &amp;quot;you need to provide 'database' in the params object&amp;quot;&lt;br /&gt;    assert params.date != null, &amp;quot;you need to provide 'date' in the params object&amp;quot;&lt;br /&gt;    assert params.machine != null, &amp;quot;you need to provide 'machine' in the params object&amp;quot;&lt;br /&gt;    assert params.pattern != null, &amp;quot;you need to provide 'pattern' in the params object&amp;quot;&lt;br /&gt;    assert params.position != null, &amp;quot;you need to provide 'position' in the params object&amp;quot;&lt;br /&gt;&lt;br /&gt;    //needs to be synchronized so we don't kill the database server with this task&lt;br /&gt;    synchronized (LOCK) {&lt;br /&gt;      println new Date()&lt;br /&gt;      BinBaseQualityConnector.getQualityService().calculateSingleStandard(params.pattern, params.database, new Date(Long.parseLong(params.date)), params.machine, BinBaseQualityConnector.getKey())&lt;br /&gt;      render(&amp;quot;&amp;lt;div class=\&amp;quot;after_complete\&amp;quot; style=\&amp;quot;width:${100 / BinBaseQualityConnector.getPattern(params).size()}%\&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;)&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  static final def LOCK = &amp;quot;lock&amp;quot;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and a possible ajax call for this looks like this&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;                  &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;                    YAHOO.util.Event.onDOMReady(&lt;br /&gt;                            function() {&lt;br /&gt;                              new Ajax.Updater('${i}_${y}_${z}', '/quality-war/processing/calculate_ajax', {&lt;br /&gt;                                method: 'get', frequency: 3,parameters:'date=${date.getTime()}&amp;amp;database=${database}&amp;amp;machine=${machine}&amp;amp;pattern=${pattern}&amp;amp;position=${z}'&lt;br /&gt;                              });&lt;br /&gt;                            });&lt;br /&gt;                  &amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-2444912208493291609?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/2444912208493291609/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2009/08/synchornized-groovy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/2444912208493291609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/2444912208493291609'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2009/08/synchornized-groovy.html' title='synchornized groovy'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-4511094609521841924</id><published>2009-07-28T15:49:00.001-07:00</published><updated>2009-07-28T15:52:54.953-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java script'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>updating more than one div with grails and ajax</title><content type='html'>sometimes it happens that you have to update several div's on one webpage, when you click on a form or a button.&lt;br /&gt;&lt;br /&gt;Now you can either reload the complete page, which can take a while with a lot of data or just queue remote functions in a java script function like this&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  function addStandard() {&lt;br /&gt;&lt;br /&gt;    if (YAHOO.example.container.addstandard) {&lt;br /&gt;      YAHOO.example.container.addstandard.hide();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    //get our element values&lt;br /&gt;    var conc = document.getElementsByName('qs_concentration')[0].value;&lt;br /&gt;    var pattern = document.getElementsByName('qs_pattern')[0].value;&lt;br /&gt;&lt;br /&gt;    //calls the remote functions&lt;br /&gt;  ${remoteFunction(&lt;br /&gt;                      controller: 'management',&lt;br /&gt;                      action: 'addStandard_ajax',&lt;br /&gt;                      params: '\'conc=\' + escape(conc) + \'&amp;amp;pattern=\' + escape(pattern)',&lt;br /&gt;                      update: 'registered_standards')}&lt;br /&gt;&lt;br /&gt;  ${remoteFunction(&lt;br /&gt;                      controller: 'messenger',&lt;br /&gt;                      action: 'showMessage',&lt;br /&gt;                      params: '\'message=you should recalculate the database now!\'',&lt;br /&gt;                      update: 'messenger')}&lt;br /&gt;  }&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-4511094609521841924?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/4511094609521841924/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2009/07/updating-more-than-one-div-with-grails.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/4511094609521841924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/4511094609521841924'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2009/07/updating-more-than-one-div-with-grails.html' title='updating more than one div with grails and ajax'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-8903425619044086124</id><published>2009-07-28T14:45:00.000-07:00</published><updated>2009-07-28T14:48:16.441-07:00</updated><title type='text'>javascripts and maps</title><content type='html'>since java script contains no Maps, well use an object instead with dynamic properties.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;var test = new Object();&lt;br /&gt;test['tada'] = 'yada';&lt;br /&gt;&lt;br /&gt;alert(test['yada']);&lt;br /&gt;alert(test.yada);&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-8903425619044086124?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/8903425619044086124/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2009/07/javascripts-and-maps.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/8903425619044086124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/8903425619044086124'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2009/07/javascripts-and-maps.html' title='javascripts and maps'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-7591727183807630705</id><published>2009-07-28T09:14:00.001-07:00</published><updated>2009-07-28T09:18:47.553-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><title type='text'>distinct or group by, what's more expensive</title><content type='html'>today I was asking my self about the best approach for a performance critical application.&lt;br /&gt;&lt;br /&gt;Distinct or group by '*'&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;select name from table group by name&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;or&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;select distinct name from table&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;after all they both return the exact same result.&lt;br /&gt;&lt;br /&gt;Some explain statements later it turned out that the group by clause is 18% faster than the distinct statement.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-7591727183807630705?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/7591727183807630705/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2009/07/distinct-or-group-by-whats-more.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/7591727183807630705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/7591727183807630705'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2009/07/distinct-or-group-by-whats-more.html' title='distinct or group by, what&apos;s more expensive'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-5577676880400846905</id><published>2009-07-27T17:54:00.001-07:00</published><updated>2009-07-27T17:57:46.292-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>sometimes it's simpler to use plain ajax...</title><content type='html'>today I was struggling for a bit with generating the update part of a remote function on the fly and after a couple of minutes. I started thinking, do I have to really use this tag? Why don't I use just plain Ajax, since grails will generate the same code anyway.&lt;br /&gt;&lt;br /&gt;Solution:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;            &amp;lt;div class=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;              &amp;lt;img name=&amp;quot;${bin.getId()}&amp;quot; src=&amp;quot;${createLinkTo(dir: 'images', file: 'remove.gif')}&amp;quot; alt=&amp;quot;zoom&amp;quot; onclick=&amp;quot;new Ajax.Updater&lt;br /&gt;&lt;br /&gt;                      ('bin-container-${db}', '/quality-war/management/remove_bin_ajax', {asynchronous:true,evalScripts:true,parameters&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;                              :'bin=${bin.getId()}&amp;amp;database=${db}'});&amp;quot;/&amp;gt;&lt;br /&gt;            &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;this also shows how to submit several parameters at once in plain ajax style.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-5577676880400846905?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/5577676880400846905/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2009/07/sometimes-its-simpler-to-use-plain-ajax.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/5577676880400846905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/5577676880400846905'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2009/07/sometimes-its-simpler-to-use-plain-ajax.html' title='sometimes it&apos;s simpler to use plain ajax...'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-5950439226303779090</id><published>2009-07-27T17:17:00.001-07:00</published><updated>2009-07-27T17:20:25.664-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='yui'/><category scheme='http://www.blogger.com/atom/ns#' term='java script'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>lesson of the day...</title><content type='html'>and god said you shall no duplicate div ids,&lt;br /&gt;cause if you do,&lt;br /&gt;you shall be send to the hell of css,&lt;br /&gt;constant torture and misfortune will await you,&lt;br /&gt;&lt;br /&gt;so do not duplicate your id's!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;problem:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;updating a you tab with some dynamic generated content, which generate the same div id over and over again...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-5950439226303779090?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/5950439226303779090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2009/07/lesson-of-day.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/5950439226303779090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/5950439226303779090'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2009/07/lesson-of-day.html' title='lesson of the day...'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-6936921009432764211</id><published>2009-07-27T00:40:00.000-07:00</published><updated>2009-07-27T00:42:58.297-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='maven2'/><category scheme='http://www.blogger.com/atom/ns#' term='bamboo'/><title type='text'>Annoying maven bug</title><content type='html'>well tonight I got an interesting error message from my bamboo build server&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;[INFO] ------------------------------------------------------------------------&lt;br /&gt;[ERROR] BUILD ERROR&lt;br /&gt;[INFO] ------------------------------------------------------------------------&lt;br /&gt;[INFO] Error installing artifact's metadata: Error installing metadata: Error updating group repository metadata&lt;br /&gt;&lt;br /&gt;input contained no data&lt;br /&gt;[INFO] ------------------------------------------------------------------------&lt;br /&gt;[INFO] For more information, run Maven with the -e switch&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;without actually doing any changes at the pom.xml. The problem turned out that the repository was corrupt.&lt;br /&gt;&lt;br /&gt;So all I had todo was to delete my project from the local build repository.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-6936921009432764211?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/6936921009432764211/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2009/07/annoying-maven-bug.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/6936921009432764211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/6936921009432764211'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2009/07/annoying-maven-bug.html' title='Annoying maven bug'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-3813065248128114956</id><published>2009-07-23T15:46:00.000-07:00</published><updated>2009-07-23T15:49:31.051-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java script'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>Grails - using several arguments with a remote function</title><content type='html'>in grails it's a bit tricky to use a remote function and pass more than one parameter, since it does not follow the map approach like the usual approach&lt;br /&gt;&lt;br /&gt;After a bit of asking Dr Google I finally found an approach which worked&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;    var conc = document.getElementsByName('qs_concentration')[0].value;&lt;br /&gt;    var pattern = document.getElementsByName('qs_pattern')[0].value;&lt;br /&gt;&lt;br /&gt;    ${remoteFunction(&lt;br /&gt;                      controller: 'management',&lt;br /&gt;                      action: 'addStandard_ajax',&lt;br /&gt;                      params: '\'conc=\' + escape(conc) + \'&amp;pattern=\' + escape(pattern)',&lt;br /&gt;                      update: 'registered_standards')}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;now I just wish there would be an easier approach&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-3813065248128114956?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/3813065248128114956/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2009/07/grails-using-several-arguments-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/3813065248128114956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/3813065248128114956'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2009/07/grails-using-several-arguments-with.html' title='Grails - using several arguments with a remote function'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-7098305280042906937</id><published>2009-07-23T13:34:00.000-07:00</published><updated>2009-07-23T13:47:34.981-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java script'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>grails remote function on image or checkbox</title><content type='html'>Today I was in the situation that I wanted to call a remote function on an image to emulate a button, to delete an object with a specific id.&lt;br /&gt;&lt;br /&gt;It's simple enough,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;        &amp;lt;img name="${standard.getPosition()}" src="${createLinkTo(dir: 'images', file: 'remove.gif')}" alt="zoom" onclick="${remoteFunction(&lt;br /&gt;                       controller: 'management',&lt;br /&gt;                       action: 'removeStandard_ajax',&lt;br /&gt;                       params: '\'standard=\' + + escape(this.name)',&lt;br /&gt;                       update: 'registered_standards')}"/&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;To make live easy we just save the id in the name field of the image, but you can also save it somewhere else, depending on your requirements.&lt;br /&gt;&lt;br /&gt;Now another thing you can do is todo the same thing for checkfields.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;         &amp;lt;input type="checkbox" id="cacheSetting" name="cacheSetting" onchange="${remoteFunction(&lt;br /&gt;                 controller: 'management',&lt;br /&gt;                 action: 'updateCache_ajax',&lt;br /&gt;                 params: '\'cacheSetting=\' + escape(this.checked)',&lt;br /&gt;                 update: 'general_config')}"/&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;If you want to preserve the check state you can do this with this&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;          &amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;cacheSetting&amp;quot; name=&amp;quot;cacheSetting&amp;quot; &amp;lt;%if(cacheSetting) println &amp;quot;checked&amp;quot;%&amp;gt; onchange=&amp;quot;${remoteFunction(&lt;br /&gt;                  controller: 'management',&lt;br /&gt;                  action: 'updateCache_ajax',&lt;br /&gt;                  params: '\'cacheSetting=\' + escape(this.checked)',&lt;br /&gt;                  update: 'general_config')}&amp;quot;/&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and an example controller function could look like this&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt; def updateCache_ajax = {&lt;br /&gt;   assert params.cacheSetting != null, "you need to provide \"cacheSetting\" in the params object"&lt;br /&gt;   BinBaseQualityConnector.getQualityConfigService().setCaching(Boolean.parseBoolean(params.cacheSetting))&lt;br /&gt;&lt;br /&gt;   //define our model&lt;br /&gt;   def model = new HashMap()&lt;br /&gt;&lt;br /&gt;   //build the model&lt;br /&gt;   model.cacheSetting = BinBaseQualityConnector.getQualityConfigService().isCaching()&lt;br /&gt;&lt;br /&gt;   render(template: "general", model: model)&lt;br /&gt; }&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-7098305280042906937?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/7098305280042906937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2009/07/grails-remote-function-on-image.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/7098305280042906937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/7098305280042906937'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2009/07/grails-remote-function-on-image.html' title='grails remote function on image or checkbox'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-4536166632202566305</id><published>2009-07-20T23:55:00.000-07:00</published><updated>2009-07-20T23:57:25.003-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>scala in grails</title><content type='html'>I know it's evil and I know you don't want todo this, but what the heck. This &lt;a href="http://www.grails.org/plugin/scala"&gt;plugin&lt;/a&gt; allows you to compile and use scala code in grails.&lt;br /&gt;&lt;br /&gt;I don't know why I would want to use scala right now in this, but I'm sure I find out a reason or two :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-4536166632202566305?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/4536166632202566305/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2009/07/scala-in-grails.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/4536166632202566305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/4536166632202566305'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2009/07/scala-in-grails.html' title='scala in grails'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry><entry><id>tag:blogger.com,1999:blog-4059581333784029364.post-2910516904149035807</id><published>2009-07-16T16:23:00.000-07:00</published><updated>2009-07-16T17:12:17.595-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='yui'/><category scheme='http://www.blogger.com/atom/ns#' term='java script'/><category scheme='http://www.blogger.com/atom/ns#' term='prototype'/><title type='text'>YUI and Prototype - updating an element</title><content type='html'>Well currently I'm working a lot with YUI and specially tabs. So one of the first things I wanted todo is to select a tab and this selections should do two things&lt;br /&gt;&lt;ul&gt;&lt;li&gt;show the content of the tab, happens by default&lt;/li&gt;&lt;li&gt;update a div on the page somewhere with some content related to the tab content&lt;/li&gt;&lt;/ul&gt;so how do you do this?&lt;br /&gt;&lt;br /&gt;Quite simple.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;    var myTabs = new YAHOO.widget.TabView('demo');&lt;br /&gt;    var tab0 = myTabs.getTab(0);&lt;br /&gt;    &lt;br /&gt;    function handleClick(e,tab) {  &lt;br /&gt;        ${&amp;quot;div_to_update&amp;quot;}.update(&amp;quot;I just clicked on my tab!&amp;quot;);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    tab0.addListener('click', handleClick,tab0);&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and as you can see we use the 'update' function from the prototype library.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4059581333784029364-2910516904149035807?l=codingandmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingandmore.blogspot.com/feeds/2910516904149035807/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingandmore.blogspot.com/2009/07/yui-and-prototype-updating-element.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/2910516904149035807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4059581333784029364/posts/default/2910516904149035807'/><link rel='alternate' type='text/html' href='http://codingandmore.blogspot.com/2009/07/yui-and-prototype-updating-element.html' title='YUI and Prototype - updating an element'/><author><name>Gert Wohlgemuth</name><uri>http://www.blogger.com/profile/02906619451323734545</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></entry></feed>
