<?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-2243677108216203364</id><updated>2012-01-16T03:11:07.540-06:00</updated><category term='script'/><category term='grails'/><category term='magazine'/><category term='tutorials'/><category term='groovy'/><category term='tips'/><category term='threading'/><title type='text'>Groovy / Grails Snippets</title><subtitle type='html'>Less talk , more code...&lt;br&gt;
Example Code in Groovy, Grails and Java.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://groovysnippets.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://groovysnippets.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>George Kowalski</name><uri>http://www.blogger.com/profile/13693193758747123915</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp2.blogger.com/_4REGFn2KfbU/R_0fLY5WWXI/AAAAAAAAADo/8SA06pZELRQ/S220/CharlesBabbage.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>22</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2243677108216203364.post-4959790070351561214</id><published>2011-02-24T13:57:00.001-06:00</published><updated>2011-02-24T13:57:33.826-06:00</updated><title type='text'>Running multithreaded example groovy</title><content type='html'>&lt;pre&gt;&lt;br /&gt;#!/bin/env groovy&lt;br /&gt;&lt;br /&gt;def MAX_THREADS = 24&lt;br /&gt;class MyThread extends Thread { &lt;br /&gt;&lt;br /&gt; private i ; &lt;br /&gt;&lt;br /&gt; public  MyThread( int code ) { &lt;br /&gt;  this.i = code;&lt;br /&gt; }&lt;br /&gt; public void run()  { &lt;br /&gt;  def rand = new java.util.Random()&lt;br /&gt;  sleep(1 + rand.nextInt(2000) ); &lt;br /&gt;  println "HELLO " + i &lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;println " Started " &lt;br /&gt;def Thread[] results = new Thread[MAX_THREADS]&lt;br /&gt;for ( int i = 0 ; i &lt; MAX_THREADS ; i++ ) { &lt;br /&gt; println "Started thread " + i &lt;br /&gt; results[i] = new MyThread(i);&lt;br /&gt; results[i].start()&lt;br /&gt;}&lt;br /&gt;for (int i = 0; i &lt; results.length; i++) {&lt;br /&gt;    try {&lt;br /&gt;       results[i].join();&lt;br /&gt;    } catch (InterruptedException ignore) {}&lt;br /&gt;}&lt;br /&gt;println "Done ... "&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2243677108216203364-4959790070351561214?l=groovysnippets.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovysnippets.blogspot.com/feeds/4959790070351561214/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovysnippets.blogspot.com/2011/02/running-multithreaded-example-groovy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/4959790070351561214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/4959790070351561214'/><link rel='alternate' type='text/html' href='http://groovysnippets.blogspot.com/2011/02/running-multithreaded-example-groovy.html' title='Running multithreaded example groovy'/><author><name>George Kowalski</name><uri>http://www.blogger.com/profile/13693193758747123915</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp2.blogger.com/_4REGFn2KfbU/R_0fLY5WWXI/AAAAAAAAADo/8SA06pZELRQ/S220/CharlesBabbage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2243677108216203364.post-4332110718989078413</id><published>2009-12-31T11:02:00.002-06:00</published><updated>2010-01-21T06:32:58.987-06:00</updated><title type='text'>New Android Site ...</title><content type='html'>I have a new site where I'll be posting further  Android code . .. See: &lt;a href="http://georgekowalski.com"&gt;GeorgeKowalski.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2243677108216203364-4332110718989078413?l=groovysnippets.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovysnippets.blogspot.com/feeds/4332110718989078413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovysnippets.blogspot.com/2009/12/site-moving.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/4332110718989078413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/4332110718989078413'/><link rel='alternate' type='text/html' href='http://groovysnippets.blogspot.com/2009/12/site-moving.html' title='New Android Site ...'/><author><name>George Kowalski</name><uri>http://www.blogger.com/profile/13693193758747123915</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp2.blogger.com/_4REGFn2KfbU/R_0fLY5WWXI/AAAAAAAAADo/8SA06pZELRQ/S220/CharlesBabbage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2243677108216203364.post-8153233638069561941</id><published>2008-12-09T08:33:00.000-06:00</published><updated>2008-12-09T08:34:55.510-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Geocoding with Groovy and Google API</title><content type='html'>Nice article on how to geocode data with Groovy and the Google API : &lt;a href="http://blog.platinumsolutions.com/Geocoding-Made-Easy-With-Groovy-And-Google"&gt;Here..&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2243677108216203364-8153233638069561941?l=groovysnippets.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovysnippets.blogspot.com/feeds/8153233638069561941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovysnippets.blogspot.com/2008/12/geocoding-with-groovy-and-google-api.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/8153233638069561941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/8153233638069561941'/><link rel='alternate' type='text/html' href='http://groovysnippets.blogspot.com/2008/12/geocoding-with-groovy-and-google-api.html' title='Geocoding with Groovy and Google API'/><author><name>George Kowalski</name><uri>http://www.blogger.com/profile/13693193758747123915</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp2.blogger.com/_4REGFn2KfbU/R_0fLY5WWXI/AAAAAAAAADo/8SA06pZELRQ/S220/CharlesBabbage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2243677108216203364.post-8645202696861696600</id><published>2008-12-05T14:41:00.000-06:00</published><updated>2008-12-05T14:56:27.795-06:00</updated><title type='text'>Deploying Grails Application on Oracle Database</title><content type='html'>The following article presents a couple of lessons learned on Deploying a Grails app on Oracle DB  &lt;a href="http://schneide.wordpress.com/2008/10/14/deploying-a-grails-app-on-an-oracle-db/"&gt;Here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2243677108216203364-8645202696861696600?l=groovysnippets.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovysnippets.blogspot.com/feeds/8645202696861696600/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovysnippets.blogspot.com/2008/12/deploying-grails-on-oracle.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/8645202696861696600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/8645202696861696600'/><link rel='alternate' type='text/html' href='http://groovysnippets.blogspot.com/2008/12/deploying-grails-on-oracle.html' title='Deploying Grails Application on Oracle Database'/><author><name>George Kowalski</name><uri>http://www.blogger.com/profile/13693193758747123915</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp2.blogger.com/_4REGFn2KfbU/R_0fLY5WWXI/AAAAAAAAADo/8SA06pZELRQ/S220/CharlesBabbage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2243677108216203364.post-8518988275427412839</id><published>2008-12-04T10:14:00.002-06:00</published><updated>2008-12-04T10:42:32.285-06:00</updated><title type='text'>API for Twitpic</title><content type='html'>Check it out here: &lt;a href="http://twitpic.com/api.do"&gt;http://twitpic.com/api.do&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2243677108216203364-8518988275427412839?l=groovysnippets.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovysnippets.blogspot.com/feeds/8518988275427412839/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovysnippets.blogspot.com/2008/12/api-for-twitpic_04.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/8518988275427412839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/8518988275427412839'/><link rel='alternate' type='text/html' href='http://groovysnippets.blogspot.com/2008/12/api-for-twitpic_04.html' title='API for Twitpic'/><author><name>George Kowalski</name><uri>http://www.blogger.com/profile/13693193758747123915</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp2.blogger.com/_4REGFn2KfbU/R_0fLY5WWXI/AAAAAAAAADo/8SA06pZELRQ/S220/CharlesBabbage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2243677108216203364.post-7438615648326959888</id><published>2008-11-16T20:14:00.000-06:00</published><updated>2008-11-16T20:15:39.389-06:00</updated><title type='text'>quick tutorial on installing grails application on glassfish prelude</title><content type='html'>See suns demo  &lt;a href="https://slx.sun.com/1179271912"&gt;Here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2243677108216203364-7438615648326959888?l=groovysnippets.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovysnippets.blogspot.com/feeds/7438615648326959888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovysnippets.blogspot.com/2008/11/quick-tutorial-on-installing-grails.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/7438615648326959888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/7438615648326959888'/><link rel='alternate' type='text/html' href='http://groovysnippets.blogspot.com/2008/11/quick-tutorial-on-installing-grails.html' title='quick tutorial on installing grails application on glassfish prelude'/><author><name>George Kowalski</name><uri>http://www.blogger.com/profile/13693193758747123915</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp2.blogger.com/_4REGFn2KfbU/R_0fLY5WWXI/AAAAAAAAADo/8SA06pZELRQ/S220/CharlesBabbage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2243677108216203364.post-7738166366611861643</id><published>2008-11-13T12:58:00.000-06:00</published><updated>2008-11-22T14:54:11.526-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='script'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Download images of twitter users from the public timeline</title><content type='html'>I wanted to take the previous program and mod it to download twitter user pictures from the public timeline. I found that a number of them were just the default picture , so I through of generating a Digest ( checksum ) on the images downloaded. You may note that it takes only the first 1285 bytes of the user's picture. That's because that is the size of this default picture as provided by Twitter. "3yLyyOGkvQJNArEKPzvRzA==" is the digest for this image.&lt;br /&gt;&lt;br /&gt;It might be cool to next mod this to &lt;a href="http://cse-mjmcl.cse.bris.ac.uk/blog/2007/07/27/1185530940001.html "&gt;stitch&lt;/a&gt; these pictures together into a wallpaper, especially if it was on ones friends instead of the random public.&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;pre name="code"  class="java"&gt;&lt;br /&gt;&lt;br /&gt;#!groovy&lt;br /&gt;// Program to download images of twitter users from the public timeline&lt;br /&gt;// Does not download the default image if the user has not changed it. &lt;br /&gt;// George Kowalski 2008&lt;br /&gt;//&lt;br /&gt;&lt;br /&gt;import sun.misc.BASE64Encoder;&lt;br /&gt;import java.io.UnsupportedEncodingException;&lt;br /&gt;import java.security.MessageDigest;&lt;br /&gt;import java.security.NoSuchAlgorithmException;&lt;br /&gt;&lt;br /&gt;// Create images dir if one does not exit&lt;br /&gt;def inDir = new File("images").mkdir()&lt;br /&gt;&lt;br /&gt;// program to parse RSS Feed&lt;br /&gt;def rssurl = "http://twitter.com/statuses/public_timeline.xml"&lt;br /&gt;def slurp = new XmlSlurper()&lt;br /&gt;def rssObj = slurp.parse(rssurl)&lt;br /&gt;rssObj.status.eachWithIndex { item , num -&gt;&lt;br /&gt; println "-------------------------------------------"&lt;br /&gt; def name =  item.user.screen_name.toString()&lt;br /&gt; def url = item.user.profile_image_url.toString()&lt;br /&gt; if ( url ) { &lt;br /&gt;  download(num, url, name)&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Download the picture to a file names after the user's screen name&lt;br /&gt;def download(num , address, screenName)&lt;br /&gt;{&lt;br /&gt; def filename =  address.tokenize("/")[-2]&lt;br /&gt; def tmp = address.tokenize("/")[-1] // get the extenstion off the last part&lt;br /&gt; def ext = tmp.tokenize(".")[-1]&lt;br /&gt; filename = screenName &lt;&lt; "." &lt;&lt; ext&lt;br /&gt; println "saving image file : " &lt;&lt; filename&lt;br /&gt; def outfile = new FileOutputStream( "images/" + filename.toString())&lt;br /&gt; def out = new BufferedOutputStream(outfile)&lt;br /&gt; try { &lt;br /&gt;  out &lt;&lt;  new URL(address).openStream()&lt;br /&gt; } catch ( FileNotFoundException e ) { &lt;br /&gt;  println "Error : Could not download image"&lt;br /&gt;  out.close()&lt;br /&gt;  // delete existing file that was started&lt;br /&gt;  new File( "images/" + filename.toString()).delete()&lt;br /&gt;  return&lt;br /&gt; } &lt;br /&gt; out.close()&lt;br /&gt; def infile = new FileInputStream( "images/" + filename.toString())&lt;br /&gt; def input = new BufferedInputStream(infile)&lt;br /&gt; byte[] testBytes= new byte[1285]&lt;br /&gt; input.read(testBytes)&lt;br /&gt; input.close()&lt;br /&gt; def digestResults = getMessageDigest(testBytes)&lt;br /&gt; // println "getMessageDigest " &lt;&lt; digestResults&lt;br /&gt; // remove default twitter image&lt;br /&gt; if ( digestResults == "3yLyyOGkvQJNArEKPzvRzA==" ) { &lt;br /&gt;  println "removing default pic for  " &lt;&lt; screenName&lt;br /&gt;  new File( "images/" + filename.toString()).delete()&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Calculate a digest ( checksum ) for the bytes passed in&lt;br /&gt;static public String getMessageDigest(byte[] bytes) throws UnsupportedEncodingException {&lt;br /&gt;        String result = null&lt;br /&gt;        String algorithm = "MD5";&lt;br /&gt;&lt;br /&gt;        if (bytes != null) {&lt;br /&gt;            MessageDigest md = null;&lt;br /&gt;            try {&lt;br /&gt;                md = MessageDigest.getInstance(algorithm);&lt;br /&gt;            } catch (NoSuchAlgorithmException e) {&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;            md.update(bytes); //set digest source&lt;br /&gt;            byte[] raw = md.digest(); //transformed digest&lt;br /&gt;            result = (new BASE64Encoder()).encode(raw); //string representation of digest&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        return result;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2243677108216203364-7738166366611861643?l=groovysnippets.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovysnippets.blogspot.com/feeds/7738166366611861643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovysnippets.blogspot.com/2008/11/download-images-of-twitter-users-from.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/7738166366611861643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/7738166366611861643'/><link rel='alternate' type='text/html' href='http://groovysnippets.blogspot.com/2008/11/download-images-of-twitter-users-from.html' title='Download images of twitter users from the public timeline'/><author><name>George Kowalski</name><uri>http://www.blogger.com/profile/13693193758747123915</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp2.blogger.com/_4REGFn2KfbU/R_0fLY5WWXI/AAAAAAAAADo/8SA06pZELRQ/S220/CharlesBabbage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2243677108216203364.post-4375422881882148945</id><published>2008-11-10T17:13:00.001-06:00</published><updated>2008-11-11T09:13:27.345-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='script'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>groovy script to parse RSS with namespaces and download images</title><content type='html'>&lt;pre name="code" class="java"&gt;&lt;br /&gt;&lt;br /&gt;#!groovy&lt;br /&gt;// program to parse RSS Feed and download images from digg&lt;br /&gt;def rssurl = "http://feeds.digg.com/digg/news/popular.rss"&lt;br /&gt;def slurp = new XmlSlurper()&lt;br /&gt;def rssObj = slurp.parse(rssurl).declareNamespace(digg: "http://digg.com/docs/diggrss/", media: "http://search.yahoo.com/mrss/")&lt;br /&gt;rssObj.channel.item.eachWithIndex { item , num -&gt;&lt;br /&gt;        println "-------------------------------------------"&lt;br /&gt;        println item.title&lt;br /&gt;        println item."digg:category"&lt;br /&gt;        def url = item."media:thumbnail".@url.text()&lt;br /&gt;        if ( url ) {&lt;br /&gt;                println url&lt;br /&gt;                download(num, url)&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def download(num , address)&lt;br /&gt;{&lt;br /&gt;        def filename =  address.tokenize("/")[-2]&lt;br /&gt;        def tmp = address.tokenize("/")[-1] &lt;br /&gt;        def ext = tmp.tokenize(".")[-1]&lt;br /&gt;        filename = filename &lt;&lt; "." &lt;&lt; ext&lt;br /&gt;        println "saving image file : " &lt;&lt; filename&lt;br /&gt;        def file = new FileOutputStream(filename.toString())&lt;br /&gt;        def out = new BufferedOutputStream(file)&lt;br /&gt;        out &lt;&lt; new URL(address).openStream()&lt;br /&gt;        out.close()&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2243677108216203364-4375422881882148945?l=groovysnippets.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovysnippets.blogspot.com/feeds/4375422881882148945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovysnippets.blogspot.com/2008/11/groovy-script-to-parse-rss-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/4375422881882148945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/4375422881882148945'/><link rel='alternate' type='text/html' href='http://groovysnippets.blogspot.com/2008/11/groovy-script-to-parse-rss-with.html' title='groovy script to parse RSS with namespaces and download images'/><author><name>George Kowalski</name><uri>http://www.blogger.com/profile/13693193758747123915</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp2.blogger.com/_4REGFn2KfbU/R_0fLY5WWXI/AAAAAAAAADo/8SA06pZELRQ/S220/CharlesBabbage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2243677108216203364.post-429750396794282517</id><published>2008-11-10T16:26:00.001-06:00</published><updated>2008-11-10T16:26:59.329-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='script'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Script to parse Rss feed from Digg</title><content type='html'>&lt;pre name="code" class="java"&gt;&lt;br /&gt;#!/usr/bin/env groovy&lt;br /&gt;// program to parse RSS Feed&lt;br /&gt;def rssurl = "http://feeds.digg.com/digg/news/popular.rss"&lt;br /&gt;def rssObj = new XmlSlurper().parse(rssurl)&lt;br /&gt;rssObj.channel.item.eachWithIndex { item , num -&gt;&lt;br /&gt;        println "-------------------------------------------"&lt;br /&gt;        println num.toString() &lt;&lt; " " &lt;&lt; item.description&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2243677108216203364-429750396794282517?l=groovysnippets.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovysnippets.blogspot.com/feeds/429750396794282517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovysnippets.blogspot.com/2008/11/script-to-parse-rss-feed-from-digg.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/429750396794282517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/429750396794282517'/><link rel='alternate' type='text/html' href='http://groovysnippets.blogspot.com/2008/11/script-to-parse-rss-feed-from-digg.html' title='Script to parse Rss feed from Digg'/><author><name>George Kowalski</name><uri>http://www.blogger.com/profile/13693193758747123915</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp2.blogger.com/_4REGFn2KfbU/R_0fLY5WWXI/AAAAAAAAADo/8SA06pZELRQ/S220/CharlesBabbage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2243677108216203364.post-7536053486564740809</id><published>2008-11-07T09:29:00.000-06:00</published><updated>2008-11-07T09:32:54.583-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>groovy screen scraping example</title><content type='html'>&lt;pre name="code" class="java"&gt;&lt;br /&gt;#!/usr/bin/env groovy&lt;br /&gt;// Depends on tagsoup library:&lt;br /&gt;//      http://ccil.org/~cowan/XML/tagsoup/&lt;br /&gt;&lt;br /&gt;def slurper = new XmlSlurper(new org.ccil.cowan.tagsoup.Parser())&lt;br /&gt;&lt;br /&gt;def url = new URL("http://fcd.mcw.edu/?module=faculty&amp;func=view&amp;id=1674")&lt;br /&gt;&lt;br /&gt;url.withReader { reader -&gt;&lt;br /&gt;&lt;br /&gt;        html = slurper.parse(reader)&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;        //we should now have a parsed file&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;        def value = html.body.div.div.div[2].ul.li&lt;br /&gt;&lt;br /&gt;        value.list().each { f -&gt;&lt;br /&gt;&lt;br /&gt;                println "\nPub : " &lt;&lt; f.toString()[0..80] &lt;&lt; "..."&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;[gkowalski]$ ./screenScrape.groovy&lt;br /&gt;Pub : Role of cannabinoids and endocannabinoids in cerebral ischemia. (Hillard CJ)  Cur...&lt;br /&gt;Pub : Regional alterations in the endocannabinoid system in an animal model of depressi...&lt;br /&gt;Pub : Mediation of Cannabidiol Anti-inflammation in the Retina by Equilibrative Nucleos...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2243677108216203364-7536053486564740809?l=groovysnippets.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovysnippets.blogspot.com/feeds/7536053486564740809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovysnippets.blogspot.com/2008/11/groovy-screen-scraping-example.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/7536053486564740809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/7536053486564740809'/><link rel='alternate' type='text/html' href='http://groovysnippets.blogspot.com/2008/11/groovy-screen-scraping-example.html' title='groovy screen scraping example'/><author><name>George Kowalski</name><uri>http://www.blogger.com/profile/13693193758747123915</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp2.blogger.com/_4REGFn2KfbU/R_0fLY5WWXI/AAAAAAAAADo/8SA06pZELRQ/S220/CharlesBabbage.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2243677108216203364.post-8543072064536458421</id><published>2008-11-03T11:29:00.000-06:00</published><updated>2008-11-03T11:31:57.971-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='magazine'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Groovy Magazine started</title><content type='html'>Picked up the first issues of Groovy Magazine &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.groovymag.com"&gt;http://www.groovymag.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'll do a full review later , but it does look promising.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2243677108216203364-8543072064536458421?l=groovysnippets.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovysnippets.blogspot.com/feeds/8543072064536458421/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovysnippets.blogspot.com/2008/11/groovy-magazine-started.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/8543072064536458421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/8543072064536458421'/><link rel='alternate' type='text/html' href='http://groovysnippets.blogspot.com/2008/11/groovy-magazine-started.html' title='Groovy Magazine started'/><author><name>George Kowalski</name><uri>http://www.blogger.com/profile/13693193758747123915</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp2.blogger.com/_4REGFn2KfbU/R_0fLY5WWXI/AAAAAAAAADo/8SA06pZELRQ/S220/CharlesBabbage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2243677108216203364.post-8847275840496486532</id><published>2008-10-29T12:00:00.000-05:00</published><updated>2008-10-29T12:37:55.394-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>Grails: How to query a database with SQL outside GORM and return an HTML SELECT</title><content type='html'>Here is an example of how to perform a query outside GORM and pass it to a view for display in a drop down select ...&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;&lt;br /&gt;import groovy.sql.Sql&lt;br /&gt;&lt;br /&gt;class DbTableListController {&lt;br /&gt;&lt;br /&gt;  // The datasource for this grails app is injected&lt;br /&gt;  // automatically by it's name &lt;br /&gt;&lt;br /&gt;  def dataSource&lt;br /&gt;&lt;br /&gt;  def create = {&lt;br /&gt;        groovy.sql.Sql sql = new groovy.sql.Sql(dataSource)&lt;br /&gt;&lt;br /&gt;        def tableNames = []&lt;br /&gt;        sql.eachRow("""&lt;br /&gt;                SELECT&lt;br /&gt;                    unique ( table_name ) &lt;br /&gt;                FROM&lt;br /&gt;                    ALL_TAB_COLUMNS&lt;br /&gt;                WHERE&lt;br /&gt;                    OWNER = 'CRDEV'&lt;br /&gt;          """, { row -&gt;&lt;br /&gt;            println "Found " &lt;&lt; row.table_name&lt;br /&gt;            tableNames &lt;&lt; row.table_name&lt;br /&gt;        }&lt;br /&gt;                )&lt;br /&gt;&lt;br /&gt;        def dbTableList = new DbTableList()&lt;br /&gt;        dbTableList.properties = params&lt;br /&gt;        return ['dbTableList':dbTableList, 'tableNames' : tableNames]&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // Other Methods deleted ...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Then it's displayed in the create.gsp for this controller with this code:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &amp;lt g:select id="tableName" name="tableName" from="${tableNames}"  /&amp;gt&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2243677108216203364-8847275840496486532?l=groovysnippets.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovysnippets.blogspot.com/feeds/8847275840496486532/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovysnippets.blogspot.com/2008/10/here-is-example-of-how-to-perform-query.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/8847275840496486532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/8847275840496486532'/><link rel='alternate' type='text/html' href='http://groovysnippets.blogspot.com/2008/10/here-is-example-of-how-to-perform-query.html' title='Grails: How to query a database with SQL outside GORM and return an HTML SELECT'/><author><name>George Kowalski</name><uri>http://www.blogger.com/profile/13693193758747123915</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp2.blogger.com/_4REGFn2KfbU/R_0fLY5WWXI/AAAAAAAAADo/8SA06pZELRQ/S220/CharlesBabbage.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2243677108216203364.post-4773562689095665301</id><published>2008-10-15T09:26:00.000-05:00</published><updated>2008-11-07T09:32:09.229-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>Grails Script DB Connection parameter storing</title><content type='html'>Storing Userids / passwords for multiple connections securely in one central file in one's home directory. &lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;&lt;br /&gt;// Load DB settings&lt;br /&gt;&lt;br /&gt;def env = System.getenv()&lt;br /&gt;&lt;br /&gt;String propfile = "${env['HOME']}/.dbconfig.properties"&lt;br /&gt;&lt;br /&gt;def config = new ConfigSlurper().parse(new File(propfile).toURL())&lt;br /&gt;&lt;br /&gt;println "Running with DB User ID : " &lt;&lt; config.db.snp.dev.userid&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def db&lt;br /&gt;&lt;br /&gt;if ( Config.DBTOUPDATE == 'prod' ) {&lt;br /&gt;&lt;br /&gt;        db = Sql.newInstance(config.db.snp.prod.jdbcURL, config.db.snp.prod.userid, config.db.snp.prod.password, config.db&lt;br /&gt;&lt;br /&gt;        dbgcrd = Sql.newInstance(config.db.gcrd.dev.jdbcURL, config.db.gcrd.dev.userid, config.db.gcrd.dev.password, confi&lt;br /&gt;&lt;br /&gt;} else {&lt;br /&gt;&lt;br /&gt;        db = Sql.newInstance(config.db.snp.dev.jdbcURL, config.db.snp.dev.userid, config.db.snp.dev.password, config.db.sn&lt;br /&gt;&lt;br /&gt;        dbgcrd = Sql.newInstance(config.db.gcrd.dev.jdbcURL, config.db.gcrd.dev.userid, config.db.gcrd.dev.password, confi&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The format of the config params is : &lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;[gkowalski@scott:~/projects/snpDatabaseImport]$ ls -l ~/.dbconfig.properties&lt;br /&gt;&lt;br /&gt;-rwx------+ 1 gkowalski gkowalski 682 Sep 18 12:13 .dbconfig.properties&lt;br /&gt;&lt;br /&gt;[gkowalski]$ cat ~/.dbconfig.properties&lt;br /&gt;&lt;br /&gt;// Development Database settings&lt;br /&gt;&lt;br /&gt;db.snp.dev.userid="devUserid"&lt;br /&gt;&lt;br /&gt;db.snp.dev.password="xxxx"&lt;br /&gt;&lt;br /&gt;db.snp.dev.jdbcURL="jdbc:oracle:thin:@server.mcw.edu:1521:SID"&lt;br /&gt;&lt;br /&gt;db.snp.dev.jdbcDriver="oracle.jdbc.driver.OracleDriver"&lt;br /&gt;&lt;br /&gt;// Production Database settings&lt;br /&gt;&lt;br /&gt;db.snp.prod.userid="prodUserId"&lt;br /&gt;&lt;br /&gt;db.snp.prod.password="xxxxxx"&lt;br /&gt;&lt;br /&gt;db.snp.prod.jdbcURL="jdbc:oracle:thin:@server.com:1521:SID1"&lt;br /&gt;&lt;br /&gt;db.snp.prod.jdbcDriver="oracle.jdbc.driver.OracleDriver"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;This keeps one from checking in DB passwords into SVN… Also keeps them all in one central spot for updating.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2243677108216203364-4773562689095665301?l=groovysnippets.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovysnippets.blogspot.com/feeds/4773562689095665301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovysnippets.blogspot.com/2008/10/grails-script-db-connection-parameter.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/4773562689095665301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/4773562689095665301'/><link rel='alternate' type='text/html' href='http://groovysnippets.blogspot.com/2008/10/grails-script-db-connection-parameter.html' title='Grails Script DB Connection parameter storing'/><author><name>George Kowalski</name><uri>http://www.blogger.com/profile/13693193758747123915</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp2.blogger.com/_4REGFn2KfbU/R_0fLY5WWXI/AAAAAAAAADo/8SA06pZELRQ/S220/CharlesBabbage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2243677108216203364.post-6206674962549562101</id><published>2008-08-22T10:21:00.000-05:00</published><updated>2008-08-22T10:32:42.897-05:00</updated><title type='text'>Oracle DB ORA-01722: invalid number error</title><content type='html'>I was getting a ORA-01722: invalid number error with the following code: &lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;BigDecimal sequence = 1000595201&lt;br /&gt;db.execute "alter sequence snp_calls_seq increment by ${sequence}"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Instead use : &lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;BigDecimal sequence = 1000595201&lt;br /&gt;String str = "alter sequence snp_calls_seq increment by ${sequence}"&lt;br /&gt;db.execute str&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Why ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2243677108216203364-6206674962549562101?l=groovysnippets.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovysnippets.blogspot.com/feeds/6206674962549562101/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovysnippets.blogspot.com/2008/08/oracle-db-ora-01722-invalid-number.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/6206674962549562101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/6206674962549562101'/><link rel='alternate' type='text/html' href='http://groovysnippets.blogspot.com/2008/08/oracle-db-ora-01722-invalid-number.html' title='Oracle DB ORA-01722: invalid number error'/><author><name>George Kowalski</name><uri>http://www.blogger.com/profile/13693193758747123915</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp2.blogger.com/_4REGFn2KfbU/R_0fLY5WWXI/AAAAAAAAADo/8SA06pZELRQ/S220/CharlesBabbage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2243677108216203364.post-2722231427053058721</id><published>2008-07-09T14:05:00.000-05:00</published><updated>2008-07-09T14:07:35.928-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>StringBuffer in groovy</title><content type='html'>Remember that when one is using a StringBuffer , one needs to close() it or your program will exit with a half written file. I use this more often than not when writing large files for performance reasons.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2243677108216203364-2722231427053058721?l=groovysnippets.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovysnippets.blogspot.com/feeds/2722231427053058721/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovysnippets.blogspot.com/2008/07/stringbuffer-in-groovy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/2722231427053058721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/2722231427053058721'/><link rel='alternate' type='text/html' href='http://groovysnippets.blogspot.com/2008/07/stringbuffer-in-groovy.html' title='StringBuffer in groovy'/><author><name>George Kowalski</name><uri>http://www.blogger.com/profile/13693193758747123915</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp2.blogger.com/_4REGFn2KfbU/R_0fLY5WWXI/AAAAAAAAADo/8SA06pZELRQ/S220/CharlesBabbage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2243677108216203364.post-4139505951462783850</id><published>2008-07-09T13:57:00.000-05:00</published><updated>2008-07-09T14:05:35.525-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Groovy Script to rename all TXT files in a directory</title><content type='html'>&lt;pre name="code" class="java"&gt;&lt;br /&gt;&lt;br /&gt;#!/usr/bin/env groovy&lt;br /&gt;// Script to rename files that end in .txt replacing the XX to YY in the name&lt;br /&gt;&lt;br /&gt;dirName = "/tmp"&lt;br /&gt;new File(dirName).eachFile() { file -&gt;&lt;br /&gt;    if ( file.getName() =~ /.txt/ ) {&lt;br /&gt;            def newName = (file.getName()).replaceFirst("XX", "YY")&lt;br /&gt;            File f = new File(dirName + "/" + newName)&lt;br /&gt;            file.renameTo(f)&lt;br /&gt;            println file.getName() + " -&gt; " + f.getName()&lt;br /&gt;    } else {&lt;br /&gt;            print "Skipping file " &lt;&lt; file.getName() &lt;&lt; "\n"&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2243677108216203364-4139505951462783850?l=groovysnippets.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovysnippets.blogspot.com/feeds/4139505951462783850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovysnippets.blogspot.com/2008/07/groovy-script-to-rename-all-txt-files.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/4139505951462783850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/4139505951462783850'/><link rel='alternate' type='text/html' href='http://groovysnippets.blogspot.com/2008/07/groovy-script-to-rename-all-txt-files.html' title='Groovy Script to rename all TXT files in a directory'/><author><name>George Kowalski</name><uri>http://www.blogger.com/profile/13693193758747123915</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp2.blogger.com/_4REGFn2KfbU/R_0fLY5WWXI/AAAAAAAAADo/8SA06pZELRQ/S220/CharlesBabbage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2243677108216203364.post-3087702790664264172</id><published>2008-06-10T14:59:00.000-05:00</published><updated>2008-06-10T15:25:19.628-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Sparklines</title><content type='html'>From: http://www.testearly.com/2008/05/22/groovy-sparklines/ &lt;A HREF="http://www.edwardtufte.com/bboard/q-and-a-fetch-msg?msg_id=0001OR&amp;topic_id=1"&gt;Original Article&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;&lt;br /&gt;package com.stelligent.gsparkyimport org.jfree.chart.JFreeChart&lt;br /&gt;import org.jfree.chart.axis.NumberAxis&lt;br /&gt;import org.jfree.chart.plot.XYPlot&lt;br /&gt;import org.jfree.chart.renderer.xy.StandardXYItemRenderer&lt;br /&gt;import org.jfree.data.general.Dataset&lt;br /&gt;import org.jfree.data.xy.XYSeries&lt;br /&gt;import org.jfree.data.xy.XYSeriesCollection&lt;br /&gt;import org.jfree.chart.ChartUtilities&lt;br /&gt;&lt;br /&gt;class GSparky {&lt;br /&gt;&lt;br /&gt;    def DEFAULT_HEIGHT = 30&lt;br /&gt;    def DEFAULT_WIDTH  = 150&lt;br /&gt;&lt;br /&gt;    boolean build( def data, def imgPath, def height = DEFAULT_HEIGHT, def width = DEFAULT_WIDTH ) {&lt;br /&gt;&lt;br /&gt;        def chart = buildChartFromData(data)&lt;br /&gt;        return buildImageFromChart( chart: chart, height: height, width: width, path: imgPath)&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private JFreeChart buildChartFromData( data ) {&lt;br /&gt;&lt;br /&gt;        def dataset = generateDataset(data)&lt;br /&gt;&lt;br /&gt;        def plot = new XYPlot()&lt;br /&gt;        plot.dataset = dataset&lt;br /&gt;&lt;br /&gt;        plot.domainAxis =  minimalAxis()&lt;br /&gt;        plot.rangeAxis = minimalAxis()&lt;br /&gt;&lt;br /&gt;        plot.domainGridlinesVisible = false&lt;br /&gt;        plot.domainCrosshairVisible = false&lt;br /&gt;        plot.rangeGridlinesVisible = false&lt;br /&gt;        plot.rangeCrosshairVisible = false&lt;br /&gt;        plot.outlinePaint = null&lt;br /&gt;        plot.renderer = new StandardXYItemRenderer(StandardXYItemRenderer.LINES)&lt;br /&gt;        plot.insets = new RectangleInsets(-1, -1, 0, 0)&lt;br /&gt;&lt;br /&gt;        def chart = new JFreeChart(null, JFreeChart.DEFAULT_TITLE_FONT, plot, false)&lt;br /&gt;        chart.borderVisible = false&lt;br /&gt;&lt;br /&gt;        return chart&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private boolean buildImageFromChart( args ) {&lt;br /&gt;&lt;br /&gt;        ChartUtilities.saveChartAsPNG( new File(args.path), args.chart, args.width, args.height )&lt;br /&gt;&lt;br /&gt;        return true&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private Object minimalAxis() {&lt;br /&gt;&lt;br /&gt;      def a = new NumberAxis()&lt;br /&gt;      a.tickLabelsVisible = false&lt;br /&gt;      a.tickMarksVisible = false&lt;br /&gt;      a.axisLineVisible = false&lt;br /&gt;      a.negativeArrowVisible = false&lt;br /&gt;      a.positiveArrowVisible = false&lt;br /&gt;      a.visible = false;&lt;br /&gt;&lt;br /&gt;      return a&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private Dataset generateDataset(def data) {&lt;br /&gt;&lt;br /&gt;        def series = new XYSeries("Sparkline")&lt;br /&gt;&lt;br /&gt;        def i = 0&lt;br /&gt;        data.each { y -&gt; series.add(i++, y)  }&lt;br /&gt;&lt;br /&gt;        def dataset = new XYSeriesCollection()&lt;br /&gt;        dataset.addSeries(series)&lt;br /&gt;&lt;br /&gt;        return dataset&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Testing program: &lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.stelligent.gsparky&lt;br /&gt;&lt;br /&gt;class GSparklineTest extends GroovyTestCase {&lt;br /&gt;&lt;br /&gt;    public void testBuildSparklineImage() {&lt;br /&gt;&lt;br /&gt;        def gs = new GSparky()&lt;br /&gt;&lt;br /&gt;        def data = [20]&lt;br /&gt;&lt;br /&gt;        def r = new Random( new Date().getTime() )&lt;br /&gt;&lt;br /&gt;        (0..99).each { x -&gt;&lt;br /&gt;           def y = data.get(x) + (x/2 - r.nextInt(x + 1))&lt;br /&gt;           data &lt;&lt; y&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        assert gs.build( data, "out/GSparklineTest_test1.png")&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Requires: http://www.jfree.org/jfreechart/ and&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2243677108216203364-3087702790664264172?l=groovysnippets.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovysnippets.blogspot.com/feeds/3087702790664264172/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovysnippets.blogspot.com/2008/06/sparklines.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/3087702790664264172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/3087702790664264172'/><link rel='alternate' type='text/html' href='http://groovysnippets.blogspot.com/2008/06/sparklines.html' title='Sparklines'/><author><name>George Kowalski</name><uri>http://www.blogger.com/profile/13693193758747123915</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp2.blogger.com/_4REGFn2KfbU/R_0fLY5WWXI/AAAAAAAAADo/8SA06pZELRQ/S220/CharlesBabbage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2243677108216203364.post-6897890662587756701</id><published>2008-04-18T14:47:00.000-05:00</published><updated>2008-04-18T14:49:06.375-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tutorials'/><title type='text'>Jasper Reports from Grails</title><content type='html'>See this Tutorial  &lt;a href="http://grails.codehaus.org/Jasper+Plugin"&gt;http://grails.codehaus.org/Jasper+Plugin&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2243677108216203364-6897890662587756701?l=groovysnippets.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovysnippets.blogspot.com/feeds/6897890662587756701/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovysnippets.blogspot.com/2008/04/jasper-reports-from-grails.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/6897890662587756701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/6897890662587756701'/><link rel='alternate' type='text/html' href='http://groovysnippets.blogspot.com/2008/04/jasper-reports-from-grails.html' title='Jasper Reports from Grails'/><author><name>George Kowalski</name><uri>http://www.blogger.com/profile/13693193758747123915</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp2.blogger.com/_4REGFn2KfbU/R_0fLY5WWXI/AAAAAAAAADo/8SA06pZELRQ/S220/CharlesBabbage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2243677108216203364.post-5106848627277355776</id><published>2008-04-10T08:41:00.001-05:00</published><updated>2008-04-14T10:08:58.201-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Executing External Processes From Groovy - Improved</title><content type='html'>I've started using an exec method as shown below to run sub processes from groovy. If you run the standard exec like: &lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;&lt;br /&gt;   def torun = "ls -l "&lt;br /&gt;   proc = torun.execute()&lt;br /&gt;   proc.waitFor()&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This will hang on UNIX systems if these programs generate more STDOUT data than the buffer can handle. Better to handle this yourself with the following: &lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;&lt;br /&gt;#!/usr/bin/env groovy&lt;br /&gt;&lt;br /&gt;void execute(def command )  {&lt;br /&gt;&lt;br /&gt; println "Running command : " + command&lt;br /&gt;        ProcessBuilder  pb = new ProcessBuilder("/bin/sh", "-c", command) &lt;br /&gt;        pb.redirectErrorStream(true)&lt;br /&gt;        def process = pb.start()&lt;br /&gt;        def output = process.inputStream&lt;br /&gt;        output.each() { // Throw away stdout in this example, could return it at the end. &lt;br /&gt;        }&lt;br /&gt;        process.waitFor()&lt;br /&gt;        println "Done executing command , return value : " + process.exitValue()&lt;br /&gt;        process.destroy()&lt;br /&gt;        process = null&lt;br /&gt;        pb = null&lt;br /&gt;        System.gc()&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;execute("ls -l /usr/bin ")&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;NOTE From: http://jira.codehaus.org/browse/GROOVY-2620&lt;br /&gt;&lt;br /&gt;A Better solution is : &lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;&lt;br /&gt;StringWriter stringWriterOutput = new StringWriter()&lt;br /&gt;StringWriter stringWriterError = new StringWriter()&lt;br /&gt;Process proc = command.execute()&lt;br /&gt;stringWriterOutput &lt;&lt; proc.in&lt;br /&gt;stringWriterError &lt;&lt; proc.err&lt;br /&gt;proc.waitFor()&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2243677108216203364-5106848627277355776?l=groovysnippets.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovysnippets.blogspot.com/feeds/5106848627277355776/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovysnippets.blogspot.com/2008/04/executing-external-processes-from.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/5106848627277355776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/5106848627277355776'/><link rel='alternate' type='text/html' href='http://groovysnippets.blogspot.com/2008/04/executing-external-processes-from.html' title='Executing External Processes From Groovy - Improved'/><author><name>George Kowalski</name><uri>http://www.blogger.com/profile/13693193758747123915</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp2.blogger.com/_4REGFn2KfbU/R_0fLY5WWXI/AAAAAAAAADo/8SA06pZELRQ/S220/CharlesBabbage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2243677108216203364.post-6459586979913923155</id><published>2008-04-09T14:47:00.000-05:00</published><updated>2008-04-10T08:50:16.739-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><category scheme='http://www.blogger.com/atom/ns#' term='threading'/><title type='text'>Multithreaded simple URL Crawler</title><content type='html'>Here is a quick program to create X threads that crawl a given URL given a set of results for a database. &lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;#!/usr/bin/env groovy&lt;br /&gt;import groovy.sql.Sql&lt;br /&gt;// &lt;br /&gt;// MultiThreaded query script. &lt;br /&gt;// Runs a query and then submits all the jobs as threads using the Executor.newFixedThreadPool&lt;br /&gt;//  &lt;br /&gt;// 3/2008 by George kowalski&lt;br /&gt;// &lt;br /&gt;&lt;br /&gt;// How may Threads to allow to run at one time. &lt;br /&gt;def MAX_THREADS = 10&lt;br /&gt;&lt;br /&gt;println "Processing started .. Quering Database for RGDIds ... "&lt;br /&gt;&lt;br /&gt;def sql = Sql.newInstance("jdbc:oracle:thin:@site.edu:1521:SCHEMA", "USERID", "passwd", "oracle.jdbc.driver.OracleDriver");&lt;br /&gt;def service = java.util.concurrent.Executors.newFixedThreadPool(MAX_THREADS)&lt;br /&gt;&lt;br /&gt;def rgdIDList  = []&lt;br /&gt;&lt;br /&gt;sql.eachRow("select * from genes, rgd_ids where genes.rgd_id = rgd_ids.rgd_id and rgd_ids.object_status = 'ACTIVE' and rgd_ids.species_type_key = 3", { rgdIDList &lt;&lt; it.rgd_id })&lt;br /&gt;&lt;br /&gt;println "Done with Query we will be processing ${rgdIDList.size} ids "&lt;br /&gt;&lt;br /&gt;// Class that is run. &lt;br /&gt;class toRun implements  Runnable {&lt;br /&gt;            String id&lt;br /&gt;            toRun(String newid) {&lt;br /&gt;                        this.id = newid&lt;br /&gt;            }&lt;br /&gt;            public void run() {&lt;br /&gt;                        println "Calling URL with id: ${id}"&lt;br /&gt;   def contents = new URL("http://rgddev.mcw.edu/tools/genes/genes_view.cgi?id=${id}").getText()&lt;br /&gt;                        println "Return from: ${id}"&lt;br /&gt;            }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;for (id in rgdIDList) {&lt;br /&gt;    println "Submitting Thread for id: ${id}"&lt;br /&gt;    service.execute( new toRun(id.toString()) )&lt;br /&gt;    // This is just to slow down display on console, not needed.&lt;br /&gt;    Thread.sleep(500)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2243677108216203364-6459586979913923155?l=groovysnippets.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovysnippets.blogspot.com/feeds/6459586979913923155/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovysnippets.blogspot.com/2008/04/multithreaded-simple-url-crawler.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/6459586979913923155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/6459586979913923155'/><link rel='alternate' type='text/html' href='http://groovysnippets.blogspot.com/2008/04/multithreaded-simple-url-crawler.html' title='Multithreaded simple URL Crawler'/><author><name>George Kowalski</name><uri>http://www.blogger.com/profile/13693193758747123915</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp2.blogger.com/_4REGFn2KfbU/R_0fLY5WWXI/AAAAAAAAADo/8SA06pZELRQ/S220/CharlesBabbage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2243677108216203364.post-6517461068446551216</id><published>2008-04-08T10:37:00.000-05:00</published><updated>2008-04-08T11:59:21.155-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Running Oracle SQL / Call URL</title><content type='html'>The following program was whipped together to pre-cache pages on our server by hitting them with an HTTP request based on a query.&lt;br /&gt;&lt;br /&gt;Running a SQL query and calling that URL like Curl to precache results&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;#!/usr/bin/env groovy&lt;br /&gt;//&lt;br /&gt;// Groovy Script to call each gene page in turn&lt;br /&gt;// Requirements : Drop the Oracle jdbc14.jar driver in your $HOME/.groovy/lib directory then run this script&lt;br /&gt;//&lt;br /&gt;import groovy.sql.Sql&lt;br /&gt;&lt;br /&gt;println "Started"&lt;br /&gt;sql = Sql.newInstance("jdbc:oracle:thin:@server.com:1521:SID", "USERID", "password", "oracle.jdbc.driver.OracleDriver");&lt;br /&gt;&lt;br /&gt;sql.eachRow("select * from genes, rgd_ids where genes.rgd_id = rgd_ids.rgd_id and rgd_ids.object_status = 'ACTIVE' and rgd_ids.species_type_key = 3", {&lt;br /&gt;      println "Calling:   http://rgd.mcw.edu/tools/genes/genes_view.cgi?id=${it.rgd_id}"&lt;br /&gt;      // creates a new URL obect and downloads that HTML into the contents variable&lt;br /&gt;      def contents = new URL("http://rgd.mcw.edu/tools/genes/genes_view.cgi?id=${it.rgd_id}").getText()&lt;br /&gt;      // Uncomment next line to print contents of page&lt;br /&gt;      // println contents&lt;br /&gt;  }&lt;br /&gt;)&lt;br /&gt;println "Done"&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2243677108216203364-6517461068446551216?l=groovysnippets.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovysnippets.blogspot.com/feeds/6517461068446551216/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovysnippets.blogspot.com/2008/04/running-sql-query-and-calling-that-url.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/6517461068446551216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/6517461068446551216'/><link rel='alternate' type='text/html' href='http://groovysnippets.blogspot.com/2008/04/running-sql-query-and-calling-that-url.html' title='Running Oracle SQL / Call URL'/><author><name>George Kowalski</name><uri>http://www.blogger.com/profile/13693193758747123915</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp2.blogger.com/_4REGFn2KfbU/R_0fLY5WWXI/AAAAAAAAADo/8SA06pZELRQ/S220/CharlesBabbage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2243677108216203364.post-4695086256091413227</id><published>2008-04-08T09:20:00.000-05:00</published><updated>2008-04-08T09:24:27.447-05:00</updated><title type='text'>New Groovy Code Site</title><content type='html'>I intend to post the various pieces of groovy / grails code I am working on . Please feel to use this code and / or comment on this code.&lt;br /&gt;&lt;br /&gt;- George K.&lt;br /&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2243677108216203364-4695086256091413227?l=groovysnippets.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovysnippets.blogspot.com/feeds/4695086256091413227/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovysnippets.blogspot.com/2008/04/new-groovy-code-site.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/4695086256091413227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2243677108216203364/posts/default/4695086256091413227'/><link rel='alternate' type='text/html' href='http://groovysnippets.blogspot.com/2008/04/new-groovy-code-site.html' title='New Groovy Code Site'/><author><name>George Kowalski</name><uri>http://www.blogger.com/profile/13693193758747123915</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp2.blogger.com/_4REGFn2KfbU/R_0fLY5WWXI/AAAAAAAAADo/8SA06pZELRQ/S220/CharlesBabbage.jpg'/></author><thr:total>0</thr:total></entry></feed>
