<?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-15692829</id><updated>2012-02-02T15:35:15.175+08:00</updated><category term='scala'/><category term='extjs javascript pattern gui'/><category term='java'/><category term='iphone sdk'/><category term='uiimageview'/><category term='shit'/><category term='grails ext ajax'/><category term='gwt'/><category term='cocoa touch'/><category term='macruby'/><category term='brew'/><category term='nerd'/><category term='andengine'/><category term='gae'/><category term='cocoa'/><category term='objective-c'/><category term='grails'/><category term='review books agile'/><category term='android'/><category term='xcode'/><category term='grails lucene java'/><category term='groovy java'/><category term='groovy'/><category term='rails'/><category term='mosc2011'/><category term='uicolor'/><category term='iOS'/><category term='ubuntu'/><category term='csv'/><category term='gaelyk'/><title type='text'>Sh*tmores</title><subtitle type='html'>Muse about software engineering and life on the Internet</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default?start-index=101&amp;max-results=100'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>136</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-15692829.post-8367406449209139658</id><published>2012-01-11T09:30:00.000+08:00</published><updated>2012-01-11T09:30:06.435+08:00</updated><title type='text'>Looking for Java/Groovy/Ruby/Python hacker</title><content type='html'>Hi, we are looking for a guy (or girl) who can hack Java/Groovy/Ruby/Python -- a generalist.&lt;br /&gt;&lt;br /&gt;You must love to learn &amp;amp; and work on new stuff -- pick up advance Javascript, Android development, work on iOS projects, solve big data problems with mongodb, HTML5/CSS3 etc.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You will have fun, glory, and opportunities to get your hand dirty on the latest techs. &lt;br /&gt;&lt;br /&gt;We are based in Singapore and expect you to be here. We will pay you good, and hope you will grow with us.&lt;br /&gt;&lt;br /&gt;Interested? PM me on my Twitter &lt;a href="https://twitter.com/#%21/seymores"&gt;@seymores&lt;/a&gt; or &lt;a href="http://www.linkedin.com/profile/view?id=29079416"&gt;Linkedin&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-8367406449209139658?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/8367406449209139658/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=8367406449209139658' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/8367406449209139658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/8367406449209139658'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2012/01/looking-for-javagroovyrubypython-hacker.html' title='Looking for Java/Groovy/Ruby/Python hacker'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-5930231805908740344</id><published>2011-09-23T15:02:00.004+08:00</published><updated>2011-09-23T15:02:42.959+08:00</updated><title type='text'>DLog</title><content type='html'>&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: small;"&gt;#define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);&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/15692829-5930231805908740344?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/5930231805908740344/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=5930231805908740344' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/5930231805908740344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/5930231805908740344'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2011/09/dlog.html' title='DLog'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-8494093444616850908</id><published>2011-09-20T21:57:00.001+08:00</published><updated>2011-09-20T21:57:39.797+08:00</updated><title type='text'>Simple Scala IRC Client</title><content type='html'>Direct and simple port of a typical Java IRC client to Scala. Notice the break. Consider this iteration 1 to learn Scala. :-)&lt;br /&gt;&lt;script src="https://gist.github.com/1229114.js?file=IrcClient.scala"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-8494093444616850908?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/8494093444616850908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=8494093444616850908' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/8494093444616850908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/8494093444616850908'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2011/09/simple-scala-irc-client.html' title='Simple Scala IRC Client'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-3088582502260191732</id><published>2011-09-05T00:06:00.000+08:00</published><updated>2011-09-05T00:06:14.852+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='brew'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>Homebrew install formula for Scala 2.9.1 final</title><content type='html'>Save this homebrew formula to /usr/local/Library/Formula/scala2.9.1.rb. Then 'brew install scala2.9.1' from command line.&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1193071.js?file=scala-2.9.1.final"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-3088582502260191732?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/3088582502260191732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=3088582502260191732' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/3088582502260191732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/3088582502260191732'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2011/09/homebrew-install-formula-for-scala-291.html' title='Homebrew install formula for Scala 2.9.1 final'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-8707286516760738535</id><published>2011-08-04T15:33:00.000+08:00</published><updated>2011-08-04T15:33:06.608+08:00</updated><title type='text'>UI Engineer (SG)</title><content type='html'>&lt;b&gt;UI Engineer (Base in Singapore)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;We are a successful web and mobile development consultancy seeking to bring on a UI engineer to assist with front-end web development. Our work environment is both fast-paced and fun.&lt;br /&gt;&lt;br /&gt;An ideal candidate should have these capabilities:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ability to communicate effectively in English. Mandarin is helpful but not mandatory.&lt;/li&gt;&lt;li&gt;Very solid HTML and CSS skills. You must live and breathe it.&lt;/li&gt;&lt;li&gt;JavaScript - understand concepts like scoping and declaration hoisting&lt;/li&gt;&lt;li&gt;Understand the differences between browser implementations of HTML, CSS, and JS&lt;/li&gt;&lt;li&gt;Reasonably adept with Photoshop &lt;/li&gt;&lt;/ul&gt;To be clear, this is not a web design position. It involves client-side development and implementation of designs.&lt;br /&gt;&lt;br /&gt;This is a full-time position based in Singapore (S088853). &lt;br /&gt;&lt;br /&gt;To apply, please email a resume/CV to hr017@favoritemedium.com and use 'SG UI Engineer [2011Q3]' as the email subject. Include links to Twitter and/or Github accounts, if applicable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-8707286516760738535?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/8707286516760738535/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=8707286516760738535' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/8707286516760738535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/8707286516760738535'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2011/08/ui-engineer-sg.html' title='UI Engineer (SG)'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-264886584452037734</id><published>2011-07-09T23:50:00.002+08:00</published><updated>2011-07-09T23:50:28.273+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gaelyk'/><category scheme='http://www.blogger.com/atom/ns#' term='mosc2011'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><category scheme='http://www.blogger.com/atom/ns#' term='gae'/><title type='text'>MOSC2011: Programming Google App Engine with Gaelyk</title><content type='html'>&lt;div style="width:425px" id="__ss_8552292"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/seymores/google-app-engine-with-gaelyk" title="Google App Engine with Gaelyk"&gt;Google App Engine with Gaelyk&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse8552292" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mosc11-gaelyk-110709104021-phpapp01&amp;stripped_title=google-app-engine-with-gaelyk&amp;userName=seymores" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse8552292" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mosc11-gaelyk-110709104021-phpapp01&amp;stripped_title=google-app-engine-with-gaelyk&amp;userName=seymores" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/seymores"&gt;Seymour Cakes&lt;/a&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/15692829-264886584452037734?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/264886584452037734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=264886584452037734' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/264886584452037734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/264886584452037734'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2011/07/mosc2011-programming-google-app-engine.html' title='MOSC2011: Programming Google App Engine with Gaelyk'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-794659316278389724</id><published>2011-05-30T15:34:00.003+08:00</published><updated>2011-05-31T00:43:12.131+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='uicolor'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='iOS'/><title type='text'>Custom UIColor from hex value</title><content type='html'>This is how to convert hex to uicolor for iOS/iPhone development.&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/998562.js?file=gistfile1.txt"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-794659316278389724?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/794659316278389724/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=794659316278389724' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/794659316278389724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/794659316278389724'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2011/05/custom-uicolor-from-hex-value.html' title='Custom UIColor from hex value'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-8664533641799284167</id><published>2011-05-26T15:20:00.001+08:00</published><updated>2011-05-26T15:20:43.687+08:00</updated><title type='text'>Where I sit and work</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-6-OzHBMYE10/Td3-9a2XRuI/AAAAAAAAA0I/DJQHSn8C69I/s1600/IMG_1867.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-6-OzHBMYE10/Td3-9a2XRuI/AAAAAAAAA0I/DJQHSn8C69I/s1600/IMG_1867.jpg" /&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;How about you guys? &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-8664533641799284167?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/8664533641799284167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=8664533641799284167' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/8664533641799284167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/8664533641799284167'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2011/05/where-i-sit-and-work.html' title='Where I sit and work'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-6-OzHBMYE10/Td3-9a2XRuI/AAAAAAAAA0I/DJQHSn8C69I/s72-c/IMG_1867.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-6195309528138301285</id><published>2011-05-24T17:39:00.001+08:00</published><updated>2011-05-24T17:40:36.666+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='nerd'/><title type='text'>What happens when you read a lot of books?</title><content type='html'>You buy more books of course.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-5AuFZ6r4XAs/Tdt8obkfSjI/AAAAAAAAA0A/EUps17VwkE0/s1600/Screen+shot+2011-05-24+at+PM+05.37.06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-5AuFZ6r4XAs/Tdt8obkfSjI/AAAAAAAAA0A/EUps17VwkE0/s1600/Screen+shot+2011-05-24+at+PM+05.37.06.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;For the rest of the interesting video, go &lt;a href="http://www.youtube.com/watch?v=E7qgiEMXTQQ"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-6195309528138301285?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/6195309528138301285/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=6195309528138301285' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/6195309528138301285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/6195309528138301285'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2011/05/what-happen-when-you-read-lot-of-books.html' title='What happens when you read a lot of books?'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-5AuFZ6r4XAs/Tdt8obkfSjI/AAAAAAAAA0A/EUps17VwkE0/s72-c/Screen+shot+2011-05-24+at+PM+05.37.06.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-2850247827136911241</id><published>2011-05-24T15:21:00.000+08:00</published><updated>2011-05-24T15:21:55.754+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>AndroidManifest.xml file decompressor</title><content type='html'>If you ever need to extract out the string from AndroidManifest.xml from your apk file, and you happen to need it to be in Groovy, use this. I hope this help someone out there. Thanks to &lt;a href="http://stackoverflow.com/questions/2097813/how-to-parse-the-androidmanifest-xml-file-inside-an-apk-package"&gt;Robo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/988255.js?file=androidmanifest_decompressor.groovy"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-2850247827136911241?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/2850247827136911241/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=2850247827136911241' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/2850247827136911241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/2850247827136911241'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2011/05/androidmanifestxml-file-decompressor.html' title='AndroidManifest.xml file decompressor'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-5982927220068090737</id><published>2011-05-20T23:43:00.001+08:00</published><updated>2011-05-21T00:26:35.698+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='andengine'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Plaything: Andengine</title><content type='html'>What I am playing now -- Killer Pool 2011, Android game with &lt;a href="http://www.andengine.org/"&gt;Andengine&lt;/a&gt;.&lt;br /&gt;I spent 2 hours of my youth reading the code examples and hack around the physic engine to come up with a simple game, screenshot below. I like what I see so far. The code on &lt;a href="http://github.com/seymores/killerpool2011"&gt;github here&lt;/a&gt;.&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/-qCTTxtm6SUw/TdaLjAB739I/AAAAAAAAAz8/bJhBLB4Uv6A/s1600/device.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-qCTTxtm6SUw/TdaLjAB739I/AAAAAAAAAz8/bJhBLB4Uv6A/s1600/device.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-5982927220068090737?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/5982927220068090737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=5982927220068090737' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/5982927220068090737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/5982927220068090737'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2011/05/plaything-andengine.html' title='Plaything: Andengine'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-qCTTxtm6SUw/TdaLjAB739I/AAAAAAAAAz8/bJhBLB4Uv6A/s72-c/device.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-5406937560931244142</id><published>2011-05-20T13:31:00.000+08:00</published><updated>2011-05-20T13:31:27.309+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Re: Seven Advantages Of Java</title><content type='html'>My usual routine is to checkout dzone.com after coming back from lunch and today the&amp;nbsp;&lt;a href="http://bielik.blogspot.com/2011/05/seven-advantages-of-java.html"&gt;Seven Advantages of Java blog post caught my attention&lt;/a&gt;. It's a quick and easy read but I will play the devil's advocate and lets put a spot light on the 7 "advantages" of Java.&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #0b5394; font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;i&gt;&lt;b&gt;1.&lt;/b&gt; &lt;b&gt;Java is easy to learn&lt;/b&gt;&lt;br /&gt;Java was designed to be easy to use and is therefore much more easy to  write, compile, debug, run and learn than other programming languages.&lt;/i&gt;&lt;/div&gt;&lt;div style="color: #741b47; font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black; font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;Well not really. This is pretty subjective -- Java is easy to learn compared to what? C or C++? Ruby is easy. Groovy is easier if you already have Java background. Python is the easiest as most claimed.&lt;/div&gt;&lt;div style="color: black; font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #3d85c6; font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;i&gt;&lt;b&gt;2. Java is object-oriented&lt;/b&gt;&lt;br /&gt;This allows you to create modular maintainable applications and reusable code.&lt;/i&gt;&lt;/div&gt;&lt;div style="color: black; font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black; font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-family: inherit;"&gt;Just because it's OO does not mean that it will create modular and maintainable program. OO languages are dime a dozen and that doesn't necessary make it an advantage for Java. &lt;/span&gt;&lt;i style="color: #666666; font-family: inherit;"&gt;(Psst, It's how you write the code)&lt;/i&gt;&lt;span style="font-family: inherit;"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #741b47; font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #0b5394; font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;i&gt;3. &lt;b&gt;Java is platform-independent&lt;/b&gt;&lt;br /&gt;One  of the most significant advantages of Java is its ability to move   easily from one system to another. The ability to run the same  code on  many different systems is crucial to www,  and Java succeeds at this by  being platform-independent at the  source and almost binary levels.&lt;/i&gt;&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;This platform-independent thing is overrated but I bought it -- hook and sinker -- when I was in college. This is a marketing-speak advantage but not so much of a practical thing in real world. It helps to know how to program in Java but you still have to learn the platform idioms and usage patterns. For example, you can't and don't run servlet as desktop app and vice versa. Btw, wassup with the "almost binary levels" -- it will always compile down to JVM bytecode.&lt;/div&gt;&lt;div style="color: #0b5394; font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #0b5394; font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;i&gt;&lt;b&gt;4. Java is distributed&lt;/b&gt;&lt;br /&gt;Java is  designed to make distributed computing easy with the networking   capability that is inherently integrated into it. Writing network   programs in Java is like sending and receiving data to and from a file.&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;This true and may be cool many years back but almost every language framework comes with some kind of distributed capability that you can use right away. So, meh, overrated. &lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b style="color: #0b5394; font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;5. Java is secure&lt;/b&gt;&lt;br style="color: #0b5394; font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;" /&gt;&lt;span style="color: #0b5394; font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt; Java  considers security as part of its design. The Java language,  compiler,  interpreter, and runtime environment were each developed with  security  in mind.&lt;/span&gt;&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;This is true to certain extend but when we talk about security we have to understand that security covers a huge body of concern -- authentication, authorization, integrity etc. So Java VM is secure against attacks like buffer overflow, but the security of the software is not guaranteed by Java alone. It's how you program it. The author should back it up with more specifics.&lt;br /&gt;&lt;div style="color: #0b5394;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #0b5394; font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;i&gt;&lt;b&gt;6. Java is robust&lt;/b&gt; &lt;br /&gt;Robust means reliability. Java  puts a lot of emphasis on early checking  for possible errors, as Java  compilers are able to detect many  problems that would first show up  during execution time in other  languages.&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;By robust you mean the damn thing doesn't crash mysteriously then ya Java is robust. But so is every languages worth their beans. Weak argument really. Reminds me of an advert I came across many years ago -- one of the publicize "Feature" of the program is, &lt;u&gt;Bug Free&lt;/u&gt;. :-O&lt;br /&gt;&lt;br /&gt;Oh, I don't think you will think about this advantage point when you are getting OutOfMemoryException.&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #0b5394; font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;i&gt;&lt;b&gt;Java is multithreaded&lt;/b&gt;&lt;br /&gt;Multithreaded  is the capability for a program to perform several tasks  simultaneously  within a program. In Java, multithreaded programming has  been smoothly  integrated into it, while in other languages, operating  system-specific  procedures have to be called in order to enable  multithreading.&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;I think we get it, multithreaded is important and Java is multithreaded language. Ok. So what are the "other languages"?&lt;br /&gt;&lt;br /&gt;The author sounds like he is new to Java world. I hope he won't bail once he learned about Ruby. Hmm, maybe he will write "100 Reasons Ruby Kicks Java-ass" then.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-5406937560931244142?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/5406937560931244142/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=5406937560931244142' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/5406937560931244142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/5406937560931244142'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2011/05/re-seven-advantages-of-java.html' title='Re: Seven Advantages Of Java'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-7117040289781757145</id><published>2011-05-20T11:28:00.001+08:00</published><updated>2011-05-20T11:29:21.259+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>I earned the "Famous Question" badge in StackOverflow</title><content type='html'>But it shows how Objective-C can be shitty in areas other language never give a rat-ass about.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;So &lt;/span&gt;&lt;span style="font-size: large;"&gt;&lt;a class="question-hyperlink" href="http://stackoverflow.com/questions/968792/what-is-the-right-way-to-check-for-a-null-string-in-objective-c"&gt;What is the right way to check for a null string in Objective-C?&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-AWe3GeYgIPM/TdXfPtfW7tI/AAAAAAAAAz4/d-qwdtvT46A/s1600/Screen+shot+2011-05-20+at+AM+11.25.00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-AWe3GeYgIPM/TdXfPtfW7tI/AAAAAAAAAz4/d-qwdtvT46A/s1600/Screen+shot+2011-05-20+at+AM+11.25.00.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-7117040289781757145?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/7117040289781757145/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=7117040289781757145' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/7117040289781757145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/7117040289781757145'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2011/05/i-earned-famous-question-badge-in.html' title='I earned the &quot;Famous Question&quot; badge in StackOverflow'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-AWe3GeYgIPM/TdXfPtfW7tI/AAAAAAAAAz4/d-qwdtvT46A/s72-c/Screen+shot+2011-05-20+at+AM+11.25.00.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-5379452529228163243</id><published>2011-05-18T21:14:00.003+08:00</published><updated>2011-05-18T21:14:54.147+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>What's new in Groovy 1.8</title><content type='html'>&lt;div style="width:425px" id="__ss_8010619"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/glaforge/groovy-18-update-guillaume-laforge-gr8conf-europe-2011" title="Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011"&gt;Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011&lt;/a&gt;&lt;/strong&gt; &lt;iframe src="http://www.slideshare.net/slideshow/embed_code/8010619" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"&gt;&lt;/iframe&gt; &lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/glaforge"&gt;Guillaume Laforge&lt;/a&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/15692829-5379452529228163243?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/5379452529228163243/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=5379452529228163243' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/5379452529228163243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/5379452529228163243'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2011/05/whats-new-with-groovy-18.html' title='What&apos;s new in Groovy 1.8'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-1737997360655375760</id><published>2011-05-18T20:25:00.004+08:00</published><updated>2011-05-18T21:29:40.183+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iOS'/><category scheme='http://www.blogger.com/atom/ns#' term='shit'/><title type='text'>MY FM iPhone app sucks shit</title><content type='html'>I have been pondering this since last week and at last I decided that I have to say my piece or I will continue to not shit comfortably. Yes, this MY FM radio app disturbs me this much. To flesh out my points I am putting&lt;span style="color: white;"&gt; &lt;/span&gt;&lt;b style="color: white;"&gt;&lt;span style="background-color: magenta;"&gt;numbers&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #999999;"&gt; &lt;/span&gt;to the UI elements that which I think made this app sucks shit.&lt;br /&gt;&lt;br /&gt;But before we proceed, let me just say that I love this app. I was a daily listener to MyFM many years back when I was living in KL and driving to work with MyFM is a daily thing. I don't understand all the Cantonese but I understand enough to laugh along.&lt;br /&gt;&lt;br /&gt;This app is a radio streaming app and it appears that MY FM is using radioactive.sg service for the content steaming. This client might just be a generic app that radioactive.sg provides along with the streaming service. But boy the UI doesn't do MY FM justice at all. If you are radioactive.sg and appreciate my criticism, then please contact me -- I hope I can provide some sort of help.&lt;br /&gt;&lt;br /&gt;Now lets get on to the shit.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-FsjRzf68I0s/TdOxz6uVlTI/AAAAAAAAAzM/QntEDfnHxno/s1600/elephant20shit1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="183" src="http://1.bp.blogspot.com/-FsjRzf68I0s/TdOxz6uVlTI/AAAAAAAAAzM/QntEDfnHxno/s320/elephant20shit1.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;First you can get the app &lt;a href="http://itunes.apple.com/my/app/my-fm/id325024723?mt=8"&gt;here.&lt;/a&gt; While you are on the page, check out the comments, generally ppl are saying this app is a fantastic app. I agree. Just that the UI makes it sucks shit. Now on startup, everything looks nice and cool. I like the little Bruce Lee with the crap helmet. Thumbs up!&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-FtFi_4K5Bpk/TdOyB5amZ1I/AAAAAAAAAzQ/rUxBxRqByzY/s1600/cover.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/-FtFi_4K5Bpk/TdOyB5amZ1I/AAAAAAAAAzQ/rUxBxRqByzY/s400/cover.jpg" width="266" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Then things go downhill from there.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-FN5Z45pjRBg/TdOwD-6h57I/AAAAAAAAAzI/rhBuMbQ4piI/s1600/myfm1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/-FN5Z45pjRBg/TdOwD-6h57I/AAAAAAAAAzI/rhBuMbQ4piI/s400/myfm1.jpg" width="265" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;Notice the MY FM logo? It's not supposed to be here. In fact it's confusing why it's part of the "tab". Logo lives in titleView -- the top center bar, see #2.&lt;/li&gt;&lt;li&gt;"Player" title is seriously, re***** -- I don't know, something doesn't look right here. I am thinking the designer got lazy, and rather go home early than say, not design shit. I suggest the logo be put here. But well that's just my opinion.&lt;/li&gt;&lt;li&gt;"Background". Wtf is that? Oh wait, something about using Safari to access the site. Well whatever, I am getting some MySQL error. I know it's getting repetitious, but this button is shitty. Get rid of it.&lt;/li&gt;&lt;li&gt;I don't even want to talk about the "twitter" icon here. When I got to this screen, the icons looks blurry and shitty. Get rid of it.&lt;/li&gt;&lt;li&gt;The "i" info screen is also another sucks shit section -- you can safely ignore it. This is also the part where you found out that either Airtime &lt;u style="color: #990000;"&gt;Mangement&lt;/u&gt; and Programming Sdn Bhd did the app, or radioactive.sg got the job done. I don't know, since this app is shitty, I recommend you stay clear of them.&lt;/li&gt;&lt;/ol&gt;Well, so far so good. Erm, I mean, yes it's good enough except I don't hear anything. Something is not right. Oh well, lets proceed anyway.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-kceMhpyUuPg/TdO1Xa8h1YI/AAAAAAAAAzY/OV9Hw2MExKo/s1600/myfm2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/-kceMhpyUuPg/TdO1Xa8h1YI/AAAAAAAAAzY/OV9Hw2MExKo/s400/myfm2.jpg" width="266" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&amp;nbsp;So, now if you go to "Stations" and select "MY FM" you will come to the screen above. At this point I realized that the tabbar doesn't look native. Probably this app was done using phonegap or one of those Adobe thingy. I don't know, it sucks shit, and I only have one advise at this point -- go learn the damn Xcode and use the controls properly! Geez.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&amp;nbsp;Now, first off, I thought the "Call" button is a good feature. And no harm if they could add a SMS button too. However, being used to proper button, the leveled bevel look is confusing. I didn't know it's a button and took me few seconds to figure out it's a button. Well, you know, I have been saying -- this app sucks shit. Also, go check out the book, &lt;a href="http://www.amazon.com/gp/product/0321344758/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=seymourcakes-20&amp;amp;linkCode=as2&amp;amp;camp=217145&amp;amp;creative=399349&amp;amp;creativeASIN=0321344758"&gt;Don't Make Me Think: A Common Sense Approach to Web Usability, 2nd Edition&lt;/a&gt;&lt;img alt="" border="0" class=" ykprlpqtclsvlbhiswyh ykprlpqtclsvlbhiswyh ykprlpqtclsvlbhiswyh" height="1" src="http://www.assoc-amazon.com/e/ir?t=&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0321344758&amp;amp;camp=217145&amp;amp;creative=399349" style="border: none !important; margin: 0px !important;" width="1" /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Email button is fine, but the usual complain here, the button is a shitty leveled or pressed bevel button. Real button doesn't look like this. I suggest the designer go press a few buttons with the native iPhone app and try again. Seriously.&lt;/li&gt;&lt;li&gt;I like the big "Listen Live" button, but with all the fuckups, this is like finding a single piece of toilet paper left in a dirty toilet. But it's Ok. This app can try to win the "Shitty App" category.&lt;/li&gt;&lt;li&gt;Now, if there's is anything, anything wrong at all in this screen, it has to be this "Back" button. This "Back" button represent all that is wrong with this app -- they got it wrong so bad it sucks shit. I will keep it short -- PUT THE DAMN "BACK" BUTTON AT THE TOP LEFT CORNER. You know, like how the rest of the app universe works. Seriously, Apple need to buff up their review team. If I am Steve Jobs, I would yank the fucker doing the review of this app and tell him in slow calm voice, "You disgraced Apple".&lt;/li&gt;&lt;/ol&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-ewDfZwvwCWI/TdPJsOARxlI/AAAAAAAAAzg/Z5AsW7aV7Nw/s1600/disgraced.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-ewDfZwvwCWI/TdPJsOARxlI/AAAAAAAAAzg/Z5AsW7aV7Nw/s1600/disgraced.jpeg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;ol&gt;&lt;/ol&gt;Ok, I got bored, but I guess you get my point. It's basically sucky in UI but it has the goods. Still...&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-FsjRzf68I0s/TdOxz6uVlTI/AAAAAAAAAzM/QntEDfnHxno/s1600/elephant20shit1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="183" src="http://1.bp.blogspot.com/-FsjRzf68I0s/TdOxz6uVlTI/AAAAAAAAAzM/QntEDfnHxno/s320/elephant20shit1.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Lets rethink the app for a moment. MY FM is a radio app and really all we want is to tune in to the live radio stream. Cut out the rest of the stuff. Just the radio.&lt;br /&gt;&lt;br /&gt;I ripped off some radio app and spent like 20 mins "redesign" it for MY FM, and I present to you the super-lite MY FM app. Now if I could figure out how to hook into the radioactive.sg stream, I could probably create the whole app, but for now, this is what I think is good and shit-free. I mean, it's basically featureless so what the hell can be so sucky about it? But who knows, if you agree or disagree, drop me a line. Cheers.&lt;br /&gt;&lt;br /&gt;*PS I love MY FM. :-)&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/-0DKHh45OLbA/TdO6tVmHIqI/AAAAAAAAAzc/x9vCPN5Jnc4/s1600/suggestion.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/-0DKHh45OLbA/TdO6tVmHIqI/AAAAAAAAAzc/x9vCPN5Jnc4/s400/suggestion.jpg" width="266" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span id="goog_2060466307"&gt;&lt;/span&gt;&lt;span id="goog_2060466308"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-1737997360655375760?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/1737997360655375760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=1737997360655375760' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/1737997360655375760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/1737997360655375760'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2011/05/myfm-iphone-app-sucks-shit.html' title='MY FM iPhone app sucks shit'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-FsjRzf68I0s/TdOxz6uVlTI/AAAAAAAAAzM/QntEDfnHxno/s72-c/elephant20shit1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-8652288874704106376</id><published>2011-05-18T12:11:00.003+08:00</published><updated>2011-05-18T22:45:06.059+08:00</updated><title type='text'>What's your "music setup" like?</title><content type='html'>The thing about us programmer is that we glue our butts on the chair whole day and we just gotta have some music. I am sure you heard a lot about "programming songs/music". We I need to warn you that regardless whether it's Britney Spears or Massive Attack, you music is only as good as your speaker or earphone (cans).&lt;br /&gt;&lt;br /&gt;Getting a good pair of cans can be expensive. I know because I already gotten myself few pairs with price tags that I am embarrassed to say out loud. I own Grado S65, K75 (best bang for buck type), and my latest Atomic Floyd. Well you get what you can.&lt;br /&gt;&lt;br /&gt;But there's something else other than getting a good cans -- get a headphone amplifier! Shown here is my Hippobox headphone amp. Cost me SGD$40 bux and boy does it make my cans sing. You don't want that ugly box dangling if you are traveling but no reason not to have one of these baby pump up the music while you're on your desk.&lt;br /&gt;&lt;br /&gt;Short description -- with my mini amp, the orchestra is right in front of me and music is live and loud and clear. Without, I am sitting in front of the TV with the orchestra showing. I hate that fucker who introduced me to these baby amps -- how could I live without them from now on?!!!&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: #cccccc; color: #0b5394;"&gt;* Warning, get a good headphone first before getting any kind of amp. Get both if you can. :-) &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-S9bOqNjAkjk/TdM389aoYVI/AAAAAAAAAzE/X2l8P-vGFE0/s1600/IMG_1821.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-S9bOqNjAkjk/TdM389aoYVI/AAAAAAAAAzE/X2l8P-vGFE0/s320/IMG_1821.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-8652288874704106376?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/8652288874704106376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=8652288874704106376' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/8652288874704106376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/8652288874704106376'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2011/05/whats-your-music-setup-like.html' title='What&apos;s your &quot;music setup&quot; like?'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-S9bOqNjAkjk/TdM389aoYVI/AAAAAAAAAzE/X2l8P-vGFE0/s72-c/IMG_1821.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-1474816914942475586</id><published>2011-05-17T11:22:00.000+08:00</published><updated>2011-05-17T11:22:10.302+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cocoa touch'/><category scheme='http://www.blogger.com/atom/ns#' term='iOS'/><title type='text'>Kill all firstResponder</title><content type='html'>If you ever have the problem of keyboard not resigning, it is most probably caused by "runaway" pointer to the texfield/textview that was holding the firstresponder. The popular way to clear all firstResponder in the view is by iterating through all the views and check if it's firstResponder -- and if it is, then resign.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;- (void)resetKeyboard {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Resign keyboard&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (UIView *view in [self.view subviews]) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ([view isFirstResponder]) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [view resignFirstResponder];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&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/15692829-1474816914942475586?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/1474816914942475586/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=1474816914942475586' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/1474816914942475586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/1474816914942475586'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2011/05/kill-all-firstresponder.html' title='Kill all firstResponder'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-8833389446341919746</id><published>2011-05-10T15:42:00.001+08:00</published><updated>2011-05-10T15:43:31.202+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iOS'/><title type='text'>Get UIImage from NSString URL</title><content type='html'>To get an image from Internet, you can load the image with NSURL as NSData and then init the UIImage with the NSData.&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt; NSData * imageData = [[NSData alloc] initWithContentsOfURL: &lt;br /&gt;                                       [NSURL URLWithString:&lt;br /&gt;                                        @"http://graph.facebook.com/seymores/picture"]];&lt;br /&gt; self.image = [UIImage imageWithData: imageData];&lt;br /&gt; [imageData release];&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/15692829-8833389446341919746?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/8833389446341919746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=8833389446341919746' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/8833389446341919746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/8833389446341919746'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2011/05/get-uiimage-from-nsstring-url.html' title='Get UIImage from NSString URL'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-8569969959803940926</id><published>2011-05-07T19:45:00.001+08:00</published><updated>2011-05-07T19:47:44.366+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mosc2011'/><title type='text'>MyOSS Conference 2011</title><content type='html'>So &lt;a href="http://blog.harisfazillah.info/2011/05/poll-what-topics-interest-you-for.html?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+TodayNotesBlogAboutLinuxOpenSourceComputerInternet+%28Today+Notes+Blog+About+Linux+Open+Source+Computer+Internet%29"&gt;MOS2011&lt;/a&gt; is coming up and I am kind of excited about it. I was there last year to talk about &lt;a href="http://shitmores.blogspot.com/2010/06/my-slides-open-source-software.html"&gt;Agile practices for healthy software engineering&lt;/a&gt;. I didn't attend all the sessions but I remember the session on converting a normal HTML site to fit mobile browser very informative, and as well as MariaDB engine session by Colin Charles.&lt;br /&gt;&lt;br /&gt;I have submitted a proposal to talk about using Gaelyk for cloud programming. &lt;a href="http://gaelyk.appspot.com/"&gt;Gaelyk&lt;/a&gt; is a Groovy PaaS framework on top of &lt;a href="https://appengine.google.com/"&gt;Google App Engine&lt;/a&gt; -- it is mature and a viable alternative to using Java for developing GAE application. Like all Groovy framework, it's easy to get started and I hope I will get the chance to show a glimpse of the future of cloud programming with Gaelyk and GAE.&lt;br /&gt;&lt;br /&gt;But for now, if you want to learn more, check out&lt;a href="http://gaelyk.appspot.com/tutorial"&gt; Gaelyk Tutorial&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-PQ6jWhA6Qc0/TcUvtEzurjI/AAAAAAAAAys/fgxAQQ7CAy8/s1600/gaelyk.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-PQ6jWhA6Qc0/TcUvtEzurjI/AAAAAAAAAys/fgxAQQ7CAy8/s1600/gaelyk.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-8569969959803940926?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/8569969959803940926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=8569969959803940926' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/8569969959803940926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/8569969959803940926'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2011/05/myoss-conference-2011.html' title='MyOSS Conference 2011'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-PQ6jWhA6Qc0/TcUvtEzurjI/AAAAAAAAAys/fgxAQQ7CAy8/s72-c/gaelyk.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-7003307393423336345</id><published>2011-05-07T19:02:00.002+08:00</published><updated>2011-05-07T19:59:38.387+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='uiimageview'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone sdk'/><category scheme='http://www.blogger.com/atom/ns#' term='iOS'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>How to create photo frame effect (UIImageView)</title><content type='html'>There is a really easy way to make a ordinary UIImageView photo frame with just few lines of code.&lt;br /&gt;&lt;br /&gt;UIImageView inherits from UIView so it has a CALayer. Among the CALayer properties that you can manipulate is the shadow and border. The trick is to set the border to few pix thick and drop some shadow radius and you instantly get a nice photo frame effect.&lt;br /&gt;&lt;br /&gt;So if you want to turn a boring looking photo (like the below) into something that look like it's in a photo frame with some drop shadow, do this:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;// #import &amp;lt;QuartzCore/QuartzCore.h&amp;gt;&lt;br /&gt;    // picture is an instance of UIImageView&lt;br /&gt;&lt;br /&gt;    CALayer *layer = picture.layer;&lt;br /&gt;    [layer setBorderColor: [[UIColor whiteColor] CGColor]];&lt;br /&gt;    [layer setBorderWidth:8.0f];&lt;br /&gt;    [layer setShadowColor: [[UIColor blackColor] CGColor]];&lt;br /&gt;    [layer setShadowOpacity:0.9f];&lt;br /&gt;    [layer setShadowOffset: CGSizeMake(1, 3)];&lt;br /&gt;    [layer setShadowRadius:4.0];&lt;br /&gt;    [picture setClipsToBounds:NO];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="https://github.com/seymores/ios-utils/blob/master/classes/UIImageView+PhotoFrame.h"&gt;I have made a handy category to apply this photo frame effect to any UIImageView easily here&lt;/a&gt;.&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/-1PAVHRf5Rr0/TcUlrI00qQI/AAAAAAAAAyk/nH4AE3rHVFQ/s1600/Screen+shot+2011-05-07+at+PM+06.44.33.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-1PAVHRf5Rr0/TcUlrI00qQI/AAAAAAAAAyk/nH4AE3rHVFQ/s1600/Screen+shot+2011-05-07+at+PM+06.44.33.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-2K46HLlLQLA/TcUl0mpkiwI/AAAAAAAAAyo/cEdgR7JvTJs/s1600/Screen+shot+2011-05-07+at+PM+06.50.43.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-2K46HLlLQLA/TcUl0mpkiwI/AAAAAAAAAyo/cEdgR7JvTJs/s1600/Screen+shot+2011-05-07+at+PM+06.50.43.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-7003307393423336345?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/7003307393423336345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=7003307393423336345' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/7003307393423336345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/7003307393423336345'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2011/05/how-to-create-photo-frame-effect.html' title='How to create photo frame effect (UIImageView)'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-1PAVHRf5Rr0/TcUlrI00qQI/AAAAAAAAAyk/nH4AE3rHVFQ/s72-c/Screen+shot+2011-05-07+at+PM+06.44.33.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-2918259266582468990</id><published>2011-04-24T13:57:00.001+08:00</published><updated>2011-04-24T16:04:32.129+08:00</updated><title type='text'>A little preview of what I am working on</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-sJVhlaj_ksM/TbO7vUC3UuI/AAAAAAAAAyc/VxKRM8LstXQ/s1600/Screen+shot+2011-04-24+at+PM+01.55.58.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://2.bp.blogspot.com/-sJVhlaj_ksM/TbO7vUC3UuI/AAAAAAAAAyc/VxKRM8LstXQ/s400/Screen+shot+2011-04-24+at+PM+01.55.58.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-2918259266582468990?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/2918259266582468990/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=2918259266582468990' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/2918259266582468990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/2918259266582468990'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2011/04/little-prevew-of-what-i-am-working-on.html' title='A little preview of what I am working on'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-sJVhlaj_ksM/TbO7vUC3UuI/AAAAAAAAAyc/VxKRM8LstXQ/s72-c/Screen+shot+2011-04-24+at+PM+01.55.58.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-1044810639262548928</id><published>2011-04-23T12:07:00.000+08:00</published><updated>2011-04-23T12:07:28.949+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xcode'/><category scheme='http://www.blogger.com/atom/ns#' term='iOS'/><title type='text'>Xcode tip: Make use of #warning directive for good</title><content type='html'>If you have been using Xcode4 lately you will notice few #warning being generated a for new UITableViewController class. I didn't notice it before in Xcode3, but it's good directive that you can make use of to add note or todo. Of course you can &lt;a href="http://stackoverflow.com/questions/367368/how-to-define-a-preprocessor-symbol-in-xcode"&gt;add custom directive&lt;/a&gt; but I am not going into that.&lt;br /&gt;&lt;br /&gt;See how I am making use of the #warning for todo items in the screenshot below.&lt;br /&gt;Hope this tip helps you.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-8BDLtCujhRc/TbJOkJuGs-I/AAAAAAAAAyY/Lu9LhedJDZ0/s1600/Screen+shot+2011-04-23+at+AM+11.57.21.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/-8BDLtCujhRc/TbJOkJuGs-I/AAAAAAAAAyY/Lu9LhedJDZ0/s1600/Screen+shot+2011-04-23+at+AM+11.57.21.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/-8BDLtCujhRc/TbJOkJuGs-I/AAAAAAAAAyY/Lu9LhedJDZ0/s1600/Screen+shot+2011-04-23+at+AM+11.57.21.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-8BDLtCujhRc/TbJOkJuGs-I/AAAAAAAAAyY/Lu9LhedJDZ0/s1600/Screen+shot+2011-04-23+at+AM+11.57.21.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-1044810639262548928?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/1044810639262548928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=1044810639262548928' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/1044810639262548928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/1044810639262548928'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2011/04/xcode-tip-make-use-of-warning-directive.html' title='Xcode tip: Make use of #warning directive for good'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-8BDLtCujhRc/TbJOkJuGs-I/AAAAAAAAAyY/Lu9LhedJDZ0/s72-c/Screen+shot+2011-04-23+at+AM+11.57.21.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-8771725774820060857</id><published>2011-04-19T13:11:00.002+08:00</published><updated>2011-04-22T23:11:41.175+08:00</updated><title type='text'>Github t-shirts</title><content type='html'>I have&lt;span style="color: white; font-size: large;"&gt;&lt;span style="background-color: magenta;"&gt; some Github t-shirts for sale&lt;/span&gt;&lt;/span&gt;, see pic below. Only SGD 39.00 each including shipping to Malaysia and Singapore.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-iz30H3wldq4/Ta0ZGlp1VqI/AAAAAAAAAyU/b2EsKU8K02E/s1600/IMG_1733.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="297" src="http://4.bp.blogspot.com/-iz30H3wldq4/Ta0ZGlp1VqI/AAAAAAAAAyU/b2EsKU8K02E/s400/IMG_1733.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The original t-shirt from github: http://shop.github.com/products/i-octocat-code &amp;amp; http://shop.github.com/products/blacktocat-2-0&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-8771725774820060857?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/8771725774820060857/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=8771725774820060857' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/8771725774820060857'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/8771725774820060857'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2011/04/github-t-shirts.html' title='Github t-shirts'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-iz30H3wldq4/Ta0ZGlp1VqI/AAAAAAAAAyU/b2EsKU8K02E/s72-c/IMG_1733.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-2497721986439007191</id><published>2011-04-19T13:05:00.001+08:00</published><updated>2011-04-19T13:05:28.362+08:00</updated><title type='text'>Fan of Github</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-HEeL7wgaByA/Ta0X87QwdMI/AAAAAAAAAyQ/61d5b6Fv6n8/s1600/IMG_1734.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="298" src="http://1.bp.blogspot.com/-HEeL7wgaByA/Ta0X87QwdMI/AAAAAAAAAyQ/61d5b6Fv6n8/s400/IMG_1734.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-2497721986439007191?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/2497721986439007191/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=2497721986439007191' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/2497721986439007191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/2497721986439007191'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2011/04/fan-og-github.html' title='Fan of Github'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-HEeL7wgaByA/Ta0X87QwdMI/AAAAAAAAAyQ/61d5b6Fv6n8/s72-c/IMG_1734.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-1817810142108651865</id><published>2011-03-10T12:20:00.001+08:00</published><updated>2011-03-10T12:31:34.750+08:00</updated><title type='text'>** Test</title><content type='html'>&lt;pre class="prettyprint"&gt;- (NSString *)applicationSupportDirectory {&lt;br /&gt;&lt;br /&gt;    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);&lt;br /&gt;    NSString *basePath = ([paths count] &gt; 0) ? [paths objectAtIndex:0] : NSTemporaryDirectory();&lt;br /&gt;    return [basePath stringByAppendingPathComponent:@"MyTime"];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;import static com.google.appengine.api.datastore.FetchOptions.Builder.*&lt;br /&gt;&lt;br /&gt;def common = Common.instance&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Listing of classified in the first page.&lt;br /&gt; * TODO: Paging&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;def commone = Common.instance&lt;br /&gt;&lt;br /&gt;int RESULT_LIMIT = 30&lt;br /&gt;String cacheName = params.t? "listquery-${params.t?.trim()}" : "listquery"&lt;br /&gt;def result = memcache[cacheName]&lt;br /&gt;&lt;br /&gt;if (!result) {&lt;br /&gt;    def query = new Query("classified")&lt;br /&gt;    query.addSort("dateCreated", Query.SortDirection.DESCENDING)&lt;br /&gt;    query.addFilter("active", Query.FilterOperator.EQUAL, true)&lt;br /&gt;&lt;br /&gt;    if (params.t) {&lt;br /&gt;        query.addFilter("tags", Query.FilterOperator.EQUAL, params.t)&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    PreparedQuery preparedQuery = datastore.prepare(query)&lt;br /&gt;    result = preparedQuery.asList( withLimit(RESULT_LIMIT) )&lt;br /&gt;    memcache[cacheName] = result&lt;br /&gt;//    System.out.println(" [info]  Cached \"${cacheName}\"");&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;request.result = result&lt;br /&gt;//System.out.println(result)&lt;br /&gt;&lt;br /&gt;forward  '/list.gtpl'&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/15692829-1817810142108651865?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/1817810142108651865/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=1817810142108651865' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/1817810142108651865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/1817810142108651865'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2011/03/test.html' title='** Test'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-4693177129273780264</id><published>2011-01-07T10:30:00.001+08:00</published><updated>2011-03-10T11:45:09.122+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='csv'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android: Using csv file as config/resource</title><content type='html'>While working on Android projects, I constantly need a way to save external configurations or simply some String value resource. For iPhone we have the "plist" file but this is not so clear cut for Android. &lt;br /&gt;&lt;br /&gt;The &lt;strike&gt;best&lt;/strike&gt; simplest way is to just use a plain CSV file to store these resources. This is easy to do in Android without using any 3rd party library.&lt;br /&gt;&lt;br /&gt;Lets start by putting the csv file in "/res/raw". So I have a csv file named as "ref_codes.csv". Inside the file I have a simple "name,code,date" format.&lt;br /&gt;&lt;br /&gt;Next is, create a method to load the CSV content.&lt;br /&gt;&lt;div style="color: #351c75; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #351c75; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;private List&lt;string[]&gt; loadCSV() throws IOException {&lt;/string[]&gt;&lt;/div&gt;&lt;div style="color: #351c75; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InputStream &lt;span style="color: #0b5394;"&gt;inputStream&lt;/span&gt; = getResources().openRawResource(&lt;i&gt;&lt;b&gt;R.raw.ref_codes&lt;/b&gt;&lt;/i&gt;);&lt;/div&gt;&lt;div style="color: #351c75; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BufferedReader reader = new BufferedReader(new InputStreamReader(&lt;span style="color: #0b5394;"&gt;inputStream&lt;/span&gt;));&lt;/div&gt;&lt;div style="color: #351c75; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style="color: #351c75; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; String &lt;span style="color: #0b5394;"&gt;line&lt;/span&gt;;&lt;/div&gt;&lt;div style="color: #351c75; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while ((&lt;span style="color: #0b5394;"&gt;line&lt;/span&gt; = reader.readLine()) != null) {&lt;br /&gt;&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; //process the line, stuff to List&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #351c75; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String[] values = line.split(",");&lt;/div&gt;&lt;div style="color: #351c75; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/div&gt;&lt;div style="color: #351c75; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;}&lt;br /&gt;&lt;br /&gt;** Do note that CSV usage as shown here has many shortcomings and it's recommended that if you config need is complex then I suggest you look into JSON or XML. (Thanks for the feedback from &lt;a href="http://commonsware.com/" rel="nofollow"&gt;Mark Murphy&lt;/a&gt;)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-4693177129273780264?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/4693177129273780264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=4693177129273780264' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/4693177129273780264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/4693177129273780264'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2011/01/android-using-csv-file-as.html' title='Android: Using csv file as config/resource'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-4408701355378433075</id><published>2010-12-09T16:13:00.002+08:00</published><updated>2010-12-09T16:13:56.841+08:00</updated><title type='text'>Social Hacking: Future of Information Guerilla Warfare</title><content type='html'>&lt;iframe src="https://docs.google.com/present/embed?id=dv83p73_94fjq9d5gn" frameborder="0" width="410" height="342"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-4408701355378433075?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/4408701355378433075/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=4408701355378433075' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/4408701355378433075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/4408701355378433075'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2010/12/social-hacking-future-of-information.html' title='Social Hacking: Future of Information Guerilla Warfare'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-8475855021478383888</id><published>2010-11-30T11:34:00.000+08:00</published><updated>2010-11-30T11:34:56.342+08:00</updated><title type='text'>Re: Java Programmer Wanted</title><content type='html'>I am looking for a full time Java programmer.&lt;br /&gt;&lt;br /&gt;I will love you if you are:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Independent -- basically knows how to google a lot&lt;/li&gt;&lt;li&gt;Java few years of Java programming experience&lt;/li&gt;&lt;li&gt;Dig Groovy &amp;amp; Grails&lt;/li&gt;&lt;li&gt;Use Linux/Unix almost daily&lt;/li&gt;&lt;/ol&gt;We make software and we believe in making software the agile way. We are based in Singapore but you can work at home if coming here is not possible.&lt;br /&gt;&lt;br /&gt;Seriously, if you are tired of screwing around and just want to get things done the right way, come talk to me.&lt;br /&gt;&lt;br /&gt;I don't want you to leave your email here to be spammed so DM me on twitter.com/seymores&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-8475855021478383888?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/8475855021478383888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=8475855021478383888' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/8475855021478383888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/8475855021478383888'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2010/11/re-java-programmer-wanted.html' title='Re: Java Programmer Wanted'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-8508813848660308675</id><published>2010-11-17T00:41:00.000+08:00</published><updated>2010-11-17T00:41:14.984+08:00</updated><title type='text'>Powers of Ten</title><content type='html'>&lt;object style="background-image:url(http://i1.ytimg.com/vi/0fKBhvDjuy0/hqdefault.jpg)" width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/0fKBhvDjuy0?fs=1&amp;amp;hl=en_US"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/0fKBhvDjuy0?fs=1&amp;amp;hl=en_US" width="425" height="344" allowscriptaccess="never" allowfullscreen="true" wmode="transparent" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-8508813848660308675?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/8508813848660308675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=8508813848660308675' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/8508813848660308675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/8508813848660308675'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2010/11/powers-of-ten.html' title='Powers of Ten'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-6868387906491466298</id><published>2010-11-01T09:52:00.001+08:00</published><updated>2011-03-12T01:14:40.631+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='macruby'/><title type='text'>MacRuby: Test 1</title><content type='html'>Get list of all visible windows from running apps.&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;framework 'cocoa'&lt;br /&gt;&lt;br /&gt;=begin&lt;br /&gt;&lt;br /&gt;enum {&lt;br /&gt;kCGWindowListOptionAll = 0,&lt;br /&gt;kCGWindowListOptionOnScreenOnly = (1 &amp;lt;&amp;lt; 0),&lt;br /&gt;kCGWindowListOptionOnScreenAboveWindow = (1 &amp;lt;&amp;lt; 1),&lt;br /&gt;kCGWindowListOptionOnScreenBelowWindow = (1 &amp;lt;&amp;lt; 2),&lt;br /&gt;kCGWindowListOptionIncludingWindow = (1 &amp;lt;&amp;lt; 3),&lt;br /&gt;kCGWindowListExcludeDesktopElements = (1 &amp;lt;&amp;lt; 4)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;=end&lt;br /&gt;&lt;br /&gt;kCGWindowListOptionOnScreenOnly = (1&amp;lt;&amp;lt;4)&lt;br /&gt;kCGNullWindowID = 0 #(CGWindowID)0&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;windowlist = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly,kCGNullWindowID)&lt;br /&gt;n = 1&lt;br /&gt;windowlist.each {| w |&lt;br /&gt;p " #{n} #{w["kCGWindowOwnerName"]} "&lt;br /&gt;p " #{w}"&lt;br /&gt;&lt;br /&gt;w.each { |e| p " #{e} " }&lt;br /&gt;&lt;br /&gt;p " ============================ " &lt;br /&gt;n += 1&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/15692829-6868387906491466298?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/6868387906491466298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=6868387906491466298' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/6868387906491466298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/6868387906491466298'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2010/11/macruby-test-1.html' title='MacRuby: Test 1'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-1650559696926352021</id><published>2010-10-13T05:38:00.000+08:00</published><updated>2010-10-13T05:38:20.066+08:00</updated><title type='text'>Fascinating work desks of very creative people (via Gizmodo)</title><content type='html'>&lt;object width="400" height="225"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=3239496&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=1&amp;amp;color=&amp;amp;fullscreen=1&amp;amp;autoplay=0&amp;amp;loop=0" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=3239496&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=1&amp;amp;color=&amp;amp;fullscreen=1&amp;amp;autoplay=0&amp;amp;loop=0" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;p&gt;&lt;a href="http://vimeo.com/3239496"&gt;Desk - Music and Sound Design&lt;/a&gt; from &lt;a href="http://vimeo.com/aarontrinder"&gt;Aaron Trinder  Film:Motion:Music&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-1650559696926352021?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/1650559696926352021/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=1650559696926352021' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/1650559696926352021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/1650559696926352021'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2010/10/fascinating-work-desks-of-very-creative.html' title='Fascinating work desks of very creative people (via Gizmodo)'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-566142557067810754</id><published>2010-06-30T12:09:00.000+08:00</published><updated>2010-06-30T12:09:08.269+08:00</updated><title type='text'>My Slides: Open Source Software Development Practices that Works</title><content type='html'>Here is my slides for my "Open Source Software Development Practices that Works" talk in MOSC2010 today.&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://docs.google.com/present/embed?id=dv83p73_51htnjz8hh" frameborder="0" width="410" height="342"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-566142557067810754?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/566142557067810754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=566142557067810754' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/566142557067810754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/566142557067810754'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2010/06/my-slides-open-source-software.html' title='My Slides: Open Source Software Development Practices that Works'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-5639752892324276785</id><published>2010-03-18T00:33:00.002+08:00</published><updated>2010-03-18T00:36:15.076+08:00</updated><title type='text'>TARCRooms.com is back!</title><content type='html'>I miss &lt;a href="http://www.tarcrooms.com/"&gt;TARCRooms.com&lt;/a&gt; so I brought it back to life.&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/_xpwq_Sv0p98/S6EE7oqZg4I/AAAAAAAAAsI/DtanX5TKwlI/s1600-h/Screen+shot+2010-03-18+at+12.35.21+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="114" src="http://3.bp.blogspot.com/_xpwq_Sv0p98/S6EE7oqZg4I/AAAAAAAAAsI/DtanX5TKwlI/s640/Screen+shot+2010-03-18+at+12.35.21+AM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;New technology, new workflow and trying out a self-sustain system that fully automated without me need to do anything -- well except fix bug. Bug #1: Manual intervention.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-5639752892324276785?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/5639752892324276785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=5639752892324276785' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/5639752892324276785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/5639752892324276785'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2010/03/tarcroomscom-is-back.html' title='TARCRooms.com is back!'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_xpwq_Sv0p98/S6EE7oqZg4I/AAAAAAAAAsI/DtanX5TKwlI/s72-c/Screen+shot+2010-03-18+at+12.35.21+AM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-2678206558713786302</id><published>2010-02-09T00:46:00.000+08:00</published><updated>2010-02-09T00:46:50.044+08:00</updated><title type='text'>The Pleasure of Finding Things Out -- Story of Richard Feynman</title><content type='html'>&lt;embed id=VideoPlayback src=http://video.google.com/googleplayer.swf?docid=7136440703094429927&amp;hl=en&amp;fs=true style=width:400px;height:326px allowFullScreen=true allowScriptAccess=always type=application/x-shockwave-flash&gt; &lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-2678206558713786302?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/2678206558713786302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=2678206558713786302' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/2678206558713786302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/2678206558713786302'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2010/02/pleasure-of-finding-things-out-story-of.html' title='The Pleasure of Finding Things Out -- Story of Richard Feynman'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-6257403557689594771</id><published>2009-12-18T14:25:00.001+08:00</published><updated>2009-12-18T14:26:36.532+08:00</updated><title type='text'>Twitter Got Hacked!</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_xpwq_Sv0p98/Sysf4JA5SBI/AAAAAAAAAqU/Glfk_OYnmuw/s1600-h/Screen+shot+2009-12-18+at+2.22.02+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_xpwq_Sv0p98/Sysf4JA5SBI/AAAAAAAAAqU/Glfk_OYnmuw/s640/Screen+shot+2009-12-18+at+2.22.02+PM.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_xpwq_Sv0p98/SysgktMZ9fI/AAAAAAAAAqs/KSoRyYO5WuM/s1600-h/Screen+shot+2009-12-18+at+2.22.23+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="222" src="http://1.bp.blogspot.com/_xpwq_Sv0p98/SysgktMZ9fI/AAAAAAAAAqs/KSoRyYO5WuM/s320/Screen+shot+2009-12-18+at+2.22.23+PM.png" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_xpwq_Sv0p98/SysgIc0luUI/AAAAAAAAAqk/g-KpG0-qbgQ/s1600-h/index.3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_xpwq_Sv0p98/SysgIc0luUI/AAAAAAAAAqk/g-KpG0-qbgQ/s640/index.3.jpg" /&gt;&lt;span id="goog_1261117378388"&gt;&lt;/span&gt;&lt;span id="goog_1261117378389"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-6257403557689594771?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/6257403557689594771/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=6257403557689594771' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/6257403557689594771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/6257403557689594771'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2009/12/twitter-got-hacked.html' title='Twitter Got Hacked!'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_xpwq_Sv0p98/Sysf4JA5SBI/AAAAAAAAAqU/Glfk_OYnmuw/s72-c/Screen+shot+2009-12-18+at+2.22.02+PM.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-6293565539393684878</id><published>2009-12-10T18:55:00.002+08:00</published><updated>2009-12-10T18:55:34.618+08: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'>Malaysia Groovy &amp; Grails User Group</title><content type='html'>Finally moved from Ning.com to Google Groups. Hopefully more ppl will join in this time.&lt;br /&gt;http://bit.ly/grails-malaysia&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-6293565539393684878?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/6293565539393684878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=6293565539393684878' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/6293565539393684878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/6293565539393684878'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2009/12/malaysia-groovy-grails-user-group.html' title='Malaysia Groovy &amp; Grails User Group'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-5708857853386386257</id><published>2009-11-13T23:23:00.002+08:00</published><updated>2009-11-13T23:25:27.016+08:00</updated><title type='text'>Mac Secrets: Make focus follow mouse for terminal app</title><content type='html'>&lt;span class="detail"&gt;&lt;span style="color: rgb(0, 0, 153);font-family:courier new;font-size:130%;"  &gt;defaults write com.apple.Terminal FocusFollowsMouse true|false&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(Source &lt;a href="http://secrets.blacktree.com/"&gt;http://secrets.blacktree.com&lt;/a&gt;)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-5708857853386386257?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/5708857853386386257/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=5708857853386386257' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/5708857853386386257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/5708857853386386257'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2009/11/mac-secrets-make-focus-follow-mouse-for.html' title='Mac Secrets: Make focus follow mouse for terminal app'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-8969987741956587658</id><published>2009-10-15T23:02:00.003+08:00</published><updated>2009-10-15T23:10:32.738+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><title type='text'>How to create ICNS icon for your Cocoa application in less than 5 minutes.</title><content type='html'>Here's how I get an cool looking icon for my Cocoa app in less than 5 minutes. We need Snow Leopard for this to work. I haven't try but it could work with Leopard.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Download one of the free PNG icons -- you can start with &lt;a href="http://www.smashingmagazine.com/2009/09/16/50-fresh-free-hiqh-quality-icon-sets/"&gt;SmashingMazagine&lt;/a&gt;&lt;/li&gt;&lt;li&gt; Open with Preview -- just double click on the png image will do.&lt;/li&gt;&lt;li&gt;Goto File, Save As. Give it a name or save as it is. Choose Format -&gt; ICNS.&lt;/li&gt;&lt;li&gt;Save.&lt;/li&gt;&lt;/ol&gt;Now you have a Mac OS icon file that you can use in your Cocoa app. You can do this easily by dragging the icon file to your project in XCode's Resource. Open *-info.plist file and set icon to the icon filename that you just drag in.&lt;br /&gt;&lt;br /&gt;Rebuild your application and you will get a nice icon for your app.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-8969987741956587658?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/8969987741956587658/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=8969987741956587658' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/8969987741956587658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/8969987741956587658'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2009/10/how-to-create-icns-icon-for-your-cocoa.html' title='How to create ICNS icon for your Cocoa application in less than 5 minutes.'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-2880612986436314419</id><published>2009-10-06T13:33:00.000+08:00</published><updated>2009-10-06T13:35:34.168+08:00</updated><title type='text'>Secret of Money-Making Blog Titles</title><content type='html'>1. The secret of [blank]&lt;br /&gt;2. Little known ways to [blank]&lt;br /&gt;3. [Do something] like [world-class example]&lt;br /&gt;4. Here's a quick way to [solve a problem]&lt;br /&gt;5. What everybody ought to know about [blank]?&lt;br /&gt;&lt;br /&gt;http://www.copyblogger.com/10-sure-fire-headline-formulas-that-work/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-2880612986436314419?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/2880612986436314419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=2880612986436314419' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/2880612986436314419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/2880612986436314419'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2009/10/secret-of-money-making-blog-titles.html' title='Secret of Money-Making Blog Titles'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-5502437080701179798</id><published>2009-01-08T22:34:00.004+08:00</published><updated>2011-03-19T14:19:56.170+08:00</updated><title type='text'>Consume RSS Feeds easily with Groovy and Rome</title><content type='html'>This is what I did to start consuming RSS feeds with Groovy within 20 minutes!&lt;br /&gt;&lt;br /&gt;1. &lt;a href="https://rome.dev.java.net/source/browse/*checkout*/rome/www/dist/rome-1.0RC1.zip"&gt;Download Rome&lt;/a&gt;.&lt;br /&gt;2. Download &lt;a href="https://rome.dev.java.net/dist/rome-fetcher-0.9.zip"&gt;Rome Fetcher&lt;/a&gt;.&lt;br /&gt;3. Download&lt;a href="http://www.jdom.org/dist/binary/jdom-1.1.zip"&gt; JDOM&lt;/a&gt; is you haven't done so.&lt;br /&gt;4. Extract rome-x.jar, rom-fetcher-x.jar and jdom.jar to a tmp directory -- I placed them at lib.&lt;br /&gt;5. Start you Groovy Console with the classpath set to the jar files, like the this:&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;      $ groovyConsole -cp lib/rome-1.0RC1.jar:lib/rome-fetcher-0.9.jar:lib/jdom.jar&lt;/span&gt;&lt;br /&gt;6. Use the code below:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;import com.sun.syndication.fetcher.*&lt;br /&gt;import com.sun.syndication.fetcher.impl.*&lt;br /&gt;import com.sun.syndication.feed.synd.SyndFeed&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;FeedFetcherCache feedInfoCache = HashMapFeedInfoCache.getInstance();&lt;br /&gt;FeedFetcher feedFetcher = new HttpURLFeedFetcher(feedInfoCache);&lt;br /&gt;SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://feeds.digg.com/digg/topic/programming/popular.rss"));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;feed.entries.each {&lt;br /&gt;println " -&gt; ${it} "&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;println " == ${feed.entries?.size()}"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;7. Finally start reading the below docs:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://rome.dev.java.net/source/browse/println%20%22%20==%20$%7Bfeed.entries?.size%28%29%7D%22rome/subprojects/fetcher/src/java/com/sun/syndication/fetcher/samples/FeedReader.java?view=markup"&gt;Rome Fetch code example&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.bytecode.com.au/glen/2006/12/22/1166781151213.html"&gt;Glen Example of using Rome to generate RSS feed&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-5502437080701179798?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/5502437080701179798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=5502437080701179798' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/5502437080701179798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/5502437080701179798'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2009/01/consume-rss-feeds-easily-with-groovy.html' title='Consume RSS Feeds easily with Groovy and Rome'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-3943791017377476647</id><published>2008-12-16T08:54:00.004+08:00</published><updated>2008-12-16T08:58:38.794+08:00</updated><title type='text'>Malaysia Groovy and Grails User Group</title><content type='html'>Hi guys,&lt;br /&gt;&lt;br /&gt;I just created a social site for &lt;span style="font-weight: bold; font-family: trebuchet ms;font-size:180%;" &gt;&lt;span style="color: rgb(204, 0, 0);"&gt;Groovy and Grails user in Malaysia&lt;/span&gt;&lt;/span&gt; to get together here. Join us!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial; font-weight: bold;font-size:130%;" &gt;&lt;a style="color: rgb(204, 0, 0);" href="http://mygroovies.ning.com"&gt;http://mygroovies.ning.com&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Cheers. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-3943791017377476647?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/3943791017377476647/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=3943791017377476647' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/3943791017377476647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/3943791017377476647'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2008/12/malaysia-groovy-and-grails-user-group.html' title='Malaysia Groovy and Grails User Group'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-6089102719656525595</id><published>2008-08-12T16:53:00.004+08:00</published><updated>2011-04-22T23:16:45.482+08:00</updated><title type='text'>Poor man web app monitoring</title><content type='html'>This is actually something I need to make sure my web apps are still up and running.&lt;br /&gt;&lt;br /&gt;1. Put the start time in global session.&lt;br /&gt;In Bootstrap:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #000099;"&gt;servletContext.setAttribute("startTime", new Date())&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;2. Then create a controller, or resuse an existing controller and define "uptime" action there:&lt;br /&gt;&lt;pre class="prettyprint"&gt;def uptime = {&lt;br /&gt;def starTime = servletContext.getAttribute("starTime")&lt;br /&gt;long uptime = new Date().time - startTime.time&lt;br /&gt;render(text:uptime)&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;3. Now come the easy part -- a simple groovy script to periodically check the server to make sure it's up.&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;try {&lt;br /&gt;def p = new URL("http://host:8080/app/foo/uptime").text&lt;br /&gt;println p // up and running&lt;br /&gt;} catch (e) {&lt;br /&gt;println "Server seems to be down"&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/15692829-6089102719656525595?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/6089102719656525595/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=6089102719656525595' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/6089102719656525595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/6089102719656525595'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2008/08/poor-man-web-app-monitoring.html' title='Poor man web app monitoring'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-3918579254532635368</id><published>2008-08-12T14:50:00.003+08:00</published><updated>2008-08-12T17:23:21.994+08:00</updated><title type='text'>Missing Groovy Recipe: Send e-mail from Groovy</title><content type='html'>This seems to be missing in &lt;a href="http://www.amazon.com/gp/product/0978739299?ie=UTF8&amp;amp;tag=seymourcakes-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0978739299%22%3EGroovy%20Recipes:%20Greasing%20the%20Wheels%20of%20Java%20%28Pragmatic%20Programmers%29%3C/a%3E%3Cimg%20src=%22http://www.assoc-amazon.com/e/ir?t=seymourcakes-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0978739299%22%20width=%221%22%20height=%221%22%20border=%220%22%20alt=%22%22%20style=%22border:none%20%21important;%20margin:0px%20%21important;%22%20/%3E"&gt;Groovy Recipes collection&lt;/a&gt; -- &lt;a href="http://pleac.sourceforge.net/pleac_groovy/internetservices.html"&gt;sending e-mail easily with Gant&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre class="SCREEN"&gt;&lt;span&gt;&lt;span style="color: rgb(245, 222, 179);font-size:78%;" &gt;&lt;span style="color: rgb(0, 0, 153);" class="comment"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;//----------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;// using AntBuilder; for more info, see:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;// http://ant.apache.org/manual/CoreTasks/mail.html&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;ant = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);" class="keyword"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);" class="type"&gt;AntBuilder&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;ant.mail(mailhost:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);" class="string"&gt;'smtp.myisp.com'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;, mailport:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);" class="string"&gt;'1025'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;, subject:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);" class="string"&gt;'Test build'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;){&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;  from(address:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);" class="string"&gt;'config@myisp.com'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;  replyto(address:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);" class="string"&gt;'me@myisp.com'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;  to(address:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);" class="string"&gt;'all@xyz.com'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;  message(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);" class="string"&gt;"The ${buildname} nightly build has completed"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;  attachments(){ &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);" class="comment"&gt;// ant 1.7 uses files attribute in earlier versions&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;    fileset(dir:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);" class="string"&gt;'dist'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;){&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;      include(name:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);" class="string"&gt;'**/*.zip'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-3918579254532635368?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/3918579254532635368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=3918579254532635368' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/3918579254532635368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/3918579254532635368'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2008/08/missing-groovy-recipe-send-e-mail-from.html' title='Missing Groovy Recipe: Send e-mail from Groovy'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-4478123568434970315</id><published>2008-07-22T12:12:00.003+08:00</published><updated>2008-07-22T12:16:25.428+08:00</updated><title type='text'>Grails Sparkline plugin in action</title><content type='html'>The below is the hit data for my blog and see the sparkline tag to produce the sparkline.&lt;br /&gt;&lt;pre&gt; 03 Jul, Thu     100   &lt;br /&gt;04 Jul, Fri     109   &lt;br /&gt;05 Jul, Sat     54   &lt;br /&gt;06 Jul, Sun     50   &lt;br /&gt;07 Jul, Mon     82   &lt;br /&gt;08 Jul, Tue     97   &lt;br /&gt;09 Jul, Wed     109   &lt;br /&gt;10 Jul, Thu     104   &lt;br /&gt;11 Jul, Fri     116   &lt;br /&gt;12 Jul, Sat     42   &lt;br /&gt;13 Jul, Sun     44   &lt;br /&gt;14 Jul, Mon     83   &lt;br /&gt;15 Jul, Tue     105   &lt;br /&gt;16 Jul, Wed     103   &lt;br /&gt;17 Jul, Thu     134   &lt;br /&gt;18 Jul, Fri     95   &lt;br /&gt;19 Jul, Sat     45   &lt;br /&gt;20 Jul, Sun     38   &lt;br /&gt;21 Jul, Mon     109   &lt;br /&gt;22 Jul, Tue     30&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;sparkline:sparkline value="100,109,54,50,82,97,109,104,116,42,44,83,105,103,134,95,45,38,109,30" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_xpwq_Sv0p98/SIVeqFeYtUI/AAAAAAAAAVY/BbKXhVljyl8/s1600-h/sparkline.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_xpwq_Sv0p98/SIVeqFeYtUI/AAAAAAAAAVY/BbKXhVljyl8/s400/sparkline.png" alt="" id="BLOGGER_PHOTO_ID_5225687019750470978" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-4478123568434970315?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/4478123568434970315/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=4478123568434970315' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/4478123568434970315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/4478123568434970315'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2008/07/grails-sparkline-plugin-in-action.html' title='Grails Sparkline plugin in action'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_xpwq_Sv0p98/SIVeqFeYtUI/AAAAAAAAAVY/BbKXhVljyl8/s72-c/sparkline.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-8677430671409740219</id><published>2008-07-22T11:02:00.003+08:00</published><updated>2008-07-22T11:09:57.935+08:00</updated><title type='text'>Laptop Tux sticker</title><content type='html'>Thanks a lot to &lt;a href="http://wingloon.com/2008/07/02/1st-year-anniversary-for-my-blog/"&gt;Wing Loon&lt;/a&gt; for the free 2 strips of 16 tux stickers. They are high quality and I indeed have lots of fun time rubbing the high quality tux sticker on my palmrest -- not to mention the brag session of that sticker. :D :D&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_xpwq_Sv0p98/SIVPBmaWpxI/AAAAAAAAAVQ/s1XGQju-TgY/s1600-h/DSC00216.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 354px; height: 250px;" src="http://bp3.blogger.com/_xpwq_Sv0p98/SIVPBmaWpxI/AAAAAAAAAVQ/s1XGQju-TgY/s400/DSC00216.JPG" alt="" id="BLOGGER_PHOTO_ID_5225669831542875922" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-8677430671409740219?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/8677430671409740219/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=8677430671409740219' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/8677430671409740219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/8677430671409740219'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2008/07/laptop-tux-sticker.html' title='Laptop Tux sticker'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_xpwq_Sv0p98/SIVPBmaWpxI/AAAAAAAAAVQ/s1XGQju-TgY/s72-c/DSC00216.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-20213756428040462</id><published>2008-07-17T15:03:00.002+08:00</published><updated>2008-07-17T15:09:35.716+08:00</updated><title type='text'>GUI Blopper -- Lenovo Contact Us page</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_xpwq_Sv0p98/SH7vLkpdE-I/AAAAAAAAAVI/uJ1QtLntg5U/s1600-h/blopper.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_xpwq_Sv0p98/SH7vLkpdE-I/AAAAAAAAAVI/uJ1QtLntg5U/s400/blopper.jpg" alt="" id="BLOGGER_PHOTO_ID_5223875599891502050" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The fact that the wording seems to make as if the user love to be spammed by Lenovo, it also assume that the user would&lt;span style="font-weight: bold;"&gt; like to &lt;/span&gt;receive news on new offerings and also&lt;span style="font-weight: bold;"&gt; not to&lt;/span&gt; received news on new offerings.&lt;br /&gt;&lt;br /&gt;This is pretty confusing!&lt;br /&gt;&lt;br /&gt;Who wrote these things anyway?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-20213756428040462?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/20213756428040462/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=20213756428040462' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/20213756428040462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/20213756428040462'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2008/07/gui-blopper-lenovo-contact-us-page.html' title='GUI Blopper -- Lenovo Contact Us page'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_xpwq_Sv0p98/SH7vLkpdE-I/AAAAAAAAAVI/uJ1QtLntg5U/s72-c/blopper.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-6691558499024324127</id><published>2008-07-09T11:45:00.001+08:00</published><updated>2008-07-09T11:47:56.426+08:00</updated><title type='text'>Berfungsi dengan Mozilla Firefox sahaja!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_xpwq_Sv0p98/SHQ0zfPZ3wI/AAAAAAAAAU8/FC3L8Ufbj18/s1600-h/Untitled.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_xpwq_Sv0p98/SHQ0zfPZ3wI/AAAAAAAAAU8/FC3L8Ufbj18/s400/Untitled.jpg" alt="" id="BLOGGER_PHOTO_ID_5220855927193329410" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This is very refreshing indeed -- way to go Penang.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-6691558499024324127?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/6691558499024324127/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=6691558499024324127' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/6691558499024324127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/6691558499024324127'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2008/07/berfungsi-dengan-mozilla-firefox-sahaja.html' title='Berfungsi dengan Mozilla Firefox sahaja!'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_xpwq_Sv0p98/SHQ0zfPZ3wI/AAAAAAAAAU8/FC3L8Ufbj18/s72-c/Untitled.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-7909710343648530341</id><published>2008-07-03T23:25:00.006+08:00</published><updated>2008-07-03T23:45:03.773+08:00</updated><title type='text'>UnixHacker</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_xpwq_Sv0p98/SGzw4vEZZtI/AAAAAAAAAUM/yuYQ8CPYeVM/s1600-h/UnixHacker_green.jpg"&gt;Interest to get one? Drop me a line. Price not sure yet but below RM 50.00.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_xpwq_Sv0p98/SGzw4vEZZtI/AAAAAAAAAUM/yuYQ8CPYeVM/s1600-h/UnixHacker_green.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_xpwq_Sv0p98/SGzw4vEZZtI/AAAAAAAAAUM/yuYQ8CPYeVM/s400/UnixHacker_green.jpg" alt="" id="BLOGGER_PHOTO_ID_5218810925713811154" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_xpwq_Sv0p98/SGzw0_UF_uI/AAAAAAAAAUE/pBnkxpkmTR4/s1600-h/UnixHacker_red.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_xpwq_Sv0p98/SGzw0_UF_uI/AAAAAAAAAUE/pBnkxpkmTR4/s400/UnixHacker_red.jpg" alt="" id="BLOGGER_PHOTO_ID_5218810861355138786" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_xpwq_Sv0p98/SGzz5H9n1tI/AAAAAAAAAUU/Bt9niawK0gI/s1600-h/UnixHacker_rails.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_xpwq_Sv0p98/SGzz5H9n1tI/AAAAAAAAAUU/Bt9niawK0gI/s400/UnixHacker_rails.jpg" alt="" id="BLOGGER_PHOTO_ID_5218814230931166930" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-7909710343648530341?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/7909710343648530341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=7909710343648530341' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/7909710343648530341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/7909710343648530341'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2008/07/unixhacker.html' title='UnixHacker'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_xpwq_Sv0p98/SGzw4vEZZtI/AAAAAAAAAUM/yuYQ8CPYeVM/s72-c/UnixHacker_green.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-6016042261927081343</id><published>2008-07-02T16:08:00.003+08:00</published><updated>2008-07-02T20:58:48.595+08:00</updated><title type='text'>I like this -- Death by Powerpoint</title><content type='html'>&lt;div style="width:425px;text-align:left" id="__ss_85551"&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=death-by-powerpoint4344"/&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=death-by-powerpoint4344" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;&lt;a href="http://www.slideshare.net/?src=embed"&gt;&lt;img src="http://static.slideshare.net/swf/logo_embd.png" style="border:0px none;margin-bottom:-5px" alt="SlideShare"/&gt;&lt;/a&gt; | &lt;a href="http://www.slideshare.net/thecroaker/death-by-powerpoint?src=embed" title="View Death by PowerPoint on SlideShare"&gt;View&lt;/a&gt; | &lt;a href="http://www.slideshare.net/upload?src=embed"&gt;Upload your own&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;I am making lots of presentation lately so until now I didn't know my presentation is more sucky than I thought.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-6016042261927081343?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/6016042261927081343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=6016042261927081343' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/6016042261927081343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/6016042261927081343'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2008/07/i-like-this-deatch-by-powerpoint.html' title='I like this -- Death by Powerpoint'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-4506066880050382309</id><published>2008-07-02T10:40:00.004+08:00</published><updated>2008-07-02T11:03:02.059+08:00</updated><title type='text'>Hey that was me!  -- Software Development with Ruby</title><content type='html'>I came across this &lt;a href="http://www.scribd.com/doc/96613/foss-ruby-software-development"&gt;slide (http://www.scribd.com/doc/96613/foss-ruby-software-development)&lt;/a&gt; that I almost forgot about.&lt;br /&gt;&lt;br /&gt;Damn that was not so long time ago and I am completely out of touch with Ruby now. I am still a Java guy though I am getting my hands pretty dirty with Django and Python.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_xpwq_Sv0p98/SGrtAfGVGHI/AAAAAAAAATk/ukrWfd4Kk2g/s1600-h/ruby_boy.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_xpwq_Sv0p98/SGrtAfGVGHI/AAAAAAAAATk/ukrWfd4Kk2g/s400/ruby_boy.jpg" alt="" id="BLOGGER_PHOTO_ID_5218243710865971314" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Shown here is my pet project with Ruby GTK+, &lt;a href="http://rubyforge.org/projects/bzzz/"&gt;&lt;span style="font-weight: bold;"&gt;bzzz&lt;/span&gt;&lt;/a&gt;. Yup I totally forgot about it. Maybe I should do a Python GTK+ version and a Groovy version too for old time sake. :D&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_xpwq_Sv0p98/SGrvy3jUoTI/AAAAAAAAATs/LsrNIm6Goe4/s1600-h/ruby_boy.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_xpwq_Sv0p98/SGrvy3jUoTI/AAAAAAAAATs/LsrNIm6Goe4/s400/ruby_boy.jpg" alt="" id="BLOGGER_PHOTO_ID_5218246775446741298" border="0" /&gt;&lt;/a&gt;The future of Ruby? erm...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-4506066880050382309?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/4506066880050382309/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=4506066880050382309' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/4506066880050382309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/4506066880050382309'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2008/07/hey-that-was-me-software-development.html' title='Hey that was me!  -- Software Development with Ruby'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_xpwq_Sv0p98/SGrtAfGVGHI/AAAAAAAAATk/ukrWfd4Kk2g/s72-c/ruby_boy.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-3131769607927757024</id><published>2008-06-28T19:22:00.004+08:00</published><updated>2008-06-29T13:42:15.683+08:00</updated><title type='text'>WIP: Grails Sparkline Plugin</title><content type='html'>Just a small preview of the &lt;a href="http://www.edwardtufte.com/bboard/q-and-a-fetch-msg?msg_id=0001OR=1"&gt;sparkline&lt;/a&gt; plugin that I am working on. Should be able to release it anytime now... just need to clean up the logs and give more options to the taglib. It seems that almost every platform have some kind of sparkline lib or addons except for Grails. Well not anymore. :D&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_xpwq_Sv0p98/SGYfRpxp3BI/AAAAAAAAATE/CR1OFL7z7G8/s1600-h/sparkline.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_xpwq_Sv0p98/SGYfRpxp3BI/AAAAAAAAATE/CR1OFL7z7G8/s400/sparkline.jpg" alt="" id="BLOGGER_PHOTO_ID_5216891606487653394" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;* Updates: Just released the plugin -- to install just do "grails install-plugin sparkline"&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-3131769607927757024?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/3131769607927757024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=3131769607927757024' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/3131769607927757024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/3131769607927757024'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2008/06/wip-grails-sparkline-plugin.html' title='WIP: Grails Sparkline Plugin'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_xpwq_Sv0p98/SGYfRpxp3BI/AAAAAAAAATE/CR1OFL7z7G8/s72-c/sparkline.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-6127711053915478738</id><published>2008-06-23T09:46:00.003+08:00</published><updated>2008-06-23T09:55:24.222+08:00</updated><title type='text'>Mercurial (hg) is nicer with colors turn on</title><content type='html'>I have been using hg for quite sometime now but only recently got the time to upgrade to the latest 1.0.1. I checked on the &lt;a href="http://www.selenic.com/mercurial/wiki/index.cgi/CategoryExtension"&gt;extensions available&lt;/a&gt; and saw this curious &lt;a href="http://www.selenic.com/mercurial/wiki/index.cgi/ColorExtension?highlight=%28CategoryExtension%29"&gt;Color Extension&lt;/a&gt;. I turn it on easily with:&lt;br /&gt;&lt;pre&gt;[extensions]&lt;br /&gt;&lt;span class="anchor" id="line-21"&gt;&lt;/span&gt;color=&lt;br /&gt;&lt;/pre&gt;And my goodness, shouldn't svn already have something like this long time ago? It's amazing how much Feel Good factor being generated by just having colors!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_xpwq_Sv0p98/SF8CPQ2yMgI/AAAAAAAAAS8/yoc8VOeDqMU/s1600-h/hg_color_ext.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_xpwq_Sv0p98/SF8CPQ2yMgI/AAAAAAAAAS8/yoc8VOeDqMU/s400/hg_color_ext.jpg" alt="" id="BLOGGER_PHOTO_ID_5214889354764366338" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-6127711053915478738?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/6127711053915478738/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=6127711053915478738' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/6127711053915478738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/6127711053915478738'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2008/06/mercurial-hg-is-nicer-with-colors-turn.html' title='Mercurial (hg) is nicer with colors turn on'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_xpwq_Sv0p98/SF8CPQ2yMgI/AAAAAAAAAS8/yoc8VOeDqMU/s72-c/hg_color_ext.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-9131894782854200321</id><published>2008-06-22T09:39:00.004+08:00</published><updated>2008-06-22T22:21:20.680+08:00</updated><title type='text'>Catchup on my readings...</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_xpwq_Sv0p98/SF2vQ-SbrdI/AAAAAAAAAS0/VqZlyIYs1f8/s1600-h/DSC00178.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_xpwq_Sv0p98/SF2vQ-SbrdI/AAAAAAAAAS0/VqZlyIYs1f8/s400/DSC00178.JPG" alt="" id="BLOGGER_PHOTO_ID_5214516649697979858" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Just managed to stack up all the books that were lying around my room. Some were re-reads and some are just plain too boring to finish.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-9131894782854200321?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/9131894782854200321/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=9131894782854200321' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/9131894782854200321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/9131894782854200321'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2008/06/catchup-on-my-readings.html' title='Catchup on my readings...'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_xpwq_Sv0p98/SF2vQ-SbrdI/AAAAAAAAAS0/VqZlyIYs1f8/s72-c/DSC00178.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-8289346705777277387</id><published>2008-06-06T15:53:00.002+08:00</published><updated>2008-06-06T15:58:26.549+08:00</updated><title type='text'>[ANN] Compress Grails Plugin Release</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_xpwq_Sv0p98/SEjtSuMyNCI/AAAAAAAAASU/XKO0K2mjnG4/s1600-h/compress_result.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_xpwq_Sv0p98/SEjtSuMyNCI/AAAAAAAAASU/XKO0K2mjnG4/s400/compress_result.jpg" alt="" id="BLOGGER_PHOTO_ID_5208673874949059618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I just release a new plugin to compress Grails output. This will be very helpful in cases where you have large CSS or Javascript files. See the above screen -- a whopping reduction from 1068KB to 220KB!&lt;br /&gt;&lt;br /&gt;Get it now;  &lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;grails install-plugin compress&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-8289346705777277387?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/8289346705777277387/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=8289346705777277387' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/8289346705777277387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/8289346705777277387'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2008/06/ann-compress-grails-plugin-release.html' title='[ANN] Compress Grails Plugin Release'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_xpwq_Sv0p98/SEjtSuMyNCI/AAAAAAAAASU/XKO0K2mjnG4/s72-c/compress_result.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-1246168675065573820</id><published>2008-06-05T09:05:00.003+08:00</published><updated>2008-06-05T09:09:50.318+08:00</updated><title type='text'>Pokey ma cheese pie</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_xpwq_Sv0p98/SEc8h_JUsgI/AAAAAAAAASM/QGPZWTTmvDU/s1600-h/paklah-akadnikah_edited.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_xpwq_Sv0p98/SEc8h_JUsgI/AAAAAAAAASM/QGPZWTTmvDU/s400/paklah-akadnikah_edited.png" alt="" id="BLOGGER_PHOTO_ID_5208198048661156354" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-1246168675065573820?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/1246168675065573820/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=1246168675065573820' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/1246168675065573820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/1246168675065573820'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2008/06/pokey-ma-cheese-pie.html' title='Pokey ma cheese pie'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_xpwq_Sv0p98/SEc8h_JUsgI/AAAAAAAAASM/QGPZWTTmvDU/s72-c/paklah-akadnikah_edited.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-2294199107312265921</id><published>2008-06-04T17:15:00.002+08:00</published><updated>2008-06-04T17:28:35.263+08:00</updated><title type='text'>Easy HTTP compression with mod_deflate</title><content type='html'>This is something that smack you in the face for not doing it any earlier. We have lots of internal documents served by our office Ubuntu server. Most of them are API docs which is in HTML. So it would make sense to turn on compression to save on the bandwidth.  Well okay, it's mostly LAN so it's not that important. But small files will be faster to load up.&lt;br /&gt;&lt;br /&gt;I am using Ubuntu Hardy so you may want to look up here on &lt;a href="http://www.howtoforge.com/apache2_mod_deflate"&gt;how to install mod_deflate&lt;/a&gt; manually.&lt;br /&gt;Anyway to get mod_deflate to work with Apache2 this is what you have to do:&lt;br /&gt;&lt;br /&gt;1. Sym link /etc/apache2/mod-available/deflate.conf and /etc/apache2/mod-available/deflate.load to /etc/apache2/mod-enable/&lt;br /&gt;&lt;br /&gt;2. Edit deflate.conf. The default compression is only turn on for html, xml and plain text files. Add in "text/css text/javascript application/javascript application/x-javascript". This will enable compression for CSS and Javascripts files.&lt;br /&gt;&lt;br /&gt;3. /etc/init.d/apache2 restart&lt;br /&gt;&lt;br /&gt;If you have Web Developer Toolbar installed in your Firefox, go to Information -&gt; View Document Size. You can see how much you have saved on the bandwith.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_xpwq_Sv0p98/SEZf_KqfxbI/AAAAAAAAASE/xMlJWuzjoVM/s1600-h/deflate.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_xpwq_Sv0p98/SEZf_KqfxbI/AAAAAAAAASE/xMlJWuzjoVM/s400/deflate.jpg" alt="" id="BLOGGER_PHOTO_ID_5207955557899552178" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-2294199107312265921?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/2294199107312265921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=2294199107312265921' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/2294199107312265921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/2294199107312265921'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2008/06/easy-http-compression-with-moddeflate.html' title='Easy HTTP compression with mod_deflate'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_xpwq_Sv0p98/SEZf_KqfxbI/AAAAAAAAASE/xMlJWuzjoVM/s72-c/deflate.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-319663855089267571</id><published>2008-05-22T12:05:00.002+08:00</published><updated>2008-05-22T12:10:16.632+08:00</updated><title type='text'>Using listener to update Window shadow</title><content type='html'>This is an update to my earlier post on fixing &lt;a href="http://shitmores.blogspot.com/2008/04/extjs-fixing-shadow-on-auto-resize.html"&gt;Window with closable fieldset&lt;/a&gt;. My earlier approach is to use event after creating the Window. The better and shorter approach is to make use of listener.&lt;br /&gt;&lt;br /&gt;So instead of :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;      Ext.getCmp('formfieldset').on("collapse", function() {&lt;br /&gt;         console.log("[fieldset] resize -- sync");&lt;br /&gt;         &lt;span style="color: rgb(204, 0, 0); font-weight: bold;"&gt;win.syncShadow();&lt;/span&gt;&lt;br /&gt;     }, this)&lt;/pre&gt;We can just do this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;form = new Ext.FormPanel({&lt;br /&gt;              labelWidth: 75, // label settings here cascade unless overridden&lt;br /&gt;              url:'save-form.php',&lt;br /&gt;              frame:true,&lt;br /&gt;              bodyStyle:'padding:5px 5px 0',&lt;br /&gt;              width: 350,&lt;br /&gt;              &lt;span style="color: rgb(204, 0, 0); font-weight: bold;"&gt;autoHeight:true,&lt;/span&gt;&lt;br /&gt;              defaults: {width: 240},&lt;br /&gt;              defaultType: 'textfield',&lt;br /&gt;          items :[{&lt;br /&gt;                  fieldLabel: 'Full Name',&lt;br /&gt;                  name: 'fullname',&lt;br /&gt;                  allowBlank:false&lt;br /&gt;              },{&lt;br /&gt;                  fieldLabel: 'Company',&lt;br /&gt;                  name: 'company'&lt;br /&gt;      },{&lt;br /&gt;          xtype:'fieldset',&lt;br /&gt;          id:'formfieldset',&lt;br /&gt;          title: 'Contact',&lt;br /&gt;          collapsible: true,&lt;br /&gt;          autoWidth:true,&lt;br /&gt;          &lt;span style="color: rgb(204, 0, 0); font-weight: bold;"&gt;autoHeight:true,&lt;/span&gt;&lt;br /&gt;          defaults: {width: 220},&lt;br /&gt;          defaultType: 'textfield',&lt;br /&gt;          items :[{&lt;br /&gt;                  fieldLabel: 'Email',&lt;br /&gt;                  name: 'email'&lt;br /&gt;              },{&lt;br /&gt;                  fieldLabel: 'Phone No#',&lt;br /&gt;                  name: 'mobile'&lt;br /&gt;              }&lt;br /&gt;          ]&lt;br /&gt;          }],&lt;br /&gt;          &lt;span style="color: rgb(204, 0, 0);"&gt;listeners:{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;                     collapse:function(panel) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;                     this.syncShadow();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;                   },&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;                   scope:this&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;          }&lt;/span&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/15692829-319663855089267571?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/319663855089267571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=319663855089267571' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/319663855089267571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/319663855089267571'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2008/05/using-listener-to-update-window-shadow.html' title='Using listener to update Window shadow'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-3234709710409406866</id><published>2008-05-22T11:58:00.003+08:00</published><updated>2008-05-22T12:02:54.981+08:00</updated><title type='text'>Shotest way to determine if a date is within the current month</title><content type='html'>Note to self:&lt;br /&gt;&lt;br /&gt;How to determine a given date is within the current month.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 204);"&gt;            def prevMonth = new GregorianCalendar()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 204);"&gt;            prevMonth.roll(Calendar.MONTH, -1)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 204);"&gt;            def nextMonth = new GregorianCalendar()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 204);"&gt;            nextMonth.roll(Calendar.MONTH, 1)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 204);"&gt;            if (update.after(prevMonth) &amp;amp;&amp;amp; update.before(nextMonth)) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 204);"&gt;                     &lt;span style="color: rgb(0, 102, 0);"&gt;//   println "Within this month"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 204);"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is in Groovy, but can easily be translated to Java.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-3234709710409406866?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/3234709710409406866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=3234709710409406866' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/3234709710409406866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/3234709710409406866'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2008/05/shotest-way-to-determine-is-date-is.html' title='Shotest way to determine if a date is within the current month'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-5991106033826583775</id><published>2008-04-17T10:43:00.005+08:00</published><updated>2008-04-18T13:37:12.519+08:00</updated><title type='text'>Book Review: Teach Yourself Django in 24 Hours</title><content type='html'>&lt;a href="http://www.amazon.com/gp/product/067232959X?ie=UTF8&amp;amp;tag=seymourcakes-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=067232959X"&gt;Sams Teach Yourself Django in 24 Hours (Sams Teach Yourself)&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=seymourcakes-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=067232959X" alt="" style="border: medium none  ! important; margin: 0px ! important; display: none;" border="0" width="1" height="1" /&gt; is indeed a good beginner Django book and no doubt will teach you Django within 24 hours. Of course you will not be an expert in Django with this book but more than enough to get started. The real stuff is the online reference anyway. :-)&lt;br /&gt;&lt;br /&gt;The content is easy to follow and &lt;a href="http://www.informit.com/authors/bio.aspx?a=019c47f0-0626-4d62-88ea-737dfd9c2515"&gt;Brad Dayley&lt;/a&gt; is no stranger to Python as he is the author of one of the best short Python book, &lt;a href="http://www.amazon.com/gp/product/0672329107?ie=UTF8&amp;amp;tag=seymourcakes-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0672329107"&gt;Python Phrasebook (Developer's Library)&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=seymourcakes-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0672329107" alt="" style="border: medium none  ! important; margin: 0px ! important; display: none;" border="0" width="1" height="1" /&gt;.&lt;br /&gt;&lt;br /&gt;I did find the chapter on Model lacking and seems incomplete. This frustrated me because the first thing I look for in the book is how to define and use &lt;a href="http://www.djangoproject.com/documentation/db-api/#many-to-many-relationships"&gt;many-to-many&lt;/a&gt;  model relationship in Django. Not much reference for this in the book beyond mere mentions. But this could be because &lt;a href="http://www.djangoproject.com/documentation/model-api/"&gt;Django API&lt;/a&gt; is still growing and as reflected by the online API.&lt;br /&gt;&lt;br /&gt;Despite that I am happy with the purchase. :-)&lt;br /&gt;&lt;br /&gt;In short this book deliver its promise of learning Django in just 24 hours. However I suggest you donate this copy away when you are comfortably using the online reference -- because this seems to be the book intention; get you started and then move you to the real world &lt;a href="http://www.djangoproject.com/documentation/"&gt;docs&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://rcm.amazon.com/e/cm?t=seymourcakes-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as1&amp;amp;asins=067232959X&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;lc1=0000FF&amp;amp;bc1=000000&amp;amp;bg1=FFFFFF&amp;amp;f=ifr" style="width: 120px; height: 240px; display: none;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-5991106033826583775?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/5991106033826583775/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=5991106033826583775' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/5991106033826583775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/5991106033826583775'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2008/04/test.html' title='Book Review: Teach Yourself Django in 24 Hours'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-5248417378777035455</id><published>2008-04-11T15:35:00.008+08:00</published><updated>2011-09-14T18:38:55.634+08:00</updated><title type='text'>ExtJs: Fixing shadow on auto resize Window on FieldSet open/collapse</title><content type='html'>I have been hunting the solution to auto resize &lt;a href="http://extjs.com/deploy/dev/docs/output/Ext.Window.html"&gt;Window &lt;/a&gt;on the collapse and open of a &lt;a href="http://extjs.com/deploy/dev/docs/output/Ext.form.FieldSet.html"&gt;FieldSet &lt;/a&gt;contained within. It is very simple actually but there is a catch.  Lets start with the usual Window and a &lt;a href="http://extjs.com/deploy/dev/docs/output/Ext.form.FormPanel.html"&gt;FormPanel&lt;/a&gt;. The FormPanel will have few fields and a FieldSet with few more fields. See screenshot. &lt;a href="http://bp0.blogger.com/_xpwq_Sv0p98/R_8Xgb5WOPI/AAAAAAAAAP4/HJa4ud8mbO8/s1600-h/1.JPG"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5187891141765642482" src="http://bp0.blogger.com/_xpwq_Sv0p98/R_8Xgb5WOPI/AAAAAAAAAP4/HJa4ud8mbO8/s400/1.JPG" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt; Simple enough, and here is the code:               &lt;br /&gt;&lt;pre&gt;      &lt;br /&gt;           form = new Ext.FormPanel({&lt;br /&gt;               labelWidth: 75, // label settings here cascade unless overridden&lt;br /&gt;               url:'save-form.php',&lt;br /&gt;               frame:true,&lt;br /&gt;               bodyStyle:'padding:5px 5px 0',&lt;br /&gt;               width: 350,&lt;br /&gt;               &lt;span style="color: #cc0000; font-weight: bold;"&gt;autoHeight:true,&lt;/span&gt;&lt;br /&gt;               defaults: {width: 240},&lt;br /&gt;               defaultType: 'textfield',&lt;br /&gt;           items :[{&lt;br /&gt;                   fieldLabel: 'Full Name',&lt;br /&gt;                   name: 'fullname',&lt;br /&gt;                   allowBlank:false&lt;br /&gt;               },{&lt;br /&gt;                   fieldLabel: 'Company',&lt;br /&gt;                   name: 'company'&lt;br /&gt;       },{&lt;br /&gt;           xtype:'fieldset',&lt;br /&gt;           id:'formfieldset',&lt;br /&gt;           title: 'Contact',&lt;br /&gt;           collapsible: true,&lt;br /&gt;           autoWidth:true,&lt;br /&gt;           &lt;span style="color: #cc0000; font-weight: bold;"&gt;autoHeight:true,&lt;/span&gt;&lt;br /&gt;           defaults: {width: 220},&lt;br /&gt;           defaultType: 'textfield',&lt;br /&gt;           items :[{&lt;br /&gt;                   fieldLabel: 'Email',&lt;br /&gt;                   name: 'email'&lt;br /&gt;               },{&lt;br /&gt;                   fieldLabel: 'Phone No#',&lt;br /&gt;                   name: 'mobile'&lt;br /&gt;               }&lt;br /&gt;           ]&lt;br /&gt;           }]&lt;br /&gt;       });&lt;br /&gt;&lt;br /&gt;           win = new Ext.Window({&lt;br /&gt;               layout:'fit',&lt;br /&gt;               width:360,&lt;br /&gt;              // height:300,&lt;br /&gt;               &lt;span style="color: #cc0000; font-weight: bold;"&gt;autoHeight:true,&lt;/span&gt;&lt;br /&gt;               closeAction:'hide',&lt;br /&gt;               plain: true,&lt;br /&gt;               items:form,&lt;br /&gt;               buttons: [{&lt;br /&gt;                   text:'Submit',&lt;br /&gt;                   disabled:true&lt;br /&gt;               },{&lt;br /&gt;                   text: 'Close',&lt;br /&gt;                   handler: function(){&lt;br /&gt;                       win.hide();&lt;br /&gt;                   }&lt;br /&gt;               }]&lt;br /&gt;           });&lt;br /&gt;&lt;/pre&gt;On clicking the FieldSet toggle button, the FormPanel would collapse nicely together with the Window. Note the &lt;span style="font-weight: bold;"&gt;autoHeight:true&lt;/span&gt; configuration for the Window, FormPanel and FieldSet.  But the catch is the Window's shadow will not be auto resize. See the below screenshot:  &lt;a href="http://bp3.blogger.com/_xpwq_Sv0p98/R_8YsL5WOQI/AAAAAAAAAQA/kBJ5KQg7_g0/s1600-h/2.JPG"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5187892443140733186" src="http://bp3.blogger.com/_xpwq_Sv0p98/R_8YsL5WOQI/AAAAAAAAAQA/kBJ5KQg7_g0/s400/2.JPG" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;We are expecting to see the FieldSet fold nicely and the Window auto resize together with the FormPanel. As discussed on &lt;a href="http://extjs.com/forum/showthread.php?t=17191"&gt;this thread&lt;/a&gt; this problem could be fixed by attaching to the resize event and call Window.syncShadow(); &lt;br /&gt;&lt;br /&gt;Looking into Panel.js code, toggling the FieldSet doesn't seem to trigger the resize event at all. So we would have to watch for the FieldSet collapse event instead. See the below code for the final fix.  &lt;br /&gt;&lt;pre&gt;        Ext.getCmp('formfieldset').on("collapse", function() {&lt;br /&gt;          console.log("[fieldset] resize -- sync");&lt;br /&gt;          &lt;span style="color: #cc0000; font-weight: bold;"&gt;win.syncShadow();&lt;/span&gt;&lt;br /&gt;      }, this)&lt;/pre&gt;&lt;a href="http://bp1.blogger.com/_xpwq_Sv0p98/R_8ZKr5WORI/AAAAAAAAAQI/9TpuoIxfRz4/s1600-h/3.JPG"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5187892967126743314" src="http://bp1.blogger.com/_xpwq_Sv0p98/R_8ZKr5WORI/AAAAAAAAAQI/9TpuoIxfRz4/s400/3.JPG" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Btw, have you guys heard about this &lt;a href="http://1fa99lhnwmz37qcimz2-m36s5k.hop.clickbank.net/?tid=OWNPRAGLANG" target="_top"&gt;book to create your own programming language? Less than 1000 pages and that's what the CoffeeScript guy uses (or inspired from) to create CoffeeScript. I'm reading it. It's cool, and you should check it out -- create your own language, for bragging rights or whatever.&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-5248417378777035455?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/5248417378777035455/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=5248417378777035455' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/5248417378777035455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/5248417378777035455'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2008/04/extjs-fixing-shadow-on-auto-resize.html' title='ExtJs: Fixing shadow on auto resize Window on FieldSet open/collapse'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_xpwq_Sv0p98/R_8Xgb5WOPI/AAAAAAAAAP4/HJa4ud8mbO8/s72-c/1.JPG' height='72' width='72'/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-6328738478361023609</id><published>2008-04-04T10:04:00.003+08:00</published><updated>2008-04-04T10:28:26.209+08:00</updated><title type='text'>Exploring Django - The Basic Cygwin Setup (1)</title><content type='html'>Some quick notes on how to get started with Django with cygwin on Windows. Lets start with the basic development setup with Cygwin and Sqlite3 database.&lt;br /&gt;&lt;br /&gt;1. Setup cygwin and install the latest Python 2.5. Well Cygwin by default will install Python so just make sure your cygwin has Python 2.3 and above -- that's the minimum Python requirement for Django.&lt;br /&gt;&lt;br /&gt;2. Download Django from &lt;a href="http://www.djangoproject.com/"&gt;Djangoproject.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;3. Install is straight forward, just tar xvfz and setup.py install. If you get confused at this stage, please consider Rails. :-)&lt;br /&gt;&lt;br /&gt;4. Next, setup the dev environment with Django and Sqlite3. Make sure your cygwin has sqlite3 installed and Gcc. I couldn't figure out how to install python-sqlite3 as cygwin package -- there's none -- so we will have to install from the egg.&lt;br /&gt;&lt;br /&gt;6. If you haven't install setuptools yet, go here &lt;a href="http://pypi.python.org/pypi/setuptools"&gt;http://pypi.python.org/pypi/setuptools&lt;/a&gt; to download and install setuptools.&lt;br /&gt;&lt;br /&gt;7. Then run "easy_install pysqlite3". This will auto install the latest Python-sqlite3 for you. The catch is you will need gcc installed. If your cygwin doesn't have gcc, re-run your cygwin's setup.exe and select gcc.&lt;br /&gt;&lt;br /&gt;8. After all this done -- took me about 20 minutes but this depends on your Internet speed :-D -- go watch this &lt;a href="http://www2.lamptraining.com/screencast/1/"&gt;Video&lt;/a&gt;. You should be up and running Django in another 3 minutes by following that Django newbie video.&lt;br /&gt;&lt;br /&gt;9. Go spend the next few hours trying to figure out why choose Django over Ruby on Rails and Grails. Hint: it's &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt;.&lt;br /&gt;Another hint: It's not Ruby.&lt;br /&gt;My tip: Use &lt;a href="http://grails.org/"&gt;Grails &lt;/a&gt;if you can. :D&lt;br /&gt;&lt;br /&gt;10. There is no step 10.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-6328738478361023609?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/6328738478361023609/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=6328738478361023609' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/6328738478361023609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/6328738478361023609'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2008/04/exploring-django-basic-cygwin-setup-1.html' title='Exploring Django - The Basic Cygwin Setup (1)'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-7422335915550199882</id><published>2008-04-03T13:19:00.002+08:00</published><updated>2008-04-03T13:20:23.593+08:00</updated><title type='text'>Asshole</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_xpwq_Sv0p98/R_RpD5Ls5LI/AAAAAAAAAPw/BwkqBEodMP4/s1600-h/iiso.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_xpwq_Sv0p98/R_RpD5Ls5LI/AAAAAAAAAPw/BwkqBEodMP4/s400/iiso.png" alt="" id="BLOGGER_PHOTO_ID_5184884586620708018" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-7422335915550199882?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/7422335915550199882/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=7422335915550199882' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/7422335915550199882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/7422335915550199882'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2008/04/asshole.html' title='Asshole'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_xpwq_Sv0p98/R_RpD5Ls5LI/AAAAAAAAAPw/BwkqBEodMP4/s72-c/iiso.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-4873867687298453736</id><published>2008-03-22T08:47:00.006+08:00</published><updated>2008-03-27T10:21:58.314+08:00</updated><title type='text'>Simple method events with Groovy meta-programming</title><content type='html'>Groovy has an amazing meta-programming capability and the behavior can be changed easily if you know where to look.&lt;br /&gt;&lt;br /&gt;Lets start with a simply concept of method event -- you can think of it as a primitive form of AOP if you want to -- and we want to automatically call a before* and after* methods on a method (huh?).&lt;br /&gt;&lt;br /&gt;Example;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;   class Person {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;       String name&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;       String toString() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;           return name&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;       }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;   }&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A simple &lt;span style="font-weight: bold; font-style: italic;"&gt;before&lt;/span&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;and &lt;span style="font-weight: bold; font-style: italic;"&gt;after &lt;/span&gt;event for toString method will be &lt;span style="font-style: italic; font-weight: bold;"&gt;before&lt;/span&gt;ToString() and &lt;span style="font-style: italic; font-weight: bold;"&gt;after&lt;/span&gt;ToString().&lt;br /&gt;&lt;br /&gt;With Groovy we can make use of its metaClass to intercept and modify its method behaviour. In this case we want to intercept all method call and check if it has any defined before and after event methods available and execute this methods.&lt;br /&gt;&lt;br /&gt;Lets go back and define the before and after method for toString;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;   class Person {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;       String name&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;       String beforeToString() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;       }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;       String toString() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;           return name&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;       }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;     String afterToString() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;       }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;   }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So now we have defined 2 before and after event method,&lt;br /&gt;lets look at the basic groovy code to make all these happen.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;Person.metaClass.invokeMethod = { String methodName, args -&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;   println "[invokeMethod] ${methodName}() called with ${args}"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;   def metaClass = Person.metaClass&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;   def method = methodName.getAt(0).toUpperCase() + methodName.substring(1)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt; &lt;span style="color: rgb(153, 51, 153); font-weight: bold;"&gt;  def beforeMethod = metaClass.getMetaMethod("before${method}", args)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;   def afterMethod = metaClass.getMetaMethod("after${method}", args)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;  &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;  &lt;span style="color: rgb(102, 51, 102); font-weight: bold;"&gt; if (beforeMethod) beforeMethod.invoke(delegate, args)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;  &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;   def metaMethod = metaClass.getMetaMethod(methodName, args)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;   def result&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;  &lt;span style="color: rgb(51, 0, 51); font-weight: bold;"&gt; if (metaMethod) result = metaMethod.invoke(delegate, args)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;  &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;   if (afterMethod) afterMethod.invoke(delegate, args)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;  &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;   return result&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;First we would have to look for the existence of before/after methods.&lt;br /&gt;This is done at this line:&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;def beforeMethod = metaClass.getMetaMethod("&lt;span style="font-weight: bold;"&gt;before${method}&lt;/span&gt;", args)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Then we execute them in the correct order:&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;if (beforeMethod) beforeMethod.invoke(delegate, args)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Finally, we execute the real method and return the result:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;       def metaMethod = metaClass.getMetaMethod(methodName, args)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;def result&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;       if (metaMethod) result = metaMethod.invoke(delegate, args)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Of course this is the very rough and basics of the method event and you still have to consider about cyclic-method-call prevention, continuation of method call, and proper return of method value.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-4873867687298453736?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/4873867687298453736/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=4873867687298453736' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/4873867687298453736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/4873867687298453736'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2008/03/simple-method-events-with-groovy-meta.html' title='Simple method events with Groovy meta-programming'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-8449441483152438288</id><published>2008-03-11T10:33:00.000+08:00</published><updated>2008-03-11T10:42:06.573+08:00</updated><title type='text'>Turn Web Apps into Desktop App With Prism Easily</title><content type='html'>Take a peek into future of Desktop webapps with Mozilla Prism, http://labs.mozilla.com/2007/10/prism/.&lt;br /&gt;&lt;br /&gt;If you are running Firefox 3b*, use this plugin, https://addons.mozilla.org/en-US/firefox/addon/6665.&lt;br /&gt;&lt;br /&gt;Then simply "Tools &gt; Convert Website to Application" and you have your desktop web application.&lt;br /&gt;&lt;br /&gt;The first thing I did was to turn GMail into my desktop app.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-8449441483152438288?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/8449441483152438288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=8449441483152438288' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/8449441483152438288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/8449441483152438288'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2008/03/turn-web-apps-into-desktop-app-with.html' title='Turn Web Apps into Desktop App With Prism Easily'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-6750201610797851753</id><published>2008-01-10T22:10:00.000+08:00</published><updated>2008-01-10T23:10:35.013+08:00</updated><title type='text'>[ANN]  JFreeChart Eastwood Servlet Plugin</title><content type='html'>I just finished the plugin for JFreeChart's Eastwood Servlet. You can find more information about Eastwood project &lt;a href="http://www.jfree.org/eastwood/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Basically it's a Google Chart API clone using JFreeChart. Well calling it clone may be an understatement as this is a really cool project.&lt;br /&gt;&lt;br /&gt;Anyway I have applied for a plugin developer account and so I hope to be able to upload to the repository soon, and in the meanwhile you can find the plugin &lt;a href="http://seymores.googlepages.com/grails-eastwood-chart-0.1.zip"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For a quick test, once installed open this page, http://localhost:8080/app/plugins/eastwood-chart-0.1/test.gsp. You should see the actual graphs produced from Google Chart on the left and the Eastwood charts on the right side.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_xpwq_Sv0p98/R4YpNq6-vdI/AAAAAAAAAE0/tbgh3ROV44w/s1600-h/gchart_eastwoodchart.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_xpwq_Sv0p98/R4YpNq6-vdI/AAAAAAAAAE0/tbgh3ROV44w/s400/gchart_eastwoodchart.png" alt="" id="BLOGGER_PHOTO_ID_5153852138408820178" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;(Charts produced by Google Chart on left and Eastwood charts on right)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="color: rgb(153, 51, 153);"&gt;**UPDATES:  File has been uploaded to the plugin repository. You can now install by the usual &lt;span style="font-style: italic;"&gt;"grails install-plugin eastwood-chart".&lt;/span&gt; For more information go to the plugin page, &lt;a href="http://grails.org/JFreeChart+Eastwood+Plugin"&gt;http://grails.org/JFreeChart+Eastwood+Plugin&lt;/a&gt;.&lt;/span&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/15692829-6750201610797851753?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/6750201610797851753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=6750201610797851753' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/6750201610797851753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/6750201610797851753'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2008/01/ann-jfreechart-eastwood-servlet-plugin.html' title='[ANN]  JFreeChart Eastwood Servlet Plugin'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_xpwq_Sv0p98/R4YpNq6-vdI/AAAAAAAAAE0/tbgh3ROV44w/s72-c/gchart_eastwoodchart.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-6784431937263482272</id><published>2008-01-04T19:32:00.000+08:00</published><updated>2008-01-04T20:21:06.602+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='extjs javascript pattern gui'/><title type='text'>ExtJs UI Pattern: User Selection Dialog</title><content type='html'>&lt;div align="center"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_xpwq_Sv0p98/R34VXa6-vcI/AAAAAAAAAEY/qKj--RvQkYM/s1600-h/user_dialog.png"&gt;&lt;img src="http://bp3.blogger.com/_xpwq_Sv0p98/R34VXa6-vcI/AAAAAAAAAEY/qKj--RvQkYM/s400/user_dialog.png" alt="" id="BLOGGER_PHOTO_ID_5151578515866303938" border="0" /&gt;&lt;/a&gt;&lt;span&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;User Selection Dialog&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;A flexible dialog for selecting user in groups.&lt;br /&gt;&lt;br /&gt;It is a common requirement to select user from a list of users grouped by hierarchy or role, for example  select a user from a department. The User Selection Dialog displays the group and users within the group in a tree structure. To select a user, click on the tree node. The selected node contains the user ID or primary key which will be then be processed by a function handler.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;How It Works&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;The User Selection Dialog is only responsible for displaying the user and group structure in a tree form, and will make available the  user ID or primary key  of the selected tree node.&lt;br /&gt;&lt;br /&gt;It is user responsible to code the handler to process the user ID or primary key. This will make the dialog highly reusable.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;Example Implementation and Usage&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;    var dialog = new UserSelectionDialog();&lt;br /&gt;    dialog.onFinished = function(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;userId&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;) {&lt;br /&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;//perform operation on the userId&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;        dialog.close();&lt;br /&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The dialog use is very simple here as we are only interested to get the selected node ID. The ID can represent the unique username or the primary key used in database.&lt;br /&gt;&lt;br /&gt;Below is the implementation of the dialog using ExtJS 2.0 with the new and improve way of extending ExtJs classes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;code&gt;&lt;span&gt;Ext.namespace('&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;span&gt;&lt;code&gt;&lt;span&gt;Myapp&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;span&gt;&lt;code&gt;&lt;span&gt;');&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;span&gt;&lt;code&gt;UserSelectionDialog = Ext.extend(Ext.Window, {&lt;br /&gt;&lt;br /&gt;     title: '&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;code&gt;User&lt;/code&gt;&lt;/span&gt;&lt;span&gt;&lt;code&gt; S&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;code&gt;electio&lt;/code&gt;&lt;/span&gt;&lt;span&gt;&lt;code&gt;n&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;code&gt;',&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;width: 280,&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;height: 300,&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;shadowOffset:6,&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;layout: 'fit',&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;iconCls: 'teamIcon',&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;buttonAlign: 'center',&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;initComponent: function() {&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    UserSelection&lt;/code&gt;&lt;code&gt;Dialog.superclass.initComponent.call(this);&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;  &lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;code&gt;  &lt;/code&gt;&lt;code&gt;/**&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;     &lt;/code&gt;&lt;code&gt;* Config for Tree and tree store&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;     &lt;/code&gt;&lt;code&gt;*/&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;var Tree = Ext.tree;&lt;/code&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;var root = new Tree.AsyncTreeNode({&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;text: 'Departments',&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;draggable:false,&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;expanded:true,&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;id:'source'&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;});&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;this.treePanel = new Tree.TreePanel({&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;autoScroll:true,&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;animate:true,&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;lines:true,&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;containerScroll:true,&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;loader: new Tree.TreeLoader({&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;dataUrl:    Util.ctxpath )+ '/user/treelist'&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;}),&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;selModel:new Tree.MultiSelectionModel(),&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;root:root&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;});&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;this.add(this.treePanel);&lt;br /&gt;&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;/**&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;     &lt;/code&gt;&lt;code&gt;* Config for buttons -- Close &amp;amp; Save&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt; &lt;/code&gt;&lt;code&gt;*/&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;var closeButton = new Ext.Button({&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;text:'Close',&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;scope:this,&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;minWidth:75,&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;handler:this.onClose&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;});&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;this.addButton(closeButton);&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;var okayButton = new Ext.Button({&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;text:'OK',&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;scope:this,&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;minWidth:75,&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;handler:this.onOkay&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;});&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;this.addButton(okayButton);&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;},&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;onClose: function() {&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;this.close();&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;},&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;onOkay: function() {&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;var nodes = &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;   &lt;/code&gt;&lt;code&gt;this.treePanel.getSelectionModel().getSelectedNodes();&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;var idlist = [];&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;for (n = 0; n &lt;&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;idlist[n] = nodes[n].id         }     &lt;br /&gt;         &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;this.onFinish(idlist)  &lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;},   &lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;span code=""&gt;&lt;span&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;code&gt;    /**&lt;br /&gt;     * This is the method to be handle by programmer&lt;br /&gt;     * to process the id returned by the tree selection.&lt;br /&gt;     * Note that multiple selection is possible hence&lt;br /&gt;     * the expected array from the tree.&lt;br /&gt;&lt;/code&gt;&lt;/span&gt;&lt;span&gt;&lt;code&gt;     */&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;onFinish: function(idList) {&lt;br /&gt;        &lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;code&gt;&lt;span&gt;&lt;i&gt;//XXX: Expect idList to be an array&lt;/i&gt;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;this.onClose;  &lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;}&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;code&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-6784431937263482272?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/6784431937263482272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=6784431937263482272' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/6784431937263482272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/6784431937263482272'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2008/01/extjs-ui-pattern-user-selection-dialog.html' title='ExtJs UI Pattern: User Selection Dialog'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_xpwq_Sv0p98/R34VXa6-vcI/AAAAAAAAAEY/qKj--RvQkYM/s72-c/user_dialog.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-6201022092669477986</id><published>2007-12-20T18:42:00.000+08:00</published><updated>2007-12-20T18:55:50.328+08:00</updated><title type='text'>Grails Open Flash Chart Plugin -- Progress towards 0.1 release</title><content type='html'>Updates:&lt;br /&gt;* Added taglib namespace&lt;br /&gt;* Adding all possible default sensible -- and pretty - default values&lt;br /&gt;* Added "pie" tag&lt;br /&gt;&lt;br /&gt;ToDo:&lt;br /&gt;1. Add "bar", "line", "area", etc tags&lt;br /&gt;2. Change default color themes to something pretty to the eyes&lt;br /&gt;3. Figure out how to combine multiple graph types into 1 chart&lt;br /&gt;4. Release o Grails plugin repository&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;For now, to create a simple pie chart, it can be simple as the tag properties below -- definitely will be shorter if using default values.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;           &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;&lt;/span&gt;&lt;span style="color: rgb(0, 100, 0);"&gt;chart&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;pie&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;title&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"AJAX Toolkit Usage Survey Dec '07,{font-size: 18px;color #d01f3c}"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;                     &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;x_axis_steps&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"1"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;                     &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;y_ticks&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"5,10,5"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;                     &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;line&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"3,#87421F"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;                     &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;y_min&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"0"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;                     &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;y_max&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"20"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;                     &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;alpha&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"60"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;                     &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;height&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"350"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;                     &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;width&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"350"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;                     &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;line_colour&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"#505050"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;                     &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;label_colour&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"#005600"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;                     &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;bg_colour&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"#ffffff"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;                     &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;pie_labels&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"Prototype,jQuery,Ext JS,Script.aculo.us,Mootools, I Use raw Ajax,JSON,Dojo,Backbase"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;                     &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;pie_values&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"34.10,29.30,22.50,14.30,13.00,12.90,11.90,8.30"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;                          &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;pie_slice_colours&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"#006600,#0066cc,#993300,#9933cc,#cc3300,#cc66cc,#ffcc00,#99ccff"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;                     &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;links&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"&lt;a href="http://ajaxian.com/archives/2007-ajax-tools-usage-survey-results"&gt;http://ajaxian.com/archives/2007-ajax-tools-usage-survey-results&lt;/a&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;                     &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;tool_tip&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"#val#%"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;             /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.surveymonkey.com/sr.aspx?sm=fXLiKcnKlD6cO5bRe961aBB6NCCWytRyY3rParAYmwA_3d"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_xpwq_Sv0p98/R2pJRK6-vbI/AAAAAAAAAEM/7N5GliUqz1k/s400/ajax_survey_chart.png" alt="" id="BLOGGER_PHOTO_ID_5146006083562552754" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-6201022092669477986?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/6201022092669477986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=6201022092669477986' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/6201022092669477986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/6201022092669477986'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2007/12/grails-open-flash-chart-plugin-progress.html' title='Grails Open Flash Chart Plugin -- Progress towards 0.1 release'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_xpwq_Sv0p98/R2pJRK6-vbI/AAAAAAAAAEM/7N5GliUqz1k/s72-c/ajax_survey_chart.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-4380349671620733606</id><published>2007-12-20T13:09:00.000+08:00</published><updated>2007-12-20T13:14:55.393+08:00</updated><title type='text'>Firefox 3b2 + Firebug?</title><content type='html'>To get Firefox 3.0b2 to work with Firebug, you need to install the patched &lt;a href="http://fireclipse.xucia.com/#Downloads"&gt;Firebug 1.1 beta from Fireclipse Project here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Anyway, just a short note on this patched Firebug:&lt;br /&gt;&lt;br /&gt;&lt;h3 style="font-style: italic; color: rgb(102, 102, 102);"&gt;Firebug 1.1 beta&lt;/h3&gt;&lt;span style="font-style: italic; color: rgb(102, 102, 102);"&gt;Firebug 1.1 is Firebug 1.05 by Joe Hewitt with enhancements and bug fixes by John J. Barton (IBM Almaden) and Max Stepanov (aptana)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="text-decoration: underline; font-style: italic; color: rgb(102, 102, 102);" href="http://fireclipse.xucia.com/files/fireclipse/firebug-1.1.0b10.xpi"&gt; Firebug-1.1.0b10&lt;/a&gt;&lt;span style="font-style: italic; color: rgb(102, 102, 102);"&gt; supports:  &lt;/span&gt;&lt;ul style="font-style: italic; color: rgb(102, 102, 102);"&gt;&lt;li&gt;eval() debugging,&lt;/li&gt;&lt;li&gt;external editor interface,&lt;br /&gt;&lt;/li&gt;&lt;li&gt;browser-generated event handler debugging,&lt;/li&gt;&lt;li&gt;executable lines marked with green line numbers,&lt;/li&gt;&lt;li&gt;user-controlled naming of eval() buffers,&lt;/li&gt;&lt;li&gt;Stack side panel on "Script" panel for callstack,&lt;/li&gt;&lt;li&gt;Supports Firefox 3,&lt;/li&gt;&lt;li&gt; "better" debugging icons,&lt;/li&gt;&lt;li&gt; CSS errors report against source lines,&lt;/li&gt;&lt;li&gt;bug fixes (incl. issues 8, 69, 218, 230, 239, 249, 269, 314, 321, 345)&lt;/li&gt;&lt;li&gt;Internal firebug debug output&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-style: italic; color: rgb(102, 102, 102);"&gt;The file is an XPI file that will add-on to Firefox as Firebug v1.1. Firefox's updater will allow you to get new experimental versions until Firebug 1.1 is official.  At that time the experimental version will be replaced by the official one when you update. Please report problems on the &lt;/span&gt;&lt;a style="font-style: italic; color: rgb(102, 102, 102);" href="http://groups.google.com/group/firebug"&gt;Firebug Group&lt;/a&gt;&lt;span style="font-style: italic; color: rgb(102, 102, 102);"&gt; or &lt;/span&gt;&lt;a style="font-style: italic; color: rgb(102, 102, 102);" href="http://code.google.com/p/fbug/issues/list"&gt;bug tracker&lt;/a&gt;&lt;span style="font-style: italic; color: rgb(102, 102, 102);"&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-4380349671620733606?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/4380349671620733606/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=4380349671620733606' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/4380349671620733606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/4380349671620733606'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2007/12/firefox-3b2-firebug.html' title='Firefox 3b2 + Firebug?'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-3479873127838625133</id><published>2007-12-19T19:02:00.000+08:00</published><updated>2007-12-19T19:13:09.007+08:00</updated><title type='text'>Note to self: Ext..DomQuery to traverse table</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:lucida grande;"&gt;Use &lt;a href="http://www.getfirebug.com/console.html"&gt;Firebug&lt;/a&gt; and &lt;a href="http://extjs.com/deploy/dev/docs/"&gt;ExtJs&lt;/a&gt;, then follow the &lt;a href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-64060425"&gt;rules&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    var table = Ext.query("&lt;span style="color: rgb(204, 0, 0);"&gt;#table-id&lt;/span&gt;")[0]; &lt;span style="color: rgb(0, 153, 0);"&gt;//would probably be $("table-id") in jQuery&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    var rows = table.rows;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;for (var i = 4; i &lt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span style="color: rgb(153, 51, 153);"&gt;console&lt;/span&gt;.log(rows[i]);&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    var cells = rows[i].cells;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span style="color: rgb(153, 51, 153);"&gt;console&lt;/span&gt;.log("&lt;span style="color: rgb(204, 0, 0);"&gt;Cell size: &lt;/span&gt;" + cells.length);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    for (var n = 0; n &lt; cells.length; n++) {&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span style="color: rgb(153, 51, 153);"&gt;console&lt;/span&gt;.log(cells[n]);&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&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/15692829-3479873127838625133?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/3479873127838625133/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=3479873127838625133' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/3479873127838625133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/3479873127838625133'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2007/12/note-to-self-extdomquery-to-traverse.html' title='Note to self: Ext..DomQuery to traverse table'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-903443346228676268</id><published>2007-12-18T14:20:00.000+08:00</published><updated>2007-12-18T14:42:04.717+08:00</updated><title type='text'>Grails Open Flash Chart Plugin</title><content type='html'>Just a little early preview of a plugin I am working on now.&lt;br /&gt;&lt;br /&gt;Using &lt;a href="http://teethgrinder.co.uk/open-flash-chart/"&gt;Open Flash Chart&lt;/a&gt;'s and Grails's plug-in, you can create cool Flash-based graphs like these:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_xpwq_Sv0p98/R2dpB66-vZI/AAAAAAAAAD8/rYXAZldONkY/s1600-h/charts.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_xpwq_Sv0p98/R2dpB66-vZI/AAAAAAAAAD8/rYXAZldONkY/s400/charts.jpg" alt="" id="BLOGGER_PHOTO_ID_5145196581011504530" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;An example of code to create a pie chart:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#008888"&gt;&amp;lt;&lt;/font&gt;g&lt;font color="#008888"&gt;:graph &lt;/font&gt;&lt;font color="#0070e6"&gt;title&lt;/font&gt;&lt;font color="#008888"&gt;=&lt;/font&gt;&lt;font color="#8016ff"&gt;&amp;quot;Pie Chart,{font-size: 18px;color #d01f3c}&amp;quot;&lt;/font&gt;&lt;br&gt;&lt;br /&gt;&lt;font color="#008888"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y_legend=&lt;/font&gt;&lt;font color="#8016ff"&gt;&amp;quot;Grails Open Flash Chart Plugin,12,#736AFF&amp;quot;&lt;/font&gt;&lt;br&gt;&lt;br /&gt;&lt;font color="#008888"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x_axis_steps=&lt;/font&gt;&lt;font color="#8016ff"&gt;&amp;quot;1&amp;quot;&lt;/font&gt;&lt;br&gt;&lt;br /&gt;&lt;font color="#008888"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y_ticks=&lt;/font&gt;&lt;font color="#8016ff"&gt;&amp;quot;5,10,5&amp;quot;&lt;/font&gt;&lt;br&gt;&lt;br /&gt;&lt;font color="#008888"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; line=&lt;/font&gt;&lt;font color="#8016ff"&gt;&amp;quot;3,#87421F&amp;quot;&lt;/font&gt;&lt;br&gt;&lt;br /&gt;&lt;font color="#008888"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y_min=&lt;/font&gt;&lt;font color="#8016ff"&gt;&amp;quot;0&amp;quot;&lt;/font&gt;&lt;br&gt;&lt;br /&gt;&lt;font color="#008888"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y_max=&lt;/font&gt;&lt;font color="#8016ff"&gt;&amp;quot;20&amp;quot;&lt;/font&gt;&lt;br&gt;&lt;br /&gt;&lt;font color="#008888"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pie=&lt;/font&gt;&lt;font color="#8016ff"&gt;&amp;quot;60,#505050,#000000&amp;quot;&lt;/font&gt;&lt;br&gt;&lt;br /&gt;&lt;font color="#008888"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; values=&lt;/font&gt;&lt;font color="#8016ff"&gt;&amp;quot;14,14,12,15,11&amp;quot;&lt;/font&gt;&lt;br&gt;&lt;br /&gt;&lt;font color="#008888"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pie_labels=&lt;/font&gt;&lt;font color="#8016ff"&gt;&amp;quot;IE,Firefox,Opera,Wii,Other&amp;quot;&lt;/font&gt;&lt;br&gt;&lt;br /&gt;&lt;font color="#008888"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; colours=&lt;/font&gt;&lt;font color="#8016ff"&gt;&amp;quot;#d01f3c,#356aa0,#C79810&amp;quot;&lt;/font&gt;&lt;br&gt;&lt;br /&gt;&lt;font color="#008888"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tool_tip=&lt;/font&gt;&lt;font color="#8016ff"&gt;&amp;quot;#val#%&amp;quot;&lt;/font&gt;&lt;font color="#008888"&gt;&amp;nbsp;/&amp;gt;&lt;/font&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/15692829-903443346228676268?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/903443346228676268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=903443346228676268' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/903443346228676268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/903443346228676268'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2007/12/grails-open-flash-chart-plugin.html' title='Grails Open Flash Chart Plugin'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_xpwq_Sv0p98/R2dpB66-vZI/AAAAAAAAAD8/rYXAZldONkY/s72-c/charts.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-4290270554871405040</id><published>2007-12-17T20:44:00.000+08:00</published><updated>2007-12-18T17:10:17.673+08:00</updated><title type='text'>ExtJs 2.0 Fileupload and Grails</title><content type='html'>If you are having problem with file uploads using ExtJs and Grails, this might help you.&lt;br /&gt;&lt;br /&gt;To upload file with the latest ExtJs 2.0, you need to specify the the &lt;a href="http://extjs.com/deploy/dev/docs/output/Ext.form.BasicForm.html"&gt;Ext.form.BasicForm&lt;/a&gt; to be configured as fileupload, just pass "fileUpload:true" to the config options. Then add a textfield as specify the "inputType" as "file". This will get you a ExtJs form with a standard File browser button to choose file.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_xpwq_Sv0p98/R2Zy866-vYI/AAAAAAAAAD0/7LVKz9xGUOo/s1600-h/fileupload.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_xpwq_Sv0p98/R2Zy866-vYI/AAAAAAAAAD0/7LVKz9xGUOo/s320/fileupload.png" alt="" id="BLOGGER_PHOTO_ID_5144926015251725698" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The tricky part comes next.&lt;br /&gt;&lt;br /&gt;Using latest Grails 1 RC4 snapshot, handling fileupload is still very easy -- in fact nothing changed at all on how to upload file. (&lt;a href="http://grails.org/doc/1.0.x/guide/single.html#6.1.8%20Uploading%20Files"&gt;Follow this guide to the upload details&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;However because ExtJs's formpanel is expecting JSON reply, typical HTTP 200 response is not valid and you will get error on the client side Javascript.&lt;br /&gt;&lt;br /&gt;The fine print is that, you need to specify the JSON response as normal "text/html" instead of "application/json" type. This is as simple as below:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;// render (someJsonResult as JSON) //won't work&lt;br /&gt;// render ([success:true, responseText:$msg] as JSON) won't work for &lt;span style="font-style: italic;"&gt;fileupload&lt;/span&gt;&lt;br /&gt;&lt;/span&gt; render "&lt;span style="color: rgb(51, 51, 255);"&gt;""{succes:&lt;span style="color: rgb(255, 102, 0);"&gt;${success}&lt;/span&gt;, responseText:"&lt;span style="color: rgb(255, 102, 0);"&gt;${msg}&lt;/span&gt;"}&lt;/span&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/15692829-4290270554871405040?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/4290270554871405040/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=4290270554871405040' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/4290270554871405040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/4290270554871405040'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2007/12/extjs-20-fileupload-and-grails.html' title='ExtJs 2.0 Fileupload and Grails'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_xpwq_Sv0p98/R2Zy866-vYI/AAAAAAAAAD0/7LVKz9xGUOo/s72-c/fileupload.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-4833455445328811811</id><published>2007-11-01T20:37:00.000+08:00</published><updated>2007-11-03T09:12:09.235+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>My first Linux experience many years back ...</title><content type='html'>Back then successful installation means a lot. Those were the RedHat 4 days. Heck even ordering Linux CD is not easy. Anyone still remember Cheapbytes?&lt;br /&gt;&lt;br /&gt;Just upgraded to Ubuntu 7.10 Gutsy. Damn, I don think I will spend a dime on Vista or Windows unless I am forced to.&lt;br /&gt;&lt;br /&gt;To everyone who still hesitates, do it now. It's going to be the smoothest Ubuntu upgrade you will ever have to deal with. There won't be a lingering doubt about clean re-install. I promise.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-4833455445328811811?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/4833455445328811811/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=4833455445328811811' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/4833455445328811811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/4833455445328811811'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2007/11/my-first-linux-experience-is-many-years.html' title='My first Linux experience many years back ...'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-4632764474542006880</id><published>2007-10-31T22:37:00.000+08:00</published><updated>2007-10-31T23:07:26.004+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><title type='text'>New Adventure with GWT</title><content type='html'>Now everyone knows I like to try out new technologies, especially if it has to do with Java, web, and agile way of doing things. I just finished messing around with ExtJs 2.0 and I got one word -- please wait for the final release, unless you have plenty of time on ya hands.&lt;br /&gt;&lt;br /&gt;Over the weekends I also tried out with Mootools and JQuery. This is after realizing Prototype is not so cool anymore, particularly when I found myself constantly wishing I can chain some effects together without using queue. So I digg out some examples with JQuery and chaining. JQuery is a clear winner here, though Mootools Fx stuff is very cool. But I'll blog about them next time.&lt;br /&gt;&lt;br /&gt;Today I want to remind myself that programming is hard, no matters what Grails or Spring framework, or ExtJs  or whater frameworks flavor of the day. Having hand code most of the AJAX stuff lately, I began to wonder if there's a better way to do things. So I took a break and look up Ajaxian. I found out about &lt;a href="http://googlewebtoolkit.blogspot.com/2007/08/gwt-14-release-and-out-of-beta.html"&gt;GWT 1.4 release&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Well why not. So I &lt;a href="http://code.google.com/webtoolkit/"&gt;downloaded the 1.4.60&lt;/a&gt; release for Linux, unzip it and run the samples according to the &lt;a href="http://code.google.com/webtoolkit/gettingstarted.html"&gt;get started guide&lt;/a&gt;. And I got this:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;Exception in thread "main" java.lang.UnsatisfiedLinkError: /mnt/windows/files/gwt-linux-1.4.60/libswt-pi-gtk-3235.so: /mnt/windows/files/gwt-linux-1.4.60/libswt-pi-gtk-3235.so: failed to map segment from shared object: Operation not permitted&lt;/span&gt; &lt;span style="color: rgb(204, 0, 0);"&gt;        at java.lang.ClassLoader$NativeLibrary.load(Native Method)&lt;/span&gt; &lt;span style="color: rgb(204, 0, 0);"&gt;        at&lt;/span&gt;&lt;span style="color: rgb(204, 0, 0);"&gt; java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1751)&lt;/span&gt; &lt;span style="color: rgb(204, 0, 0);"&gt;        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1647)&lt;/span&gt; &lt;span style="color: rgb(204, 0, 0);"&gt;        at java.lang.Runtime.load0(Runtime.java:770)&lt;/span&gt; &lt;span style="color: rgb(204, 0, 0);"&gt;        at java.lang.System.load(System.java:1005)&lt;/span&gt; &lt;span style="color: rgb(204, 0, 0);"&gt;        at org.eclipse.swt.internal.Library.loadLibrary(Library.java:132)&lt;/span&gt; &lt;span style="color: rgb(204, 0, 0);"&gt;        at org.eclipse.swt.internal.gtk.OS.&lt;clinit&gt;(OS.java:22)&lt;/clinit&gt;&lt;/span&gt; &lt;span style="color: rgb(204, 0, 0);"&gt;        at org.eclipse.swt.internal.Converter.wcsToMbcs(Converter.java:63)&lt;/span&gt; &lt;span style="color: rgb(204, 0, 0);"&gt;        at org.eclipse.swt.internal.Converter.wcsToMbcs(Converter.java:54)&lt;/span&gt; &lt;span style="color: rgb(204, 0, 0);"&gt;        at org.eclipse.swt.widgets.Display.&lt;clinit&gt;(Display.java:126)&lt;/clinit&gt;&lt;/span&gt; &lt;span style="color: rgb(204, 0, 0);"&gt;        at com.google.gwt.dev.GWTShell.&lt;clinit&gt;(GWTShell.java:264)&lt;/clinit&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;At 1.30 AM, I googled in vain for the solution so I posted up in the GWT Groups hoping for an answer by the time I come into office tomorrow morning. Morning came and hours passed, nobody gives a shit to my plea for help there.&lt;br /&gt;&lt;br /&gt;Well no matters, so I followed &lt;a href="http://code.google.com/webtoolkit/makinggwtbetter.html#compiling"&gt;the guide to build my own dist from the src. The guide for this is pretty straight forward&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I grab the tools and the trunk and it build myself. And it works then. I am not sure why it says my gwt is at version 0.0.0 though.&lt;br /&gt;&lt;br /&gt;At this point I think GWT is definitely a tool that is not getting enough attention than it should. As my first adventure, I am going to play with the samples. Next, my killer 2.0 app. :-D&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_xpwq_Sv0p98/RyiZozgrSoI/AAAAAAAAACk/7SzFFghwPVA/s1600-h/Screenshot-Kitchen+Sink+.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_xpwq_Sv0p98/RyiZozgrSoI/AAAAAAAAACk/7SzFFghwPVA/s320/Screenshot-Kitchen+Sink+.png" alt="" id="BLOGGER_PHOTO_ID_5127517102062389890" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-4632764474542006880?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/4632764474542006880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=4632764474542006880' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/4632764474542006880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/4632764474542006880'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2007/10/new-adventure-with-gwt.html' title='New Adventure with GWT'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_xpwq_Sv0p98/RyiZozgrSoI/AAAAAAAAACk/7SzFFghwPVA/s72-c/Screenshot-Kitchen+Sink+.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-7300881862397596109</id><published>2007-07-25T17:49:00.000+08:00</published><updated>2007-10-27T23:51:16.020+08:00</updated><title type='text'>SeymourCakes.com</title><content type='html'>&lt;strike&gt;&lt;span style="color: rgb(204, 0, 0);font-size:180%;" &gt;&lt;span style="font-family:lucida grande;"&gt;I'm moving now. Find me at&lt;/span&gt;&lt;br /&gt;&lt;a style="font-family: lucida grande;" href="http://seymourcakes.com/?cat=8"&gt;SeymourCakes.com&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;/strike&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;I am back.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-7300881862397596109?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/7300881862397596109/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=7300881862397596109' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/7300881862397596109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/7300881862397596109'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2007/07/seymourcakescom.html' title='SeymourCakes.com'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-4727659186697301029</id><published>2007-06-20T17:22:00.000+08:00</published><updated>2007-06-20T17:39:54.963+08:00</updated><title type='text'>How to create favicons for free</title><content type='html'>A favicon is the icon shown inside the browser's location bar and bookmark. It is a cool way to brand your site.&lt;br /&gt;&lt;br /&gt;Here is a short guide on how to create your own favicon for your website or blog.&lt;br /&gt;&lt;br /&gt;1. Startup Gimp&lt;br /&gt;2. Create a 16x16 pixel image.&lt;br /&gt;3. Zoom the image to at least 200%. (View -&gt; Zoom)&lt;br /&gt;4. Create your icon. You can import any graphic as long as it fit into the 16x16 space.&lt;br /&gt;5. Save as "favicon.ico".&lt;br /&gt;&lt;br /&gt;Next upload to the web server.&lt;br /&gt;&lt;br /&gt;1. Put the favicon.ico to the root directory of your server.&lt;br /&gt;2. Verify the icon is uploaded successfully by by http://www.yoursite.com/favicon.ico.&lt;br /&gt;3. Using Firefox to access your site again you will see the favicon immediately but may not be so if you are using IE. (Go ask Bill)&lt;br /&gt;&lt;br /&gt;Well of course if you are lazy, then use of the those favicon generators like this &lt;a href="http://tools.dynamicdrive.com/favicon/"&gt;one&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-4727659186697301029?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/4727659186697301029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=4727659186697301029' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/4727659186697301029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/4727659186697301029'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2007/06/how-to-create-favicons-for-free.html' title='How to create favicons for free'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-386724359206679948</id><published>2007-06-20T11:50:00.000+08:00</published><updated>2007-06-20T12:07:12.934+08:00</updated><title type='text'>Java regex matching date</title><content type='html'>I found many resources on the web give really weak regular expression for date matching. The best I found is &lt;a href="http://www.regular-expressions.info/dates.html"&gt;this&lt;/a&gt;. However, I found some example of pretty horrible regex for matching date in Java.&lt;br /&gt;&lt;br /&gt;For example, to match a date of 25/05/2007 (dd/mm/2007).&lt;br /&gt;&lt;ol&gt;&lt;li&gt;\\d\\d-\\d\\d-\\d\\d\\d\\d&lt;/li&gt;&lt;li&gt;\\d{2}-\\d{2}-\\d{4}&lt;/li&gt;&lt;/ol&gt;While these may work, but it won't be accurate. What is needed is:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;     &lt;span style="color: rgb(255, 102, 0);font-size:85%;" &gt;(0[1-9]|[1-9]|[12][0-9]|3[01])&lt;/span&gt;&lt;span style="font-size:85%;"&gt;-&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0);font-size:85%;" &gt;(0[1-9]|1[012]|[1-9])&lt;/span&gt;&lt;span style="font-size:85%;"&gt;-&lt;/span&gt;&lt;span style="color: rgb(204, 51, 204);font-size:85%;" &gt;(19|20)\\d{2}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255);font-size:130%;" &gt;     &lt;span style="color: rgb(255, 102, 0);"&gt;(0[1-9]|[1-9]|[12][0-9]|3[01])&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;This will make sure that date is within range from 1 to 31.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255);font-size:130%;" &gt;&lt;span style="color: rgb(51, 204, 0);"&gt;(0[1-9]|1[012]|[1-9])&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Similarly matches against month from 1-12 or 01-12&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255);font-size:130%;" &gt;&lt;span style="color: rgb(204, 51, 204);"&gt;(19|20)\\d{2}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;And of course year to be a valid 19** or 20**.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-386724359206679948?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/386724359206679948/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=386724359206679948' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/386724359206679948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/386724359206679948'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2007/06/java-regex-matching-date.html' title='Java regex matching date'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-7951698489576949822</id><published>2007-06-12T21:34:00.000+08:00</published><updated>2011-09-14T18:42:52.685+08:00</updated><title type='text'>Convert java.sql.Blob to String</title><content type='html'>For some reason I have put in really lots of effort to find the reference to convert Blob to String.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #3333ff;"&gt;Blob blob = rs.getBlob("Data");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3333ff;"&gt;byte[] bdata = blob.getBytes(1, (int) blob.length());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3333ff;"&gt;String text = new String(bdata);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i style="color: #666666;"&gt;Btw, have you guys heard about this &lt;a href="http://1fa99lhnwmz37qcimz2-m36s5k.hop.clickbank.net/?tid=OWNPRAGLANG" target="_top"&gt;book to create your own programming language? Less than 1000 pages and that's what the CoffeeScript guy uses (or inspired from) to create CoffeeScript. I'm reading it. It's cool, and you should check it out -- create your own language, for bragging rights or whatever.&lt;/a&gt;&lt;/i&gt;&lt;span style="color: #3333ff;"&gt;&lt;i style="color: #666666;"&gt; &lt;/i&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-7951698489576949822?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/7951698489576949822/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=7951698489576949822' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/7951698489576949822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/7951698489576949822'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2007/06/convert-javasqlblob-to-string.html' title='Convert java.sql.Blob to String'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-6745644163848593255</id><published>2007-04-22T12:26:00.000+08:00</published><updated>2007-04-22T13:28:02.400+08:00</updated><title type='text'>Tok: Chat program in 2 hours.</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_xpwq_Sv0p98/RirqnKxm4KI/AAAAAAAAABY/qSLFAlooM_A/s1600-h/tok.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_xpwq_Sv0p98/RirqnKxm4KI/AAAAAAAAABY/qSLFAlooM_A/s400/tok.png" alt="" id="BLOGGER_PHOTO_ID_5056111490305024162" border="0" /&gt;&lt;/a&gt;My DSL line was down for almost a week so I took the chance to get some quality offline-time to brush up on my Groovy. I thought about doing another IRC bot but that's kinda stale as I have done something similar with Ruby.&lt;br /&gt;&lt;br /&gt;I want to learn more on SwingBuilder and socket programming with Groovy. And that is when I thought about a simple multiuser chat system. What you are seeing above is Tok, simple chat system written in Groovy. The client and server is done in about 2 hours with &lt;a href="http://www.amazon.com/gp/product/1932394842?ie=UTF8&amp;tag=seymourcakes-20&amp;amp;linkCode=as2&amp;camp=1789&amp;amp;creative=9325&amp;creativeASIN=1932394842"&gt;Groovy in Action&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=seymourcakes-20&amp;amp;l=as2&amp;o=1&amp;amp;a=1932394842" alt="" style="border: medium none  ! important; margin: 0px ! important;" border="0" height="1" width="1" /&gt; as my guide.&lt;br /&gt;&lt;br /&gt;The first thing I did was to get the basic GUI up. As you can see from line 10 and line 21, creating basic Swing panel and frame is very easy. The tricky part is to get the layout right -- line 35. But then again layout has always been a PITA.&lt;br /&gt;&lt;br /&gt;For the client server communication I use XML-RPC. It's simple to setup and use in Groovy. Read line 52 - 55. Just start a server and listen for incoming message. The chat server will send updates to everyone who is listening.&lt;br /&gt;&lt;br /&gt;The server is a simple server that simply accepts a new client and register it to a list. The "ticket" is simply a serial int number -- indicating the port to be used for the server to connect to the client. See line 27 of the server code.&lt;br /&gt;&lt;br /&gt;Well this is a simple chat afterall so you should track by IP and maybe some string token as session control. Anytime a new message is sent from the client, the server will send back the same message to everyone registered in the server list. See line 19.&lt;br /&gt;&lt;br /&gt;&lt;u style="font-weight: bold; font-style: italic;"&gt;Tok client&lt;/u&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt; 1 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(200, 120, 60);"&gt;import&lt;/span&gt; groovy.swing.SwingBuilder&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt; 2 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(200, 120, 60);"&gt;import&lt;/span&gt; groovy.net.xmlrpc.XMLRPCServerProxy &lt;span style="color: rgb(0, 255, 0);"&gt;as&lt;/span&gt; Proxy&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt; 3 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(200, 120, 60);"&gt;import&lt;/span&gt; groovy.net.xmlrpc.XMLRPCServer &lt;span style="color: rgb(0, 255, 0);"&gt;as&lt;/span&gt; Server&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt; 4 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt; 5 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(200, 120, 60);"&gt;import&lt;/span&gt; java.net.ServerSocket&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt; 6 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(200, 120, 60);"&gt;import&lt;/span&gt; java.awt.BorderLayout &lt;span style="color: rgb(0, 255, 0);"&gt;as&lt;/span&gt; BL&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt; 7 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(200, 120, 60);"&gt;import&lt;/span&gt; javax.swing.WindowConstants &lt;span style="color: rgb(0, 255, 0);"&gt;as&lt;/span&gt; WC&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt; 8 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt; 9 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0); font-weight: bold; color: rgb(255, 204, 102);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;10&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 255, 0);"&gt;def&lt;/span&gt; swing = &lt;span style="color: rgb(255, 255, 0);"&gt;new&lt;/span&gt; SwingBuilder()&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;11 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 255, 0);"&gt;def&lt;/span&gt; content = &lt;span style="color: rgb(255, 255, 0);"&gt;new&lt;/span&gt; StringBuffer()&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;12 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 255, 0);"&gt;def&lt;/span&gt; remote = &lt;span style="color: rgb(255, 255, 0);"&gt;new&lt;/span&gt; Proxy(&lt;span style="color: rgb(204, 204, 153);"&gt;'&lt;a href="http://localhost:8081/"&gt;http://localhost:8081/&lt;/a&gt;'&lt;/span&gt;)&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;13 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;14 &lt;/span&gt;&lt;/span&gt;newMsg = swing.action( name:&lt;span style="color: rgb(204, 204, 153);"&gt;'newMessage'&lt;/span&gt;, closure: {&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;15 &lt;/span&gt;&lt;/span&gt;    msg = remote.chat( swing.inputMsg.text )&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;16 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(153, 153, 153);"&gt;//content &amp;lt;&amp;lt; "&amp;lt;br&amp;gt; ${msg}" &lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;17 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(153, 153, 153);"&gt;//swing.msgPane.text = content &lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;18 &lt;/span&gt;&lt;/span&gt;    swing.inputMsg.text = &lt;span style="color: rgb(204, 204, 153);"&gt;""&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;19 &lt;/span&gt;&lt;/span&gt;} )&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;20 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;21&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 255, 0);"&gt;def&lt;/span&gt; frame = swing.frame( title:&lt;span style="color: rgb(204, 204, 153);"&gt;'Tok'&lt;/span&gt; ) {&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;22 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(153, 153, 153);"&gt;// Menu bar&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;23 &lt;/span&gt;&lt;/span&gt;    menuBar {&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;24 &lt;/span&gt;&lt;/span&gt;        menu(&lt;span style="color: rgb(204, 204, 153);"&gt;'File'&lt;/span&gt;) {&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;25 &lt;/span&gt;&lt;/span&gt;            menuItem &lt;span style="color: rgb(204, 204, 153);"&gt;'Quit'&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;26 &lt;/span&gt;&lt;/span&gt;        }&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;27 &lt;/span&gt;&lt;/span&gt;        menu(&lt;span style="color: rgb(204, 204, 153);"&gt;'Edit'&lt;/span&gt;) {&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;28 &lt;/span&gt;&lt;/span&gt;        }&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;29 &lt;/span&gt;&lt;/span&gt;        menu(&lt;span style="color: rgb(204, 204, 153);"&gt;'Help'&lt;/span&gt;) {&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;30 &lt;/span&gt;&lt;/span&gt;            menuItem &lt;span style="color: rgb(204, 204, 153);"&gt;'About'&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;31 &lt;/span&gt;&lt;/span&gt;        }&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;32 &lt;/span&gt;&lt;/span&gt;    }&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;33 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;34 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(153, 153, 153);"&gt;// Panel&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;&lt;span style="color: rgb(255, 255, 0); font-weight: bold;"&gt;35&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;    panel( layout: &lt;span style="color: rgb(255, 255, 0);"&gt;new&lt;/span&gt; BL() ) {&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;36 &lt;/span&gt;&lt;/span&gt;        scrollPane( constraints: BL.CENTER ) {&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;37 &lt;/span&gt;&lt;/span&gt;            editorPane( id:&lt;span style="color: rgb(204, 204, 153);"&gt;'msgPane'&lt;/span&gt;, editable:&lt;span style="color: rgb(160, 150, 60);"&gt;false&lt;/span&gt;, preferredSize:[&lt;span style="color: rgb(160, 150, 60);"&gt;60&lt;/span&gt;, &lt;span style="color: rgb(160, 150, 60);"&gt;100&lt;/span&gt;],&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;38 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(230, 110, 70);"&gt;                        editorKit&lt;/span&gt;: &lt;span style="color: rgb(255, 255, 0);"&gt;new&lt;/span&gt; javax.swing.text.html.HTMLEditorKit() )&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;39 &lt;/span&gt;&lt;/span&gt;        }&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;40 &lt;/span&gt;&lt;/span&gt;        panel(constraints: BL.SOUTH) {&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;41 &lt;/span&gt;&lt;/span&gt;            textField(id:&lt;span style="color: rgb(204, 204, 153);"&gt;'inputMsg'&lt;/span&gt;, columns:&lt;span style="color: rgb(160, 150, 60);"&gt;20&lt;/span&gt;)&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;42 &lt;/span&gt;&lt;/span&gt;            button( action:newMsg, &lt;span style="color: rgb(204, 204, 153);"&gt;'Go'&lt;/span&gt; )&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;43 &lt;/span&gt;&lt;/span&gt;        }&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;44 &lt;/span&gt;&lt;/span&gt;    }&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;45 &lt;/span&gt;&lt;/span&gt;}&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;46 &lt;/span&gt;&lt;/span&gt;content &lt;span style="color: rgb(51, 51, 51);"&gt;&lt;&lt;&lt;/span&gt; &lt;span style="color: rgb(204, 204, 153);"&gt;"&lt;small&gt;Tok session started on &lt;/small&gt;&lt;/span&gt;&lt;span style="color: rgb(102, 102, 0);"&gt;&lt;small&gt;${new Date().toString()}&lt;/small&gt;&lt;/span&gt;&lt;span style="color: rgb(204, 204, 153);"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;47 &lt;/span&gt;&lt;/span&gt;swing.msgPane.text = content&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;48 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;49 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;// Perform client registration to the chat network&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;50 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(230, 100, 30);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; ticket = remote.&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;register&lt;/span&gt;&lt;/span&gt;()&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;51 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(230, 250, 70);"&gt;println&lt;/span&gt; &lt;span style="color: rgb(204, 204, 153);"&gt;"TICKET: &lt;/span&gt;&lt;span style="color: rgb(230, 250, 70);"&gt;${ticket}&lt;/span&gt;&lt;span style="color: rgb(204, 204, 153);"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;&lt;span style="color: rgb(51, 255, 51); font-weight: bold;"&gt;52&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 255, 0);"&gt;def&lt;/span&gt; server = &lt;span style="color: rgb(255, 255, 0);"&gt;new&lt;/span&gt; Server()&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0); color: rgb(51, 255, 51);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;&lt;span style="color: rgb(51, 255, 51); font-weight: bold;"&gt;53&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;server.startServer( &lt;span style="color: rgb(255, 255, 0);"&gt;new&lt;/span&gt; ServerSocket(ticket) )&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;54 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;&lt;span style="color: rgb(51, 255, 51); font-weight: bold;"&gt;55&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;server.update = { msg &lt;span style="color: rgb(255, 255, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;56 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(230, 250, 70);"&gt;print&lt;/span&gt; msg&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;57 &lt;/span&gt;&lt;/span&gt;    content &lt;&lt; &lt;span style="color: rgb(204, 204, 153);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(230, 250, 70);"&gt;${msg}&lt;/span&gt;&lt;span style="color: rgb(204, 204, 153);"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;58 &lt;/span&gt;&lt;/span&gt;    swing.msgPane.text = content&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;59 &lt;/span&gt;&lt;/span&gt;}&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;60 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;61 &lt;/span&gt;&lt;/span&gt;frame.pack()&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;62 &lt;/span&gt;&lt;/span&gt;frame.setDefaultCloseOperation( WC.EXIT_ON_CLOSE )&lt;br /&gt;&lt;span style="background-color: rgb(190, 30, 0);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;63 &lt;/span&gt;&lt;/span&gt;frame.show()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;u style="font-weight: bold; font-style: italic;"&gt;Tok Server&lt;/u&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;span style="color: rgb(70, 130, 180);"&gt; 1 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(126, 111, 39);"&gt;import&lt;/span&gt; groovy.net.xmlrpc.XMLRPCServer &lt;span style="color: rgb(0, 0, 0);"&gt;as&lt;/span&gt; Server&lt;br /&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;span style="color: rgb(70, 130, 180);"&gt; 2 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(126, 111, 39);"&gt;import&lt;/span&gt; groovy.net.xmlrpc.XMLRPCServerProxy &lt;span style="color: rgb(0, 0, 0);"&gt;as&lt;/span&gt; Proxy&lt;br /&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;span style="color: rgb(70, 130, 180);"&gt; 3 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(126, 111, 39);"&gt;import&lt;/span&gt; java.net.ServerSocket&lt;br /&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;span style="color: rgb(70, 130, 180);"&gt; 4 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;span style="color: rgb(70, 130, 180);"&gt; 5 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;span style="color: rgb(70, 130, 180);"&gt; 6 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;def&lt;/span&gt; ticket = &lt;span style="color: rgb(170, 113, 47);"&gt;9991&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;span style="color: rgb(70, 130, 180);"&gt; 7 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;def&lt;/span&gt; clients = []&lt;br /&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;span style="color: rgb(70, 130, 180);"&gt; 8 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;span style="color: rgb(70, 130, 180);"&gt; 9 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;def&lt;/span&gt; server = &lt;span style="color: rgb(0, 191, 255);"&gt;new&lt;/span&gt; Server()&lt;br /&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;span style="color: rgb(70, 130, 180);"&gt;10 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;span style="color: rgb(70, 130, 180);"&gt;11 &lt;/span&gt;&lt;/span&gt;server.chat = { msg &lt;span style="color: rgb(0, 191, 255);"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;span style="color: rgb(70, 130, 180);"&gt;12 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(30, 144, 255);"&gt;println&lt;/span&gt; msg&lt;br /&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;span style="color: rgb(70, 130, 180);"&gt;13 &lt;/span&gt;&lt;/span&gt;        clients.&lt;span style="color: rgb(30, 144, 255);"&gt;each&lt;/span&gt; { client &lt;span style="color: rgb(0, 191, 255);"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;span style="color: rgb(70, 130, 180);"&gt;14 &lt;/span&gt;&lt;/span&gt;            &lt;span style="color: rgb(254, 248, 255);"&gt;//client.update( msg )&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;span style="color: rgb(70, 130, 180);"&gt;15 &lt;/span&gt;&lt;/span&gt;            updateClient(client, msg)&lt;br /&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;span style="color: rgb(70, 130, 180);"&gt;16 &lt;/span&gt;&lt;/span&gt;    }&lt;br /&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;span style="color: rgb(70, 130, 180);"&gt;17 &lt;/span&gt;&lt;/span&gt;}&lt;br /&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;span style="color: rgb(70, 130, 180);"&gt;18 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;span style="color: rgb(70, 130, 180);"&gt;&lt;span style="font-weight: bold; color: rgb(102, 255, 255);"&gt;19&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;def&lt;/span&gt; updateClient(client, msg) {&lt;br /&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;span style="color: rgb(70, 130, 180);"&gt;20 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(126, 88, 39);"&gt;&lt;b&gt;try&lt;/b&gt;&lt;/span&gt; {&lt;br /&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;span style="color: rgb(70, 130, 180);"&gt;21 &lt;/span&gt;&lt;/span&gt;        client.update( msg )&lt;br /&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;span style="color: rgb(70, 130, 180);"&gt;22 &lt;/span&gt;&lt;/span&gt;    } &lt;span style="color: rgb(126, 88, 39);"&gt;&lt;b&gt;catch&lt;/b&gt;&lt;/span&gt; (&lt;span style="color: rgb(126, 88, 39);"&gt;&lt;b&gt;Exception&lt;/b&gt;&lt;/span&gt; ex) {&lt;br /&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;span style="color: rgb(70, 130, 180);"&gt;23 &lt;/span&gt;&lt;/span&gt;        &lt;span style="color: rgb(30, 144, 255);"&gt;println&lt;/span&gt; ex&lt;br /&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;span style="color: rgb(70, 130, 180);"&gt;24 &lt;/span&gt;&lt;/span&gt;    }&lt;br /&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;span style="color: rgb(70, 130, 180);"&gt;25 &lt;/span&gt;&lt;/span&gt;}&lt;br /&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;span style="color: rgb(70, 130, 180);"&gt;26 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;span style="color: rgb(70, 130, 180);"&gt;&lt;span style="font-weight: bold; color: rgb(51, 255, 255);"&gt;27&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;server.&lt;span style="background-color: rgb(204, 56, 7);"&gt;&lt;span style="color: rgb(222, 184, 135);"&gt;register&lt;/span&gt;&lt;/span&gt; = {&lt;br /&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;span style="color: rgb(70, 130, 180);"&gt;28 &lt;/span&gt;&lt;/span&gt;    clients &lt;&lt;&lt;span style="color: rgb(0, 191, 255);"&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 191, 255);"&gt;new&lt;/span&gt; Proxy(&lt;span style="color: rgb(70, 130, 180);"&gt;"&lt;a href="http://localhost/"&gt;http://localhost:&lt;/a&gt;&lt;/span&gt;&lt;span style="color: rgb(94, 56, 7);"&gt;${ticket}&lt;/span&gt;&lt;span style="color: rgb(70, 130, 180);"&gt;"&lt;/span&gt;)&lt;br /&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;span style="color: rgb(70, 130, 180);"&gt;29 &lt;/span&gt;&lt;/span&gt;   &lt;span style="color: rgb(126, 88, 39);"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt; ticket++&lt;br /&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;span style="color: rgb(70, 130, 180);"&gt;30 &lt;/span&gt;&lt;/span&gt;}&lt;br /&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;span style="color: rgb(70, 130, 180);"&gt;31 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;span style="color: rgb(70, 130, 180);"&gt;32 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;def&lt;/span&gt; socket = &lt;span style="color: rgb(0, 191, 255);"&gt;new&lt;/span&gt; ServerSocket(&lt;span style="color: rgb(170, 113, 47);"&gt;8081&lt;/span&gt;)&lt;br /&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;span style="color: rgb(70, 130, 180);"&gt;33 &lt;/span&gt;&lt;/span&gt;server.startServer(socket)&lt;br /&gt;&lt;span style="background-color: rgb(5, 5, 5);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-6745644163848593255?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/6745644163848593255/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=6745644163848593255' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/6745644163848593255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/6745644163848593255'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2007/04/tok-chat-program-in-2-hours.html' title='Tok: Chat program in 2 hours.'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_xpwq_Sv0p98/RirqnKxm4KI/AAAAAAAAABY/qSLFAlooM_A/s72-c/tok.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-3714591915740312950</id><published>2007-04-21T22:32:00.000+08:00</published><updated>2007-04-21T23:25:48.897+08:00</updated><title type='text'>Grails + Ext Grid Mini Tutorial</title><content type='html'>Ext Grid component is very easy to use with Grails listing. However you should go over the &lt;a href="http://extjs.com/tutorial/beginning-using-grid-component"&gt;basic Grids tutorial&lt;/a&gt; and then the &lt;a href="http://extjs.com/tutorial/basics-paging-grid-component"&gt;paging Grid tutorial&lt;/a&gt; first.&lt;br /&gt;&lt;br /&gt;Because the Grid component talk to your Grails controller with either XML or JSON, you have to use &lt;a href="http://grails.codehaus.org/Ajax"&gt;XML or JSON builde&lt;/a&gt;r. Render your XML data like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; render(contentType:'text/xml') {&lt;br /&gt;     Minutes {&lt;br /&gt;         totalCount(totalRecordCount)&lt;br /&gt;             for(m in results) {&lt;br /&gt;                 Minute {&lt;br /&gt;                     ID(m.id)&lt;br /&gt;                     Subject(m.subject)&lt;br /&gt;                     MeetingSummary(m.meetingSummary)&lt;br /&gt;                     Scribe(m.scribe)&lt;br /&gt;                     Venue(m.venue)&lt;br /&gt;                     MeetingStartTime(m.meetingStartTime)&lt;br /&gt;                     MeetingEndTime(m.meetingEndTime)&lt;br /&gt;                 }&lt;br /&gt;             }&lt;br /&gt;     }&lt;br /&gt;&lt;/pre&gt;That's about the only thing you'd have to do on your Grails controller to output the XML data. Then if you follow through the Grid component example, you should get ya data rows on the Grid. Next enable paging, you need to a few modifications.&lt;br /&gt;&lt;br /&gt;Use DomainClass.count() method to get the total number of records. Generate that along with the XML data.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(192, 192, 192);"&gt; render(contentType:'text/xml') {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(192, 192, 192);"&gt;         Minutes {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;             totalCount(totalRecordCount)&lt;/span&gt;&lt;br /&gt;             &lt;span style="color: rgb(192, 192, 192);"&gt;for(m in results) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(192, 192, 192);"&gt;                     Minute {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(192, 192, 192);"&gt;                         ID(m.id)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(192, 192, 192);"&gt;                         Subject(m.subject)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(192, 192, 192);"&gt;                         MeetingSummary(m.meetingSummary)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(192, 192, 192);"&gt;                         Scribe(m.scribe)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(192, 192, 192);"&gt;                         Venue(m.venue)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(192, 192, 192);"&gt;                         MeetingStartTime(m.meetingStartTime)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(192, 192, 192);"&gt;                         MeetingEndTime(m.meetingEndTime)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(192, 192, 192);"&gt;                     }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(192, 192, 192);"&gt;                 }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(192, 192, 192);"&gt;         }&lt;/span&gt;&lt;/pre&gt;In your controller, you need to get 2 params from Grid, "start" and "limit". This is passed by the datastore during load time (Refer to the paging tutorial) . Grails paging need "offset" and "max" to work so we will just assign "start" to "offset" and "limit" to "max".&lt;br /&gt;&lt;br /&gt;       &lt;span style="color: rgb(255, 153, 255);"&gt;    results = DomainClass.list(&lt;/span&gt; &lt;span style="color: rgb(204, 51, 204); font-weight: bold;"&gt;[offset:params.start, max:params.limit]&lt;span style="color: rgb(255, 153, 255);"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 153, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Well you can also change the default example paging params to "offset" and "max" staightaway instead of reassign them in the controller.&lt;br /&gt;&lt;br /&gt;       &lt;span style="color: rgb(255, 153, 255);"&gt;     ds.load(&lt;span style="font-weight: bold; color: rgb(204, 51, 204);"&gt;{params:&lt;span style="color: rgb(153, 51, 153);"&gt;{offset:0, max:25}&lt;/span&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/15692829-3714591915740312950?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/3714591915740312950/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=3714591915740312950' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/3714591915740312950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/3714591915740312950'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2007/04/grails-ext-grid-mini-tutorial.html' title='Grails + Ext Grid Mini Tutorial'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-1297463548433037468</id><published>2007-04-21T21:58:00.000+08:00</published><updated>2007-04-21T22:29:17.726+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails ext ajax'/><title type='text'>Grails + Ext Exprience Log</title><content type='html'>I found out about &lt;a href="http://extjs.com/"&gt;Ext&lt;/a&gt; recently and was taken by the slick UI. Diving into the &lt;a href="http://extjs.com/learn-about-ext-javascript-library"&gt;documentations and tutorials&lt;/a&gt; I find Ext suspiciously easy to implement. I have been using Grails a lot since beginning of this year but I am still looking something looks as cool as &lt;a href="http://www.nextapp.com/platform/echo2/echo/demo/"&gt;Echo2&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So on Monday night, I started with a small project to get a Grails app integrate with Ext. I worked with the Ext components one by one until I get a fully functional Meeting Minute tracker sort of application. And this is what I got to show for.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_xpwq_Sv0p98/RioaSqxm4II/AAAAAAAAABI/1MUXGxBptA4/s1600-h/argi.backoffice1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_xpwq_Sv0p98/RioaSqxm4II/AAAAAAAAABI/1MUXGxBptA4/s400/argi.backoffice1.png" alt="" id="BLOGGER_PHOTO_ID_5055882439699128450" border="0" /&gt;&lt;/a&gt;Some stats here:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Use AJAX for tree, tabs, grid, and content refresh.&lt;/li&gt;&lt;li&gt;Never mess with any SQL, CSS or HTML. Pure Grails and JavaScript.&lt;/li&gt;&lt;li&gt;Btw, my level of JavaScript is up to using alert() for debugging.&lt;/li&gt;&lt;li&gt;Ext support 3 really cool themes, no messing around with graphics or buttons.&lt;/li&gt;&lt;li&gt;Stable and fast. I tested on old P3, works just fine.&lt;/li&gt;&lt;li&gt;Very helpful forum.&lt;/li&gt;&lt;li&gt;Open Source license or commercial licence -- up to you to choose.&lt;/li&gt;&lt;li&gt;Good documentations and examples.&lt;/li&gt;&lt;li&gt;The API is developer friendly and can be use with Java, Grails, Ruby on Rails, PHP or just about anything that can generate JSON or XML data.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Started on Monday night, worked every night for at least 1 hour till Saturday to complete all the basic features.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;What I found out is that:&lt;br /&gt;&lt;ol style="font-weight: bold;"&gt;&lt;li style="color: rgb(204, 51, 204);"&gt;&lt;span style="font-size:130%;"&gt;Grails is very cool.&lt;/span&gt;&lt;/li&gt;&lt;li style="color: rgb(51, 204, 0);"&gt;&lt;span style="font-size:130%;"&gt;Ext together with Grails is going to be a blast.&lt;/span&gt;&lt;/li&gt;&lt;li style="color: rgb(255, 102, 0);"&gt;&lt;span style="font-size:130%;"&gt;Like Grails, you can get something of quality up in short time with Ext.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;A few weeks back I completed a small project using Prototype and Scriptaculous, and wondered how am I going to create any cool webapps without them. Well, I'm going to delete them off from my bookmark tonight. :D &lt;a href="http://extjs.com/"&gt;Extjs.com&lt;/a&gt; will do fine now.&lt;br /&gt;&lt;br /&gt;To help others on using Grails together with Ext, I am going to start a small series of tutorials of integrating Grails with Ext. I hope many will find it useful.&lt;br /&gt;&lt;br /&gt;By the way, Ext Version 1.0 has just been released. If you have been using Ext beta2, you can see the &lt;a href="http://extjs.com/forum/showthread.php?t=4753"&gt;list of changes from beta 2 to version 1&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-1297463548433037468?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/1297463548433037468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=1297463548433037468' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/1297463548433037468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/1297463548433037468'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2007/04/grails-ext-guide-exprience-log.html' title='Grails + Ext Exprience Log'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_xpwq_Sv0p98/RioaSqxm4II/AAAAAAAAABI/1MUXGxBptA4/s72-c/argi.backoffice1.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-7706943121535346580</id><published>2007-04-20T11:51:00.000+08:00</published><updated>2007-04-20T11:58:41.656+08:00</updated><title type='text'>Easy fileupload with Grails</title><content type='html'>&lt;pre&gt;Uploading files in Grails is as simple as this. Add a upload closure in&lt;br /&gt;the controller, then create the multipart form in the gsp.&lt;br /&gt;&lt;br /&gt;   &lt;span style="color: rgb(153, 51, 153);"&gt;def&lt;/span&gt; uploadFile = {&lt;br /&gt;      println "&lt;span style="color: rgb(255, 102, 102);"&gt;Getting new file&lt;/span&gt;"&lt;br /&gt;      &lt;span style="color: rgb(153, 51, 153);"&gt;def&lt;/span&gt; f = &lt;span style="color: rgb(0, 0, 0);"&gt;request&lt;/span&gt;.&lt;span style="color: rgb(51, 102, 255);"&gt;getFile&lt;/span&gt;('&lt;span style="color: rgb(255, 102, 102);"&gt;upfile&lt;/span&gt;')&lt;br /&gt;          if(!f.empty) {&lt;br /&gt;              f.&lt;span style="color: rgb(51, 102, 255);"&gt;transferTo&lt;/span&gt;( new File('&lt;span style="color: rgb(255, 102, 102);"&gt;someotherloc&lt;/span&gt;') )&lt;br /&gt;              println f&lt;br /&gt;          }&lt;br /&gt;          else {&lt;br /&gt;              &lt;span style="color: rgb(51, 102, 255);"&gt;flash&lt;/span&gt;.message = '&lt;span style="color: rgb(255, 102, 102);"&gt;file cannot be empty&lt;/span&gt;'&lt;br /&gt;                  redirect(action:'&lt;span style="color: rgb(255, 102, 102);"&gt;upload&lt;/span&gt;')&lt;br /&gt;          }&lt;br /&gt;      println "&lt;span style="color: rgb(255, 102, 102);"&gt;Done getting new file&lt;/span&gt;"&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;g:form controller="technicalReport" action="upload" method="post" enctype="multipart/form-data"&gt;&lt;/g:form&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-7706943121535346580?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/7706943121535346580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=7706943121535346580' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/7706943121535346580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/7706943121535346580'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2007/04/easy-fileupload-with-grails.html' title='Easy fileupload with Grails'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-804123917117217800</id><published>2007-04-10T19:26:00.000+08:00</published><updated>2007-04-10T19:35:04.857+08:00</updated><title type='text'>Personal WTF</title><content type='html'>I read &lt;a href="http://thedailywtf.com/"&gt;TheDailyWTF&lt;/a&gt; daily and I can really empathized with the victims in the story. Heck I have been shoving lots of shits myself over the years, in fact I made money from it.&lt;br /&gt;&lt;br /&gt;Anyway, I just finished a reporting part which requires some data mungling before output to the PDF report. I looked at the one piece that bugged me whole day and I thought to myself,&lt;br /&gt;&lt;br /&gt;&lt;blockquote  style="font-weight: bold;font-family:verdana;"&gt;&lt;span style="font-size:180%;"&gt;WTF!&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;I just hope whoever that is going to maintain that piece of code will forgive me. I blame myself for not putting the effort to learn JasperReport!&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;    &lt;span style="color: rgb(0, 153, 0);"&gt;$F{SCORE}&lt;/span&gt; == null ? "" : (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;       (&lt;span style="color: rgb(204, 51, 204);"&gt;Double.parseDouble&lt;/span&gt;(&lt;span style="color: rgb(0, 153, 0);"&gt;$F{SCORE}&lt;/span&gt;)) &gt; 91 ? "&lt;span style="color: rgb(204, 0, 0);"&gt;X&lt;/span&gt;" : (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;           (&lt;span style="color: rgb(204, 51, 204);"&gt;Double.parseDouble&lt;/span&gt;(&lt;span style="color: rgb(0, 153, 0);"&gt;$F{SCORE}&lt;/span&gt;)) &gt; 81 ? "&lt;span style="color: rgb(204, 0, 0);"&gt;XY&lt;/span&gt;" : (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;               (&lt;span style="color: rgb(204, 51, 204);"&gt;Double.parseDouble&lt;/span&gt;(&lt;span style="color: rgb(0, 153, 0);"&gt;$F{SCORE}&lt;/span&gt;)) &gt; 61 ? "&lt;span style="color: rgb(204, 0, 0);"&gt;Y&lt;/span&gt;" : "&lt;span style="color: rgb(204, 0, 0);"&gt;Z&lt;/span&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;           )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;       )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;    )&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-804123917117217800?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/804123917117217800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=804123917117217800' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/804123917117217800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/804123917117217800'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2007/04/personal-wtf.html' title='Personal WTF'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-7439263919070147556</id><published>2007-04-10T12:31:00.000+08:00</published><updated>2007-04-10T12:47:42.490+08:00</updated><title type='text'>Rails pagination with condition</title><content type='html'>&lt;a style="font-weight: bold;" href="http://tarcrooms.com/"&gt;TarcRooms.com&lt;/a&gt; was launched a year back and at that time all I wanted was to get the site up with the basic features. The ads was slow to come in but nowadays I get on average 10 ads per week. I guess that's good since it's serving people.&lt;br /&gt;&lt;br /&gt;Some of the features which I initially planned that didn't make it are:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Limit ads to 30 days&lt;/li&gt;&lt;li&gt;Registration free&lt;/li&gt;&lt;li&gt;E-mail reminders&lt;/li&gt;&lt;/ol&gt;After so long I finally got the pagination to work with condition -- that is to display ads that are no more than 30 days old.&lt;br /&gt;&lt;br /&gt;The code for &lt;a href="http://api.rubyonrails.org/classes/ActionController/Pagination.html"&gt;pagination&lt;/a&gt; is relatively simple.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;  &lt;/span&gt;&lt;span style="color: rgb(204, 51, 204); font-weight: bold;"&gt;def&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;span style="color: rgb(51, 102, 255); font-weight: bold;"&gt;list&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;    &lt;/span&gt;&lt;span style="color: rgb(51, 102, 255); font-weight: bold;"&gt;@classified_pages&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;, &lt;/span&gt;&lt;span style="color: rgb(51, 102, 255); font-weight: bold;"&gt;@classifieds&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; = paginate &lt;/span&gt;&lt;span style="color: rgb(51, 102, 255); font-weight: bold;"&gt;:classifieds&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;, &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;        &lt;/span&gt;&lt;span style="color: rgb(51, 102, 255); font-weight: bold;"&gt;:order&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; =&gt; 'post_date DESC', &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;        &lt;/span&gt;&lt;span style="color: rgb(51, 102, 255); font-weight: bold;"&gt;:per_page&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; =&gt; 15, &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;        &lt;/span&gt;&lt;span style="color: rgb(51, 102, 255); font-weight: bold;"&gt;:conditions&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; =&gt; '&lt;/span&gt;&lt;span style="color: rgb(204, 0, 0); font-weight: bold;"&gt;( CURDATE() - classifieds.post_date)&lt;30&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;  &lt;/span&gt;&lt;span style="color: rgb(204, 51, 204); font-weight: bold;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I avoided that from the start because I didn't want to tied the condition to MySQL's CURDATE(). Well I guess I'll be pragmatic about it and do what works for me now.&lt;br /&gt;&lt;br /&gt;The condition above actually translated to:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);font-family:courier new;" &gt; SELECT (*) FROM classifieds&lt;br /&gt;WHERE (&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-family:courier new;" &gt; CURDATE() - classifieds.post_date)&lt;30&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-7439263919070147556?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/7439263919070147556/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=7439263919070147556' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/7439263919070147556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/7439263919070147556'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2007/04/rails-pagination-with-condition.html' title='Rails pagination with condition'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-2632254936118295641</id><published>2007-04-09T19:29:00.000+08:00</published><updated>2007-04-09T20:06:13.718+08:00</updated><title type='text'>Poderosa: The PuTTY killer</title><content type='html'>I have been using PuTTY for years and it's one of those invaluable software that you thank God not because it's free but it solves your daily problem over and over again. PuTTY has its wrinkles but I still love it nevertheless.&lt;br /&gt;&lt;br /&gt;However I think the time has come to move on. I have stopped using PuTTY for months. Let me introduce to you &lt;a href="http://en.poderosa.org/"&gt;Poderosa &lt;/a&gt; -- a tabbed terminal emulator for Windows.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_xpwq_Sv0p98/Rhopn0GRHzI/AAAAAAAAABA/5p2fHv3i4Zc/s1600-h/poderosa.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_xpwq_Sv0p98/Rhopn0GRHzI/AAAAAAAAABA/5p2fHv3i4Zc/s400/poderosa.jpg" alt="" id="BLOGGER_PHOTO_ID_5051395696026001202" border="0" /&gt;&lt;/a&gt;Among the &lt;a href="http://en.poderosa.org/present/screenshot.html"&gt;features&lt;/a&gt; you get from Poderosa are:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;GUI tab&lt;/li&gt;&lt;li&gt;SSH1/2 connection&lt;/li&gt;&lt;li&gt;Local Cygwin connection&lt;/li&gt;&lt;li&gt;... (this means you should find out more from the website)&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;I am impressed most by the tabbing of terminals. However you might not like the fact that this software .NET based. The good news is that it's under Apache 2.0 license so you can get the &lt;a href="http://en.poderosa.org/download/source.html"&gt;source&lt;/a&gt; and have a ball with it if you want to.&lt;br /&gt;&lt;br /&gt;I used it everyday for my Cygwin sessions and also for SSH. Very easy to use, stable and fast. I tried various terminal emulators but most has stability issues. No problem for me so far. I think I finally found what I am looking for in a terminal emulator.&lt;br /&gt;&lt;br /&gt;Give it a try.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-2632254936118295641?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/2632254936118295641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=2632254936118295641' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/2632254936118295641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/2632254936118295641'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2007/04/poderosa-putty-killer.html' title='Poderosa: The PuTTY killer'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_xpwq_Sv0p98/Rhopn0GRHzI/AAAAAAAAABA/5p2fHv3i4Zc/s72-c/poderosa.jpg' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-3309566320203383851</id><published>2007-04-04T19:07:00.000+08:00</published><updated>2007-04-05T09:24:13.630+08:00</updated><title type='text'>Shipping culture</title><content type='html'>I'm watching this &lt;a href="http://www.bejug.org/confluenceBeJUG/display/PARLEYS/Java%20in%20the%20Trenches"&gt;Java in Trenches&lt;/a&gt; and I must say, if you are doing any kind of serious software development works, then please spend sometime with this video. This stuff is so good I would pay money for it!&lt;br /&gt;&lt;br /&gt;Anyway, something from the slides.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_xpwq_Sv0p98/RhOJwbhOAEI/AAAAAAAAAA4/_lVpJmeQt1w/s1600-h/Our_Culture_Shipping_matters.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_xpwq_Sv0p98/RhOJwbhOAEI/AAAAAAAAAA4/_lVpJmeQt1w/s400/Our_Culture_Shipping_matters.jpg" alt="" id="BLOGGER_PHOTO_ID_5049531072326271042" border="0" /&gt;&lt;/a&gt;In Malaysia, this is not a culture. It's a mandatory thing if you want to continue to get your pay cheque. The problem is really not whether you ship it out -- on time or otherwise -- but shipping out the kind of software that won't come back and bite your ass.&lt;br /&gt;&lt;br /&gt;By biting your ass I mean:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-weight: bold;font-family:verdana;" &gt;   1. Your client won't call you up and explain what professionalism means.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0); font-weight: bold;font-family:verdana;" &gt;   2. You don't have to explain why the software puke errors every 2 clicks.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204); font-weight: bold;font-family:verdana;" &gt;   3. You don't have to debug and fix code that needs to be running on the client server the next morning. (And it's already 2.30 AM)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Well, I'm actually taking this slide out of context. These guys ensure quality every step of the way, and when they deliver the final product, the really deliver. And that says a lot about &lt;a href="http://www-128.ibm.com/developerworks/rational/library/05/1011_kroll/"&gt;Eclipse Software Framework&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;By the way, if you still think that using a good framework will &lt;span style="font-style: italic; color: rgb(204, 51, 204);"&gt;ship&lt;/span&gt;, you should find out more about the shipping. Think "process".&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0974514047?ie=UTF8&amp;tag=seymourcakes-20&amp;amp;linkCode=as2&amp;camp=1789&amp;amp;creative=9325&amp;creativeASIN=0974514047"&gt;Ship it! A Practical Guide to Successful Software Projects&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=seymourcakes-20&amp;amp;l=as2&amp;o=1&amp;amp;a=0974514047" alt="" style="border: medium none  ! important; margin: 0px ! important; display: none;" border="0" height="1" width="1" /&gt; is a good book on how to navigate your way out of the mess of shipping out the good stuff on time. If you need to start, start with this short guide.&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://rcm.amazon.com/e/cm?t=seymourcakes-20&amp;o=1&amp;amp;p=13&amp;l=st1&amp;amp;mode=books&amp;search=linux%20java&amp;amp;fc1=000000&amp;lt1=&amp;amp;lc1=3366FF&amp;bg1=FFFFFF&amp;amp;f=ifr" marginwidth="0" marginheight="0" border="0" style="border: medium none ; display: none;" frameborder="0" height="60" scrolling="no" width="468"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-3309566320203383851?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/3309566320203383851/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=3309566320203383851' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/3309566320203383851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/3309566320203383851'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2007/04/shipping-culture.html' title='Shipping culture'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_xpwq_Sv0p98/RhOJwbhOAEI/AAAAAAAAAA4/_lVpJmeQt1w/s72-c/Our_Culture_Shipping_matters.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-8212208845774040271</id><published>2007-04-04T18:28:00.000+08:00</published><updated>2007-04-04T19:05:25.555+08:00</updated><title type='text'>A personal note on productivity with Thunderbird 2.0</title><content type='html'>One of the coolest features of the upcoming Thunderbird 2.0 is tagging for your e-mail. When I first discovered tagging of e-maill with Gmails I have been looking for something similar for my POP mails.&lt;br /&gt;&lt;br /&gt;I am using Thunderbird 2 beta 2 now, and I'm not sure why it's still beta. As far as I am concerned, it's might as well be the final version. This beta software haven't crashed on me since many moons ago! Seriously Thunderbird raises my standard as to what beta software means.&lt;br /&gt;&lt;br /&gt;Apart from tagging, I think the search function beats the crap out of Outlook. I remember waiting for my colleague to search for some information from his Outlook. After a while waiting, I just go to my Thunderbird and got the search result back almost instantly.&lt;br /&gt;&lt;br /&gt;This whole Thunderbird 2.0 experience taught me 3 things.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold; color: rgb(51, 204, 0);font-family:verdana;" &gt;    &lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;1. Beta version software is the new gold version.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 102, 0);font-family:verdana;" &gt;    &lt;span style="color: rgb(102, 102, 102);"&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;2. Outlook sucks.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 51, 204);font-family:verdana;" &gt;  &lt;span style="color: rgb(204, 51, 204);"&gt; &lt;span style="color: rgb(153, 153, 153);"&gt;&lt;span style="color: rgb(204, 51, 204);"&gt; 3. Use your own Thunderbird to do you own damn search. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 51, 204);font-family:verdana;" &gt;    Or "Quit asking people to do your shit"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;But anyway if you need to know 3 things about Thunderbird 2.0 now, they are:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-weight: bold;font-family:verdana;" &gt;   &lt;span style="color: rgb(51, 204, 0);"&gt;   1. Damn stable&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:verdana;" &gt;    &lt;span style="color: rgb(255, 102, 0);"&gt;   2. Damn fast search&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:verdana;" &gt;   &lt;span style="color: rgb(204, 51, 204);"&gt;   3. Damn cool tagging&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_xpwq_Sv0p98/RhN-MbhOACI/AAAAAAAAAAo/e3ySsjC3jQo/s1600-h/bad_idea.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_xpwq_Sv0p98/RhN-MbhOACI/AAAAAAAAAAo/e3ySsjC3jQo/s320/bad_idea.jpg" alt="" id="BLOGGER_PHOTO_ID_5049518359223074850" border="0" /&gt;&lt;/a&gt;Now, see that &lt;span style="font-size:130%;"&gt;&lt;span style="color: rgb(255, 0, 0); font-weight: bold;font-family:verdana;" &gt;"BAD IDEA"&lt;/span&gt;&lt;/span&gt; up there?&lt;br /&gt;&lt;br /&gt;Well take it from me and try it out yourself. I have been creating so many tags that, I didn't know which tags are for which anymore. I think after about 3 tags, you'll pretty much start getting confuse about which tags are for which.&lt;br /&gt;&lt;br /&gt;As you can see I have:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Important (default)&lt;/li&gt;&lt;li&gt;Personal (default)&lt;/li&gt;&lt;li&gt;ToDo (default)&lt;/li&gt;&lt;li&gt;Work&lt;/li&gt;&lt;li&gt;BugReport&lt;/li&gt;&lt;li&gt;Report&lt;/li&gt;&lt;li&gt;bla bla bla bla blaaa...&lt;/li&gt;&lt;li&gt;More bla bla&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;First, I shouldn't even have report tag, just create a folder to hold the e-mails related to reports. That's probably what I should have done for the rest of stuff.&lt;br /&gt;&lt;br /&gt;After some "refactoring" -- I basically delete everything except these 3.&lt;br /&gt;&lt;ol  style="font-weight: bold;font-family:verdana;"&gt;&lt;li style="color: rgb(51, 204, 0);"&gt;&lt;span style="font-size:180%;"&gt;Important&lt;/span&gt;&lt;/li&gt;&lt;li style="color: rgb(255, 102, 0);"&gt;&lt;span style="font-size:180%;"&gt;To Do&lt;/span&gt;&lt;/li&gt;&lt;li style="color: rgb(204, 51, 204);"&gt;&lt;span style="font-size:180%;"&gt;FuckIt&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-8212208845774040271?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/8212208845774040271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=8212208845774040271' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/8212208845774040271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/8212208845774040271'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2007/04/personal-note-on-productivity-with.html' title='A personal note on productivity with Thunderbird 2.0'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_xpwq_Sv0p98/RhN-MbhOACI/AAAAAAAAAAo/e3ySsjC3jQo/s72-c/bad_idea.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-9060426719406555343</id><published>2007-03-29T14:02:00.000+08:00</published><updated>2007-04-04T20:18:53.243+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='review books agile'/><title type='text'>Book review: Implementing Lean Software Development: From Concept to Cash</title><content type='html'>The first thing I can tell you about this book is that it is not boring at all. Second thing is that you will learns a lot from it.&lt;br /&gt;&lt;br /&gt;In brevity, &lt;b class="sans"&gt;Implementing Lean Software Development: From Concept to Cash &lt;/b&gt;&lt;span class="sans"&gt;is about making software pragmatically, from the &lt;span style="font-style: italic;"&gt;management point of view&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0321437381?ie=UTF8&amp;tag=seymourcakes-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0321437381"&gt;&lt;img border="0" src="0321437381.01._AA_SCMZZZZZZZ_.jpg"&gt;&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=seymourcakes-20&amp;l=as2&amp;o=1&amp;a=0321437381" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&lt;br /&gt;&lt;br /&gt;I was pleasantly surprised to learn how to apply &lt;a href="http://en.wikipedia.org/wiki/Toyota_Production_System"&gt;Toyota Production System&lt;/a&gt; to software engineering. For example, the concept of &lt;a href="http://en.wikipedia.org/wiki/Poka-yoke"&gt;Poka-yoke&lt;/a&gt; or "mistake-proofing" can been in &lt;a href="http://en.wikipedia.org/wiki/Rename_Method"&gt;Rename Method refactoring&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt; &lt;span style="font-weight: bold;"&gt;   public void close(Object obj);&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;br /&gt;There are few potential  mistake that could happen when calling this method. The method name, "close" is vague enough to mean closing a database connection or a file. That and the parameter of Object type which could mean closing anything and everything.&lt;br /&gt;Lets refactor that to&lt;span style="color: rgb(153, 51, 153);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;public &lt;/span&gt;&lt;span style="color: rgb(153, 51, 153); font-weight: bold;"&gt;void close&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;File(File file)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;br /&gt;Now there is no way to make mistake with the method -- unless you try really hard. That's Poka-yoke for you in software development. You should read on the rest of the book to find out how TPS works for making software.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;See, those stuff are not just for making cars or plastic chairs.&lt;span style="color: rgb(255, 204, 0);"&gt; :)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Reading this book feels like listening from a manufacturing engineer teaching software engineering, which is actually enlightening considering that manufacturing has embraced "lean and agile" methodologies for ages.&lt;br /&gt;&lt;br /&gt;I don't think grunt programmers would appreciate what &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;Poppendiecks&lt;/b&gt; are trying to teach about lean development, but I highly recommend this book to management people looking for answers to why you should get on the Agile bandwagon today.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;!--&lt;br /&gt; amzn_cl_tag="seymourcakes-20";&lt;br /&gt; amzn_cl_link_color="16D95D";&lt;br /&gt; amzn_cl_border_color="F5F1F5";&lt;br /&gt; amzn_cl_link_style=2;&lt;br /&gt; amzn_cl_logo=0;&lt;br /&gt; amzn_cl_categories="a";&lt;br /&gt;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript" src="http://cls.assoc-amazon.com/s/cls.js"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-9060426719406555343?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/9060426719406555343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=9060426719406555343' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/9060426719406555343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/9060426719406555343'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2007/03/book-review-implementing-lean-software.html' title='Book review: Implementing Lean Software Development: From Concept to Cash'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-8433541537676050143</id><published>2007-03-16T16:22:00.000+08:00</published><updated>2007-03-16T16:32:29.096+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails lucene java'/><title type='text'>My first useful Grails plugin</title><content type='html'>After about 4 weeks for part time research, trial-and-error, and countless night digging Grails source code, I finally finished the my first useful grails plugin.&lt;br /&gt;&lt;br /&gt;It's really a search plugin, using lucene as the engine. It still has many basic features to go before I can call it barebone complete, but what the heck I'm using it on production system.&lt;br /&gt;&lt;br /&gt;I will be releasing the source code and licensed it same as Grails's licenced term, which is Apache 2.0.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_xpwq_Sv0p98/RfpVkdntrmI/AAAAAAAAAAc/ayK45QjUThk/s1600-h/lucene_search-pluging_v1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 256px; height: 527px;" src="http://bp2.blogger.com/_xpwq_Sv0p98/RfpVkdntrmI/AAAAAAAAAAc/ayK45QjUThk/s320/lucene_search-pluging_v1.jpg" alt="" id="BLOGGER_PHOTO_ID_5042436817709543010" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Coincidentally Maurice Nicholson released his &lt;a href="http://www.nabble.com/Searchable-Plugin-0.1-t3411085.html"&gt;Searchable Plugin 0.1&lt;/a&gt; last night.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-8433541537676050143?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/8433541537676050143/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=8433541537676050143' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/8433541537676050143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/8433541537676050143'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2007/03/my-first-useful-grails-plugin.html' title='My first useful Grails plugin'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_xpwq_Sv0p98/RfpVkdntrmI/AAAAAAAAAAc/ayK45QjUThk/s72-c/lucene_search-pluging_v1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-5163003007870161382</id><published>2007-02-16T09:33:00.000+08:00</published><updated>2007-02-16T10:45:18.211+08:00</updated><title type='text'>Grails Plugins notes</title><content type='html'>I tried my hands at creating Grails plugin and I'm documenting my findings here.&lt;br /&gt;&lt;br /&gt;1. First thing anyone who wants to develop plugin should join the grails-dev mailing list. There's too much hidden information which you just cannot get from the &lt;a href="http://grails.codehaus.org/The+Plug-in+Developers+Guide"&gt;Plugin Developer Guide.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2. Of course you need to read &lt;a href="http://grails.codehaus.org/Plugins"&gt;other plugin codes&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;3. I think the best way to get started is to simply get started with "grails create-plugin". Then simply package it and try to load it in your grails project. (See below for my kickass shitmore plugin)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;....&lt;br /&gt;Attempting to load [1] user defined plugins&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    Grails plug-in [&lt;span style="color: rgb(255, 102, 102);"&gt;shitmores&lt;/span&gt;] with version [0.1] loaded successfully&lt;br /&gt;....&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;4.  I did found out there is not easy way to test for plugin. The usual GrailsTestCase just won't do it properly. Well atleast not yet anyway.  &lt;span style="color: rgb(255, 204, 0);"&gt; &lt;span style="color: rgb(204, 153, 51);"&gt;:(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;5. The stable 0.4.1 release has problem with custom plugin, so you might as well be using the 0.5-SNAPSHOT.   &lt;span style="color: rgb(204, 153, 51);"&gt;:(&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&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/15692829-5163003007870161382?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/5163003007870161382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=5163003007870161382' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/5163003007870161382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/5163003007870161382'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2007/02/grails-plugins-notes.html' title='Grails Plugins notes'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-116961603153617217</id><published>2007-01-24T12:59:00.000+08:00</published><updated>2007-01-24T13:48:31.455+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy java'/><title type='text'>Grails' new dynamic encoding</title><content type='html'>Grails' &lt;a href="http://grails.org/Dynamic+Encoding+Methods"&gt;dynamic encoding&lt;/a&gt; is something really useful and will be available in the upcoming Grails 0.4.&lt;br /&gt;&lt;br /&gt;Right now it only has 2 standard codec -- HTMLCodec and URLCodec. I want to show you how easy it is to create a custom codec of your own here. Lets take Base64 encoding and decoding for this example.&lt;br /&gt;&lt;br /&gt;We start by creating the basic codec class, &lt;span style="color: rgb(51, 51, 255);font-family:courier new;" &gt;Base64Codec.groovy&lt;/span&gt; and define 2 methods; encode and decode.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-family:courier new;font-size:130%;"  &gt;  class Base64Codec {&lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-family:courier new;font-size:130%;"  &gt;     static def encode = {  str -&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-family:courier new;font-size:130%;"  &gt;         &lt;span style="color: rgb(0, 153, 0);"&gt;// TODO: Implement me&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-family:courier new;font-size:130%;"  &gt;     }&lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-family:courier new;font-size:130%;"  &gt;     static def decode = {  str -&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-family:courier new;font-size:130%;"  &gt;         &lt;span style="color: rgb(0, 153, 0);"&gt;// TODO: Implement me&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-family:courier new;font-size:130%;"  &gt;     }&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-family:courier new;font-size:130%;"  &gt;&lt;br /&gt; }&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;So far so good. Grails will automatically pick up your custom codec as long as your class ends with a "Codec", like this &lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;Base64&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;Codec&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;.groovy&lt;/span&gt;&lt;/span&gt; for example. Well of course you need to put this class in &lt;span style="font-family:courier new;"&gt;grails-app/util&lt;/span&gt; folder.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);font-family:courier new;font-size:130%;"  &gt;  class Base64Codec {&lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-family:courier new;font-size:130%;"  &gt;     static def encode = {  str -&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-family:courier new;font-size:130%;"  &gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255); font-weight: bold;"&gt;        return new sun.misc.BASE64Encoder().encode(str.bytes)&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-family:courier new;font-size:130%;"  &gt;     }&lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-family:courier new;font-size:130%;"  &gt;     static def decode = {  str -&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-family:courier new;font-size:130%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;         &lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(51, 51, 255); font-weight: bold;"&gt;def result = new sun.misc.BASE64Decoder().decodeBuffer(str)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255); font-weight: bold;"&gt;         return new String(result)&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-family:courier new;font-size:130%;"  &gt;     }&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-family:courier new;font-size:130%;"  &gt;&lt;br /&gt; }&lt;/span&gt;&lt;span style="font-family: Georgia,serif;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(0, 153, 0);font-size:130%;" &gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);font-size:130%;" &gt;&lt;span style="font-family: courier new;"&gt;//Encoding string to Base64:  someString.encodeAsBase64()&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;//Decoding Base64 string:  def s = encodedString.decodeAsBase64()&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;A word of warning, you are not supposed to use those Sun's undocumented classes. Try something like Apache Commons Codec library for &lt;a href="http://jakarta.apache.org/commons/codec/apidocs/org/apache/commons/codec/binary/Base64.html"&gt;Base64 encoding and decoding&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-116961603153617217?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/116961603153617217/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=116961603153617217' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/116961603153617217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/116961603153617217'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2007/01/grails-new-dynamic-encoding.html' title='Grails&apos; new dynamic encoding'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-116952480880369747</id><published>2007-01-23T11:20:00.000+08:00</published><updated>2007-01-24T12:59:07.736+08:00</updated><title type='text'>Setup Subversion 1.4 on Windows 2003</title><content type='html'>I have been going through the web for the steps to install SVN on Windows server. I tried the Svn1Click but I think it is obsolete now. Well anyway to those who needs it, here are the latest guide on how to setup Subversion 1.4.2 on Windows 2003 server as Windows service.&lt;br /&gt;&lt;br /&gt;1. &lt;a href="http://subversion.tigris.org/project_packages.html"&gt;Download&lt;/a&gt; and install the latest Subversion. The latest package is 1.4.2 as of today.&lt;br /&gt;&lt;br /&gt;2. Create your root folder for your project repository. I created mine at D:\svn_repository.&lt;br /&gt;&lt;br /&gt;3.  Test out if everything is okay. Fire up cmd (Command prompt) and execute this command, "svnserve -d -r d:\svn_repository". You can find out more of the svnserve options &lt;a href="http://svnbook.red-bean.com/nightly/en/svn.serverconfig.svnserve.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;4. That is to start up the SVn light weight server in daemon mode. Now lets see if svn client can connect to it. Execute this "svn ls svn:\\localhost". No news is good news here as we don't have anything in the repository yet.&lt;br /&gt;&lt;br /&gt;5. Next lets install SVN as Windows service. Now if you google for this topic, you are going to find some old stuff. I believe the latest and correct way to install SVn as Windows service is by using SC.exe. Well you can get the details of this &lt;a href="http://svn.collab.net/repos/svn/trunk/notes/windows-service.txt"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Execute this command:&lt;br /&gt;sc create "SVNservice" binPath= "\"C:\Program Files\Subversion\bin\svnserve.exe\" --service --root \"d:\svn_repository\"" DisplayName= "Subversion" depend= tcpip start= auto&lt;br /&gt;&lt;br /&gt;Assuming that you install Suversion and never mess with the default program path, then you can copy, paste and run the above command.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;Note that the space " " between the binPath= and the parameter. The name value pair must be separated by a space. I wasted about half and hour wondering why it won't run.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;6. If all goes well, you will see "[SC] CreateService SUCCESS".  Yay. Now lets open up the Services tool window and you should see "Subversion" listed as on of the services.&lt;br /&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/15692829-116952480880369747?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/116952480880369747/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=116952480880369747' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/116952480880369747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/116952480880369747'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2007/01/setup-subversion-14-on-windows-2003.html' title='Setup Subversion 1.4 on Windows 2003'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-116920999856029962</id><published>2007-01-19T20:28:00.000+08:00</published><updated>2007-01-19T20:43:31.520+08:00</updated><title type='text'>No fear.</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/4296/1248/1600/664467/heroes_edited.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/4296/1248/320/792759/heroes_edited.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-116920999856029962?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/116920999856029962/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=116920999856029962' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/116920999856029962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/116920999856029962'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2007/01/no-fear.html' title='No fear.'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-116641750732058209</id><published>2006-12-18T12:51:00.000+08:00</published><updated>2006-12-18T12:51:47.850+08:00</updated><title type='text'>Sunday afternoon with Geek00L</title><content type='html'>&lt;a href="http://www.flickr.com/photos/seymores/325664636/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/143/325664636_d827735eaa.jpg" width="500" height="375" alt="Sunday After with GeeK00L" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-116641750732058209?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/116641750732058209/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=116641750732058209' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/116641750732058209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/116641750732058209'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2006/12/sunday-afternoon-with-geek00l.html' title='Sunday afternoon with Geek00L'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-116295259503249509</id><published>2006-11-08T10:18:00.000+08:00</published><updated>2006-11-08T10:23:15.723+08:00</updated><title type='text'>You mean all these cool games are done in Java??!!</title><content type='html'>The common perception of Java in game development is a impossible, or at least slow and lousy. However, many have tried to push Java to the gaming industry since the 90's.&lt;br /&gt;&lt;br /&gt;If you think Java games are only for the puzzle and turn base type, then watch this video. We are talking about 3D and fast action pack games.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/p9ytsfaGWts"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/p9ytsfaGWts" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-116295259503249509?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/116295259503249509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=116295259503249509' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/116295259503249509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/116295259503249509'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2006/11/you-mean-all-these-cool-games-are-done.html' title='You mean all these cool games are done in Java??!!'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-116286957128507925</id><published>2006-11-07T11:06:00.000+08:00</published><updated>2006-11-07T11:25:40.253+08:00</updated><title type='text'>PgOSS -- What coming next</title><content type='html'>Was chatting with &lt;a href="http://geek00l.blogspot.com/2006/11/pgoss-call-for-helps.html"&gt;geekCool&lt;/a&gt; earlier about his call for help to run the next PgOSS. The last PgOSS was lots of fun, we have people coming in just to check out the Penang FOSS thing.&lt;br /&gt;&lt;br /&gt;Well, obviously we lack manpower.&lt;br /&gt;So if you are in Penang and interested to join the team, this is the ToDo list that you might be interested to get into.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Event planning&lt;/li&gt;&lt;li&gt;Organizing&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Looking for presenter&lt;/li&gt;&lt;li&gt;Spreading the words of PgOSS event&lt;/li&gt;&lt;li&gt;Linux CDs give-away&lt;/li&gt;&lt;li&gt;Giving presentations&lt;/li&gt;&lt;li&gt;Donation&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;We you can reach geek00L at #myoss @ freenode, and me at this number here, zero one seven - five four seven zero two four seven. Yeah, I changed my number recently. :D&lt;br /&gt;(If you do ring me up, you can call me Shitmores -- no worries) :D :D&lt;br /&gt;&lt;br /&gt;I really hope we can our November PgOSS.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-116286957128507925?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/116286957128507925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=116286957128507925' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/116286957128507925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/116286957128507925'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2006/11/pgoss-what-coming-next.html' title='PgOSS -- What coming next'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-116201361849008991</id><published>2006-10-28T13:20:00.000+08:00</published><updated>2006-10-28T13:45:39.616+08:00</updated><title type='text'>Top 9 books to read to become a professional Java developer</title><content type='html'>You can forget the other shallow Java books on the market. I have put together a short list of great Java books for newbies aspiring to become professional Java programmer. These are the books I wished I had when I was starting out early in my career.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://astore.amazon.com/seymourcakes-20"&gt;Follow this link here to view the books.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;No these books won't turn you into a great Java developer overnight, but invest time and absorb the knowledge and you are surely on the right path.&lt;br /&gt;&lt;br /&gt;However if you absolutely need to read a good Java newbie book this year, then get &lt;a href="http://www.amazon.com/gp/product/0131482394?ie=UTF8&amp;tag=seymourcakes-20&amp;amp;linkCode=as2&amp;camp=1789&amp;amp;creative=9325&amp;creativeASIN=0131482394"&gt;Agile Java(TM): Crafting Code with Test-Driven Development (Robert C. Martin Series)&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=seymourcakes-20&amp;amp;l=as2&amp;o=1&amp;amp;a=0131482394" alt="" style="border: medium none  ! important; margin: 0px ! important; display: none;" border="0" height="1" width="1" /&gt;.&lt;br /&gt;&lt;br /&gt;Or you just want to sharpen the skills regardless of the language you use then get &lt;a href="http://www.amazon.com/gp/product/020161622X?ie=UTF8&amp;tag=seymourcakes-20&amp;amp;linkCode=as2&amp;camp=1789&amp;amp;creative=9325&amp;creativeASIN=020161622X"&gt;The Pragmatic Programmer: From Journeyman to Master&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=seymourcakes-20&amp;amp;l=as2&amp;o=1&amp;amp;a=020161622X" alt="" style="border: medium none  ! important; margin: 0px ! important; display: none;" border="0" height="1" width="1" /&gt;.&lt;br /&gt;&lt;br /&gt;Ultimately, a good Java book will always make you a better programmer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-116201361849008991?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/116201361849008991/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=116201361849008991' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/116201361849008991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/116201361849008991'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2006/10/top-9-books-to-read-to-become.html' title='Top 9 books to read to become a professional Java developer'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-116187205728641635</id><published>2006-10-26T21:43:00.000+08:00</published><updated>2006-10-26T22:49:09.636+08:00</updated><title type='text'>A little thought about PetalingStreet.org's AutoPinger</title><content type='html'>I was setting up my new Wordpress blog and applying for the PetalingStreet.org autopinger.  The instruction to setup AutPinger for self-installed server caught my attention.&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="color: rgb(153, 153, 153);"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;To obtain the Ping URLs for Project Petaling Street, please write an email with your blog URL (e.g. http://www.myblogname.com) as the SUBJECT to the following email address: autopinger (a) petalingstreet.org. A reply with the latest ping URL will be sent to you.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;b style="color: rgb(0, 0, 0);"&gt;This ping URL changes on a regular basis to defeat ping spammers&lt;/b&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;so please make sure your membership details are up to date as an email notification will be sent to you whenever the ping URL changes.&lt;/blockquote&gt;Changing the ping URL is a feeble attempt to discourage spammers. In fact it is quite easy to solve that problem (if I'm a spammer that is).&lt;br /&gt;&lt;br /&gt;Just apply for an auto pinger URL myself, and have my SPAM scripts to update accordingly when the ping URL changes.&lt;br /&gt;&lt;br /&gt;Talk about spamming, I am reading this book, "&lt;a href="http://www.amazon.com/gp/product/1932266860?ie=UTF8&amp;tag=seymourcakes-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=1932266860"&gt;Inside the Spam Cartel: Trade Secrets from the Dark Side&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=seymourcakes-20&amp;l=as2&amp;o=1&amp;a=1932266860" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;" by Spammer X. I don't know who is Spammer X. And I am not sure if he is actually happy that he couldn't get any fame from writing this book. But hell, I'm sure he enjoys the wealth. You see this is a really good book.&lt;br /&gt;&lt;br /&gt;If you have the time, I recomend it. I couldn't stop reading after the first chapter.&lt;br /&gt;&lt;center&gt;&lt;br /&gt;&lt;iframe src="http://rcm.amazon.com/e/cm?t=seymourcakes-20&amp;o=1&amp;p=13&amp;l=st1&amp;mode=books&amp;search=spammer%20spam%20cartel&amp;nou=1&amp;fc1=&amp;lt1=_blank&amp;lc1=&amp;bg1=&amp;f=ifr" marginwidth="0" marginheight="0" width="468" height="60" border="0" frameborder="0" style="border:none;" scrolling="no"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-116187205728641635?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/116187205728641635/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=116187205728641635' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/116187205728641635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/116187205728641635'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2006/10/little-thought-about.html' title='A little thought about PetalingStreet.org&apos;s AutoPinger'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-116186973479640993</id><published>2006-10-26T21:31:00.000+08:00</published><updated>2006-10-26T23:05:16.760+08:00</updated><title type='text'>Firefox 2.0 is out and this is how you get Newsfox to work</title><content type='html'>If you are like me, who reads alot of online mags and blogs, you need a RSS reader. And if you happen to use Newsfox and Firefox 2.0, you would know how pissed I was.&lt;br /&gt;&lt;br /&gt;Well, be glad the sufferings is over and this is how you get Newsfox to work now.&lt;br /&gt;&lt;br /&gt;Step 1:  Go &lt;a href="http://newsfox.mozdev.org/"&gt;http://newsfox.mozdev.org/&lt;/a&gt;.&lt;br /&gt;Step 2:  Install dev version of Newsfox&lt;br /&gt;Step 3:  Restart and rejoice.&lt;br /&gt;&lt;br /&gt;Actually you can cheat by just clicking here to &lt;a href="http://downloads.mozdev.org/newsfox/newsfox-dev.xpi"&gt;install&lt;/a&gt;.&lt;br /&gt;This links directly to the deve xpi file. Have fun!&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;iframe src="http://rcm.amazon.com/e/cm?t=seymourcakes-20&amp;o=1&amp;amp;p=15&amp;l=st1&amp;amp;mode=books&amp;search=open%20source%20javascript%20web%20design&amp;amp;fc1=&amp;lt1=&amp;amp;lc1=&amp;bg1=&amp;amp;f=ifr" marginwidth="0" marginheight="0" border="0" style="border: medium none ;" frameborder="0" height="240" scrolling="no" width="468"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-116186973479640993?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/116186973479640993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=116186973479640993' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/116186973479640993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/116186973479640993'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2006/10/firefox-20-is-out-and-this-is-how-you.html' title='Firefox 2.0 is out and this is how you get Newsfox to work'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-116080052930120035</id><published>2006-10-14T12:34:00.000+08:00</published><updated>2006-10-14T12:35:29.573+08:00</updated><title type='text'>Linux is not boring at all man</title><content type='html'>Look at this coolness&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/i0ZtcxHUSDQ"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/i0ZtcxHUSDQ" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-116080052930120035?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/116080052930120035/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=116080052930120035' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/116080052930120035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/116080052930120035'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2006/10/linux-is-not-boring-at-all-man.html' title='Linux is not boring at all man'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15692829.post-116045263815042754</id><published>2006-10-10T11:48:00.000+08:00</published><updated>2006-10-10T11:57:18.546+08:00</updated><title type='text'>Google search source code now</title><content type='html'>Something new from Google, &lt;a href="http://www.google.com/codesearch/advanced_code_search"&gt;"Advanced Code Search"&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;POSIX regex search&lt;/li&gt;&lt;li&gt;License aware&lt;/li&gt;&lt;li&gt;&lt;span class="greenBlurb"&gt;package-constrainable&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="greenBlurb"&gt;search even if contained in archived files&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;I tried it, and it was fun.&lt;br /&gt;See what I mean &lt;a href="http://www.google.com/codesearch?as_q=fucking&amp;btnG=Search+Code&amp;amp;as_lang=java&amp;as_license_restrict=i&amp;amp;as_license=&amp;as_package=&amp;amp;as_filename=&amp;as_case=y"&gt;here&lt;/a&gt;, &lt;a href="http://www.google.com/codesearch?as_q=fuck&amp;amp;btnG=Search+Code&amp;as_lang=python&amp;amp;as_license_restrict=i&amp;as_license=&amp;amp;as_package=&amp;as_filename=&amp;amp;as_case=y"&gt;here,&lt;/a&gt; and &lt;a href="http://www.google.com/codesearch?as_q=bill+gates&amp;btnG=Search+Code&amp;amp;as_lang=&amp;as_license_restrict=i&amp;amp;as_license=&amp;as_package=&amp;amp;as_filename=&amp;amp;as_case=y"&gt;this&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Well, you go try now.&lt;br /&gt;http://www.google.com/help/faq_codesearch.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15692829-116045263815042754?l=shitmores.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shitmores.blogspot.com/feeds/116045263815042754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15692829&amp;postID=116045263815042754' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/116045263815042754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15692829/posts/default/116045263815042754'/><link rel='alternate' type='text/html' href='http://shitmores.blogspot.com/2006/10/google-search-source-code-now.html' title='Google search source code now'/><author><name>Seymour Cakes</name><uri>http://www.blogger.com/profile/15257037423143802963</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_xpwq_Sv0p98/Sx0myYVTHtI/AAAAAAAAAps/TNd786MYg6c/S220/Photo+on+2009-12-07+at+23.46.jpg'/></author><thr:total>0</thr:total></entry></feed>
