{"@attributes":{"version":"2.0"},"channel":{"title":"Studio Cliffano","link":"https:\/\/blog.cliffano.com\/","description":"Recent content on Studio Cliffano","generator":"Hugo","language":"en-au","lastBuildDate":"Sat, 28 Dec 2024 13:59:21 +0000","item":[{"title":"Meet Dave The Sumobot","link":"https:\/\/blog.cliffano.com\/2024\/12\/28\/meet-dave-the-sumobot\/","pubDate":"Sat, 28 Dec 2024 13:59:21 +0000","guid":"https:\/\/blog.cliffano.com\/2024\/12\/28\/meet-dave-the-sumobot\/","description":"<p>During Little Godzilla&rsquo;s term 3 school holidays back in October 2024, he joined a 2-day camp where the kids learnt &ldquo;coding&rdquo;. I later figured out they they learnt to program an <a href=\"https:\/\/core-electronics.com.au\/edison-robot-v3-edpack1.html\">Edison<\/a> using <a href=\"https:\/\/www.edscratchapp.com\/\">EdScratch<\/a>.<\/p>\n<p>He wasn&rsquo;t initially enthusiastic about this coding camp because he wanted to do an animation camp instead but the schedule didn&rsquo;t work out for us. So I didn&rsquo;t have much expectation.<\/p>\n<p>However, when I picked him up at the end of the second day, he proudly showed me his bot: Dave!<\/p>"},{"title":"Using Terraform To Sync Secrets Across Multiple Repositories For GitHub Free Account","link":"https:\/\/blog.cliffano.com\/2023\/08\/19\/using-terraform-to-sync-secrets-across-multiple-repositories-for-github-free-account\/","pubDate":"Wed, 23 Aug 2023 08:37:55 +0000","guid":"https:\/\/blog.cliffano.com\/2023\/08\/19\/using-terraform-to-sync-secrets-across-multiple-repositories-for-github-free-account\/","description":"<p>After eons of SVN and CVS (anybody remember those?), I have been managing hundreds of Git repositories, mostly on GitHub. Out of those repositories, plenty are on Enterprise and Team accounts, but most are on Free accounts. The latter there is a bit of a pain to manage as it doesn&rsquo;t have the ability to natively sync secrets across repositories.<\/p>\n<p>This means that if I want to update a secret, I have to do it manually on each repository. Multiply this to hundreds of repositories, and it becomes way too tedious for any human to tolerate. So I ended up automating it using Terraform.<\/p>"},{"title":"Home Studio v0.5","link":"https:\/\/blog.cliffano.com\/2023\/01\/06\/home-studio-v0-5\/","pubDate":"Fri, 06 Jan 2023 11:07:20 +0000","guid":"https:\/\/blog.cliffano.com\/2023\/01\/06\/home-studio-v0-5\/","description":"<p>First post since 2018!<\/p>\n<p>This long hiatus has been unplanned since the <a href=\"https:\/\/blog.cliffano.com\/2018\/10\/30\/adobe-experience-cloud-meetup-5th-edition\/\">last blog post<\/a>. This is the result of raising a young child, combined with busier-than-ever work, topped off with <a href=\"https:\/\/covid19.who.int\/\">COVID-19<\/a>. It was challenging to say the least, the toughest part being having to work on tough projects from home while assisting remote preschooler classes in parallel. Nevertheless&hellip; we made it through in one piece.<\/p>\n<p>There&rsquo;s one good news though. A few months before the pandemic hit and <a href=\"https:\/\/www.aph.gov.au\/About_Parliament\/Parliamentary_departments\/Parliamentary_Library\/pubs\/rp\/rp2021\/Chronologies\/COVID-19StateTerritoryGovernmentAnnouncements#_Toc52275800\">Victoria went into lockdowns<\/a>, we moved to a new place which provided more space for Little Godzilla to run around and this house has an extra room that him and I have been sharing as a work and study space.<\/p>"},{"title":"Tech Talks","link":"https:\/\/blog.cliffano.com\/tech-talks\/","pubDate":"Thu, 15 Apr 2021 17:08:52 +0000","guid":"https:\/\/blog.cliffano.com\/tech-talks\/","description":"<ul>\n<li>OpenAPI Generator The Babel Fish of The API World (Paris) - <a href=\"https:\/\/www.slideshare.net\/cliffano\/openapi-generator-the-babel-fish-of-the-api-world-apidays-live-paris\">slides<\/a> | <a href=\"https:\/\/www.youtube.com\/watch?v=Z3b-oIZNIDo\">video<\/a><!-- raw HTML omitted --><a href=\"https:\/\/www.apidays.global\/paris\/\">apidays Live Paris 2021<\/a><\/li>\n<li>OpenAPI Generator The Babel Fish of The API World (Australia) - <a href=\"https:\/\/www.slideshare.net\/cliffano\/openapi-generator-the-babel-fish-of-the-api-world\">slides<\/a> | <a href=\"https:\/\/www.youtube.com\/watch?v=s2zMtwd5klg\">video<\/a><!-- raw HTML omitted --><a href=\"https:\/\/www.apidays.global\/australia\/\">apidays Live Australia 2021<\/a><\/li>\n<li>A Journey To Improve Infrastructure Compliance With InSpec - <a href=\"https:\/\/www.slideshare.net\/cliffano\/a-journey-to-improve-infrastructure-compliance-with-inspec\">slides<\/a> | <a href=\"https:\/\/www.youtube.com\/watch?v=31E_XvK1oak\">video<\/a><!-- raw HTML omitted --><a href=\"https:\/\/www.chef.io\/chefconf\">ChefConf &lsquo;21 Online<\/a><\/li>\n<li>Swagger AEM - An OpenAPI Specification for AEM - <a href=\"https:\/\/www.slideshare.net\/cliffano\/swagger-aem-an-openapi-specification-for-aem\">slides<\/a> | <a href=\"https:\/\/www.youtube.com\/watch?v=mqgbEYUlgWo\">video<\/a><!-- raw HTML omitted --><a href=\"https:\/\/adapt.to\/2019\/en.html\">adaptTo() 2019<\/a>, Berlin<\/li>\n<li>Introducing AEM OpenCloud - <a href=\"https:\/\/www.slideshare.net\/cliffano\/introducing-aem-opencloud\">slides<\/a> | <a href=\"https:\/\/www.youtube.com\/watch?v=I1swGfPn85M\">video<\/a><!-- raw HTML omitted --><a href=\"https:\/\/adapt.to\/2019\/en.html\">adaptTo() 2019<\/a>, Berlin<\/li>\n<li>A Quick Look at Accessibility in the World of DevOps - <a href=\"https:\/\/www.slideshare.net\/cliffano\/a-quick-look-at-accessibility-in-the-world-of-devops\">slides<\/a><!-- raw HTML omitted --><a href=\"https:\/\/devopsworldjenkinsworld2019.sched.com\">DevOps World 2019<\/a>, San Francisco<\/li>\n<li>Conversation With Your Application Using DialogFlow and CloudFunctions - <a href=\"https:\/\/www.slideshare.net\/cliffano\/conversation-with-your-application-using-dialogflow-and-cloudfunctions\">slides<\/a><!-- raw HTML omitted --><a href=\"https:\/\/www.meetup.com\/GDG-Cloud-Melbourne\/events\/258047647\/\">GDG Cloud Melbourne (February 2019)<\/a>, Melbourne<\/li>\n<li>Let&rsquo;s Build Voice Assistant Learning Games For Kids - <a href=\"https:\/\/www.slideshare.net\/cliffano\/lets-build-voice-assistant-learning-games-for-kids\">slides<\/a><!-- raw HTML omitted --><a href=\"https:\/\/anzunconfmel2018.sched.com\">ANZ Un\/Conf 2018<\/a>, Melbourne<\/li>\n<li>Having A Talk With Jenkins - <a href=\"https:\/\/www.slideshare.net\/cliffano\/having-a-talk-with-jenkins\">slides<\/a> | <a href=\"https:\/\/www.youtube.com\/watch?v=Wc_QUjw1y3w\">video<\/a><!-- raw HTML omitted --><a href=\"https:\/\/devopsworldjenkinsworld2018.sched.com\">DevOps World 2018<\/a>, San Francisco<\/li>\n<li>Beyond AEM Curl Commands - <a href=\"https:\/\/www.slideshare.net\/cliffano\/beyond-aem-curl-commands\">slides<\/a><!-- raw HTML omitted --><a href=\"https:\/\/immerse18.adobe-devs.adobeevents.com\/\">Adobe Immerse'18<\/a><\/li>\n<li>AEM OpenCloud - <a href=\"https:\/\/www.slideshare.net\/cliffano\/aem-opencloud\">slides<\/a><!-- raw HTML omitted --><a href=\"https:\/\/www.meetup.com\/Melbourne-Adobe-Experience-Cloud\/events\/249851899\/\">Adobe Experience Cloud Meetup 5th Edition<\/a>, Melbourne<\/li>\n<li>How To Play Music On A Vacuum Cleaner - <a href=\"https:\/\/www.slideshare.net\/cliffano\/how-to-play-music-on-a-vacuum-cleaner-82679071\">slides<\/a><!-- raw HTML omitted --><a href=\"https:\/\/www.eventbrite.com.au\/e\/anz-technology-unconference-2017-tickets-39242191451\">ANZ Technology Un:\/\/Conference 2017<\/a>, Melbourne<\/li>\n<li>Bringing Jenkins Remote Access API To The Masses - <a href=\"https:\/\/www.slideshare.net\/cliffano\/bringing-jenkins-remote-access-api-to-the-masses\">slides<\/a> | <a href=\"https:\/\/www.youtube.com\/watch?v=D93t1jElt4Q\">video<\/a><!-- raw HTML omitted --><a href=\"https:\/\/jenkinsworld20162017.sched.com\/event\/ALN6\/bringing-jenkins-remote-access-api-to-the-masses\">Jenkins World 2017<\/a>, San Francisco<\/li>\n<li>Building An AEM API Clients Ecosystem - <a href=\"https:\/\/www.slideshare.net\/cliffano\/building-an-aem-api-clients-ecosystem\">slides<\/a><!-- raw HTML omitted --><a href=\"https:\/\/www.meetup.com\/Melbourne-Adobe-Experience-Cloud\/events\/233363101\/?eventId=233363101\">Adobe Marketing Cloud Community Expo (AMCCE) 2016<\/a>, Melbourne<\/li>\n<li>Continuous Delivery Using Jenkins - <a href=\"https:\/\/www.slideshare.net\/cliffano\/continuous-delivery-using-jenkins\">slides<\/a> | <a href=\"https:\/\/www.youtube.com\/watch?v=kDLG5c-OIgE\">video<\/a><!-- raw HTML omitted --><a href=\"http:\/\/2011.osdc.com.au:80\/schedule\/#continuousdeliver\">Open Source Developers Conference 2011<\/a>, Canberra<\/li>\n<li>Javascript Everywhere From Nose To Tail - <a href=\"https:\/\/www.slideshare.net\/cliffano\/javascript-everywhere-from-nose-to-tail\">slides<\/a> | <a href=\"https:\/\/vimeo.com\/28531395\">video<\/a><!-- raw HTML omitted --><a href=\"http:\/\/melbjs.eventbrite.com\">Melbourne JavaScript User Group<\/a> August 2011, Melbourne<\/li>\n<\/ul>"},{"title":"Adobe Experience Cloud Meetup - 5th Edition","link":"https:\/\/blog.cliffano.com\/2018\/10\/30\/adobe-experience-cloud-meetup-5th-edition\/","pubDate":"Tue, 30 Oct 2018 23:01:22 +0000","guid":"https:\/\/blog.cliffano.com\/2018\/10\/30\/adobe-experience-cloud-meetup-5th-edition\/","description":"<p>Wayyy back in May 2018, I presented a talk at <a href=\"https:\/\/www.meetup.com\/Melbourne-Adobe-Experience-Cloud\/events\/249851899\/\">Adobe Experience Cloud Meetup - 5th Edition<\/a> titled <a href=\"https:\/\/www.slideshare.net\/cliffano\/aem-opencloud\">AEM OpenCloud<\/a>.<\/p>\n<p><a href=\"https:\/\/shinesolutions.com\/aem-opencloud\/\">AEM OpenCloud<\/a> is an open source cloud platform for running <a href=\"https:\/\/www.adobe.com\/au\/marketing\/experience-manager.html\">Adobe Experience Manager<\/a> environments on <a href=\"https:\/\/aws.amazon.com\">Amazon Web Services<\/a>. This provides the bells and whistles in terms of auto recovery, failover, blue green deployment, repository migration, back up management, content health checking, multi AEM versions support, multi operating systems support, multi architectures and permissions support, and a lot of other features.<\/p>"},{"title":"Little Godzilla Underground Robot Fighting","link":"https:\/\/blog.cliffano.com\/2018\/10\/30\/little-godzilla-underground-robot-fighting\/","pubDate":"Tue, 30 Oct 2018 16:39:41 +0000","guid":"https:\/\/blog.cliffano.com\/2018\/10\/30\/little-godzilla-underground-robot-fighting\/","description":"<p>Milestone: At 30 months old, my son figured out that there&rsquo;s a future in running an underground robot fighting club.<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/IMG_20180607_194717.jpg\" alt=\"\"><\/p>"},{"title":"Adobe Immerse '18","link":"https:\/\/blog.cliffano.com\/2018\/09\/27\/adobe-immerse-18\/","pubDate":"Thu, 27 Sep 2018 07:12:12 +0000","guid":"https:\/\/blog.cliffano.com\/2018\/09\/27\/adobe-immerse-18\/","description":"<p>Back in June 2018 (I should really really really work on my blogging), I presented a talk at <a href=\"https:\/\/immerse18.adobe-devs.adobeevents.com\/\">Adobe Immerse &lsquo;18<\/a> titled <a href=\"https:\/\/www.slideshare.net\/cliffano\/beyond-aem-curl-commands\">Beyond AEM Curl Commands<\/a>. This is basically the culmination of my effort in tackling the widespread (mis)use of cURL commands for provisioning <a href=\"https:\/\/www.adobe.com\/au\/marketing\/experience-manager.html\">Adobe Experience Manager<\/a> environments, and the lack of official AEM web API.<\/p>\n<p>This event was promoted as &ldquo;The global virtual conference for enterprise developers on Adobe solutions &amp; platform,&rdquo; and it was my first time giving a talk at a virtual conference. Learnt some lessons with managing event preparation on different timezones (would somebody please think about Australia? :p), and to also get a clear voice recording (my session producer blamed the Internet from down under, but I blamed the mic).<\/p>"},{"title":"ANZ Technology Unconference 2017","link":"https:\/\/blog.cliffano.com\/2018\/02\/12\/anz-technology-unconference-2017\/","pubDate":"Mon, 12 Feb 2018 14:22:18 +0000","guid":"https:\/\/blog.cliffano.com\/2018\/02\/12\/anz-technology-unconference-2017\/","description":"<p>Back in November 2017 (I should really work on my blogging), I presented a talk titled <a href=\"https:\/\/www.slideshare.net\/cliffano\/how-to-play-music-on-a-vacuum-cleaner-82679071\">How To Play Music On A Vacuum Cleaner<\/a> at <a href=\"https:\/\/www.eventbrite.com.au\/e\/anz-technology-unconference-tickets-39242191451\">ANZ Technology Unconference 2017<\/a>. I gave the audience a walkthrough of my experience with trying to fix a broken circle-dancing Roomba which ended up with utilising the Roomba vacuum cleaner as a music player, some sound tuning tips included.<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/anzunconf.png\" alt=\"\"><\/p>\n<p>Lo and behold, my talk was voted as the crowd favourite!<\/p>"},{"title":"Feedpaper in 2017","link":"https:\/\/blog.cliffano.com\/2017\/12\/27\/feedpaper-in-2017\/","pubDate":"Wed, 27 Dec 2017 15:12:12 +0000","guid":"https:\/\/blog.cliffano.com\/2017\/12\/27\/feedpaper-in-2017\/","description":"<p>I hastily wrote Feedpaper <a href=\"http:\/\/blog.cliffano.com\/2011\/02\/19\/do-you-find-websites-hard-to-read-on-the-iphone-try-feedtouch\/\">in 2011<\/a> (was called FeedTouch back then) as an effort to come up with the fastest way for me to speed-read the news from a curated list of websites. Imagine going to the good old brick and mortar book shop and skimmed your favourite newspapers as fast as possible.<\/p>\n<p>Lo and behold, it is still up and running in 2017, and it still is the fastest way for me to consume the news. The only difference is that Feedpaper is now running on this tech stack: <a href=\"http:\/\/code.kik.com\/app\/3\/index.html\">App.js<\/a>, <a href=\"https:\/\/www.npmjs.com\/package\/node-read\">node-read<\/a>, <a href=\"https:\/\/www.npmjs.com\/package\/ae86\">ae86<\/a>, <a href=\"https:\/\/www.terraform.io\/\">Terraform<\/a>, and <a href=\"https:\/\/docs.aws.amazon.com\/AmazonS3\/latest\/dev\/WebsiteHosting.html\">S3<\/a>.<\/p>"},{"title":"Little Godzilla Meets Robot","link":"https:\/\/blog.cliffano.com\/2017\/12\/24\/little-godzilla-meets-robot\/","pubDate":"Sun, 24 Dec 2017 14:25:20 +0000","guid":"https:\/\/blog.cliffano.com\/2017\/12\/24\/little-godzilla-meets-robot\/","description":"<p>Milestone: Introduced my son to a robot for the first time when he was 18 months old.<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/lg-robot.png\" alt=\"\"><\/p>"},{"title":"Jenkins World 2017","link":"https:\/\/blog.cliffano.com\/2017\/09\/01\/jenkins-world-2017\/","pubDate":"Fri, 01 Sep 2017 15:13:31 +0000","guid":"https:\/\/blog.cliffano.com\/2017\/09\/01\/jenkins-world-2017\/","description":"<p>I was in San Francisco this week for <a href=\"https:\/\/jenkinsworld20162017.sched.com\/\">Jenkins World 2017<\/a> where I also gave a talk titled <a href=\"https:\/\/jenkinsworld20162017.sched.com\/event\/ALN6\/bringing-jenkins-remote-access-api-to-the-masses\">Bringing Jenkins Remote Access API To The Masses<\/a>.<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/devopsworld-jenkins-api.png\" alt=\"\"><\/p>\n<p>Took this opportunity to have few chats in person to a number of people whom I had previously only known from Jenkins\/Hudson IRC channel and mailing list. It was also interesting to talk to other Jenkins users with varying use cases and requirements.<\/p>\n<p>The conference itself was great. To me, it cemented Jenkins position as the incumbent in CI\/CD space (I&rsquo;m happy to hear if anyone would like to convince me otherwise).<\/p>"},{"title":"Streaming Swagger CodeGen Ruby Client File Download","link":"https:\/\/blog.cliffano.com\/2017\/05\/27\/streaming-swagger-codegen-ruby-client-file-download\/","pubDate":"Sat, 27 May 2017 16:04:48 +0000","guid":"https:\/\/blog.cliffano.com\/2017\/05\/27\/streaming-swagger-codegen-ruby-client-file-download\/","description":"<p>Few days ago I received an error report about a number of file download failures on one of the applications that I was working on. And after some troubleshooting effort, I found out that the failures happened only on files with size ~2Gb or greater. A colleague also dug up this important clue in one of the log files: <code>failed to allocate memory<\/code>, but there was no stack trace to be found. Great start.<\/p>"},{"title":"Color Harmony By Hideaki Chijiiwa","link":"https:\/\/blog.cliffano.com\/2016\/12\/02\/color-harmony-by-hideaki-chijiiwa\/","pubDate":"Fri, 02 Dec 2016 20:23:19 +0000","guid":"https:\/\/blog.cliffano.com\/2016\/12\/02\/color-harmony-by-hideaki-chijiiwa\/","description":"<p>My dad is visiting Melbourne and he brought his 1987 copy of Hideaki Chijiiwa&rsquo;s <a href=\"https:\/\/www.amazon.com\/Color-Harmony-Guide-Creative-Combinations\/dp\/0935603069\">Color Harmony - A guide to creative color combinations<\/a> for me to keep. This is one of the many books from his home office&rsquo;s library in Jakarta which I flipped through far too many times during my childhood.<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/color_harmony.jpg\" alt=\"\"><\/p>\n<p>This colour combinations knowledge helped me with my first few gigs as a front end developer during my university days. But it certainly hasn&rsquo;t helped with ignoring badly colour coded diagrams that I encountered for the following decade and a half.<\/p>"},{"title":"Adobe Marketing Cloud Community Expo","link":"https:\/\/blog.cliffano.com\/2016\/11\/10\/adobe-marketing-cloud-community-expo\/","pubDate":"Thu, 10 Nov 2016 22:12:11 +0000","guid":"https:\/\/blog.cliffano.com\/2016\/11\/10\/adobe-marketing-cloud-community-expo\/","description":"<p>With the same squad as <a href=\"https:\/\/blog.cliffano.com\/2016\/10\/29\/aws-serverless-chatbot-hackathon\/\">AWS Chatbot Hackathon<\/a>, I also participated in another hackathon as part of <a href=\"https:\/\/www.meetup.com\/Melbourne-AEM-CQ-Meetup\/events\/233363101\/\">Adobe Marketing Cloud Community Expo (AMCCE)<\/a>.<\/p>\n<p>We presented <a href=\"https:\/\/github.com\/shinesolutions\/swagger-aem\">Swagger AEM<\/a>, an ecosystem of AEM API clients that <a href=\"http:\/\/shinesolutions.com\">Shine Solutions<\/a> recently open sourced. The idea is to build an OpenAPI specification for AEM, and then generate a number of API clients in various languages like Ruby, Python, Java, and JavaScript using <a href=\"https:\/\/github.com\/swagger-api\/swagger-codegen\">Swagger Codegen<\/a>. These clients will then be used by the next layer of tools like Puppet and Ansible, or by custom applications, or who knows, maybe wearable devices (why not?).<\/p>"},{"title":"AWS Serverless Chatbot Hackathon","link":"https:\/\/blog.cliffano.com\/2016\/10\/29\/aws-serverless-chatbot-hackathon\/","pubDate":"Sat, 29 Oct 2016 23:23:23 +0000","guid":"https:\/\/blog.cliffano.com\/2016\/10\/29\/aws-serverless-chatbot-hackathon\/","description":"<p>Last month me and two buddies from work, Michael Diender and Stephen Shim, participated in <a href=\"https:\/\/awschatbot.devpost.com\/\">AWS Serverless Chatbot Hackathon<\/a> hosted by Devpost. This hackathon was <a href=\"https:\/\/aws.amazon.com\/blogs\/aws\/enter-the-aws-serverless-chatbot-competition\/\">announced<\/a> by Jeff Barr on AWS Blog on August 10th this year.<\/p>\n<p>Even though they allowed about 1.5 months submission period, our team only spent 8 hours for each person in order to build two entries due to our busy schedules: <a href=\"https:\/\/github.com\/shinesolutions\/chaos-slackbot\">Chaos Slackbot<\/a> and <a href=\"https:\/\/github.com\/shinesolutions\/sitechecker-slackbot\">SiteChecker Slackbot<\/a>.<\/p>\n<p>The first one, Chaos Slackbot, is a serverless Slack bot for randomly terminating EC2 instance from Auto Scaling Groups whitelist. The idea is similar to <a href=\"https:\/\/github.com\/Netflix\/SimianArmy\/wiki\/Chaos-Monkey\">Chaos Monkey<\/a>, but the difference is that the randomness is determined by the messages that people sent to a Slack channel. The bot won&rsquo;t know in advance what people will say and when they will say those particular messages.<\/p>"},{"title":"Some Projects Handover","link":"https:\/\/blog.cliffano.com\/2016\/06\/25\/some-projects-handover\/","pubDate":"Sat, 25 Jun 2016 21:32:09 +0000","guid":"https:\/\/blog.cliffano.com\/2016\/06\/25\/some-projects-handover\/","description":"<p>Due to lack of coding time outside of work hours, I&rsquo;ve handed some projects over to these intrepid volunteers:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/basti1302\/repoman\">Repoman<\/a> is now maintained by <a href=\"https:\/\/github.com\/basti1302\">Bastian Krol<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/jenkinsci\/sitemonitor-plugin\">SiteMonitor Plugin<\/a> is now maintained by <a href=\"https:\/\/github.com\/onuba\">Francisco Hern\u00e1ndez Su\u00e1rez<\/a><\/li>\n<\/ul>\n<p>Some other Jenkins plugins had organically been inherited by the community:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/jenkinsci\/chucknorris-plugin\">ChuckNorris Plugin<\/a> with <a href=\"https:\/\/github.com\/batmat\">Baptiste Mathus<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/jenkinsci\/nodejs-plugin\">NodeJS Plugin<\/a> with <a href=\"https:\/\/github.com\/ndeloof\">Nicolas De loof<\/a><\/li>\n<\/ul>\n<p>Thanks, folks! Much appreciated.<\/p>\n<p>And just as a reminder, all of the Jenkins plugins I created eons ago are <a href=\"https:\/\/wiki.jenkins-ci.org\/display\/JENKINS\/Adopt+a+Plugin\">up for adoption<\/a>.<\/p>"},{"title":"Custom AWS AMIs Dependency Tree","link":"https:\/\/blog.cliffano.com\/2016\/03\/19\/custom-aws-amis-dependency-tree\/","pubDate":"Sat, 19 Mar 2016 16:57:08 +0000","guid":"https:\/\/blog.cliffano.com\/2016\/03\/19\/custom-aws-amis-dependency-tree\/","description":"<p>As awesome as those AMIs from <a href=\"https:\/\/aws.amazon.com\/marketplace\/\">AWS Marketplace<\/a> are, it&rsquo;s often not possible to use most of them <em>AS-IS<\/em> at various organisations due to policies that enforce:<\/p>\n<ul>\n<li>Mandated operating system with specific distro and version<\/li>\n<li>Blacklisted operating system packages for security reasons<\/li>\n<li>Whitelisted versions of various tech stacks, tools, libraries, etc<\/li>\n<\/ul>\n<p>I&rsquo;ve never found a marketplace AMI that fulfils all of the above requirements without some further provisioning, which can sometimes defeat the purpose of using an AMI in the first place. Another challenge with marketplace AMIs is the reliance on the providers to actively update their AMIs, in a manner that suits your schedule.<\/p>"},{"title":"My Ninja Blocks Setup","link":"https:\/\/blog.cliffano.com\/2015\/01\/10\/my-ninja-blocks-setup\/","pubDate":"Sat, 10 Jan 2015 07:00:42 +0000","guid":"https:\/\/blog.cliffano.com\/2015\/01\/10\/my-ninja-blocks-setup\/","description":"<p>Now that the fine folks at Ninja Blocks <a href=\"http:\/\/blog.ninjablocks.com\/updates\/shipping-update\/\">already started shipping<\/a>\u00a0their next generation IoT controller, the Ninja Sphere,\u00a0I better write about my\u00a0old school Ninja Blocks setup before it gets too late.<\/p>\n<p>First off is the Watts Clever socket that I used with Ninja rules to switch a table\u00a0lamp on at 8.30pm and then switch it off at 10.30pm during weekdays.<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/2014-12-16_11.50.38.jpg\" alt=\"\"><\/p>\n<p>The second socket is used to switch\u00a0my\u00a0Tivoli radio\u00a0on and off on the rare occasion\u00a0when everyone is away travelling and the house is empty, you know,\u00a0like Home Alone but minus the kid.<\/p>"},{"title":"Wrapping AEM cURL Commands With Python","link":"https:\/\/blog.cliffano.com\/2014\/05\/21\/wrapping-aem-curl-commands-with-python\/","pubDate":"Wed, 21 May 2014 13:40:24 +0000","guid":"https:\/\/blog.cliffano.com\/2014\/05\/21\/wrapping-aem-curl-commands-with-python\/","description":"<p>If you ever\u00a0had the experience (no pun) of using\u00a0<a href=\"http:\/\/www.adobe.com\/au\/solutions\/web-experience-management.html\">Adobe Experience Manager<\/a>\u00a0(AEM), you would\u00a0already know that curl commands are arguably the de facto\u00a0way of\u00a0interacting with AEM over http.<\/p>\n<p>Whenever you google for various AEM \/CQ HOWTOs, it&rsquo;s easy to find examples with curl commands:<\/p>\n<ul>\n<li>\n<p><a href=\"http:\/\/stackoverflow.com\/questions\/19387826\/adobe-cq-is-it-possible-to-execute-curl-command\">Adobe CQ- Is it possible to execute CURL command?<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"http:\/\/www.wemblog.com\/2011\/09\/how-to-create-pages-using-curl-command.html\">How to create pages using curl command in CQ \/ WEM<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"http:\/\/aemtips.blogspot.com.au\/2013\/05\/how-to-find-out-curl-command-for-any-cq.html\">How to find out CURL command for any CQ operation?<\/a><\/p>"},{"title":"Human-Readable Ansible Playbook Log Output Using Callback Plugin","link":"https:\/\/blog.cliffano.com\/2014\/04\/06\/human-readable-ansible-playbook-log-output-using-callback-plugin\/","pubDate":"Sun, 06 Apr 2014 10:29:58 +0000","guid":"https:\/\/blog.cliffano.com\/2014\/04\/06\/human-readable-ansible-playbook-log-output-using-callback-plugin\/","description":"<p>One problem I&rsquo;ve had\u00a0with Ansible playbook since its early 0.x days is with its\u00a0verbose log\u00a0output. Jsonified by default, it&rsquo;s hard to read, and pretty much impossible for a human to review when its stdout or stderr contains tens\/hundreds of lines combined into one lengthy string.<\/p>\n<p>Here&rsquo;s how it looks like:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-json\" data-lang=\"json\"><span style=\"display:flex;\"><span>    \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#960050;background-color:#1e0010\">changed:<\/span> [<span style=\"color:#960050;background-color:#1e0010\">gennou.local<\/span>] <span style=\"color:#960050;background-color:#1e0010\">=&gt;<\/span> {<span style=\"color:#f92672\">&#34;changed&#34;<\/span>: <span style=\"color:#66d9ef\">true<\/span>, <span style=\"color:#f92672\">&#34;cmd&#34;<\/span>: <span style=\"color:#e6db74\">&#34;\/tmp\/sample.sh&#34;<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">&#34;delta&#34;<\/span>: <span style=\"color:#e6db74\">&#34;0:00:00.019164&#34;<\/span>, <span style=\"color:#f92672\">&#34;end&#34;<\/span>: <span style=\"color:#e6db74\">&#34;2014-03-30 21:05:33.994066&#34;<\/span>, <span style=\"color:#f92672\">&#34;rc&#34;<\/span>: <span style=\"color:#ae81ff\">0<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">&#34;start&#34;<\/span>: <span style=\"color:#e6db74\">&#34;2014-03-30 21:05:33.974902&#34;<\/span>, <span style=\"color:#f92672\">&#34;stderr&#34;<\/span>: <span style=\"color:#e6db74\">&#34;&#34;<\/span>, <span style=\"color:#f92672\">&#34;stdout&#34;<\/span>: <span style=\"color:#e6db74\">&#34;gazillion\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#e6db74\">texts here with lots of \\n\u00a0in between gazillion texts here with\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#e6db74\">lots of \\n in between gazillion texts here with lots of \\n\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#e6db74\">in between gazillion texts here with lots \\n in between&#34;<\/span>}<\/span><\/span><\/code><\/pre><\/div>\n<p>When &ndash;verbose flag is set, I believe that the intention is\u00a0for a human to eventually review the verbose log output. And whenever the human did review the log, the person never failed to tell\u00a0me that the jsonified message was impossible to read, to which\u00a0I replied with &ldquo;They will fix it someday.&rdquo;<\/p>"},{"title":"Roombox - Node Knockout 2013","link":"https:\/\/blog.cliffano.com\/2013\/11\/25\/roombox-node-knockout-2013\/","pubDate":"Mon, 25 Nov 2013 11:26:01 +0000","guid":"https:\/\/blog.cliffano.com\/2013\/11\/25\/roombox-node-knockout-2013\/","description":"<p>A few weeks ago I participated in <a href=\"http:\/\/nodeknockout.com\">Node Knockout 2013<\/a> (NKO4), a 48-hour hackathon with 385 teams competing for the top spot in 7 categories (team, solo, innovation, design, utility\/fun, completeness, and popularity).<\/p>\n<p>And here&rsquo;s a video of what I hacked: <a href=\"http:\/\/github.com\/cliffano\/roombox\">Roombox<\/a>, a <a href=\"http:\/\/en.wikipedia.org\/wiki\/Roomba\">Roomba vacuum cleaner<\/a> turned into a boombox using node.js . This demo shows the Roomba playing Rocky theme, Beverly Hills Cop theme, Hey Jude (The Beatles), Scar Tissue (Red Hot Chilli Peppers), Super Mario Bros. theme, and Airwolf theme.<\/p>"},{"title":"NodeUp 53: NodeUp Listeners On NodeUp","link":"https:\/\/blog.cliffano.com\/2013\/11\/24\/nodeup-53-nodeup-listeners-on-nodeup\/","pubDate":"Sun, 24 Nov 2013 10:58:35 +0000","guid":"https:\/\/blog.cliffano.com\/2013\/11\/24\/nodeup-53-nodeup-listeners-on-nodeup\/","description":"<p>About a month ago, I joined D-Shaw, Nizar Khalife, Erik Isaksen, and Matt Creager on <a href=\"http:\/\/nodeup.com\/fiftythree\">NodeUp 53<\/a> where we discussed about NodeUp podcast and node.js community from NodeUp listeners point of view, and I also talked a bit about <a href=\"http:\/\/blog.cliffano.com\/2012\/03\/23\/australia-according-to-nodeup\/\">Australia, kangaroos, and node<\/a>. Thanks to Rodd Vagg for <a href=\"https:\/\/twitter.com\/rvagg\/status\/392047095764381696\">pinging me<\/a> about this particular episode.<\/p>\n<p>Recording the show itself was an interesting experience :). For one, it started at 4am Melbourne EST. I totally missed the two alarms I set up, and was finally awaken by my mobile&rsquo;s push notification alert from dshaw&rsquo;s tweet telling me to accept the Skype invitation about two minutes before 4. Ran down the stairs, head spun a bit for the first hour lol.<\/p>"},{"title":"An Old Dryer, A Watts Clever, and A Ninja Blocks","link":"https:\/\/blog.cliffano.com\/2013\/10\/27\/an-old-dryer-a-watts-clever-and-a-ninja-blocks\/","pubDate":"Sun, 27 Oct 2013 09:26:37 +0000","guid":"https:\/\/blog.cliffano.com\/2013\/10\/27\/an-old-dryer-a-watts-clever-and-a-ninja-blocks\/","description":"<p>This was another quick weekend hack to fix my old dryer&rsquo;s busted timer problem (busted timer = having to stay around when it&rsquo;s time to switch off the dryer).<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/photo+1.JPG\" alt=\"\"><\/p>\n<p>Step one was to use <a href=\"http:\/\/www.wattsclever.net.au\/shop\/easyoffsocket3\">Watts Clever Easy-off Remote Control Socket<\/a> which allowed me to switch the power on and off remotely. This product comes with a remote control which saved me from having to get out of the house to get to the garage during winter. But that&rsquo;s not all&hellip;<\/p>"},{"title":"Monitor Jenkins From The Terminal","link":"https:\/\/blog.cliffano.com\/2013\/09\/13\/monitor-jenkins-from-the-terminal\/","pubDate":"Fri, 13 Sep 2013 07:56:31 +0000","guid":"https:\/\/blog.cliffano.com\/2013\/09\/13\/monitor-jenkins-from-the-terminal\/","description":"<p>Here&rsquo;s how I&rsquo;ve been monitoring my Jenkins setup&hellip;<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/nestor-terminal-watch.png\" alt=\"\"><\/p>\n<p>A combination of <a href=\"https:\/\/github.com\/cliffano\/nestor\/\">Nestor<\/a> + <a href=\"http:\/\/en.wikipedia.org\/wiki\/Watch_%28Unix%29\">watch<\/a> + <a href=\"http:\/\/www.ubuntugeek.com\/terminator-multiple-gnome-terminals-in-one-window.html\">Terminator<\/a>\u00a0\u00bb one view for monitoring failing builds, one view for executors status, and one view for job queue. A summary of Jenkins status info on a small screen estate that I can place at the corner of my workspace.<\/p>\n<p>If you want to set up something similar, here are the commands: (assume JENKINS_URL is already set)<\/p>"},{"title":"DataGen Workers Optimisation","link":"https:\/\/blog.cliffano.com\/2013\/08\/03\/datagen-workers-optimisation\/","pubDate":"Sat, 03 Aug 2013 03:33:21 +0000","guid":"https:\/\/blog.cliffano.com\/2013\/08\/03\/datagen-workers-optimisation\/","description":"<p>I released <a href=\"https:\/\/npmjs.org\/package\/datagen\">DataGen<\/a> v0.0.9 during lunch break yesterday. This version includes the support to limit how many workers can run concurrently, which is something that I&rsquo;ve always wanted to add since day one. I finally got the time to do it last weekend, and it turned out to be an easy task thanks to <a href=\"http:\/\/r.va.gg\/\">Rod Vagg<\/a>&rsquo;s <a href=\"https:\/\/npmjs.org\/package\/worker-farm\">worker-farm<\/a> module.<\/p>\n<p>Why is this necessary?<\/p>\n<p>The problem with previous versions of DataGen was that when you want to generate 20 data files, then 20 worker processes will be created and run concurrently. It&rsquo;s obviously not a great idea to have 20 processes fighting over 2 CPUs.<\/p>"},{"title":"Database Sharding Be Like","link":"https:\/\/blog.cliffano.com\/2013\/07\/31\/database-sharding-be-like\/","pubDate":"Wed, 31 Jul 2013 12:24:40 +0000","guid":"https:\/\/blog.cliffano.com\/2013\/07\/31\/database-sharding-be-like\/","description":"<p>Sometimes I get the feeling that people think database sharding is like flipping a switch.<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/sharding.png\" alt=\"\"><\/p>\n<p>In reality, I think it&rsquo;s more like tuning a set of dials.<\/p>"},{"title":"Jenkins Build Slaves On A Budget","link":"https:\/\/blog.cliffano.com\/2013\/07\/28\/jenkins-build-slaves-on-a-budget\/","pubDate":"Sun, 28 Jul 2013 09:42:27 +0000","guid":"https:\/\/blog.cliffano.com\/2013\/07\/28\/jenkins-build-slaves-on-a-budget\/","description":"<p>About half a year ago our team started working on a project with <a href=\"http:\/\/www.youtube.com\/watch?v=2rKEveL55TY\">micro-service architecture<\/a>, which means we had a lot of little applications to build as part of our delivery pipeline. One of the reasons why we opted to use this architecture was to gain the ability to replace a piece of component without having to rebuild the whole system, hence enabling faster feedback loop by releasing small chunks of changes in small parts of the system.<\/p>"},{"title":"CITCON 2013","link":"https:\/\/blog.cliffano.com\/2013\/07\/21\/sydney-workcapade-2013\/","pubDate":"Sun, 21 Jul 2013 09:57:53 +0000","guid":"https:\/\/blog.cliffano.com\/2013\/07\/21\/sydney-workcapade-2013\/","description":"<p>I attended <a href=\"http:\/\/www.citconf.com\/archive\/sydney2013\/\">CITCON 2013<\/a> in Sydney last February. This year&rsquo;s sessions covered more non-technical issues compared to <a href=\"http:\/\/blog.cliffano.com\/2010\/07\/04\/new-zealand-workcapade-2010\/\">CITCON 2010<\/a>. Two of the more interesting topics for me were on how devops movement could potentially discourage collaboration, and on how large non-tech companies try and still fail to implement continuous delivery.<\/p>\n<p>Those were some of the problems that I&rsquo;ve been battling for many years. In an organisation where dev and ops are two separate divisions, devops is often a shortcut for dev to do ops tasks while bypassing any ops involvement. Instead, a better alternative would be for dev and ops teams to collaborate and stop fighting over issues like root access.<\/p>"},{"title":"Introducing Repoman","link":"https:\/\/blog.cliffano.com\/2013\/05\/26\/introducing-repoman\/","pubDate":"Sun, 26 May 2013 06:58:15 +0000","guid":"https:\/\/blog.cliffano.com\/2013\/05\/26\/introducing-repoman\/","description":"<p><strong>Q:<\/strong> _How do you clone 30 repositories from your personal GitHub accounts and 150 repositories from your organisation GitHub accounts in just one line?\n_\n<strong>A:<\/strong> <code>repoman --github-user myuser1,myuser2 --github-org myorg1,myorg2 config &amp;&amp; repoman init<\/code><\/p>\n<p><strong>Q:<\/strong> _How do you execute a set of commands against all repositories in just one line?\n_\n<strong>A:<\/strong> <code>repoman exec 'git stash &amp;&amp; git pull --rebase &amp;&amp; git stash apply'<\/code><\/p>\n<p>I wrote <a href=\"https:\/\/github.com\/cliffano\/repoman\">Repoman<\/a> back in 2011 and I&rsquo;ve been using it ever since. It was my solution to resolve the annoyances involved with working on multiple machines, multiple OSes, multiple SCMs, and multiple repositories that depend on each other.<\/p>"},{"title":"How To Incorrectly Track The Progress Of A Project","link":"https:\/\/blog.cliffano.com\/2013\/05\/08\/how-to-incorrectly-track-the-progress-of-a-project\/","pubDate":"Wed, 08 May 2013 08:37:47 +0000","guid":"https:\/\/blog.cliffano.com\/2013\/05\/08\/how-to-incorrectly-track-the-progress-of-a-project\/","description":"<p>The next time a manager asks you the percentage progress of a task, make sure you reply with a float rounded to 2 decimal places, and say it with full confidence.<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/photo.JPG\" alt=\"\"><\/p>\n<p>Sometime in mid 2000s, the manager of a project I was working on had to take an emergency leave, so another manager filled in for him. It was an agile project, but somehow this other manager managed to come up with a magical Gantt chart for the rest of the project. The project was waterfalled!<\/p>"},{"title":"Voice-Controlled Lamp Using Ninja Blocks + MacBook","link":"https:\/\/blog.cliffano.com\/2013\/05\/06\/voice-controlled-lamp-using-ninja-blocks-macbook\/","pubDate":"Mon, 06 May 2013 14:10:02 +0000","guid":"https:\/\/blog.cliffano.com\/2013\/05\/06\/voice-controlled-lamp-using-ninja-blocks-macbook\/","description":"<p>Here&rsquo;s a video of my latest quick weekend hack, using voice to switch a lamp on and off:<\/p>\n<div style=\"position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;\">\n      <iframe allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" loading=\"eager\" referrerpolicy=\"strict-origin-when-cross-origin\" src=\"https:\/\/www.youtube.com\/embed\/VwqzfYWK1R0?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0\" style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;\" title=\"YouTube video\"><\/iframe>\n    <\/div>\n\n<p>Ok, so it&rsquo;s actually a combination of <a href=\"http:\/\/www.wattsclever.com\/products\/easy-off-sockets\">Watts Clever<\/a> + <a href=\"http:\/\/ninjablocks.com\/\">Ninja Blocks<\/a> + <a href=\"http:\/\/nodejs.org\">Node.js<\/a> + <a href=\"http:\/\/www.macosxautomation.com\/automator\/\">Automator<\/a> + <a href=\"http:\/\/support.apple.com\/kb\/PH11447\">Speakable Items<\/a>. Speakable Items takes the voice commands via MacBook&rsquo;s internal microphone, then calls the Automator applications, which then runs a Node.js script (which output gets spoken by Automator applications), which then tells Ninja Blocks to actuate Watts Clever power socket.<\/p>"},{"title":"Jenkins Build Status On Ninja Blocks RGB LED","link":"https:\/\/blog.cliffano.com\/2013\/04\/08\/jenkins-build-status-on-ninja-blocks-rgb-led\/","pubDate":"Mon, 08 Apr 2013 02:37:39 +0000","guid":"https:\/\/blog.cliffano.com\/2013\/04\/08\/jenkins-build-status-on-ninja-blocks-rgb-led\/","description":"<p><a href=\"https:\/\/github.com\/cliffano\/nestor\">Nestor<\/a> v0.1.2 is out and one of its new features is <code>nestor ninja<\/code> for monitoring <a href=\"http:\/\/jenkins-ci.org\">Jenkins<\/a> and displaying the latest build status on <a href=\"http:\/\/ninjablocks.com\/\">Ninja Blocks<\/a> RGB LED device (if you have a block, it&rsquo;s the ninja&rsquo;s eyes).<\/p>\n<p>Here&rsquo;s a usage example:\n<code>export JENKINS_URL=&lt;url&gt; export NINJABLOCKS_TOKEN=&lt;token_from_https:\/\/a.ninja.is\/hacking&gt; nestor ninja<\/code><\/p>\n<p>Red for build failure, green for build success, yellow for build warning, and white for unknown status. The yellow light looks quite similar to green, and the white one does look blue-ish.<\/p>"},{"title":"Akio Morita On Management","link":"https:\/\/blog.cliffano.com\/2013\/03\/23\/akio-morita-on-management\/","pubDate":"Sat, 23 Mar 2013 07:03:48 +0000","guid":"https:\/\/blog.cliffano.com\/2013\/03\/23\/akio-morita-on-management\/","description":"<p>For the past few weeks, I&rsquo;ve been reading <a href=\"http:\/\/www.amazon.com\/gp\/product\/0451151712\/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0451151712&amp;linkCode=as2&amp;tag=mbledugcom-20\">Made In Japan<\/a>, a story about <a href=\"http:\/\/en.wikipedia.org\/wiki\/Akio_Morita\">Akio Morita<\/a>&rsquo;s life and the first three decades since the founding of Sony Corporation.<\/p>\n<p>I haven&rsquo;t finished this book, but the last chapter titled &lsquo;On Management&rsquo; was very interesting and it struck a chord with me. I&rsquo;ve seen enough management decisions that were short sighted and proven to be wrong in the long run, throughout the 12 years I&rsquo;ve been in the industry, and some of them could&rsquo;ve been avoided or at least  improved had the people behind them had better insights. I think everyone can learn a thing or two from these quotes&hellip;<\/p>"},{"title":"Private NPM Registry Replicator Document","link":"https:\/\/blog.cliffano.com\/2013\/03\/16\/private-npm-registry-replicator-document\/","pubDate":"Sat, 16 Mar 2013 05:04:02 +0000","guid":"https:\/\/blog.cliffano.com\/2013\/03\/16\/private-npm-registry-replicator-document\/","description":"<p>For my future reference and to help others trying to set up a private NPM registry which sits behind a [corporate] proxy and requires authenticated CouchDB admin access, here&rsquo;s the replicator document that I ended up using:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-javascript\" data-lang=\"javascript\"><span style=\"display:flex;\"><span>{\n<\/span><\/span><span style=\"display:flex;\"><span>   <span style=\"color:#e6db74\">&#34;_id&#34;<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#e6db74\">&#34;registry&#34;<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span>   <span style=\"color:#e6db74\">&#34;source&#34;<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#e6db74\">&#34;http:\/\/isaacs.iriscouch.com\/registry\/&#34;<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span>   <span style=\"color:#e6db74\">&#34;target&#34;<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#e6db74\">&#34;registry&#34;<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span>   <span style=\"color:#e6db74\">&#34;user_ctx&#34;<\/span><span style=\"color:#f92672\">:<\/span> {\n<\/span><\/span><span style=\"display:flex;\"><span>       <span style=\"color:#e6db74\">&#34;name&#34;<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#e6db74\">&#34;myadmin_username&#34;<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span>       <span style=\"color:#e6db74\">&#34;roles&#34;<\/span><span style=\"color:#f92672\">:<\/span> [<span style=\"color:#e6db74\">&#34;_admin&#34;<\/span>]\n<\/span><\/span><span style=\"display:flex;\"><span>   },\n<\/span><\/span><span style=\"display:flex;\"><span>   <span style=\"color:#e6db74\">&#34;continuous&#34;<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#66d9ef\">true<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span>   <span style=\"color:#e6db74\">&#34;owner&#34;<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#e6db74\">&#34;myadmin_username&#34;<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span>   <span style=\"color:#e6db74\">&#34;proxy&#34;<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#e6db74\">&#34;http:\/\/proxy:8080&#34;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>}<\/span><\/span><\/code><\/pre><\/div>\n<p>For those who are not familiar with CouchDB, the above is a document that needs to be created in _replicator database, so that the replication rule from public NPM registry to your private NPM registry can be persisted and runs continuously.<\/p>"},{"title":"The Difference Between Dev And Ops","link":"https:\/\/blog.cliffano.com\/2013\/03\/15\/the-difference-between-dev-and-ops\/","pubDate":"Fri, 15 Mar 2013 09:31:23 +0000","guid":"https:\/\/blog.cliffano.com\/2013\/03\/15\/the-difference-between-dev-and-ops\/","description":"<p>You can tell whether someone is an ops or a dev from the way he\/she stops a program&hellip;<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/diffdevops.JPG\" alt=\"How To Stop A Program - The Difference Between Dev And Ops\"><\/p>"},{"title":"Home Studio v0.3","link":"https:\/\/blog.cliffano.com\/2012\/12\/18\/home-studio-v0-3\/","pubDate":"Tue, 18 Dec 2012 12:33:02 +0000","guid":"https:\/\/blog.cliffano.com\/2012\/12\/18\/home-studio-v0-3\/","description":"<p>This favourite corner of mine in the living room is the latest revision of my home studio.\nMy main computer for the past couple of years has been an 11&quot; MacBook Air, codename: <a href=\"http:\/\/naruto.wikia.com\/wiki\/Kakashi\">kakashi<\/a>.<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/photo18.JPG\" alt=\"\"><\/p>\n<p><a href=\"http:\/\/blog.cliffano.com\/2010\/07\/04\/home-studio-v0-2\/\">The study desk<\/a> had been disassembled and now rests in the garage.<\/p>"},{"title":"Roomba Twist Fix Attempt","link":"https:\/\/blog.cliffano.com\/2012\/11\/07\/roomba-twist-fix-attempt\/","pubDate":"Wed, 07 Nov 2012 11:27:21 +0000","guid":"https:\/\/blog.cliffano.com\/2012\/11\/07\/roomba-twist-fix-attempt\/","description":"<p>A few months ago my awesome <a href=\"http:\/\/en.wikipedia.org\/wiki\/Roomba\">Roomba <\/a>vacuum cleaner started dancing instead of cleaning the carpet like it&rsquo;s supposed to. It reversed, then rotated to the right, left, right, left, all the time. I call it &lsquo;doing the Twist&rsquo; (Chubby Checker&rsquo;s).<\/p>\n<p>The closest explanation I could find on the Internet regarding this problem was something that&rsquo;s commonly known as Roomba Circle Dance. The problem is that there are a number of solutions which various people claimed to have fixed the problem and I didn&rsquo;t know which one was applicable to my case.<\/p>"},{"title":"100 Kiva Loans Later","link":"https:\/\/blog.cliffano.com\/2012\/10\/24\/100-kiva-loans-later\/","pubDate":"Wed, 24 Oct 2012 11:56:16 +0000","guid":"https:\/\/blog.cliffano.com\/2012\/10\/24\/100-kiva-loans-later\/","description":"<p>Today I made my 100th micro loan on <a href=\"http:\/\/kiva.org\">Kiva.org<\/a> . I joined Kiva in July 2007 and today I have $275 across 15 active loans, so I&rsquo;m one of those people with a minimal fund who re-loan as soon as there&rsquo;s enough repayment.<\/p>\n<p>Here are some stats from my portfolio:<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/kivastat.png\" alt=\"\"><\/p>\n<p>The interesting numbers here are the 1.62% delinquency rate and 0.68% default rate. <a href=\"http:\/\/mpra.ub.uni-muenchen.de\/16123\/\">Yep<\/a>, <a href=\"http:\/\/www.themix.org\/publications\/microbanking-bulletin\/2010\/11\/microfinance-default-rates-ghana-evidence-individual-liab\">default<\/a> <a href=\"http:\/\/www.bloomberg.com\/news\/2010-06-14\/india-microfinance-evokes-risk-of-subprime-in-the-east-as-sks-prepares-ipo.html\">happens<\/a> in microfinance world.<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/kivadist.jpg\" alt=\"\"><\/p>\n<p>Portfolio distribution:<\/p>\n<ul>\n<li>\n<p>Gender: 65% female, 35% male.<\/p>"},{"title":"DevOps Collaboration Patterns","link":"https:\/\/blog.cliffano.com\/2012\/10\/20\/devops-collaboration-patterns\/","pubDate":"Sat, 20 Oct 2012 11:30:23 +0000","guid":"https:\/\/blog.cliffano.com\/2012\/10\/20\/devops-collaboration-patterns\/","description":"<p>The good, the bad, and the ugly.<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/devops.jpg\" alt=\"\"><\/p>"},{"title":"Sapi, A Node.js Client For Sensis API","link":"https:\/\/blog.cliffano.com\/2012\/07\/15\/sapi-a-node-js-client-for-sensis-api\/","pubDate":"Sun, 15 Jul 2012 07:26:05 +0000","guid":"https:\/\/blog.cliffano.com\/2012\/07\/15\/sapi-a-node-js-client-for-sensis-api\/","description":"<p>We had a hack day at <a href=\"http:\/\/www.about.sensis.com.au\/\">Sensis<\/a> a couple of days ago where I ended up writing <a href=\"http:\/\/github.com\/cliffano\/sapi\">Sapi<\/a>, a Node.js client for <a href=\"http:\/\/developers.sensis.com.au\/about\">Sensis API<\/a>. This module is now <a href=\"http:\/\/search.npmjs.org\/#\/sapi\">available on NPM<\/a>.<\/p>\n<p>The latest version (v0.0.5) was tested against Sensis API open beta version ob-20110511. I think I&rsquo;ve got all of its <a href=\"http:\/\/developers.sensis.com.au\/docs\">documented features<\/a> covered. Let me know if I missed anything.<\/p>\n<p>Sapi module provides a chainable interface to construct the endpoint parameters, here&rsquo;s an example:<\/p>"},{"title":"DataGen: Generate Large Test Data Files - Like A Boss","link":"https:\/\/blog.cliffano.com\/2012\/07\/08\/datagen-generate-large-test-data-files-like-a-boss\/","pubDate":"Sun, 08 Jul 2012 02:17:41 +0000","guid":"https:\/\/blog.cliffano.com\/2012\/07\/08\/datagen-generate-large-test-data-files-like-a-boss\/","description":"<p>A couple of months ago I was doing some volume and performance testing against an application that was expecting a 500% data growth, which meant I had to generate lots and lots of dummy data to test whether the storage would hold up and whether the application itself would still perform well.<\/p>\n<p>I quickly came up with a script that loops through N times, generates dummy data, and creates an XML file. I left the script running while working on something else in parallel, and at the end the script finished after about a couple of hours.<\/p>"},{"title":"Publishing Node.js Module To Ivy Repository","link":"https:\/\/blog.cliffano.com\/2012\/06\/13\/publishing-node-js-module-to-ivy-repository\/","pubDate":"Wed, 13 Jun 2012 10:46:52 +0000","guid":"https:\/\/blog.cliffano.com\/2012\/06\/13\/publishing-node-js-module-to-ivy-repository\/","description":"<p>Let me guess what you&rsquo;re going to say in 3&hellip; 2&hellip; 1&hellip;<\/p>\n<!-- raw HTML omitted -->\n<p>Right?<\/p>\n<p>Some of us don&rsquo;t have the luxury of a <a href=\"https:\/\/github.com\/isaacs\/npm\/issues\/100\">local NPM repository<\/a>, while some others have their delivery pipeline tightly integrated to an <a href=\"http:\/\/ant.apache.org\/ivy\/history\/latest-milestone\/tutorial\/build-repository\/basic.html\">Ivy repository<\/a>.<\/p>\n<p>So, for those few who are stuck with the unholy union of Node.js and Apache Ivy, you can publish your Node.js module to an Ivy repository using <a href=\"https:\/\/github.com\/cliffano\/bob\">Bob<\/a>. Here&rsquo;s how:<\/p>"},{"title":"Apple Facts 95 - PowerBook, MessagePad","link":"https:\/\/blog.cliffano.com\/2012\/04\/02\/apple-facts-95-powerbook-messagepad\/","pubDate":"Mon, 02 Apr 2012 12:25:03 +0000","guid":"https:\/\/blog.cliffano.com\/2012\/04\/02\/apple-facts-95-powerbook-messagepad\/","description":"<p>Look what I found at my dad&rsquo;s home office in Jakarta?<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/P1210245.JPG\" alt=\"\"><\/p>\n<p>Apple Facts 8.95 - a concise guide to Apple products offered worldwide.<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/P1210249.JPG\" alt=\"\"><\/p>\n<p>I didn&rsquo;t know Apple used to have gazillion of products. Apple printers?<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/P1210252.JPG\" alt=\"\"><\/p>\n<p>Why Macintosh? I started using an Apple MacBook Pro about 2 years ago, and after 6 months I was convinced that it was by far the most productive environment I had ever used. It&rsquo;s cool to know that it was also the case back in the 90s.<\/p>"},{"title":"Australia According To NodeUp","link":"https:\/\/blog.cliffano.com\/2012\/03\/23\/australia-according-to-nodeup\/","pubDate":"Fri, 23 Mar 2012 04:02:49 +0000","guid":"https:\/\/blog.cliffano.com\/2012\/03\/23\/australia-according-to-nodeup\/","description":"<p>I&rsquo;m a fan of <a href=\"http:\/\/nodeup.com\">NodeUp<\/a>, a podcast of all things Node.js-related, and a great source of thoughts\/opinions from the who&rsquo;s who in Node.js community.<\/p>\n<p>Putting the serious stuff aside, the show has a running joke where the hosts put on their best effort to prop up <a href=\"http:\/\/www.bislr.com\">Bislr<\/a>, one of the show&rsquo;s sponsors, by saying hilarious things about Australia. And it actually worked, us Australians (at least myself and those I know) love it, and I sure won&rsquo;t forget the name Bislr for at least the next couple of years.<\/p>"},{"title":"OSDC 2011","link":"https:\/\/blog.cliffano.com\/2011\/11\/19\/osdc-2011\/","pubDate":"Sat, 19 Nov 2011 14:25:28 +0000","guid":"https:\/\/blog.cliffano.com\/2011\/11\/19\/osdc-2011\/","description":"<p>I went to Canberra this week to attend <a href=\"http:\/\/2011.osdc.com.au\">Open Source Developers Conference 2011<\/a> and also to give a talk titled <a href=\"http:\/\/2011.osdc.com.au\/schedule\/#continuousdeliver\">Continuous Delivery Using Jenkins<\/a>. OSDC ran for 3 days, and was held at Australian National University.<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/P1190948.JPG\" alt=\"\"><\/p>\n<p>OSDC 2011 was very well organised, much thanks to the organisers: Evan Leybourn, Gavin Jackson, and the volunteers squad. It was an interesting grass roots conference with lots of passionate open source geeks, definitely learned a lot.<\/p>"},{"title":"Use Jenkins On Firefox By Talking To Your Mac","link":"https:\/\/blog.cliffano.com\/2011\/11\/06\/use-jenkins-on-firefox-by-talking-to-your-mac\/","pubDate":"Sun, 06 Nov 2011 00:59:53 +0000","guid":"https:\/\/blog.cliffano.com\/2011\/11\/06\/use-jenkins-on-firefox-by-talking-to-your-mac\/","description":"<p>I was watching <a href=\"http:\/\/en.wikipedia.org\/wiki\/I,_Robot_%28film%29\">I, Robot<\/a> the other day, and thought how great it would be to use voice to control Jenkins.<\/p>\n<p>So last night I did a <a href=\"http:\/\/lifehacker.com\/215764\/hack-attack-make-your-macs-speech-recognition-work-for-you\">quick read<\/a>, and then recorded this video.\nThis used Mac Speech Recognition, so in theory I talked to my Mac, which then opened Jenkins pages on Firefox. Here are the commands:<\/p>\n<ol>\n<li>\n<p>&lsquo;Open Jenkins&rsquo;: opens Jenkins home page (dashboard)<\/p>\n<\/li>\n<li>\n<p>&lsquo;Build Bob&rsquo;: builds a project called <a href=\"http:\/\/github.com\/cliffano\/bob\">Bob<\/a><\/p>\n<\/li>\n<li>\n<p>&lsquo;Configure system&rsquo;: opens Jenkins configuration page<\/p>"},{"title":"Nestor - A Faster And Simpler CLI For Jenkins","link":"https:\/\/blog.cliffano.com\/2011\/10\/22\/nestor-a-faster-and-simpler-cli-for-jenkins\/","pubDate":"Sat, 22 Oct 2011 12:20:39 +0000","guid":"https:\/\/blog.cliffano.com\/2011\/10\/22\/nestor-a-faster-and-simpler-cli-for-jenkins\/","description":"<p>It all started because at one point I was using a rather resource-challenged machine running Windows and an Ubuntu VM at the same time, and Firefox froze every so often, rendering <a href=\"https:\/\/addons.mozilla.org\/en-US\/firefox\/addon\/jenkins-build-monitor\/\">Jenkins BuildMonitor<\/a> and Jenkins web interface useless most of the time. So I looked for an alternative and gave <a href=\"https:\/\/wiki.jenkins-ci.org\/display\/JENKINS\/Jenkins+CLI\">Jenkins CLI<\/a> a go.<\/p>\n<p>Like most Java applications, Jenkins built-in CLI also suffers from <a href=\"http:\/\/en.wikipedia.org\/wiki\/Java_performance#Startup_time\">slow start up time<\/a> (flame suit: ON) due to core Java libraries loading (Kohsuke later told me on #jenkins that there&rsquo;s also a handshaking process involved). This led me to try <a href=\"https:\/\/wiki.jenkins-ci.org\/display\/JENKINS\/Remote+access+API\">Jenkins Remote Access API<\/a> with curl, which performed significantly faster than Jenkins CLI.<\/p>"},{"title":"Mamiya RB67","link":"https:\/\/blog.cliffano.com\/2011\/08\/27\/mamiya-rb67\/","pubDate":"Sat, 27 Aug 2011 09:52:35 +0000","guid":"https:\/\/blog.cliffano.com\/2011\/08\/27\/mamiya-rb67\/","description":"<p>My earliest memory of real photography was this Mamiya camera my dad used for his work. My dad was an entrepreneur and started a small advertising company in the 80s, which means I grew up surrounded by tons of printing, design, photography, and various other creative works.<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/mamiya1.jpg\" alt=\"\"><\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/mamiya2.jpg\" alt=\"\"><\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/mamiya3.jpg\" alt=\"\"><\/p>\n<p>The above pictures were taken at the garage of my parents&rsquo; house back in Jakarta, Indonesia, sometime in the 90s.<\/p>"},{"title":"Node.js Presentations","link":"https:\/\/blog.cliffano.com\/2011\/08\/13\/node-js-presentations\/","pubDate":"Sat, 13 Aug 2011 08:46:00 +0000","guid":"https:\/\/blog.cliffano.com\/2011\/08\/13\/node-js-presentations\/","description":"<p>I gave two Node.js-related talks within the past week.<\/p>\n<p>The first one was titled &ldquo;From Java To Node.js&rdquo;, at <a href=\"http:\/\/shinetech.com\">Shine Technologies<\/a>&rsquo; developers meeting on August 5th, 2011.<\/p>\n<iframe\n  style=\"width: 100%; height: 500px;\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"\n  src=\"https:\/\/www.slideshare.net\/slideshow\/embed_code\/8780210?rel=0\" allowfullscreen webkitallowfullscreen mozallowfullscreen> <\/iframe>\n<br><br>\n\n<p>The second one was titled &ldquo;JavaScript Everywhere From Nose To Tail&rdquo;, at <a href=\"http:\/\/melbjs.eventbrite.com\">Melbourne JavaScript usergroup<\/a> on August 10th, 2011, with <a href=\"http:\/\/twitter.com\/bumblethru\">Carl Husselbee<\/a> from <a href=\"http:\/\/about.sensis.com.au\">Sensis<\/a>.<\/p>\n<iframe\n  style=\"width: 100%; height: 500px;\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"\n  src=\"https:\/\/www.slideshare.net\/slideshow\/embed_code\/8819281?rel=0\" allowfullscreen webkitallowfullscreen mozallowfullscreen> <\/iframe>\n<br><br>\n\n<p>Happy with the positive feedback from the audience of both talks, thanks folks, much appreciated!<\/p>"},{"title":"Using Node.js To Discover Jenkins On The Network","link":"https:\/\/blog.cliffano.com\/2011\/08\/04\/using-nodejs-to-discover-jenkins-on-the-network\/","pubDate":"Thu, 04 Aug 2011 11:21:28 +0000","guid":"https:\/\/blog.cliffano.com\/2011\/08\/04\/using-nodejs-to-discover-jenkins-on-the-network\/","description":"<p>I&rsquo;ve just added a new feature to <a href=\"http:\/\/github.com\/cliffano\/nestor\">Nestor<\/a> to discover <a href=\"http:\/\/jenkins-ci.org\">Jenkins<\/a> on the network, and as it turned out, it&rsquo;s pretty simple to do thanks to <a href=\"http:\/\/nodejs.org\/docs\/v0.4.10\/api\/dgram.html\">Node.js Datagram sockets API<\/a> (hat tip <a href=\"http:\/\/twitter.com\/#!\/pquerna\">Paul Querna<\/a>).<\/p>\n<p>Jenkins has a discovery feature as part of its <a href=\"https:\/\/wiki.jenkins-ci.org\/display\/JENKINS\/Remote+access+API\">remote access API<\/a> where it listens on UDP port 33848, and whenever it receives a message, Jenkins will respond with an XML containing the instance&rsquo;s URL, version number, and slave port information.<\/p>"},{"title":"Kelly Johnson In Skunk Works","link":"https:\/\/blog.cliffano.com\/2011\/07\/07\/kelly-johnson-in-skunk-works\/","pubDate":"Thu, 07 Jul 2011 13:09:38 +0000","guid":"https:\/\/blog.cliffano.com\/2011\/07\/07\/kelly-johnson-in-skunk-works\/","description":"<p>I still have 80 pages to go on <a href=\"http:\/\/www.bookdepository.com\/Skunk-Works-Ben-Rich\/9780751515039\">Skunk Works<\/a>, but this book has been one of the best I&rsquo;ve ever read.<\/p>\n<p>The story revolves around an elite group within <a href=\"http:\/\/en.wikipedia.org\/wiki\/Lockheed_Martin\">Lockheed Martin<\/a> called Skunk Works, who worked on top secret projects and engineered some of the most famous aircraft in the history of aviation. The book was authored by <a href=\"http:\/\/en.wikipedia.org\/wiki\/Ben_Rich\">Ben Rich<\/a>, Skunk Works second director, and central to the story was <a href=\"http:\/\/en.wikipedia.org\/wiki\/Kelly_Johnson_%28engineer%29\">Clarence &lsquo;Kelly&rsquo; Johnson<\/a>, the founder of Skunk Works who was a genius on both technical and management fronts.<\/p>"},{"title":"Couchtato Introduction","link":"https:\/\/blog.cliffano.com\/2011\/07\/03\/couchtato-introduction\/","pubDate":"Sun, 03 Jul 2011 08:37:16 +0000","guid":"https:\/\/blog.cliffano.com\/2011\/07\/03\/couchtato-introduction\/","description":"<p>Last Thursday I put up a post at Shine Technologies blog titled <a href=\"http:\/\/blog.shinetech.com\/2011\/06\/30\/couchtato-a-couchdb-document-utility-tool-written-in-nodejs\/\">Couchtato - A CouchDB Document Utility Tool Written In Node.js<\/a>. It&rsquo;s a short introduction to <a href=\"https:\/\/github.com\/cliffano\/couchtato\">Couchtato<\/a>, a little hobby project I worked on over several evenings and lunch breaks.<\/p>\n<p>Do check it out if you are a CouchDB and NodeJS user.<\/p>"},{"title":"State Of The Blog","link":"https:\/\/blog.cliffano.com\/2011\/06\/23\/state-of-the-blog\/","pubDate":"Thu, 23 Jun 2011 13:10:12 +0000","guid":"https:\/\/blog.cliffano.com\/2011\/06\/23\/state-of-the-blog\/","description":"<p>After 5.5 years, 140 posts, 550 comments, and 270 tags\u2026<\/p>\n<p>this blog attracts about 7000 monthly visits,<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/analytics.png\" alt=\"\"><\/p>\n<p>and has a Google PageRank of 5.<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/pagerank.png\" alt=\"\"><\/p>\n<p>Not too bad for a little blog, eh?<\/p>"},{"title":"Running CouchDB-Lucene On Tomcat","link":"https:\/\/blog.cliffano.com\/2011\/05\/26\/running-couchdb-lucene-on-tomcat\/","pubDate":"Thu, 26 May 2011 02:26:09 +0000","guid":"https:\/\/blog.cliffano.com\/2011\/05\/26\/running-couchdb-lucene-on-tomcat\/","description":"<p>As of the time of writing, <a href=\"https:\/\/github.com\/rnewson\/couchdb-lucene\">CouchDB-Lucene<\/a> (v0.6.0) distribution was bundled with <a href=\"http:\/\/jetty.codehaus.org\/jetty\/\">Jetty WebServer<\/a> and runnable from command line. But if you dive a little bit into the code, you\u2019ll find that the run script basically executes <code>com.github.rnewson.couchdb.lucene.Main<\/code>, which in turn (1) reads the couchdb-lucene.ini config, (2) creates a Jetty Server, and (3) sets up <code>com.github.rnewson.couchdb.lucene.LuceneServlet<\/code> on the server.<\/p>\n<p>At work, we had to use Tomcat due to SOE reason, so I spent a bit of   time trying to get CouchDB-Lucene running on Tomcat and get it deployed   as a .war file. Here\u2019s how we did it, please note that this is the   tedious way of doing it, all because I had to integrate CouchDB-Lucene   into an existing web app. There\u2019s an easier way to build a .war file   mentioned at the end of this post.<\/p>"},{"title":"Jenkins BuildMonitor - 20000 Downloads Later","link":"https:\/\/blog.cliffano.com\/2011\/05\/15\/jenkins-buildmonitor-20000-downloads-later\/","pubDate":"Sun, 15 May 2011 09:37:39 +0000","guid":"https:\/\/blog.cliffano.com\/2011\/05\/15\/jenkins-buildmonitor-20000-downloads-later\/","description":"<p>Yesterday, <a href=\"https:\/\/addons.mozilla.org\/en-us\/firefox\/addon\/jenkins-build-monitor\/\">Jenkins BuildMonitor<\/a> Firefox Add-on surpassed 20,000 downloads. I uploaded the first version  on June 8th, 2008, so that\u2019s almost 3 years ago, and there have been 26  releases since.<\/p>\n<p>On average, there are about 2500-2700 active daily users on weekdays.  That became the basis of my release mantra: \u201cLet\u2019s not piss 2500 people  off.\u201d<\/p>\n<p>[<img src=\"https:\/\/blog.cliffano.com\/images\/o\/jenkins-stat.jpg\" alt=\"\"><\/p>\n<p>The top locales are en-US, de, en-GB, fr, ja, pl. We\u2019ve got en, fr, and ja locales covered <a href=\"https:\/\/github.com\/jenkinsci\/firefox-extension-buildmonitor\/tree\/master\/src\/main\/resources\/firefox\/chrome\/locale\">https:\/\/github.com\/jenkinsci\/firefox-extension-buildmonitor\/tree\/master\/src\/main\/resources\/firefox\/chrome\/locale<\/a>. Any German or Polish translator around? please feel free to submit a pull request.<\/p>"},{"title":"Watching TV Needs To Be A More Social Experience","link":"https:\/\/blog.cliffano.com\/2011\/04\/10\/watching-tv-needs-to-be-a-more-social-experience\/","pubDate":"Sun, 10 Apr 2011 05:13:13 +0000","guid":"https:\/\/blog.cliffano.com\/2011\/04\/10\/watching-tv-needs-to-be-a-more-social-experience\/","description":"<p><strong>Disclaimer:<\/strong> the title is just a disguise for feature request\/suggestion to the fine folks at <a href=\"http:\/\/appsperhaps.com\/\">Apps Perhaps<\/a>. But I do really think that watching TV should be more social over the web, and Apps Perhaps\u2019 OzTV iPhone app hopefully has the opportunity to turn this into reality.<\/p>\n<p>Four hours ago I started watching the gran finale of <a href=\"http:\/\/www.sbs.com.au\/sales\/programs\/view\/id\/207\/t\/Iron-Chef\">Iron Chef<\/a> series run on SBS, <a href=\"http:\/\/blogs.yahoo.co.jp\/larochelle214\">Hiroyuki Sakai<\/a> vs <a href=\"http:\/\/www.alain-passard.com\/fr\/8-parcours.html\">Alain Passard<\/a> (it was awesome!), and the first thing I did after the show finished an hour later was to search for \u201cIron Chef\u201d on Twitter, I wanted to find out other people\u2019s comments regarding the episode. Sure I found many related tweets, but the search result was polluted by some other tweets about Iron Chef in general and had nothing to do with that particular episode.<\/p>"},{"title":"Code To Relax","link":"https:\/\/blog.cliffano.com\/2011\/02\/20\/code-to-relax-nospam\/","pubDate":"Sun, 20 Feb 2011 12:40:22 +0000","guid":"https:\/\/blog.cliffano.com\/2011\/02\/20\/code-to-relax-nospam\/","description":"<p>The hours are much less compared to ten years ago, but coding after work is still the best way to unwind and relax.<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/gpf.png\" alt=\"\"><\/p>\n<p>I started reading GPF Comics when I just started working the IT industry in 2001. The <a href=\"http:\/\/www.gpf-comics.com\/archive.php?d=19990201\">above strip<\/a> has always been my favourite, geeks on coding as a hobby :).<\/p>\n<p><a href=\"http:\/\/www.gpf-comics.com\/\">GPF Comics website<\/a> still keeps its retro design from the late 90s.<\/p>"},{"title":"Do You Find Websites Hard To Read On The iPhone? Try FeedTouch","link":"https:\/\/blog.cliffano.com\/2011\/02\/19\/do-you-find-websites-hard-to-read-on-the-iphone-try-feedtouch\/","pubDate":"Sat, 19 Feb 2011 13:15:37 +0000","guid":"https:\/\/blog.cliffano.com\/2011\/02\/19\/do-you-find-websites-hard-to-read-on-the-iphone-try-feedtouch\/","description":"<p>After the first few weeks of using an iPhone, I learned that reading the content of most websites on a mobile phone was such an unpleasant experience. The texts were tiny and hard to read, the ads were distracting, I kept having to zoom in and out, scroll vertically and horizontally. In short, I spent most of the time trying to navigate the content instead of reading the content.<\/p>\n<p>I know there are already some solutions out there that somewhat tackle this problem, but none of them is simple enough to my liking. So that&rsquo;s why I wrote <a href=\"http:\/\/ft.t00.me\">FeedTouch<\/a>. (Note: even if there&rsquo;s a simpler solution that I didn&rsquo;t know of, I&rsquo;d still write it anyway :p)<\/p>"},{"title":"Childhood Drawings - T'Challa And Scorpion","link":"https:\/\/blog.cliffano.com\/2010\/12\/28\/childhood-drawings-tchalla-and-scorpion\/","pubDate":"Tue, 28 Dec 2010 10:30:13 +0000","guid":"https:\/\/blog.cliffano.com\/2010\/12\/28\/childhood-drawings-tchalla-and-scorpion\/","description":"<p>I found some of my old hand drawings when I visited my parents&rsquo; house in Jakarta earlier this year. I used to draw a lot when I was still in elementary and junior high school, nothing awesome, but I guess it wasn&rsquo;t too bad for someone at that age.<\/p>\n<p>Back then I was really into soccer and basketball, and for a reason I can no longer remember, I often incorporated elements of a soccer ball or a basketball in my drawings.<\/p>"},{"title":"XMas Lego Mindstorms","link":"https:\/\/blog.cliffano.com\/2010\/12\/25\/xmas-lego-mindstorms\/","pubDate":"Sat, 25 Dec 2010 10:55:39 +0000","guid":"https:\/\/blog.cliffano.com\/2010\/12\/25\/xmas-lego-mindstorms\/","description":"<p>Last week we had an early XMas celebration over at <a href=\"http:\/\/shinetech.com\">Shine Technologies<\/a> office, geekin&rsquo; it with some <a href=\"http:\/\/mindstorms.lego.com\/en-us\/Default.aspx\">Lego Mindstorms<\/a>.<\/p>\n<p>We had to wire up some logic blocks for the Lego robot to use in a simple maze. The goal was to traverse a path within the maze, the challenge was to pass some obstacles like opening a gate, executing several turns, and opening a door handle.<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/IMG_1264.JPG\" alt=\"\"><\/p>\n<p>Our robot, all kudos to <a href=\"http:\/\/twitter.com\/#!\/manishchhabra27\">@manishchhabra27<\/a> for revving it up.<\/p>"},{"title":"Studio Sign","link":"https:\/\/blog.cliffano.com\/2010\/12\/07\/studio-sign\/","pubDate":"Tue, 07 Dec 2010 12:51:13 +0000","guid":"https:\/\/blog.cliffano.com\/2010\/12\/07\/studio-sign\/","description":"<p>This sign was bolted on the front wall up to the third letter before some body corporate police appeared out of nowhere and pointed out that it&rsquo;s against their rules.<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/studiosign.jpg\" alt=\"\"><\/p>\n<p>So we had to improvise and placed the sign above the door frame for now.<\/p>\n<p>Time to start planning to overthrow the current body corporate.<\/p>"},{"title":"EC2 Micro Instance Saved Me $120 A Year","link":"https:\/\/blog.cliffano.com\/2010\/09\/26\/ec2-micro-instance-saved-me-120-a-year\/","pubDate":"Sun, 26 Sep 2010 08:07:52 +0000","guid":"https:\/\/blog.cliffano.com\/2010\/09\/26\/ec2-micro-instance-saved-me-120-a-year\/","description":"<p><strong>Update:<\/strong> Nathan Peel pointed out that I missed the $0.007 hourly usage in my calculation. I originally said that I saved $180 a year, it&rsquo;s actually $120. Thanks Nathan for the correction!<\/p>\n<p>Please note that what I&rsquo;m writing here is more applicable to web sites with low traffic and storage requirement.<\/p>\n<p>I&rsquo;ve been a <a href=\"http:\/\/blog.cliffano.com\/2008\/02\/17\/slicehosted\/\">happy<\/a> <a href=\"http:\/\/slicehost.com\">Slicehost<\/a> user for the past 2.5 years. I used Slicehost for hosting this blog and some other web sites. I used their 256 slice plan at $20 per month, i.e $240 per year which includes 36.5 days bonus. I know there are cheaper hosting plans out there, but none provides the combination of excellent reliability, full root access, easy to use domain management, excellent support and documentation, and competitive price.<\/p>"},{"title":"Node.js Discussion On Teman Macet Podcast","link":"https:\/\/blog.cliffano.com\/2010\/09\/19\/nodejs-discussion-on-teman-macet-podcast\/","pubDate":"Sun, 19 Sep 2010 14:31:28 +0000","guid":"https:\/\/blog.cliffano.com\/2010\/09\/19\/nodejs-discussion-on-teman-macet-podcast\/","description":"<p>Last May, I recorded a discussion in Indonesian language on <a href=\"http:\/\/temanmacet.com\">Teman Macet<\/a> podcast with the show&rsquo;s host, <a href=\"http:\/\/www.ronaldwidha.net\/\">Ronald Widha<\/a>, and another guest who was a fellow NodeJS user,\u00a0 <a href=\"http:\/\/julius.sirait.net\/\">Julius Sirait<\/a>. The discussion itself was more on NodeJS introduction and sharing what we had learnt thus far. The episode, <a href=\"http:\/\/www.temanmacet.com\/2010\/07\/ep-51-nodejs-bersama-julius-sirait-dan-cliffano-subagio\/\">#51 nodeJS bersama Julius Sirait dan Cliffano Subagio<\/a>, was available for streaming\/download in July.<\/p>\n<p>NodeJS is one piece of technology that I&rsquo;m very excited about. For web application development, I think Node, along with its web stack, is a nice middle ground between Ruby\/Rails magical &lsquo;simplicity&rsquo; and Java\/JEE layers of complexity. For network-related stuffs, (I&rsquo;m quoting Sami Samhuri here) NodeJS is a swiss army knife. Oh, and have I mentioned that NodeJS is fast? like seriously da*n fast? (thanks to <a href=\"http:\/\/code.google.com\/p\/v8\/\">V8<\/a>).<\/p>"},{"title":"Hudson NodeJS Plugin","link":"https:\/\/blog.cliffano.com\/2010\/09\/19\/hudson-nodejs-plugin\/","pubDate":"Sun, 19 Sep 2010 06:40:13 +0000","guid":"https:\/\/blog.cliffano.com\/2010\/09\/19\/hudson-nodejs-plugin\/","description":"<p>If you&rsquo;re a <a href=\"http:\/\/nodejs.org\">NodeJS<\/a> user who happens to use <a href=\"http:\/\/hudson-ci.org\">Hudson<\/a> as a continuous integration server, then perhaps you would be interested to check out <a href=\"http:\/\/wiki.hudson-ci.org\/display\/HUDSON\/NodeJS+Plugin\">NodeJS Plugin<\/a> which I released about a month ago (yea, I&rsquo;m always behind with blogging).<\/p>\n<p>This plugin allows you to use NodeJS script on a build step, as an alternative to the existing shell script (out of the box) and Ruby script (via a plugin).<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/nodejs_buildstep_menu.png\" alt=\"\"><\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/nodejs_buildstep_script.png\" alt=\"\"><\/p>\n<p>Call me too optimistic, but I&rsquo;m waiting for the day when all standard shell script commands have their NodeJS equivalence.<\/p>"},{"title":"JSGames Plugin - Play Mario Kart & Tetris On Hudson","link":"https:\/\/blog.cliffano.com\/2010\/09\/15\/jsgames-plugin-play-mario-kart-tetris-on-hudson\/","pubDate":"Wed, 15 Sep 2010 13:51:38 +0000","guid":"https:\/\/blog.cliffano.com\/2010\/09\/15\/jsgames-plugin-play-mario-kart-tetris-on-hudson\/","description":"<p>Now you can play games on <a href=\"http:\/\/hudson-ci.org\">Hudson<\/a> using <a href=\"http:\/\/wiki.hudson-ci.org\/display\/HUDSON\/JSGames+Plugin\">JSGames Plugin<\/a>, albeit only a cutdown version of Mario Kart and Tetris (credit goes to Jacob Seidelin of <a href=\"http:\/\/blog.nihilogic.dk\/\">Nihilogic Games<\/a>). This plugin is extensible enough, so it&rsquo;s pretty easy to add new games. The winners of <a href=\"http:\/\/10k.aneventapart.com\/\">10K Apart<\/a> would be good additions given the right license.<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/jsgames_menu.png\" alt=\"\"><\/p>\n<p>I wrote this plugin as an experiment on using Hudson for non-continuous integration purposes, in this case, a very minimalistic &lsquo;games delivery platform&rsquo;. Games as plugins, each with a pluggable Hudson UI that automatically adds a game menu \/ navigation. To push this further, the dashboard can then be modified to look more like Steam or iTunes, but of course I didn&rsquo;t do this part.<\/p>"},{"title":"CouchDB Upgrade From 0.11.0 To 1.0.1","link":"https:\/\/blog.cliffano.com\/2010\/09\/09\/couchdb-upgrade-from-0-11-0-to-1-0-1\/","pubDate":"Thu, 09 Sep 2010 14:42:32 +0000","guid":"https:\/\/blog.cliffano.com\/2010\/09\/09\/couchdb-upgrade-from-0-11-0-to-1-0-1\/","description":"<p>This post also serves as a note to self when I do another upgrade in the future.<\/p>\n<p>It&rsquo;s still not clear to me of what&rsquo;s the best practice for upgrading a CouchDB installation. From the mailing list, some people suggested backing up the config and database files, uninstalling the old version, then installing the new version. But, really, what&rsquo;s involved in uninstalling a CouchDB installation? manually deleting the files from the old installation? I had the same confusion when I tried to do the upgrade on OS X, once from a compile from source, and another from a CouchDBX installation.<\/p>"},{"title":"Nginx With Gzip On Ubuntu Jaunty","link":"https:\/\/blog.cliffano.com\/2010\/08\/31\/nginx-with-gzip-on-ubuntu-jaunty\/","pubDate":"Tue, 31 Aug 2010 12:58:29 +0000","guid":"https:\/\/blog.cliffano.com\/2010\/08\/31\/nginx-with-gzip-on-ubuntu-jaunty\/","description":"<p>I just noticed that the latest version of Nginx available on Jaunty repositories was [1] the latest legacy version (0.6.x) instead of the latest stable version (0.7.x), and [2] not compiled with gzip compression enabled.<\/p>\n<p>To solve both problems, I had to compile Nginx from source with <code>--with-http_gzip_static_module<\/code> option. By default, Nginx would be installed at <code>\/usr\/local<\/code>. I would rather keep the locations consistent with those used in the precompiled packages from the repositories, so I ended up having to use the following configure options:<\/p>"},{"title":"Quotes From 37signals Rework","link":"https:\/\/blog.cliffano.com\/2010\/07\/22\/quotes-from-37signals-rework\/","pubDate":"Thu, 22 Jul 2010 14:46:32 +0000","guid":"https:\/\/blog.cliffano.com\/2010\/07\/22\/quotes-from-37signals-rework\/","description":"<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/rework.jpg\" alt=\"\"><\/p>\n<p>Pictured above is my copy of <a href=\"http:\/\/www.bookdepository.com\/Rework-Jason-Fried\/9780307463746\">Rework<\/a>. <a href=\"http:\/\/life.qoqoa.com\/rework-83\">The photo<\/a> was taken by Latte Girl at the State Library of Victoria.<\/p>\n<p>If there&rsquo;s ever going to be anyone changing the way we work and the way we run a business, then I&rsquo;ll bet my money on the <a href=\"http:\/\/37signals.com\">37signals<\/a> guys. This is one book I&rsquo;d suggest everyone to read (unless you&rsquo;re filthy rich and never have to work). I see Rework as the agile movement for the broader working industry. There are so many practices that are just brain-dead-absolute-must pick ups. The challenge out of this will be on the natural fact that people are uncomfortable with change, even when the change is for the better.<\/p>"},{"title":"Badminton Academy Of Victoria Web Site Relaunch","link":"https:\/\/blog.cliffano.com\/2010\/07\/15\/badminton-academy-of-victoria-web-site-relaunch\/","pubDate":"Thu, 15 Jul 2010 14:57:06 +0000","guid":"https:\/\/blog.cliffano.com\/2010\/07\/15\/badminton-academy-of-victoria-web-site-relaunch\/","description":"<p>Just moved, to the cloud.<\/p>\n<p>I&rsquo;ve just relaunched <a href=\"http:\/\/badmintonacademyofvictoria.com.au\">Badminton Academy of Victoria<\/a> web site. v2.0 sports a new look and floats on <a href=\"http:\/\/posterous.com\">Posterous<\/a> platform.<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/bav.png\" alt=\"\"><\/p>\n<p>The site previously used <a href=\"http:\/\/wordpress.org\">WordPress<\/a>(.org) and was hosted at <a href=\"http:\/\/godaddy.com\">Go Daddy<\/a>. I decided to migrate it to Posterous to allow the users to spend more time using the site, and less time maintaining the site software and infrastructure.<\/p>\n<p>Just like everyone else, I initially considered <a href=\"http:\/\/wordpress.com\">WordPress.com<\/a>, but Posterous has most if not all of the features needed for $0, this includes custom domain name, custom theme, FeedBurner integration, Twitter and Facebook integration, easy Google Maps embedding, easy image gallery, short URL, and post by email. Posterous wins, hands down.<\/p>"},{"title":"CITCON ANZ 2010","link":"https:\/\/blog.cliffano.com\/2010\/07\/04\/citcon-anz-2010\/","pubDate":"Sun, 04 Jul 2010 13:10:33 +0000","guid":"https:\/\/blog.cliffano.com\/2010\/07\/04\/citcon-anz-2010\/","description":"<p><strong>Workcapade<\/strong> -noun: like an escapade, extra work days on a weekend.<\/p>\n<p>Last weekend I went to Wellington, New Zealand, to attend CITCON A\/NZ 2010. Write ups about the event have been posted on ShineTech blog:<\/p>\n<ul>\n<li>\n<p><a href=\"http:\/\/blog.shinetech.com\/?p=295\">CITCON Australia\/New Zealand 2010 - Day 1<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"http:\/\/blog.shinetech.com\/?p=317\">CITCON Australia\/New Zealand 2010 - Day 2 (Part 1)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"http:\/\/blog.shinetech.com\/?p=328\">CITCON Australia\/New Zealand 2010 - Day 2 (Part 2)<\/a><\/p>\n<\/li>\n<\/ul>\n<p>In summary, the current hotness in CI world is continuous deployment, citing the experiences from <a href=\"http:\/\/timothyfitz.wordpress.com\/2009\/02\/10\/continuous-deployment-at-imvu-doing-the-impossible-fifty-times-a-day\/\">IMVU<\/a> and <a href=\"http:\/\/www.slideshare.net\/jallspaw\/10-deploys-per-day-dev-and-ops-cooperation-at-flickr\">Flickr<\/a>.<\/p>"},{"title":"Home Studio v0.2","link":"https:\/\/blog.cliffano.com\/2010\/07\/04\/home-studio-v0-2\/","pubDate":"Sun, 04 Jul 2010 08:06:03 +0000","guid":"https:\/\/blog.cliffano.com\/2010\/07\/04\/home-studio-v0-2\/","description":"<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/P1070306.JPG\" alt=\"\"><\/p>\n<p>I finally moved to my own place! Go me! :). It&rsquo;s kind of hard to say &lsquo;my own place&rsquo; since a 30-year home loan is somewhat like renting your soul to the devil. So anyway, after an intense month of dealing with the solicitor, the broker, the real estate agent, and the bank, I finally moved in last February. The place is a small townhouse at Clayton, a suburb about 18km away from Melbourne CBD. There are still tons of things to do, but it&rsquo;s slowly shaping up.<\/p>"},{"title":"Vent Your Spleen","link":"https:\/\/blog.cliffano.com\/2010\/07\/04\/vent-you-spleen\/","pubDate":"Sun, 04 Jul 2010 06:49:30 +0000","guid":"https:\/\/blog.cliffano.com\/2010\/07\/04\/vent-you-spleen\/","description":"<p>Before Twitter, I ranted on <a href=\"http:\/\/www.mxnet.com.au\/\">mX<\/a>, a local free daily newspaper.<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/connexconvenience.jpg\" alt=\"\"><\/p>\n<p>19 October 2007, on <a href=\"http:\/\/www.theage.com.au\/news\/national\/government-fines-rail-operators\/2007\/08\/19\/1187462085256.html\">Connex&rsquo;s performance<\/a>.<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/cricketworld.jpg\" alt=\"\"><\/p>\n<p>10 January 2008, I can&rsquo;t remember which incident triggered this rant, but cricket as a &lsquo;sport&rsquo; was filled with too much drama.<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/darthvader.jpg\" alt=\"\"><\/p>\n<p>15 February 2008, on <a href=\"http:\/\/news.theage.com.au\/national\/nelsons-sorry-speech-sparks-anger-20080213-1rx7.html\">Brendan Nelson&rsquo;s &lsquo;apology&rsquo;<\/a>.<\/p>\n<p>I decided to retire when my rant made the section&rsquo;s headline.<\/p>\n<p><strong>Update (02\/11\/2012):<\/strong> In retrospective, I was curious whether I could hack my name into the newspaper, and how many times it could be done. I cared about public transport and social issues, not so much on cricket though. I never thought that I would use those punch lines as a form of a real life hackery.<\/p>"},{"title":"Hudson BuildMonitor v1.5.5","link":"https:\/\/blog.cliffano.com\/2010\/06\/14\/hudson-buildmonitor-v1-5-5\/","pubDate":"Mon, 14 Jun 2010 06:14:37 +0000","guid":"https:\/\/blog.cliffano.com\/2010\/06\/14\/hudson-buildmonitor-v1-5-5\/","description":"<p>FIFA World Cup 2010 update: <a href=\"http:\/\/theworldgame.sbs.com.au\/match\/report\/54715\/Germany-vs-Australia\">Australia was demolished by Germany 0-4<\/a>.<\/p>\n<p>After ten months since the last public approval (v1.0.2) and four review rejections from the Mozilla editors, <a href=\"https:\/\/addons.mozilla.org\/en-US\/firefox\/addons\/versions\/7522#version-1.5.5\">Hudson BuildMonitor v1.5.5<\/a> was finally approved a couple of weeks ago.<\/p>\n<p>This version contains a major refactoring effort, attempting to separate the generic JavaScript code from the Firefox specific code. The goal was to make it easier for me to create a Chrome extension version of Hudson BuildMonitor, but of course I never had the time to do it and by now there are already two Chrome extensions out there, <a href=\"https:\/\/chrome.google.com\/extensions\/detail\/hfncndbfmjmafoodaigpoicpbdfhhgdo\">Hudson Extension by sanitz<\/a> and <a href=\"https:\/\/chrome.google.com\/extensions\/detail\/lnalnbkkohdcnaapeeceifjabgmdfgah\">Hudson Monitor by Henning Hoefer<\/a>.<\/p>"},{"title":"iPhone Equation","link":"https:\/\/blog.cliffano.com\/2010\/06\/13\/iphone-equation\/","pubDate":"Sun, 13 Jun 2010 11:59:04 +0000","guid":"https:\/\/blog.cliffano.com\/2010\/06\/13\/iphone-equation\/","description":"<p>Here&rsquo;s my review of the iPhone&hellip;<\/p>\n<p>[<img src=\"https:\/\/blog.cliffano.com\/images\/o\/iphone_math.jpg\" alt=\"\"><\/p>\n<p>I&rsquo;m not an Apple fanboy, I started using an iPhone several months ago, I give credit where credit is due. Despite all the criticisms about Apple, they still make the best consumer products on earth, &rsquo;nuff said.<\/p>\n<p><strong>Update (04\/12\/2012):<\/strong> I found an old photo, from ~1997, of a Macintosh that my dad used for his work (which I borrowed for playing <a href=\"http:\/\/biasedvideogamerblog.com\/blog:sim-tower-pc-mac-review\">Sim Tower<\/a>). I then moved to Australia in 1998 and never used any Apple product since then, until I bought a MacBook Pro in 2009, and I was reminded how Apple products were teh awesome [tm];.<\/p>"},{"title":"Compiling Node.js on Solaris - The Issues","link":"https:\/\/blog.cliffano.com\/2010\/06\/04\/compiling-node-js-on-solaris-the-issues\/","pubDate":"Fri, 04 Jun 2010 10:27:33 +0000","guid":"https:\/\/blog.cliffano.com\/2010\/06\/04\/compiling-node-js-on-solaris-the-issues\/","description":"<p><strong>Disclaimer:<\/strong> I&rsquo;m not a sysadmin, better solutions are welcome.<\/p>\n<p>Earlier today, I was trying to compile <a href=\"http:\/\/nodejs.org\">node.js<\/a> on Solaris (x86, 64-bit), get it installed, and setup a simple OHAI server.<\/p>\n<p>And as usual, installing stuffs on Solaris is never straightforward and I ended up encountering several issues. I&rsquo;m sure these issues (specially the errors) will bite me again in the future, hence I&rsquo;m blogging this.<\/p>\n<p>First up&hellip;<\/p>\n<pre><code>nom&gt; .\/configure\n\/usr\/bin\/env: No such file or directory\n<\/code><\/pre>\n<p>Oh right, I forgot to install python and all of its dependencies. From node.js home page &ldquo;The build system requires Python 2.4 or better.&rdquo;<\/p>"},{"title":"Hudson Gource","link":"https:\/\/blog.cliffano.com\/2010\/05\/30\/hudson-gource\/","pubDate":"Sun, 30 May 2010 13:29:36 +0000","guid":"https:\/\/blog.cliffano.com\/2010\/05\/30\/hudson-gource\/","description":"<p>Awesome visualization of Hudson codebase on SVN using <a href=\"http:\/\/code.google.com\/p\/gource\/\">Gource<\/a>, a reply to <a href=\"http:\/\/twitter.com\/kohsukekawa\/status\/14797335179\">Kohsuke&rsquo;s tweet<\/a> a few days ago. Gource is a software version control visualization tool, similar to <a href=\"http:\/\/vis.cs.ucdavis.edu\/~ogawa\/codeswarm\/\">code_swarm<\/a>, but triple the coolness factor.<\/p>\n<p>This video somehow doubled up, I must&rsquo;ve done something wrong when I added the audio using iMovie. The activities from 2005 to 2010 run up to 16:30 minute mark, the rest is just a repeat so you can skip it.<\/p>"},{"title":"Introducing Wordnik Search Firefox Add-on","link":"https:\/\/blog.cliffano.com\/2010\/05\/05\/introducing-wordnik-search-firefox-add-on\/","pubDate":"Wed, 05 May 2010 13:12:00 +0000","guid":"https:\/\/blog.cliffano.com\/2010\/05\/05\/introducing-wordnik-search-firefox-add-on\/","description":"<p>For those Firefox users who often need to look up for a word.<\/p>\n<p>Having lived in Australia for the last decade or so after the first 18 years growing up in Indonesia, I&rsquo;m now at a point where I&rsquo;m fluent enough in English but still occasionally need to look up for the definition of rarely used words and phrases, while at the same time I lost track of the more recent Indonesian slang and, again, I have to look for the meaning on the Internet.<\/p>"},{"title":"The Altered Past","link":"https:\/\/blog.cliffano.com\/2010\/04\/25\/the-altered-past\/","pubDate":"Sun, 25 Apr 2010 09:06:08 +0000","guid":"https:\/\/blog.cliffano.com\/2010\/04\/25\/the-altered-past\/","description":"<p>What if Eminem, 2Pac, and Jay-Z visited Tibet in 1938? Spitted rhymes with the monks, while The Dalai Lama moved his body to the beat?<\/p>\n<p><a href=\"http:\/\/www.flickr.com\/photos\/cliffano\/4530991033\/\"><img src=\"http:\/\/lh4.ggpht.com\/_fXOvW0MYmrY\/S9PpDZqTEzI\/AAAAAAAAFeE\/Cs9VXNi5rlY\/s400\/lhasa1938.png\" alt=\"\"><\/a><\/p>\n<p>The above picture was my first go at the idea of an altered past, partly inspired by <a href=\"http:\/\/www.flickr.com\/photos\/31199746@N02\/sets\/72157622452249309\/\">the amazing work<\/a> of <a href=\"http:\/\/melmanandthehippo.blogspot.com\/\">Agan Harahap<\/a>. The quality of my work is nowhere near Agan&rsquo;s. I&rsquo;m still learning, still particularly weak with shadowing and scaling.<\/p>\n<p>I&rsquo;ve always been interested with the idea of characters from different time and space visiting the past (our past). I often think what if so and so was at a certain place certain years ago, what would have been different?<\/p>"},{"title":"Re Hudson SiteMonitor Plugin And JSLint Violations Support","link":"https:\/\/blog.cliffano.com\/2010\/04\/12\/re-hudson-sitemonitor-plugin-and-jslint-violations-support\/","pubDate":"Mon, 12 Apr 2010 12:41:10 +0000","guid":"https:\/\/blog.cliffano.com\/2010\/04\/12\/re-hudson-sitemonitor-plugin-and-jslint-violations-support\/","description":"<p>Just a quick note about <a href=\"http:\/\/blog.shinetech.com\/?p=239\">a post<\/a> I made over at Shine Technologies blog re Hudson SiteMonitor Plugin and JSLint Violations support.<\/p>\n<p>My current employer, <a href=\"http:\/\/shinetech.com\">Shine Technologies<\/a>, allowed me to spend a couple of days to contribute to an open source project, so naturally I chose Hudson and worked on things that are useful for the projects I&rsquo;m involved with at work.<\/p>\n<p>SiteMonitor Plugin was a late follow up to <a href=\"http:\/\/markmail.org\/message\/feoicrmkvfks5sor\">this short thread<\/a> on Hudson users mailing list about a year ago. JSLint support in Violations Plugin was an effort to add JSLint report handling in Hudson a la Checkstyle.<\/p>"},{"title":"A Guide To Stand-Up Meeting - Part 1","link":"https:\/\/blog.cliffano.com\/2010\/01\/26\/a-guide-to-stand-up-meeting-part-1\/","pubDate":"Tue, 26 Jan 2010 11:58:56 +0000","guid":"https:\/\/blog.cliffano.com\/2010\/01\/26\/a-guide-to-stand-up-meeting-part-1\/","description":"<p>[caption id=&quot;&quot; align=&ldquo;alignnone&rdquo; width=&ldquo;450&rdquo; caption=&ldquo;people around you are not blind&hellip;&rdquo;]![](\/images\/o\/caption]<\/p>\n<p>I&rsquo;ve been doing daily stand-up meetings for all but 1.5 years of my time in the software development industry, and I had plenty of chance to observe the good and bad habits during the stand-up.<\/p>\n<p>For this part, I&rsquo;ll just highlight the need to keep what you say relevant to the project, to not pause too long and too often, and to not unconsciously perform politically incorrect hand movement where no one wants to pair-program with you afterward.<\/p>"},{"title":"Known Hosts Issue With Net::SSH","link":"https:\/\/blog.cliffano.com\/2010\/01\/18\/known-hosts-issue-with-netssh\/","pubDate":"Mon, 18 Jan 2010 13:25:48 +0000","guid":"https:\/\/blog.cliffano.com\/2010\/01\/18\/known-hosts-issue-with-netssh\/","description":"<p>This issue bit me twice within a month, and each time I had to spend a couple of hours to figure out the cause of the problem, mostly due to the obscurity of the error messages.<\/p>\n<p>So I was using <a href=\"http:\/\/net-ssh.rubyforge.org\">net-ssh<\/a>-2.0.15 and <a href=\"http:\/\/github.com\/jruby\/jruby-openssl\">jruby-openssl<\/a>-0.5.1 for a piece of code that&rsquo;s supposed to perform some remote operations. The Net::SSH usage itself was straightforward&hellip;<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-ruby\" data-lang=\"ruby\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">Net<\/span><span style=\"color:#f92672\">::<\/span><span style=\"color:#66d9ef\">SSH<\/span><span style=\"color:#f92672\">.<\/span>start(@host, @username, <span style=\"color:#e6db74\">:keys<\/span> <span style=\"color:#f92672\">=&gt;<\/span> @keys) <span style=\"color:#66d9ef\">do<\/span> <span style=\"color:#f92672\">|<\/span>ssh<span style=\"color:#f92672\">|<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>    <span style=\"color:#f92672\">...<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">end<\/span><\/span><\/span><\/code><\/pre><\/div>\n<p>When I ran the above snippet on Windows XP, it gave this error message without any further information&hellip;<\/p>"},{"title":"My Take On People's Takes On Google's QR Code Push","link":"https:\/\/blog.cliffano.com\/2009\/12\/11\/my-take-on-peoples-take-on-googles-qr-code-push\/","pubDate":"Fri, 11 Dec 2009 11:35:55 +0000","guid":"https:\/\/blog.cliffano.com\/2009\/12\/11\/my-take-on-peoples-take-on-googles-qr-code-push\/","description":"<p>So Google made <a href=\"http:\/\/googleblog.blogspot.com\/2009\/12\/explore-whole-new-way-to-window-shop.html\">a big push for QR Code usage<\/a> in the US by sending window decals containing QR Code links to their top 100,000 business listings (via <a href=\"http:\/\/www.google.com\/help\/maps\/favoriteplaces\/gallery\/\">Favorite Places<\/a>). This effort was covered by <a href=\"http:\/\/www.techcrunch.com\/2009\/12\/06\/google-local-maps-qr-code\/\">TechCrunch<\/a> (TC) and <a href=\"http:\/\/www.mobilemarketingwatch.com\/google-starts-pushing-local-qr-codes-for-business-listings-will-it-pay-off-4643\/\">Mobile Marketing Watch<\/a> (MMW) among many other tech blogs \/ news sites out there. For the most part of the articles, they were only a rehash of Google&rsquo;s original blog post, while the rest contained some original opinions from the authors, and this, along with some short sighted comments, was the part that bugged me.<\/p>"},{"title":"Sitebricks And SiteMesh On Google App Engine","link":"https:\/\/blog.cliffano.com\/2009\/12\/06\/sitebricks-and-sitemesh-on-google-app-engine\/","pubDate":"Sun, 06 Dec 2009 05:01:23 +0000","guid":"https:\/\/blog.cliffano.com\/2009\/12\/06\/sitebricks-and-sitemesh-on-google-app-engine\/","description":"<p>For the past couple of weeks, I&rsquo;ve been trying various web framework stacks to be used with <a href=\"http:\/\/code.google.com\/appengine\/\">Google App Engine<\/a>. The ones that I gave a go, and gave a pass for various reasons, were <a href=\"https:\/\/stapler.dev.java.net\/\">Stapler<\/a> (the enchilada that powers <a href=\"http:\/\/hudson-ci.org\/\">Hudson<\/a>), <a href=\"http:\/\/www.springsource.org\/\">Spring<\/a>, and <a href=\"http:\/\/www.jboss.org\/resteasy\/\">RestEasy<\/a> + <a href=\"http:\/\/code.google.com\/p\/htmleasy\/\">htmleasy<\/a>.<\/p>\n<p>The search continued and I came across <a href=\"http:\/\/code.google.com\/p\/google-sitebricks\/\">Sitebricks<\/a>, still in its alpha phase but it looks really promising. Simple and straightforward, nothing too magicky, and I got it working with GAE\/J in no time.<\/p>"},{"title":"Garry Kasparov's How Life Imitates Chess","link":"https:\/\/blog.cliffano.com\/2009\/09\/22\/garry-kasparovs-how-life-imitates-chess\/","pubDate":"Tue, 22 Sep 2009 15:08:46 +0000","guid":"https:\/\/blog.cliffano.com\/2009\/09\/22\/garry-kasparovs-how-life-imitates-chess\/","description":"<p>I finished reading <a href=\"http:\/\/www.bookdepository.com\/How-Life-Imitates-Chess-Garry-Kasparov\/9780099489863\">How Life Imitates Chess<\/a><img src=\"https:\/\/www.assoc-amazon.com\/e\/ir?t=cliffano-20&amp;l=ur2&amp;o=1\" alt=\"\"> a few months ago, and finally had the chance to go through my notes this afternoon during lunch break.<\/p>\n<p>Having followed the world of chess ever since I was a teenager, I&rsquo;ve always been interested to know how great chess players think, to know their opinions about life, to know the things they went through to achieve their extraordinary skills&hellip; and this book offers exactly that.<\/p>"},{"title":"Hudson Code Swarm Part 2","link":"https:\/\/blog.cliffano.com\/2009\/09\/14\/hudson-code-swarm-part-2\/","pubDate":"Mon, 14 Sep 2009 17:16:50 +0000","guid":"https:\/\/blog.cliffano.com\/2009\/09\/14\/hudson-code-swarm-part-2\/","description":"<p>Continuing from my last <a href=\"http:\/\/blog.cliffano.com\/2009\/02\/01\/hudson-code-swarm\/\">Hudson Code Swarm<\/a> post, this code_swarm video covers the last 7-8 months of activities in Hudson SVN repository (r14862 on 29 Jan 2009 to r21601 on 11 Sep 2009).<\/p>\n<p>Hudson project has been very active during that period, and this video clearly reflects that fact with the number of commiters (names) and their activities (particle movements).<\/p>\n<p><a href=\"http:\/\/vimeo.com\/6573203\">Hudson Code Swarm Part 2<\/a> from <a href=\"http:\/\/vimeo.com\/user1227637\">Cliffano Subagio<\/a> on <a href=\"http:\/\/vimeo.com\">Vimeo<\/a>.<\/p>\n<p>And in case anyone is interested, I&rsquo;ve uploaded the code_swarm <a href=\"http:\/\/github.com\/cliffano\/wabisabi\/blob\/master\/hudson\/code_swarm\/sample.config\">config file<\/a> I used to generate the videos to github.<\/p>"},{"title":"RFC - ChuckNorris Plugin","link":"https:\/\/blog.cliffano.com\/2009\/09\/09\/rfc-chucknorris-plugin\/","pubDate":"Wed, 09 Sep 2009 15:29:51 +0000","guid":"https:\/\/blog.cliffano.com\/2009\/09\/09\/rfc-chucknorris-plugin\/","description":"<p><strong>Update (06\/10\/2009):<\/strong> installation &amp; usage instructions are available from <a href=\"http:\/\/wiki.hudson-ci.org\/display\/HUDSON\/ChuckNorris+Plugin\">ChuckNorris Plugin<\/a> wiki page.<\/p>\n<p>Me and some colleagues were yammering some <a href=\"http:\/\/www.chucknorrisfacts.com\">Chuck Norris Facts<\/a>-like jokes a few days ago (ChuckNorrisException can never be caught, only thrown :p), and that reminded me of ChuckNorris Plugin, a simple plugin I wrote when I first started learning about Hudson plugin mechanism a while ago.<\/p>\n<p>This plugin displays a picture of Chuck Norris, instead of Hudson the butler, and a random <a href=\"http:\/\/www.codesqueeze.com\/the-ultimate-top-25-chuck-norris-the-programmer-jokes\/\">Chuck Norris &lsquo;The Programmer&rsquo; fact<\/a> on each build page.<\/p>"},{"title":"Emptiness Header Images","link":"https:\/\/blog.cliffano.com\/2009\/08\/21\/emptiness-header-images\/","pubDate":"Fri, 21 Aug 2009 19:41:24 +0000","guid":"https:\/\/blog.cliffano.com\/2009\/08\/21\/emptiness-header-images\/","description":"<p>First of all, my apology to Tony Lauria for making him wait for a long time and for not being able to upload these images earlier as promised. Life has been exceptionally busy, but I&rsquo;ll save the details for another blog post.<\/p>\n<p>It was a pleasant surprise for me to find out that Tony and some other <a href=\"http:\/\/code.google.com\/p\/bitpress\/wiki\/Emptiness\">Emptiness Theme<\/a> users like to the header images from previous versions of the theme and requested their availability for download. Thanks so much for using the theme.<\/p>"},{"title":"Teman Macet Podcast","link":"https:\/\/blog.cliffano.com\/2009\/07\/06\/teman-macet-podcast\/","pubDate":"Mon, 06 Jul 2009 09:57:57 +0000","guid":"https:\/\/blog.cliffano.com\/2009\/07\/06\/teman-macet-podcast\/","description":"<p>About 2 months ago, <a href=\"http:\/\/www.ronaldwidha.net\/\">Ronald Widha<\/a> invited me to become a guest on <a href=\"http:\/\/www.temanmacet.com\/\">Teman Macet<\/a>, a weekly tech podcast in Indonesian language, focusing on programming, software development, and the IT industry. The discussion was done via Skype since Ronald was based in Dubai, UAE, and I resided in Melbourne, Australia.<\/p>\n<p>The episode, <a href=\"http:\/\/www.temanmacet.com\/2009\/06\/11-kontribusi-ke-open-source-project-dalam-waktu-luang\/\">#11 kontribusi ke open source project dalam waktu luang<\/a>, was uploaded earlier this week. We discussed about my experience contributing to several small open source projects and various other tech-related topics.<\/p>"},{"title":"Creating An Eco-Friendly Office","link":"https:\/\/blog.cliffano.com\/2009\/07\/04\/creating-an-eco-friendly-office\/","pubDate":"Sat, 04 Jul 2009 15:05:08 +0000","guid":"https:\/\/blog.cliffano.com\/2009\/07\/04\/creating-an-eco-friendly-office\/","description":"<!-- raw HTML omitted -->\n<p>In this day and age, every little bit that we can do to help the environment makes a big difference.\u00a0 Since the average person spends most of his or her time at work, maintaining an eco-friendly office lifestyle is a great first step.<\/p>\n<p><strong>Green Office Furniture<\/strong><\/p>\n<p>When it comes to office furniture, comfort is obviously key.\u00a0 Many office furniture manufacturers are producing lines that are both comfortable and eco-friendly.\u00a0 Herman Miller, for instance, a company that&rsquo;s been around for over 100 years, has had its eye on the environment for quite some time now.\u00a0 Herman Miller&rsquo;s ever popular <a href=\"http:\/\/www.csnchairs.com\/Aeron-%AE-Chair-C144376.html\">Aeron Chair<\/a> not only adapts naturally to fit every body type, but it is also 94% recyclable.\u00a0 The brand new Embody chair is 95% recyclable, made from 42% recycled content and contains no <a href=\"http:\/\/en.wikipedia.org\/wiki\/PVC\">PVC<\/a>s.<\/p>"},{"title":"QR Code Usage In Japan","link":"https:\/\/blog.cliffano.com\/2009\/05\/18\/qr-code-usage-in-japan\/","pubDate":"Mon, 18 May 2009 15:28:34 +0000","guid":"https:\/\/blog.cliffano.com\/2009\/05\/18\/qr-code-usage-in-japan\/","description":"<p>Some of my friends must&rsquo;ve been tired listening to my constant complaining about how slow it is for Australia to adopt <a href=\"http:\/\/en.wikipedia.org\/wiki\/QR_Code\">QR Code<\/a> usage. QR Code is what I believe to be the link between print media and the web. And contrary to popular belief, I think print media is not going to die anytime soon.<\/p>\n<p>I <a href=\"http:\/\/twitter.com\/cliffano\/status\/863813959\">spotted<\/a> the first QR Code in Melbourne in July last year. <a href=\"http:\/\/www.telstra.com.au\">Telstra<\/a> has been campaigning the use of QR Code, mostly on their products and ads. There have been few magazines using QR Code to link to some pages on their own sites. I&rsquo;m predicting that this technology will become much more mainstream in Australia within the next 2-3 years, providing steady adoption of smart phones with QR Code support.<\/p>"},{"title":"Gift From wannabesociety.com","link":"https:\/\/blog.cliffano.com\/2009\/03\/16\/gift-from-wannabesocietycom\/","pubDate":"Mon, 16 Mar 2009 13:39:12 +0000","guid":"https:\/\/blog.cliffano.com\/2009\/03\/16\/gift-from-wannabesocietycom\/","description":"<p>About a month ago I received an email from Andja Maric who was a global ambassador for <a href=\"http:\/\/www.wannabesociety.com\/\">wannabesociety.com<\/a> . Andja came across <a href=\"http:\/\/wish.cliffano.com\">Wish<\/a> while googling for wishes, she explained that wannabesociety shared a similar idea of sharing your wish with the world (t-shirts in their case, binaries in my case).<\/p>\n<p>Andja then mentioned that she liked the concept of <a href=\"http:\/\/wish.cliffano.com\">Wish<\/a> and kindly offered to send a gift as a token of appreciation. So the gift finally arrived in my mailbox yesterday&hellip;<\/p>"},{"title":"BuildMonitor v1.0","link":"https:\/\/blog.cliffano.com\/2009\/03\/09\/build-monitor-v10\/","pubDate":"Mon, 09 Mar 2009 11:34:13 +0000","guid":"https:\/\/blog.cliffano.com\/2009\/03\/09\/build-monitor-v10\/","description":"<p>It&rsquo;s been a long time since the last one (v0.9.2 - November 2008), but I&rsquo;ve finally managed to release <a href=\"https:\/\/addons.mozilla.org\/en-US\/firefox\/addon\/7522\">Hudson Build Monitor<\/a> v1.0 .\u00a0 This add-on is still in the sandbox, I&rsquo;ve been waiting for approval from the Mozilla editors for the last 9 months, so unfortunately you still have to login to download it.<\/p>\n<p>A new feature in this release is build executor monitoring. This feature will work only on Hudson instance feeds (non-job feeds), and you have to enable it via Prefereces window -&gt; Feeds tab -&gt; Enable executor monitoring check box.<\/p>"},{"title":"Lovin' The Groovy","link":"https:\/\/blog.cliffano.com\/2009\/03\/01\/lovin-the-groovy\/","pubDate":"Sun, 01 Mar 2009 14:21:00 +0000","guid":"https:\/\/blog.cliffano.com\/2009\/03\/01\/lovin-the-groovy\/","description":"<p>I&rsquo;m a huge fan of <a href=\"http:\/\/javaposse.com\">The Java Posse<\/a>, a podcast about Java related news and technologies. The show co-hosts, Tor Norbye, Carl Quinn, Dick Wall, and Joe Nuxoll, really have a great chemistry between them, probably the best compared to other tech podcasts I&rsquo;ve ever listened to.<\/p>\n<p>There&rsquo;s a joke in <a href=\"http:\/\/javaposse.com\/index.php?post_id=425787\">episode #227<\/a> on how Dick &lsquo;hates&rsquo; <a href=\"http:\/\/groovy.codehaus.org\">Groovy<\/a> (of course he doesn&rsquo;t) which led him to repeat the phrase &ldquo;I love The Groovy, Man&rdquo; several times during that episode. So, to help Dick Wall convince the world that he, in fact, loves Groovy&hellip; I fired up Photoshop and quickly whipped up this show poster idea.<\/p>"},{"title":"Build Executor Monitoring","link":"https:\/\/blog.cliffano.com\/2009\/03\/01\/build-executor-monitoring\/","pubDate":"Sun, 01 Mar 2009 12:50:30 +0000","guid":"https:\/\/blog.cliffano.com\/2009\/03\/01\/build-executor-monitoring\/","description":"<p>Here&rsquo;s a sneak peek of <a href=\"https:\/\/addons.mozilla.org\/en-US\/firefox\/addon\/7522\">Hudson Build Monitor<\/a>&rsquo;s new feature, the ability to monitor build executors from Firefox statusbar panel. This feature was <a href=\"https:\/\/hudson.dev.java.net\/issues\/show_bug.cgi?id=2004\">requested by Espens<\/a> back in July last year. Espens was one of the earliest users who raised lots of ideas and feature requests. Thanks Espens!<\/p>\n<p>In retrospective, I should&rsquo;ve implemented this feature much earlier as I found out recently how useful it is to be able to keep track of the currently running builds and the status of the executors. Having a stuck executor is like losing a leg, sometimes you end up with a lot of builds waiting in the queue just because a master\/slave doesn&rsquo;t have any idle executor.<\/p>"},{"title":"Home Studio v0.1","link":"https:\/\/blog.cliffano.com\/2009\/03\/01\/home-studio-01\/","pubDate":"Sun, 01 Mar 2009 11:04:58 +0000","guid":"https:\/\/blog.cliffano.com\/2009\/03\/01\/home-studio-01\/","description":"<p>Some pictures of the initial version of my &lsquo;home studio&rsquo;. :)<\/p>\n<p>I have always wanted a home studio where I can work on my own projects and create stuffs: codes, digital graphics, hand drawings, circuit boards. I guess I&rsquo;ll start with the codes and digital graphics bits for now. This &lsquo;studio&rsquo; is basically a third of my apartment&rsquo;s bedroom (still renting). An old study desk, an old $25 chair. I&rsquo;ll get proper furnitures, think ergonomic chair, when I have my own house, god knows when that will happen with the current global economic downturn.<\/p>"},{"title":"Hudson Code Swarm","link":"https:\/\/blog.cliffano.com\/2009\/01\/31\/hudson-code-swarm\/","pubDate":"Sat, 31 Jan 2009 14:53:35 +0000","guid":"https:\/\/blog.cliffano.com\/2009\/01\/31\/hudson-code-swarm\/","description":"<p>I found a very interesting project called <a href=\"http:\/\/code.google.com\/p\/codeswarm\/\">code_swarm<\/a>, which is (as quoted from its web site) &lsquo;an experiment in organic software visualization&rsquo;. code_swarm analyses the commit activities within the project&rsquo;s source repository, and generates a visual representation of those activities. Each resource commit is represented as a particle floating around the commiter&rsquo;s username.<\/p>\n<p>So I thought it would be interesting to see how Hudson has evolved as a project, check out the embedded video below&hellip; . The particles are color coded. Red-shaded particles for Java, Jar, JSP, Jelly. Yellow-shaded particles for XML, properties files. Green-shaded particles for HTML, CSS, JavaScript, and images. Blue-shaded particles for various scripting languages.<\/p>"},{"title":"A Cleaner Way To Customise WordPress Theme Styles","link":"https:\/\/blog.cliffano.com\/2009\/01\/12\/a-cleaner-way-to-customise-wordpress-theme-styles\/","pubDate":"Mon, 12 Jan 2009 12:25:10 +0000","guid":"https:\/\/blog.cliffano.com\/2009\/01\/12\/a-cleaner-way-to-customise-wordpress-theme-styles\/","description":"<p>The most frequently asked question from <a href=\"http:\/\/code.google.com\/p\/bitpress\/wiki\/Emptiness\">Emptiness Theme<\/a> users was about customising the styles (font, color, width, etc) and the header image of the theme, and I usually answered by giving them some pointers to which file to modify and where. The problem was that most WordPress users\u00a0 would make the modifications directly against the theme files.<\/p>\n<p>The downside of such approach is that the custom code would end up buried within the theme, which users won&rsquo;t remember few months down the line. And this will then discourage them from upgrading the theme in order to avoid overwriting the customisations accidentally.<\/p>"},{"title":"Image Saving In Watir","link":"https:\/\/blog.cliffano.com\/2008\/12\/29\/image-saving-in-watir\/","pubDate":"Mon, 29 Dec 2008 18:03:25 +0000","guid":"https:\/\/blog.cliffano.com\/2008\/12\/29\/image-saving-in-watir\/","description":"<p>So I got the chance to use <a href=\"http:\/\/wtr.rubyforge.org\/\">Watir<\/a> again on a short project at work. The last time I used it was about 1.5 years ago, and I was glad to find out that Watir is still a nice library to use. Watir simply works without much hassle.<\/p>\n<p>The only issue I had was with <a href=\"http:\/\/wiki.openqa.org\/display\/WTR\/Save+All+Images+on+a+Webpage\">image saving<\/a>. From <a href=\"http:\/\/wtr.rubyforge.org\/rdoc\/classes\/Watir\/Image.html\">Image class documentation<\/a> (Watir 1.6), it wasn&rsquo;t obvious that save can only be called when image element is directly contained within a browser element.<\/p>"},{"title":"Three Years Running A Mini Content Sharing Web Site - Part 1","link":"https:\/\/blog.cliffano.com\/2008\/12\/22\/three-years-running-a-mini-content-sharing-web-site-part-1\/","pubDate":"Mon, 22 Dec 2008 15:33:47 +0000","guid":"https:\/\/blog.cliffano.com\/2008\/12\/22\/three-years-running-a-mini-content-sharing-web-site-part-1\/","description":"<p>To celebrate 3 years of <a href=\"http:\/\/wish.cliffano.com\">Wish<\/a>&rsquo; existence on teh web, I&rsquo;ve been meaning to write up some behind-the-scene stories about Wish and some lessons learned so far from running a mini content sharing web site.<\/p>\n<p><strong>The Beginning<\/strong><\/p>\n<p>Wish was started back in 2005. The idea was simple, I&rsquo;ve always believed that having a wish is an important part of life, so why not share it? I thought it would be interesting to know what other people are wishing for.<\/p>"},{"title":"Testing Reflection Plugin","link":"https:\/\/blog.cliffano.com\/2008\/12\/06\/testing-reflection-plugin\/","pubDate":"Sat, 06 Dec 2008 10:03:48 +0000","guid":"https:\/\/blog.cliffano.com\/2008\/12\/06\/testing-reflection-plugin\/","description":"<p>I spent several train rides this week putting together <a href=\"http:\/\/code.google.com\/p\/bitpress\/wiki\/Reflection\">Reflection Plugin<\/a> for WordPress. This plugin applies reflection effect to images on a blog. The reflection effect is done on the client side using the excellent <a href=\"http:\/\/raphaeljs.com\">Raphael<\/a> JavaScript library. You can use normal image on your posts as usual, and you&rsquo;ll get the reflection effect by simply adding &lsquo;reflection&rsquo; to the class value.<\/p>\n<p>Here are some examples of the effect&hellip;<\/p>\n<p><strong>Wide movie poster:<\/strong><\/p>"},{"title":"BuildMonitor v0.9.1 - Oui!","link":"https:\/\/blog.cliffano.com\/2008\/11\/23\/buildmonitor-v091-oui\/","pubDate":"Sun, 23 Nov 2008 12:27:36 +0000","guid":"https:\/\/blog.cliffano.com\/2008\/11\/23\/buildmonitor-v091-oui\/","description":"<p><a href=\"https:\/\/addons.mozilla.org\/en-US\/firefox\/addon\/7522\">BuildMonitor<\/a> v0.9.1 was released yesterday. This is the first version with French l10n bundled, thanks to <a href=\"http:\/\/ericlefevre.net\">Eric Lefevre<\/a> who submitted the translations.<\/p>\n<p>I added a new &lsquo;Build&rsquo; menu to trigger the build of a particular job. This menu item only comes up on a job feed.<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/091buildmonitor_build.jpg\" alt=\"\"><\/p>\n<p>Another little improvement is a new option on the preference window to hide the feed name on Firefox status bar. This is useful when you need to monitor many feeds.<\/p>"},{"title":"XStringBundle NS_ERROR_FAILURE","link":"https:\/\/blog.cliffano.com\/2008\/11\/16\/xstringbundle-ns_error_failure\/","pubDate":"Sun, 16 Nov 2008 10:36:34 +0000","guid":"https:\/\/blog.cliffano.com\/2008\/11\/16\/xstringbundle-ns_error_failure\/","description":"<p>I got this error message on Firefox Error Console after adding fr-FR locale to BuildMonitor, which caused it to fail initialising the status bar feeds.\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-text\" data-lang=\"text\"><span style=\"display:flex;\"><span>1=&#34;[Exception...&#34; 2=&#34;Component&#34; 3=&#34;returned&#34; 4=&#34;failure&#34; 5=&#34;code:&#34; 6=&#34;0x80004005&#34; 7=&#34;(NS_ERROR_FAILURE)&#34; 8=&#34;[nsIStringBundle.&#34; 9=&#34;&lt;div&#34; id=&#34;:sd&#34; 10=&#34;class=&#34;ArwC7c&#34; 11=&#34;ckChnd&#34;&gt;GetStringFromName&#34; language=&#34;Error:&#34;]&#34;\u00a0 nsresult: &#34;0x80004005 (NS_ERROR_FAILURE)&#34;\u00a0 location: &#34;JS frame :: XStringBundle :: getString :: line 17&#34;\u00a0 data: no] Source File: XStringBundle Line: 17&lt;\/div&gt;<\/span><\/span><\/code><\/pre><\/div>\nGoogling gave me some clues but still nothing obvious to solve the problem. At first I thought it has something to do with the non-ASCII characters, so I did a binary-replace on the property values, but still no luck. It&rsquo;s only after I cat-ed the file then I noticed an empty space before the first property key. This empty space turned out to be a weird character that didn&rsquo;t show up on Eclipse text editor, gedit, and vi.<\/p>"},{"title":"BuildMonitor v0.9 - Usage Video","link":"https:\/\/blog.cliffano.com\/2008\/11\/10\/buildmonitor-v09-usage-video\/","pubDate":"Mon, 10 Nov 2008 13:36:18 +0000","guid":"https:\/\/blog.cliffano.com\/2008\/11\/10\/buildmonitor-v09-usage-video\/","description":"<p>BuildMonitor v0.9 has been released, you can get it from <a href=\"https:\/\/addons.mozilla.org\/en-US\/firefox\/addon\/7522\">the usual place<\/a>.<\/p>\n<p>The most useful improvement from this release is the ability to add new feed via right click menu of a link. Other improvements include the ability to remove the feed via status bar right click menu or from preferences menu. It&rsquo;s also now possible to rearrange the order of the feeds via preferences menu.<\/p>\n<p>I made a quick video (using <a href=\"http:\/\/recordmydesktop.sourceforge.net\">recordMyDesktop<\/a>) showing how easy it is to monitor Hudson feeds using the Firefox Add-on.<\/p>"},{"title":"100+ Custom Emptiness","link":"https:\/\/blog.cliffano.com\/2008\/10\/24\/100-custom-emptiness\/","pubDate":"Fri, 24 Oct 2008 15:40:19 +0000","guid":"https:\/\/blog.cliffano.com\/2008\/10\/24\/100-custom-emptiness\/","description":"<p>Five months since <a href=\"http:\/\/blog.cliffano.com\/2008\/05\/31\/emptiness-theme-v01\/\">v0.1 was released<\/a>, Emptiness Theme has been <a href=\"http:\/\/wordpress.org\/extend\/themes\/emptiness\/stats\/\">downloaded 5,867 times and given 4\/5 stars average rating<\/a>. Not bad. Even though it&rsquo;s not as popular as other themes with fancy graphic design, I think Emptiness has its own target audience with it&rsquo;s simplistic style.<\/p>\n<p>I&rsquo;m particularly happy to find (via Google search) more than 100 blogs using Emptiness Theme with customised header image and some with customised css. Check them out on <a href=\"http:\/\/picasaweb.google.com\/cliffano\/100CustomEmptiness#\">my Picasa Web album<\/a>.<\/p>"},{"title":"BuildMonitor v0.8","link":"https:\/\/blog.cliffano.com\/2008\/10\/12\/buildmonitor-v08\/","pubDate":"Sun, 12 Oct 2008 13:44:23 +0000","guid":"https:\/\/blog.cliffano.com\/2008\/10\/12\/buildmonitor-v08\/","description":"<p>BuildMonitor v0.8 is finally here, you can download it from <a href=\"https:\/\/addons.mozilla.org\/en-US\/firefox\/addon\/7522\">Firefox Add-ons page<\/a>. This release has a number of nice improvements&hellip;<\/p>\n<p><strong>Multiple feeds monitoring<\/strong><\/p>\n<p>Now you can monitor multiple Hudson instances by configuring their feeds in BuildMonitor preferences. All feed status icons will be displayed on the Firefox status bar, you can mouseover or click each icon to get the build details for the corresponding feed.<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/buildmonitor-0.8-multiplefeeds.jpg\" alt=\"\"><\/p>\n<p><strong>Feed status display<\/strong><\/p>\n<p>The way BuildMonitor uses the orbs to represent the health summary of the feed in v0.7 has been a source of confusion to the users. Many users thought that the orb indicates the latest build status, and not the overall health of the feed.<\/p>"},{"title":"Multiple Feeds Monitoring","link":"https:\/\/blog.cliffano.com\/2008\/09\/07\/multiple-feeds-monitoring\/","pubDate":"Sun, 07 Sep 2008 14:53:24 +0000","guid":"https:\/\/blog.cliffano.com\/2008\/09\/07\/multiple-feeds-monitoring\/","description":"<p>Patrick Struhs left a comment on <a href=\"https:\/\/addons.mozilla.org\/en-US\/firefox\/addon\/7522\">Hudson Build Monitor<\/a> page, suggesting &ldquo;A nice feature would be to be able to monitor more than one server easily,&rdquo; and that&rsquo;s what I&rsquo;ve been working on sporadically this week. I started with the statusbar panel, the goal is to keep the UI minimal but still provide enough information. I&rsquo;ve also got the multiple feeds processing pretty much done.<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/buildmonitor_multiple.jpg\" alt=\"\"><\/p>\n<p>This is how the statusbar panel looks like in 0.8-SNAPSHOT. I used <a href=\"http:\/\/tango.freedesktop.org\/Tango_Icon_Library\">Tango Icon Library<\/a> to keep it consistent with Hudson. The above screenshot shows the status of six feeds, the first one is a Netbeans feed with a warning, the second and fourth ones show an error icon indicating a problem with the urls, the third one is a JBoss feed - currently downloading, the fifth one shows the no-build icon, and the last one shows that the feed is currently queued waiting to start the download.<\/p>"},{"title":"Citysearch.com.au On Nintendo DS","link":"https:\/\/blog.cliffano.com\/2008\/08\/31\/citysearchcomau-on-nintendo-ds\/","pubDate":"Sun, 31 Aug 2008 14:59:36 +0000","guid":"https:\/\/blog.cliffano.com\/2008\/08\/31\/citysearchcomau-on-nintendo-ds\/","description":"<p>This is my first attempt at using <a href=\"http:\/\/www.opera.com\/products\/devices\/nintendo\/\">Opera<\/a> on my <a href=\"http:\/\/www.nintendo.com\/ds\">Nintendo DS<\/a>, recorded using <a href=\"http:\/\/panasonic.net\/pavc\/lumix\/\">Panasonic Lumix<\/a>. The video was edited using <a href=\"http:\/\/www.kinodv.org\">Kino<\/a> with sound effects from <a href=\"http:\/\/www.freesound.org\">The Freesound Project<\/a>. For the record, I did my best Indonesian accent, notice the &lsquo;rrr&rsquo;, the &lsquo;sss&rsquo;, and the &rsquo;d&rsquo; replacing the &rsquo;th&rsquo;.<\/p>\n<p>I had a go at browsing <a href=\"http:\/\/citysearch.com.au\">Citysearch.com.au<\/a> to see how it looks like on a handheld device. I think the site is still quite usable, the default CSS works fine. Business Finder HTML chunk need to be moved further down so verticals content is served first. Spoiler: starting from 5:00, I was trying to figure out how to click a link using the stylus and it took too long after 2.5 minutes, so I stopped the video. If you got bored, fast forward to the end where I gave myself an applause. Spoiler 2: at around 2:40, my brother made a voice cameo appearance by asking for the bus timetable.<\/p>"},{"title":"Kaptcha v2.3 And BuildMonitor v0.7","link":"https:\/\/blog.cliffano.com\/2008\/07\/27\/kaptcha-v23-and-buildmonitor-v07\/","pubDate":"Sun, 27 Jul 2008 10:34:56 +0000","guid":"https:\/\/blog.cliffano.com\/2008\/07\/27\/kaptcha-v23-and-buildmonitor-v07\/","description":"<p>Jon released <a href=\"http:\/\/code.google.com\/p\/kaptcha\/downloads\/list\">Kaptcha 2.3<\/a> which includes a patch I submitted about 2 months ago. This patch replaced imaging library with <a href=\"https:\/\/pixels.dev.java.net\/\">pixels<\/a>. If you look closely at the new kaptcha image&hellip;<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/kaptcha_2.3.jpg\" alt=\"\"><\/p>\n<p>you will notice that the water effect (at the centre of the image) is now visible with pixels, whereas it wasn&rsquo;t at all with imaging library in the original simplecaptcha implementation. I tested various settings of the water effect, and opted to minimise the effect so lowercase letters on a small font size are still easy on human eyes. Another change with 2.3 is the ripple effect on the characters. It&rsquo;s not too obvious on the above image, but it&rsquo;s more visible on uppercase letters with larger font size.<\/p>"},{"title":"BuildMonitor Development Notes","link":"https:\/\/blog.cliffano.com\/2008\/06\/28\/buildmonitor-development-notes\/","pubDate":"Sat, 28 Jun 2008 14:23:50 +0000","guid":"https:\/\/blog.cliffano.com\/2008\/06\/28\/buildmonitor-development-notes\/","description":"<p><strong>Usage Scenario<\/strong><\/p>\n<p>When I first developed <a href=\"http:\/\/hudson.gotdns.com\/wiki\/display\/HUDSON\/Firefox+Add-on+Build+Monitor\">BuildMonitor<\/a>, I thought that the typical users would be something like a team of 5-10 developers working on a project, and they would be located in the same building.<\/p>\n<p>After v0.1 was released and feedback started coming in, I learned that some users want to monitor 10-20 projects on the same Hudson instance, there are projects with developers scattered across different time zones, and there was someone who asked for non-English translations since Hudson itself has been translated to 7 languages.<\/p>"},{"title":"Shelfari Bug Report","link":"https:\/\/blog.cliffano.com\/2008\/06\/10\/shelfari-bug-report\/","pubDate":"Tue, 10 Jun 2008 14:15:21 +0000","guid":"https:\/\/blog.cliffano.com\/2008\/06\/10\/shelfari-bug-report\/","description":"<p>I like <a href=\"http:\/\/www.shelfari.com\">Shelfari<\/a>. I like it a lot that I even bother creating a bug report video.<\/p>\n<p>In this video, I edited my profile, set my location to VIC, and saved it. Shelfari then displayed the correct location (VIC), but then I switched the screen to another page, and returned to the location details. This time Shelfari displayed just VI. I repeated it again with a different page and the same problem occured.<\/p>"},{"title":"BuildMon v0.1 - Bringing Hudson Orbs To Firefox","link":"https:\/\/blog.cliffano.com\/2008\/06\/08\/buildmon-v01-bringing-hudson-orbs-to-firefox\/","pubDate":"Sun, 08 Jun 2008 17:57:32 +0000","guid":"https:\/\/blog.cliffano.com\/2008\/06\/08\/buildmon-v01-bringing-hudson-orbs-to-firefox\/","description":"<p><strong>Update:<\/strong> documentation and screenshots have been moved to <a href=\"http:\/\/hudson.gotdns.com\/wiki\/display\/HUDSON\/Firefox+Add-on+Build+Monitor\">Hudson wiki<\/a>.<\/p>\n<p>I&rsquo;ve just released <a href=\"http:\/\/code.google.com\/p\/duckworth\/wiki\/BuildMon\">BuildMon<\/a> <a href=\"http:\/\/hudson.gotdns.com\/wiki\/display\/HUDSON\/Firefox+Add-on+Build+Monitor\">Build Monitor<\/a> v0.1, a Firefox Add-on that displays <a href=\"https:\/\/hudson.dev.java.net\/\">Hudson<\/a> Build status on Firefox status bar panel. You can install it from <a href=\"https:\/\/addons.mozilla.org\/en-US\/firefox\/addon\/7522\">https:\/\/addons.mozilla.org\/en-US\/firefox\/addon\/7522<\/a> .<\/p>\n<p>This add-on is currently sandboxed (only registered users can click the &lsquo;Add to Firefox&rsquo; button). It still needs at least a user review before I can nominate it for public access. So if you can help with a review, it will be highly appreciated. I&rsquo;ve tested it on Firefox 2.0.14 and 3.0RC2 (Gran Paradiso), on Windows Vista and Ubuntu Gutsy Gibbon, against Hudson 1.211&rsquo;s feed.<\/p>"},{"title":"Did You Make Wish #7208?","link":"https:\/\/blog.cliffano.com\/2008\/05\/31\/did-you-make-wish-7208\/","pubDate":"Sat, 31 May 2008 08:33:29 +0000","guid":"https:\/\/blog.cliffano.com\/2008\/05\/31\/did-you-make-wish-7208\/","description":"<p>I received an email from a <a href=\"http:\/\/wish.cliffano.com\">Wish<\/a> visitor asking me  &ldquo;What if we could help make the wish come true? how do we contact the person?&rdquo; Turned out it was related to <a href=\"http:\/\/wish.cliffano.com\/text\/show\/7208\">wish #7208<\/a> &ldquo;i wish adam would send me a painting.&rdquo; It also turned out that the email sender was a painter (I googled her name).<\/p>\n<p>I explained to her that the wishes were made anonymously and I couldn&rsquo;t trace the wishers. The best I can do is to blog about it and hope that the wisher returns to the site and reads about this.<\/p>"},{"title":"Emptiness Theme v0.1","link":"https:\/\/blog.cliffano.com\/2008\/05\/31\/emptiness-theme-v01\/","pubDate":"Sat, 31 May 2008 02:48:01 +0000","guid":"https:\/\/blog.cliffano.com\/2008\/05\/31\/emptiness-theme-v01\/","description":"<p>Introducing <a href=\"http:\/\/code.google.com\/p\/bitpress\/wiki\/Emptiness\">Emptiness<\/a> Theme v0.1 .<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/emptinesstheme.jpg\" alt=\"\"><\/p>\n<p>Since I started using WordPress few months ago, I&rsquo;ve tried various minimalist themes available from WordPress <a href=\"http:\/\/themes.wordpress.net\/\">Theme Viewer<\/a>, but none of them really suits me. So, just like any designer-wannabe, I rolled out my own minimalist theme. It&rsquo;s available for <a href=\"http:\/\/code.google.com\/p\/bitpress\/downloads\/list\">download<\/a>, though I&rsquo;m still trying to register it on  WordPress Theme Viewer. I don&rsquo;t know what&rsquo;s wrong with Theme Viewer, they must be really busy with backlogs of registrations to process, or they&rsquo;re totally ignoring the current Theme Viewer and currently building a better system.<\/p>"},{"title":"About","link":"https:\/\/blog.cliffano.com\/about\/","pubDate":"Sat, 24 May 2008 19:50:21 +0000","guid":"https:\/\/blog.cliffano.com\/about\/","description":"<p>G&rsquo;day, my name is Cliffano Subagio (<a href=\"https:\/\/twitter.com\/cliffano\">@cliffano<\/a>, <a href=\"mailto:blah@cliffano.com\">blah@cliffano.com<\/a>), I&rsquo;m a software engineer from Melbourne, Australia.<\/p>\n<p>I&rsquo;ve delivered some <a href=\"https:\/\/blog.cliffano.com\/tech-talks\/\">tech talks<\/a> and joined some <a href=\"https:\/\/blog.cliffano.com\/tags\/podcast-discussion\/\">tech podcast discussions<\/a> in the past. In my (extremely lack of) spare time, I maintain several <a href=\"https:\/\/github.com\/cliffano\">open source projects<\/a> and <a href=\"https:\/\/www.openhub.net\/accounts\/cliffano\">contribute to other projects<\/a>, big and small.<\/p>\n<p>I&rsquo;m an <a href=\"https:\/\/www.flickr.com\/photos\/cliffano\/sets\/\">ocassional traveler<\/a>. My travel\u00a0photos are published under Creative Commons license, and some have been used by <a href=\"https:\/\/www.pinterest.com\/cliffano\/media\/\">various popular\u00a0media outlets<\/a>. I&rsquo;m also an\u00a0<a href=\"https:\/\/www.goodreads.com\/review\/list\/4102184-cliffano?sort=rating\">avid reader listener<\/a>.<\/p>"},{"title":"Random Project Updates","link":"https:\/\/blog.cliffano.com\/2008\/04\/02\/random-project-updates\/","pubDate":"Wed, 02 Apr 2008 13:00:01 +0000","guid":"https:\/\/blog.cliffano.com\/2008\/04\/02\/random-project-updates\/","description":"<p>Haven&rsquo;t made any project related post since July last year, so here&rsquo;s a list of little things I spent some time on:<\/p>\n<ul>\n<li>\n<p>While playing around with Firefox Web Developer Extension, I found out that some Maven reports generated invalid HTML which could break the reports layout with non-default vm templates. Hence <a href=\"http:\/\/jira.codehaus.org\/browse\/MFINDBUGS-29\">MFINDBUGS-29<\/a>, <a href=\"http:\/\/jira.codehaus.org\/browse\/MCHECKSTYLE-74\">MCHECKSTYLE-74<\/a>, and <a href=\"http:\/\/jira.codehaus.org\/browse\/MCHANGES-83\">MCHANGES-83<\/a>.<\/p>\n<\/li>\n<li>\n<p>After integrating Kaptcha in SCode Plugin 0.5, I spent some time working on the Kaptcha project itself where most of the effort was on refactoring the original SimpleCaptcha code. <a href=\"http:\/\/code.google.com\/p\/kaptcha\/issues\/detail?id=5\">That<\/a>, and <a href=\"http:\/\/code.google.com\/p\/kaptcha\/issues\/detail?id=11&amp;can=1\">some<\/a> <a href=\"http:\/\/code.google.com\/p\/kaptcha\/issues\/detail?id=10&amp;can=1\">other<\/a> <a href=\"http:\/\/code.google.com\/p\/kaptcha\/issues\/detail?id=9&amp;can=1\">patches<\/a> have made it to Kaptcha 2.1 and 2.2 .<\/p>"},{"title":"Slicehosted","link":"https:\/\/blog.cliffano.com\/2008\/02\/16\/slicehosted\/","pubDate":"Sat, 16 Feb 2008 17:27:06 +0000","guid":"https:\/\/blog.cliffano.com\/2008\/02\/16\/slicehosted\/","description":"<p>I moved my site hosting to <a href=\"http:\/\/www.slicehost.com\">Slicehost<\/a> about 6 months ago, and I only have praises about their service. What I like the most about Slicehost is the fact that they give a sense of community with their <a href=\"http:\/\/wiki.slicehost.com\">wiki<\/a>, <a href=\"http:\/\/forum.slicehost.com\">forum<\/a>, and <a href=\"http:\/\/slicehost.campfirenow.com\/489cc\">chatroom<\/a>. Gone are the days when I had to wait for at least a day to get a reply to my queries (think <a href=\"http:\/\/www.godaddy.com\">Go Daddy<\/a>).<\/p>\n<p>There are so many <a href=\"http:\/\/www.slicehost.com\/testimonials\">testimonials<\/a> about how great Slicehost is, so I&rsquo;m just going to write my Sliceperiences here&hellip;<\/p>"},{"title":"Quotes From Randy Pausch's Last Lecture","link":"https:\/\/blog.cliffano.com\/2007\/12\/26\/quotes-from-randy-pauschs-last-lecture\/","pubDate":"Wed, 26 Dec 2007 12:36:24 +0000","guid":"https:\/\/blog.cliffano.com\/2007\/12\/26\/quotes-from-randy-pauschs-last-lecture\/","description":"<p>My favourite quotes from Randy Pausch (a professor of computer science and human-computer interaction and design at Carnegie Mellon University)&rsquo;s <a href=\"http:\/\/www.bookdepository.com\/Last-Lecture-Randy-Pausch\/9781401309657\">The Last Lecture<\/a><img src=\"https:\/\/www.assoc-amazon.com\/e\/ir?t=cliffano-20&amp;l=ur2&amp;o=1\" alt=\"\"> - Really Achieving Your Childhood Dreams (<a href=\"http:\/\/www.youtube.com\/watch?v=ji5_MqicxSo\">video<\/a>):<\/p>\n<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->\n<p>I think the most important message from his lecture is that leading your life the right way is never just about you, it&rsquo;s about you and the people around you.<\/p>"},{"title":"Going Java 1.5 With Maven2-Based Project","link":"https:\/\/blog.cliffano.com\/2007\/07\/10\/going-java-15-with-maven2-based-project\/","pubDate":"Tue, 10 Jul 2007 11:49:29 +0000","guid":"https:\/\/blog.cliffano.com\/2007\/07\/10\/going-java-15-with-maven2-based-project\/","description":"<p>I recently made some simple updates to <a href=\"http:\/\/code.google.com\/p\/wish-anonymous\/\">Wish<\/a> by using Java 1.5 generics and autoboxing\/unboxing. Making Java source changes was the easy part, while the time consuming part was on hunting for information on Maven-related changes.<\/p>\n<p>I started by changing maven-compiler-plugin source and target in pom.xml:\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-xml\" data-lang=\"xml\"><span style=\"display:flex;\"><span><span style=\"color:#f92672\">&lt;build&gt;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>  <span style=\"color:#f92672\">&lt;plugins&gt;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>    ...\n<\/span><\/span><span style=\"display:flex;\"><span>    <span style=\"color:#f92672\">&lt;plugin&gt;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>      <span style=\"color:#f92672\">&lt;artifactId&gt;<\/span>maven-compiler-plugin<span style=\"color:#f92672\">&lt;\/artifactId&gt;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>      <span style=\"color:#f92672\">&lt;configuration&gt;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>        <span style=\"color:#f92672\">&lt;source&gt;<\/span>1.5<span style=\"color:#f92672\">&lt;\/source&gt;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>        <span style=\"color:#f92672\">&lt;target&gt;<\/span>1.5<span style=\"color:#f92672\">&lt;\/target&gt;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>      <span style=\"color:#f92672\">&lt;\/configuration&gt;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>    <span style=\"color:#f92672\">&lt;\/plugin&gt;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>    ...\n<\/span><\/span><span style=\"display:flex;\"><span>  <span style=\"color:#f92672\">&lt;\/plugins&gt;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">&lt;\/build&gt;<\/span><\/span><\/span><\/code><\/pre><\/div>\nAnd got this error upon running mvn site<\/p>\n<p><div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-text\" data-lang=\"text\"><span style=\"display:flex;\"><span>Caused by: net.sourceforge.pmd.ast.ParseException: Can&#39;t use generics unless running in JDK 1.5 mode!<\/span><\/span><\/code><\/pre><\/div>\nwhich led me to change maven-pmd-plugin targetJdk:\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-xml\" data-lang=\"xml\"><span style=\"display:flex;\"><span><span style=\"color:#f92672\">&lt;reporting&gt;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>  <span style=\"color:#f92672\">&lt;plugins&gt;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>    ...\n<\/span><\/span><span style=\"display:flex;\"><span>    <span style=\"color:#f92672\">&lt;plugin&gt;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>      <span style=\"color:#f92672\">&lt;artifactId&gt;<\/span>maven-pmd-plugin<span style=\"color:#f92672\">&lt;\/artifactId&gt;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>      <span style=\"color:#f92672\">&lt;configuration&gt;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>        <span style=\"color:#f92672\">&lt;targetJdk&gt;<\/span>1.5<span style=\"color:#f92672\">&lt;\/targetJdk&gt;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>      <span style=\"color:#f92672\">&lt;\/configuration&gt;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>    <span style=\"color:#f92672\">&lt;\/plugin&gt;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>    ...\n<\/span><\/span><span style=\"display:flex;\"><span>  <span style=\"color:#f92672\">&lt;\/plugins&gt;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">&lt;\/reporting&gt;<\/span><\/span><\/span><\/code><\/pre><\/div>\nThen I found out that the angle brackets used by generics syntax resulted in checkstyle errors:\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-text\" data-lang=\"text\"><span style=\"display:flex;\"><span>&lt;&#39; is not preceded with whitespace.\n<\/span><\/span><span style=\"display:flex;\"><span>error\t&lt;;&#39; is not followed by whitespace.\n<\/span><\/span><span style=\"display:flex;\"><span>error\t&#39;&gt;&#39; is not preceded with whitespace.<\/span><\/span><\/code><\/pre><\/div>\nwhich is fixed by <a href=\"http:\/\/sourceforge.net\/tracker\/index.php?func=detail&amp;aid=1374798&amp;group_id=29721&amp;atid=397078\">adding these modules<\/a> to checkstyle.xml .<\/p>"},{"title":"SCode Image Reload","link":"https:\/\/blog.cliffano.com\/2007\/06\/10\/scode-image-reload\/","pubDate":"Sun, 10 Jun 2007 18:57:12 +0000","guid":"https:\/\/blog.cliffano.com\/2007\/06\/10\/scode-image-reload\/","description":"<p>Sometimes the numbers on SCodePlugin-generated CAPTCHA image are not easy to read. And rather than refreshing the whole page, it would be nice to reload only the image and generate a new \/ more readable code.<\/p>\n<p>In order to give this a go, I modified the comment form on Melbourne photoblog and added a short Javascript code to refresh the image source. You can try it yourself on <a href=\"http:\/\/mbledug.com\/melbourne\/blog\/melbourne\/airport\/2006\/12\/09\/04\/25\/2006%2008:04:54#responses\">this form<\/a>, just click the text &ldquo;Generate another code&rdquo; and wait shortly for the image to be reloaded with a new code.<\/p>"},{"title":"GateKeeper Plugin v0.1 And IMNotification Plugin v0.1","link":"https:\/\/blog.cliffano.com\/2007\/06\/08\/gatekeeper-plugin-v01-and-imnotification-plugin-v01\/","pubDate":"Fri, 08 Jun 2007 16:31:43 +0000","guid":"https:\/\/blog.cliffano.com\/2007\/06\/08\/gatekeeper-plugin-v01-and-imnotification-plugin-v01\/","description":"<p><a href=\"http:\/\/wiki.blojsom.com\/wiki\/display\/blojsom3\/GateKeeper+Plugin\">GateKeeper Plugin<\/a> v0.1 and <a href=\"http:\/\/wiki.blojsom.com\/wiki\/display\/blojsom3\/IM+Notification+Plugin\">IMNotification Plugin<\/a> v0.1 have been released.<\/p>\n<p>I implemented GateKeeper Plugin for Blojsom following the earlier discussion on <a href=\"http:\/\/blog.cliffano.com\/2007\/02\/19\/myqanda-possibly-a-simple-anti-bot-solution-to-fight-coment-spams\/\">a simple anti-bot solution to fight comment spams<\/a>. This blog has been using GateKeeper Plugin (with very simple challenges for now) and it has worked like a charm with 100% success rate, though I think that the success is actually contributed from the fact that the spammers have been focusing their effort on breaking more mainstream anti-spam solutions like CAPTCHAs.<\/p>"},{"title":"Der Wunsch: Offline... Leider","link":"https:\/\/blog.cliffano.com\/2007\/05\/30\/der-wunsch-offline-leider\/","pubDate":"Wed, 30 May 2007 10:06:28 +0000","guid":"https:\/\/blog.cliffano.com\/2007\/05\/30\/der-wunsch-offline-leider\/","description":"<p>While working on a mini improvement request for <a href=\"http:\/\/mbledug.com\/wish\">Wish<\/a> (more on that later), I found out that <a href=\"http:\/\/www.derwunsch.de\/\">Der Wunsch<\/a> is now &lsquo;almost&rsquo; offline. Here&rsquo;s the <a href=\"http:\/\/babelfish.altavista.com\/\">Babel Fish<\/a> translation of the message on Der Wunsch home page:<\/p>\n<!-- raw HTML omitted -->\n<p>That&rsquo;s about a year and a half since Der Wunsch <a href=\"http:\/\/blog.cliffano.com\/2006\/01\/24\/der-wunsch\/\">came to life<\/a>. Thanks for the effort, Claus.<\/p>\n<p>Now, back to the mini improvement. I&rsquo;ve received several feedbacks and was finally able to complete the first request from Machi.<\/p>"},{"title":"Blojsom IM Notification Messages","link":"https:\/\/blog.cliffano.com\/2007\/05\/05\/blojsom-im-notification-messages\/","pubDate":"Sat, 05 May 2007 15:03:33 +0000","guid":"https:\/\/blog.cliffano.com\/2007\/05\/05\/blojsom-im-notification-messages\/","description":"<p>Here&rsquo;s a screenshot of Blojsom notification messages on <a href=\"http:\/\/www.pandion.be\/\">Pandion<\/a>.<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/imnotification_pandion.jpg\" alt=\"\"><\/p>\n<p>You&rsquo;ll be notified for new entry, comment, trackback, and pingback. I&rsquo;m currently working on XMPP Plugin for Blojsom, though nothing is stopping this from becoming IMNotification Plugin. I guess there are plenty of AIM and MSN users out there.<\/p>"},{"title":"SCodePlugin v0.5","link":"https:\/\/blog.cliffano.com\/2007\/05\/02\/scodeplugin-v05\/","pubDate":"Wed, 02 May 2007 10:16:23 +0000","guid":"https:\/\/blog.cliffano.com\/2007\/05\/02\/scodeplugin-v05\/","description":"<p><a href=\"http:\/\/wiki.blojsom.com\/wiki\/display\/blojsom3\/SCode+Plugin\">SCodePlugin<\/a> v0.5 has been released, expect the jar and source <a href=\"http:\/\/sourceforge.net\/project\/showfiles.php?group_id=72754&amp;package_id=154672&amp;release_id=480225\">downloads<\/a> to be available from SourceForge mirrors in the next few days. As usual, if you want it earlier, just email me and I&rsquo;ll send it to you.<\/p>\n<p>Changelog:<\/p>\n<ul>\n<li>\n<p>Introduced KaptchaImageEngine using Kaptcha (was Simple Captcha) library, with 3 new flavours from KinkImageEngine, FishEyeImageEngine, and ShadowImageEngine.<\/p>\n<\/li>\n<li>\n<p>Replaced image engine class loading in image factory with constructor injection. SCodePlugin passes the image factory to SCodeServlet, instead of passing the image engines.<\/p>"},{"title":"FishEye And Shadow Flavors","link":"https:\/\/blog.cliffano.com\/2007\/04\/13\/fisheye-and-shadow-flavors\/","pubDate":"Fri, 13 Apr 2007 05:07:20 +0000","guid":"https:\/\/blog.cliffano.com\/2007\/04\/13\/fisheye-and-shadow-flavors\/","description":"<p>Still using <a href=\"http:\/\/code.google.com\/p\/kaptcha\/\">Kaptcha<\/a>, I added 2 new flavors to SCode Plugin: &ldquo;fisheye&rdquo; and &ldquo;shadow&rdquo;. Here&rsquo;s the screenshot:<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/kaptcha_fisheye_shadow.jpg\" alt=\"\"><\/p>\n<p>Same as &ldquo;kink&rdquo;, these new flavors will be part of SCode Plugin 0.5 .<\/p>"},{"title":"Kink, New SCode Flavor","link":"https:\/\/blog.cliffano.com\/2007\/04\/12\/kink-new-scode-flavor\/","pubDate":"Thu, 12 Apr 2007 10:06:20 +0000","guid":"https:\/\/blog.cliffano.com\/2007\/04\/12\/kink-new-scode-flavor\/","description":"<p>Jon Stevens resurrected <a href=\"http:\/\/simplecaptcha.sf.net\/\">Simple Captcha<\/a> in the form of <a href=\"http:\/\/code.google.com\/p\/kaptcha\/\">Kaptcha<\/a>. The good thing about Simple Captcha \/ Kaptcha is that it generates an image similar to the ones used at <a href=\"https:\/\/edit.yahoo.com\/config\/eval_register?.intl=us&amp;new=1\">Yahoo!<\/a>. Other than that, it&rsquo;s really straightforward to use.<\/p>\n<p>I quickly integrated Kaptcha into SCode Plugin by introducing KinkImageEngine, exposed to Blojsom via &ldquo;kink&rdquo; flavor. Here&rsquo;s how it looks like:<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/kaptcha_kink.jpg\" alt=\"\"><\/p>\n<p>This flavor will be included in SCode Plugin 0.5 (yet to be released).<\/p>"},{"title":"Blojsom 3 Plugins Update Wrap Up","link":"https:\/\/blog.cliffano.com\/2007\/03\/25\/blojsom-3-plugins-update-wrap-up\/","pubDate":"Sun, 25 Mar 2007 10:37:44 +0000","guid":"https:\/\/blog.cliffano.com\/2007\/03\/25\/blojsom-3-plugins-update-wrap-up\/","description":"<p>Blojsom 3 was <a href=\"http:\/\/www.blojsom.com\/blog\/david\/blojsom\/2006\/03\/23\/blojsom-3-0.html\">first mentioned<\/a> on March 23rd 2006, and it was <a href=\"http:\/\/www.blojsom.com\/blog\/david\/blojsom\/2006\/09\/29\/blojsom-3-0-available\">finally released<\/a> (post milestone releases) on September 29th 2006.<\/p>\n<p>The first time I mentioned about updating my plugins was on March 27th 2006. And today, March 25th <strong>2007<\/strong>, almost a year later, I finally finished updating all plugins with necessary improvements along with documentation updates. Phew.<\/p>\n<p>Here are some notes of each plugin:<\/p>\n<p><strong>BlogTimes Plugin<\/strong><\/p>\n<p>In Blojsom 2, BlogTimes Plugin only draws the current entries on the page, which means it only draws one blog time on a permalink view. This doesn&rsquo;t give a good indication on the user&rsquo;s blogging time pattern. In Blojsom 3, it draws a configurable number of N latest entries. So if you set it to a large value, e.g. 100, then you&rsquo;ll get better graph on the time you post your last 100 blogs regardless whether you&rsquo;re on a permalink view or not.<\/p>"},{"title":"Myqanda, Possibly A Simple Anti-Bot Solution To Fight Coment Spams?","link":"https:\/\/blog.cliffano.com\/2007\/02\/19\/myqanda-possibly-a-simple-anti-bot-solution-to-fight-coment-spams\/","pubDate":"Mon, 19 Feb 2007 13:40:49 +0000","guid":"https:\/\/blog.cliffano.com\/2007\/02\/19\/myqanda-possibly-a-simple-anti-bot-solution-to-fight-coment-spams\/","description":"<p>I just checked my server log between Dec 19, 2006 and today. <a href=\"http:\/\/wiki.blojsom.com\/wiki\/display\/blojsom3\/SCode+Plugin\">SCode Plugin<\/a> has successfully prevented 2140 comment spams, but there were 122 spams which slipped through the cracks. Those 122 provided correct answers from the CAPTCHA image. And judging from the timestamps, I&rsquo;m pretty sure that those 122 were automated spam attacks using bots. However, considering that evil spammers would go as far as <a href=\"http:\/\/www.getafreelancer.com\/projects\/Data-Processing-Data-Entry\/Data-Entry-Solve-CAPTCHA.html\">hiring freelancers to solve CAPTCHAs manually<\/a>, there&rsquo;s a chance that some people out there somewhere &lsquo;unintentionally&rsquo; spammed my blog manually 122 times since Dec 2006. Ouch!<\/p>"},{"title":"Ressurecting Page By Page View A La Pager Plugin In Blojsom 3","link":"https:\/\/blog.cliffano.com\/2007\/01\/31\/ressurecting-page-by-page-view-a-la-pager-plugin-in-blojsom-3\/","pubDate":"Wed, 31 Jan 2007 12:29:18 +0000","guid":"https:\/\/blog.cliffano.com\/2007\/01\/31\/ressurecting-page-by-page-view-a-la-pager-plugin-in-blojsom-3\/","description":"<p>After upgrading this blog to Blojsom 3.1, I hooked up <a href=\"http:\/\/wiki.blojsom.com\/wiki\/display\/blojsom\/Pager+Plugin\">Pager Plugin<\/a>&rsquo;s pager.vm velocity code to <a href=\"http:\/\/wiki.blojsom.com\/wiki\/display\/blojsom3\/Skip+Filter+Helper+Plugin\">SkipFilterHelper Plugin<\/a>, and the result is as you can see at the bottom of my blog when you&rsquo;re not viewing this post via feed or permalink (e.g. try the blog home page).<\/p>\n<p>There is a bug with SkipFilterHelper Plugin in Blojsom 3.1 (registered in JIRA as <a href=\"http:\/\/jira.blojsom.com\/jira\/browse\/BLOJSOM-195\">BLOJSOM-195<\/a>, David checked in the fix to CVS), which is about incorrect total pages on boundary cases. I immediately noticed this error because it also exists in Pager Plugin 0.2 . The SkipFilterHelper Plugin fix will be included in Blojsom 3.2, and in the mean time you can either apply the fix yourself to Blojsom 3.1 and rebuild from source, or email me and I&rsquo;ll send you the patched jar.<\/p>"},{"title":"Plugins Update For Blojsom 3","link":"https:\/\/blog.cliffano.com\/2006\/12\/17\/plugins-update-for-blojsom-3\/","pubDate":"Sun, 17 Dec 2006 08:42:15 +0000","guid":"https:\/\/blog.cliffano.com\/2006\/12\/17\/plugins-update-for-blojsom-3\/","description":"<p><strong>Update:<\/strong> all plugins are now available for download from <a href=\"http:\/\/sourceforge.net\/project\/showfiles.php?group_id=72754&amp;package_id=154672&amp;release_id=480225\">Source Forge<\/a>.<\/p>\n<p>I&rsquo;ve finished updating most of my plugins to work with Blojsom 3, they&rsquo;re currently in testing on both this blog and <a href=\"http:\/\/mbledug.com\/melbourne\/\">Melbourne Photoblog<\/a>.<\/p>\n<p>If you want to try the SNAPSHOT versions on your Blojsom 3 installation, you can download them temporarily from my server (I&rsquo;ll add the released versions to SourceForge later on): <!-- raw HTML omitted --><a href=\"http:\/\/mbledug.com\/downloads\/projects\/blojsom\/blogtimesplugin-0.2-SNAPSHOT.jar\">blogtimesplugin-0.2-SNAPSHOT.jar<\/a><!-- raw HTML omitted -->, <!-- raw HTML omitted --><a href=\"http:\/\/mbledug.com\/downloads\/projects\/blojsom\/galleryrplugin-0.2-SNAPSHOT.jar\">galleryrplugin-0.2-SNAPSHOT.jar<\/a><!-- raw HTML omitted -->, <!-- raw HTML omitted --><a href=\"http:\/\/mbledug.com\/downloads\/projects\/blojsom\/gravatarplugin-0.2-SNAPSHOT.jar\">gravatarplugin-0.2-SNAPSHOT.jar<\/a><!-- raw HTML omitted -->, <!-- raw HTML omitted --><a href=\"http:\/\/mbledug.com\/downloads\/projects\/blojsom\/param2ctxplugin-0.2-SNAPSHOT.jar\">param2ctxplugin-0.2-SNAPSHOT.jar<\/a><!-- raw HTML omitted -->, <!-- raw HTML omitted --><a href=\"http:\/\/mbledug.com\/downloads\/projects\/blojsom\/scodeplugin-0.4-SNAPSHOT.jar\">scodeplugin-0.4-SNAPSHOT.jar<\/a><!-- raw HTML omitted -->, <!-- raw HTML omitted --><a href=\"http:\/\/mbledug.com\/downloads\/projects\/blojsom\/trackbackkeywordplugin-0.2-SNAPSHOT.jar\">trackbackkeywordplugin-0.2-SNAPSHOT.jar<\/a><!-- raw HTML omitted -->.<\/p>"},{"title":"MySQL Dump Export\/Import And Table Name Case Sensitivity","link":"https:\/\/blog.cliffano.com\/2006\/12\/09\/mysql-dump-exportimport-and-table-name-case-sensitivity\/","pubDate":"Sat, 09 Dec 2006 13:40:16 +0000","guid":"https:\/\/blog.cliffano.com\/2006\/12\/09\/mysql-dump-exportimport-and-table-name-case-sensitivity\/","description":"<p>Before Blojsom 3, I could get away with moving my blog content from my web host to my home environment (and vice versa) simply by moving the text files. Now that I&rsquo;m using MySQL for Blojsom 3, I figured that the easiest way is to use MySQL dump.<\/p>\n<p>Export to the dump file:\n<code>mysqldump -p -u [username] [dbname] &gt; [dumpfile].sql<\/code>\nImport from the dump file:\n<code>mysql -p -u [username] [dbname] &lt; [dumpfile].sql<\/code>\nThis might not be a good solution if you have a large amount of records, but that will do for me for now. It&rsquo;s also easy enough to delete the irrelevant bits from the dump file and only move the content you want.<\/p>"},{"title":"Wish Appears On The First Page Of Google Search For The Word 'wish'","link":"https:\/\/blog.cliffano.com\/2006\/09\/28\/wish-appears-on-the-first-page-of-google-search-for-the-word-wish\/","pubDate":"Thu, 28 Sep 2006 14:15:58 +0000","guid":"https:\/\/blog.cliffano.com\/2006\/09\/28\/wish-appears-on-the-first-page-of-google-search-for-the-word-wish\/","description":"<p>It was a nice surprise to find out that <a href=\"http:\/\/mbledug.com\/wish\">Wish<\/a> web site appears on the first page (ranked 8th) of <a href=\"http:\/\/www.google.com.au\/search?q=wish\">Google.com.au search result for the word &lsquo;wish&rsquo;<\/a>. Yes, that&rsquo;s right. &lsquo;wish&rsquo;, that&rsquo;s it, just the 4-letter word.<\/p>\n<p>And it&rsquo;s currently ranked 5th on <a href=\"http:\/\/www.google.com\/search?q=wish\">google.com<\/a>. Whoa! That&rsquo;s a superb result considering that the site does not have the word &lsquo;wish&rsquo; itself as part of the domain name (mbledug.com) or even a sub domain, and &lsquo;wish&rsquo; only appears as a context path in the full URL <a href=\"http:\/\/mbledug.com\/wish\">http:\/\/mbledug.com\/wish<\/a> . Plus it doesn&rsquo;t hurt to have other sites linking to Wish, like <a href=\"http:\/\/www.lifehacker.com\/software\/life-hacks\/clear-your-head-make-an-anonymous-wish-136080.php\">Lifehacker<\/a>.<\/p>"},{"title":"Blojsom, The Company?","link":"https:\/\/blog.cliffano.com\/2006\/08\/30\/blojsom-the-company\/","pubDate":"Wed, 30 Aug 2006 07:06:26 +0000","guid":"https:\/\/blog.cliffano.com\/2006\/08\/30\/blojsom-the-company\/","description":"<p><strong>Update<\/strong>: please welcome <a href=\"http:\/\/www.redcogllc.com\/\">Red Cog<\/a>. It&rsquo;s about time :).<\/p>\n<p>Note: the following is just a speculation. My predictions for <a href=\"http:\/\/fifaworldcup.yahoo.com\/06\/en\/\">World Cup 2006<\/a> were all wrong, so&hellip;<\/p>\n<p>David <a href=\"http:\/\/www.blojsom.com\/blog\/david\/moblog\/2006\/08\/29\/Business-Card\">posted a picture of a business card<\/a> with a large Blojsom logo. This is a follow up to his earlier <a href=\"http:\/\/www.blojsom.com\/blog\/david\/general\/2006\/08\/16\/Name-Title\">post on name title<\/a> with his usual &lsquo;cryptic&rsquo; style. Tracing way back, it got to be related to Blojsom as a <a href=\"http:\/\/www.blojsom.com\/blog\/david\/blojsom\/2006\/05\/25\/Registered\">registered trademark<\/a>, following yet <a href=\"http:\/\/www.blojsom.com\/blog\/david\/nerdery\/2006\/02\/28\/Published.html\">another cryptic hint<\/a>.<\/p>\n<p>I&rsquo;m guessing that he&rsquo;s setting up Blojsom, the company. And I predict that it is going to provide paid customer support for Blojsom. Which is good for the project\/product!<\/p>"},{"title":"Tagyu Service Has Been Shutdown, For Now","link":"https:\/\/blog.cliffano.com\/2006\/08\/17\/tagyu-service-has-been-shutdown-for-now\/","pubDate":"Thu, 17 Aug 2006 13:14:54 +0000","guid":"https:\/\/blog.cliffano.com\/2006\/08\/17\/tagyu-service-has-been-shutdown-for-now\/","description":"<p>Adam announced that <a href=\"http:\/\/kalsey.com\/2006\/08\/and_thanks_for_all_the_fish\">Tagyu has been shutdown for now<\/a> (as of 16 Aug 2006), citing the lack of room for growth as perhaps one of the causes.<\/p>\n<p>Hopefully Tagyu service will be back up someday. I guess people will just be using <a href=\"http:\/\/developer.yahoo.com\/search\/content\/V1\/termExtraction.html\">Yahoo! Term Extraction<\/a>.<\/p>\n<p><a href=\"http:\/\/widgets.yahoo.com\/gallery\/view.php?widget=39848\">Tagyu Widget<\/a> has been downloaded 773 times since 16 Jun 2006, and <a href=\"http:\/\/code.google.com\/p\/tagyu4j\/\">Tagyu4J<\/a> has been available since 31 Dec 2005.<\/p>"},{"title":"JSP Precompilation For Maven2 Project","link":"https:\/\/blog.cliffano.com\/2006\/08\/16\/jsp-precompilation-for-maven2-project\/","pubDate":"Wed, 16 Aug 2006 00:14:23 +0000","guid":"https:\/\/blog.cliffano.com\/2006\/08\/16\/jsp-precompilation-for-maven2-project\/","description":"<p>You can precompile JSP as part of your Maven2 project build by using Maven2 JSPC Plugin.<\/p>\n<p>Follow <a href=\"http:\/\/mojo.codehaus.org\/jspc-maven-plugin\/usage.html\">the usage guide<\/a> for copy-paste samples to add insert-fragment in web.xml file and jspc-maven-plugin + maven-war-plugin as part of build plugins in pom.xml file.<\/p>\n<p>Here are some problems that I encountered while adding JSP precompilation to <a href=\"http:\/\/code.google.com\/p\/wish-anonymous\/\">Wish<\/a>:<\/p>\n<p>Some of the JSPs use <a href=\"http:\/\/www.opensymphony.com\/sitemesh\/\">SiteMesh<\/a> taglib and since the application only needed it as part of the war package, I originally set the dependency scope to be runtime. This causes JSPC to complain because it needs the library in the classpath while compiling the JSPs.<\/p>"},{"title":"My Maven2 Cheat Sheet","link":"https:\/\/blog.cliffano.com\/2006\/07\/27\/my-maven2-cheat-sheet\/","pubDate":"Thu, 27 Jul 2006 01:53:55 +0000","guid":"https:\/\/blog.cliffano.com\/2006\/07\/27\/my-maven2-cheat-sheet\/","description":"<p>Here are some Maven2 command lines that I use most often:<\/p>\n<p>To create a new project:<\/p>\n<pre><code>mvn archetype:create -DgroupId=com.mbledug.foo -DartifactId=bar\n<\/code><\/pre>\n<p>To generate Eclipse project descriptor after configuring the dependencies in pom.xml:<\/p>\n<pre><code>mvn eclipse:eclipse\n<\/code><\/pre>\n<p>To run unit tests, obviously:<\/p>\n<pre><code>mvn test\n<\/code><\/pre>\n<p>Tun run a single test by test class name:<\/p>\n<pre><code>mvn test -Dtest=FooBar\n<\/code><\/pre>\n<p>To generate site documentation without running the tests (handy while updating the APTs):<\/p>\n<pre><code>mvn -Dmaven.test.skip=true clean site\n<\/code><\/pre>\n<p>To build the package file (jar, war, etc) allowing test failure:<\/p>"},{"title":"Introducing Tagyu Widget","link":"https:\/\/blog.cliffano.com\/2006\/06\/11\/introducing-tagyu-widget\/","pubDate":"Sun, 11 Jun 2006 07:38:54 +0000","guid":"https:\/\/blog.cliffano.com\/2006\/06\/11\/introducing-tagyu-widget\/","description":"<p><strong>Update2:<\/strong> Unfortunately <a href=\"http:\/\/kalsey.com\/2006\/08\/and_thanks_for_all_the_fish\">Tagyu service has been shutdown for now<\/a> (as of 16 August 2006).<\/p>\n<p><strong>Update<\/strong>: it is now <a href=\"http:\/\/widgets.yahoo.com\/gallery\/view.php?widget=39848\">available for download<\/a> at Yahoo! Widget Gallery.<\/p>\n<p>I gave <a href=\"http:\/\/widgets.yahoo.com\/\">Yahoo! Widget<\/a> a try by creating <a href=\"http:\/\/www.tagyu.com\/\">Tagyu<\/a> Widget.<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/tagyu_widget.jpg\" alt=\"\"><\/p>\n<p>Suggested category and tags for yahoo.com .<\/p>\n<p>Yahoo! Widget is simple and straightforward to use, and I think the most important bit is that it&rsquo;s <em>fun<\/em> to use! (can&rsquo;t say the same thing about <a href=\"http:\/\/java.sun.com\/products\/jfc\/\">Swing<\/a>). Anyone with knowledge of HTML\/XML and Javascript should be able to start creating widgets right away.<\/p>"},{"title":"Tagyu4J v0.3 and BlogMap4J v0.2 - More On Maven","link":"https:\/\/blog.cliffano.com\/2006\/06\/04\/tagyu4j-v03-and-blogmap4j-v02-more-on-maven\/","pubDate":"Sun, 04 Jun 2006 07:43:07 +0000","guid":"https:\/\/blog.cliffano.com\/2006\/06\/04\/tagyu4j-v03-and-blogmap4j-v02-more-on-maven\/","description":"<p>Tagyu4J v0.3 and BlogMap4J v0.2 have been released. Included in this release:<\/p>\n<ul>\n<li>\n<p>The use of Maven2. Spent some time on figuring out the equivalent of Maven1 goals in Maven2, e.g. distribution plugin in Maven1 is now assembly plugin in Maven2.<\/p>\n<\/li>\n<li>\n<p>Project sites (<a href=\"http:\/\/code.google.com\/p\/blogmap4j\/\">BlogMap4J<\/a>, <a href=\"http:\/\/code.google.com\/p\/tagyu4j\/\">Tagyu4J<\/a>) are now generated by Maven. It reminds me of the old days of using <a href=\"http:\/\/forrest.apache.org\/\">Forrest<\/a> 0.6 back in 2004.<\/p>\n<\/li>\n<li>\n<p>Lots of code refactoring, lots of &lsquo;Why did I do it that way?&rsquo; moments.<\/p>"},{"title":"Vintage Monitor Stand","link":"https:\/\/blog.cliffano.com\/2006\/04\/29\/vintage-monitor-stand\/","pubDate":"Sat, 29 Apr 2006 12:52:25 +0000","guid":"https:\/\/blog.cliffano.com\/2006\/04\/29\/vintage-monitor-stand\/","description":"<p>My vintage monitor stand.<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/desktop_stand.jpg\" alt=\"\"><\/p>\n<p>Classic web 0.1!<\/p>"},{"title":"Tagyu4J v0.2","link":"https:\/\/blog.cliffano.com\/2006\/03\/12\/tagyu4j-v02\/","pubDate":"Sun, 12 Mar 2006 00:54:00 +0000","guid":"https:\/\/blog.cliffano.com\/2006\/03\/12\/tagyu4j-v02\/","description":"<p><a href=\"http:\/\/code.google.com\/p\/tagyu4j\/\">Tagyu4J<\/a> v0.2 is now available. This release is to maintain compatibility with <a href=\"http:\/\/tagyu.com\/tools\/rest\/\">Tagyu REST web services<\/a> due to recent modifications on Tagyu&rsquo;s interfaces.<\/p>\n<p>Some notable changes: there&rsquo;s a new interface to get related tags, suggested tags response now provides category\/classification, and the response on both interfaces returns more tag information (name, relation, url).<\/p>"},{"title":"Trackback Keyword Plugin","link":"https:\/\/blog.cliffano.com\/2006\/03\/06\/trackback-keyword-plugin\/","pubDate":"Mon, 06 Mar 2006 16:20:14 +0000","guid":"https:\/\/blog.cliffano.com\/2006\/03\/06\/trackback-keyword-plugin\/","description":"<p>I&rsquo;ve just released <a href=\"http:\/\/wiki.blojsom.com\/wiki\/display\/blojsom\/Trackback+Keyword+Plugin\">Trackback Keyword Plugin<\/a>. It&rsquo;s a <a href=\"http:\/\/www.blojsom.com\/\">Blojsom<\/a> plugin that checks the content of trackback URL for the existence of at least one of the specified keywords which will determine whether the trackback is a spam or not. A trackback spam will then be deleted or moderated.<\/p>\n<p>I created this plugin because my blog started receiving some trackback spams from the usual poker-viagra-and-friends web sites. I know this plugin is not a perfect solution, specially compared to <a href=\"http:\/\/wiki.blojsom.com\/wiki\/display\/blojsom\/Akismet+Moderation+Plugin\">Akismet<\/a>. However, having another option for spam fighting is not a bad thing.<\/p>"},{"title":"Corrupted Jar On Local Maven Repository","link":"https:\/\/blog.cliffano.com\/2006\/02\/27\/corrupted-jar-on-local-maven-repository\/","pubDate":"Mon, 27 Feb 2006 15:29:10 +0000","guid":"https:\/\/blog.cliffano.com\/2006\/02\/27\/corrupted-jar-on-local-maven-repository\/","description":"<p><div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-text\" data-lang=\"text\"><span style=\"display:flex;\"><span>test:test:\n<\/span><\/span><span style=\"display:flex;\"><span>[junit] Running\n<\/span><\/span><span style=\"display:flex;\"><span>foo.bar.BlahTestCase java.util.zip.ZipException: error in opening zip file\n<\/span><\/span><span style=\"display:flex;\"><span>at java.util.zip.ZipFile.open(Native Method)\n<\/span><\/span><span style=\"display:flex;\"><span>at java.util.zip.ZipFile.&amp;lt;init&amp;gt;(ZipFile.java:111)\n<\/span><\/span><span style=\"display:flex;\"><span>at java.util.zip.ZipFile.&amp;lt;init&amp;gt;(ZipFile.java:127)\n<\/span><\/span><span style=\"display:flex;\"><span>at org.apache.tools.ant.AntClassLoader.getResourceURL(AntClassLoader.java:870)\n<\/span><\/span><span style=\"display:flex;\"><span>at org.apache.tools.ant.AntClassLoader.getResource(AntClassLoader.java:799)<\/span><\/span><\/code><\/pre><\/div>\nAfter staring blankly on why the test failed with Maven but it was ok as a stand-alone, I remembered that I had this problem before. It was caused by corrupted jar on my local maven repository. The solution was to simply destroy the repository and rebuild it.<\/p>"},{"title":"Social Bookmark Buttons For Blojsom","link":"https:\/\/blog.cliffano.com\/2006\/02\/25\/social-bookmark-buttons-for-blojsom\/","pubDate":"Sat, 25 Feb 2006 11:09:11 +0000","guid":"https:\/\/blog.cliffano.com\/2006\/02\/25\/social-bookmark-buttons-for-blojsom\/","description":"<p><strong>Update<\/strong>: this information is now available on Blojsom wiki&rsquo;s <a href=\"http:\/\/wiki.blojsom.com\/wiki\/display\/blojsom\/Social+Bookmark+Buttons\">Social Bookmark Buttons<\/a> page.<\/p>\n<p>You can add various social bookmark (<a href=\"http:\/\/www.blinklist.com\/\">BlinkList<\/a>, <a href=\"http:\/\/del.icio.us\/\">del.icio.us<\/a>, <a href=\"http:\/\/digg.com\/\">Digg<\/a>, <a href=\"http:\/\/www.fark.com\/\">Fark<\/a>, <a href=\"http:\/\/www.furl.net\/\">Furl<\/a>, <a href=\"http:\/\/www.newsvine.com\/\">Newsvine<\/a>, <a href=\"http:\/\/www.reddit.com\/\">Reddit<\/a>, <a href=\"http:\/\/www.simpy.com\/\">Simpy<\/a>, <a href=\"http:\/\/www.spurl.net\/\">Spurl<\/a>, <a href=\"http:\/\/myweb2.search.yahoo.com\/\">Yahoo! MyWeb<\/a>) buttons to your <a href=\"http:\/\/www.blojsom.com\/\">Blojsom<\/a> blog like this:<\/p>\n<p><img src=\"https:\/\/blog.cliffano.com\/images\/o\/bookmark_buttons.jpg\" alt=\"\"><\/p>\n<p>Download the <a href=\"http:\/\/mbledug.com\/downloads\/projects\/blojsom\/socialbookmark-icons.zip\">icons<\/a> and unzip them under your Blojsom resources\/[blog-id]\/ directory. Copy paste the following code snippet to your blog entries template:\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-php\" data-lang=\"php\"><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#set($blinklist  = [&#34;BlinkList&#34;, &#34;blinklist.gif&#34;, &#34;http:\/\/www.blinklist.com\/index.php?Action=Blink\/addblink.php&amp;amp;Description=&amp;amp;Url=$permalink&amp;amp;Title=$entry.getTitle()&#34;])\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#set($delicious  = [&#34;del.icio.us&#34;, &#34;delicious.gif&#34;, &#34;http:\/\/del.icio.us\/post?url=$permalink&amp;amp;title=$entry.getTitle()&#34;])\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#set($digg       = [&#34;digg&#34;, &#34;digg.gif&#34;, &#34;http:\/\/digg.com\/submit?phase=2&amp;amp;url=$permalink&#34;])\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#set($fark       = [&#34;Fark&#34;, &#34;fark.gif&#34;, &#34;http:\/\/cgi.fark.com\/cgi\/fark\/edit.pl?new_url=$permalink&amp;amp;new_comment=$entry.getTitle()&amp;amp;new_link_other=&amp;amp;linktype=Misc&#34;])\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#set($furl       = [&#34;Furl&#34;, &#34;furl.gif&#34;, &#34;http:\/\/www.furl.net\/storeIt.jsp?t=$entry.getTitle()&amp;amp;u=$permalink&#34;])\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#set($newsvine   = [&#34;Newsvine&#34;, &#34;newsvine.gif&#34;, &#34;http:\/\/www.newsvine.com\/_tools\/seed&amp;amp;save?u=$permalink&amp;amp;h=$entry.getTitle()&#34;])\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#set($reddit     = [&#34;reddit&#34;, &#34;reddit.gif&#34;, &#34;http:\/\/reddit.com\/submit?url=$permalink&amp;amp;title=$entry.getTitle()&#34;])\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#set($simpy      = [&#34;Simpy&#34;, &#34;simpy.png&#34;, &#34;http:\/\/www.simpy.com\/simpy\/LinkAdd.do?href=$permalink&amp;amp;title=$entry.getTitle()&#34;])\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#set($spurl      = [&#34;Spurl&#34;, &#34;spurl.gif&#34;, &#34;http:\/\/www.spurl.net\/spurl.php?title=$entry.getTitle()&amp;amp;url=$permalink&#34;])\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#set($yahoomyweb = [&#34;Yahoo! MyWeb&#34;, &#34;yahoomyweb.gif&#34;, &#34;http:\/\/myweb2.search.yahoo.com\/myresults\/bookmarklet?t=$entry.getTitle()&amp;amp;u=$permalink&#34;])\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#set($links = [$blinklist, $delicious, $digg, $fark, $furl, $newsvine, $reddit, $simpy, $spurl, $yahoomyweb])\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\"><\/span><span style=\"color:#f92672\">&lt;<\/span><span style=\"color:#a6e22e\">div<\/span><span style=\"color:#f92672\">&gt;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#foreach ($link in $links)\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\"><\/span>  <span style=\"color:#f92672\">&lt;<\/span><span style=\"color:#a6e22e\">a<\/span> <span style=\"color:#a6e22e\">href<\/span><span style=\"color:#f92672\">=<\/span><span style=\"color:#e6db74\">&#34;<\/span><span style=\"color:#e6db74\">$link<\/span><span style=\"color:#e6db74\">.get(2)&#34;<\/span> <span style=\"color:#a6e22e\">style<\/span><span style=\"color:#f92672\">=<\/span><span style=\"color:#e6db74\">&#34;border: 0;&#34;<\/span><span style=\"color:#f92672\">&gt;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>    <span style=\"color:#f92672\">&lt;<\/span><span style=\"color:#a6e22e\">img<\/span> <span style=\"color:#a6e22e\">src<\/span><span style=\"color:#f92672\">=<\/span><span style=\"color:#e6db74\">&#34;#Resource(&#34;<\/span><span style=\"color:#a6e22e\">icons<\/span><span style=\"color:#f92672\">\/<\/span>$link<span style=\"color:#f92672\">.<\/span><span style=\"color:#a6e22e\">get<\/span>(<span style=\"color:#ae81ff\">1<\/span>)<span style=\"color:#e6db74\">&#34;)&#34;<\/span> <span style=\"color:#a6e22e\">style<\/span><span style=\"color:#f92672\">=<\/span><span style=\"color:#e6db74\">&#34;border: 0;&#34;<\/span> <span style=\"color:#a6e22e\">height<\/span><span style=\"color:#f92672\">=<\/span><span style=\"color:#e6db74\">&#34;16&#34;<\/span> <span style=\"color:#a6e22e\">width<\/span><span style=\"color:#f92672\">=<\/span><span style=\"color:#e6db74\">&#34;16&#34;<\/span> <span style=\"color:#a6e22e\">alt<\/span><span style=\"color:#f92672\">=<\/span><span style=\"color:#e6db74\">&#34;<\/span><span style=\"color:#e6db74\">$link<\/span><span style=\"color:#e6db74\">.get(0)&#34;<\/span><span style=\"color:#f92672\">\/&gt;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>  <span style=\"color:#f92672\">&lt;\/<\/span><span style=\"color:#a6e22e\">a<\/span><span style=\"color:#f92672\">&gt;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#end\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\"><\/span><span style=\"color:#f92672\">&lt;\/<\/span><span style=\"color:#a6e22e\">div<\/span><span style=\"color:#f92672\">&gt;<\/span><\/span><\/span><\/code><\/pre><\/div>\nFor a demo, check out <a href=\"http:\/\/mbledug.com\/melbourne\">Melbourne<\/a>. Please do not hotlink the icons :).<\/p>"},{"title":"SCode On Headless Hosting And Resin Plus OS X","link":"https:\/\/blog.cliffano.com\/2006\/01\/31\/scode-on-headless-hosting-and-resin-plus-os-x\/","pubDate":"Tue, 31 Jan 2006 07:45:21 +0000","guid":"https:\/\/blog.cliffano.com\/2006\/01\/31\/scode-on-headless-hosting-and-resin-plus-os-x\/","description":"<p>Tim wrote about his adventure setting up <a href=\"http:\/\/wiki.blojsom.com\/wiki\/display\/blojsom\/SCode+Plugin\">SCode Plugin<\/a> on a headless hosting: <a href=\"http:\/\/www.anothercaffeniatedday.com\/blog\/default\/2006\/01\/29\/blojsom-anti-splog-and-captcha.html\">blojsom, anti-splog, and captcha<\/a>; while Miles wrote about using the plugin on Resin and OS X: <a href=\"http:\/\/blogs.rave.ac.uk\/blojsom\/blog\/mmetcalfe\/work\/2006\/01\/13\/Resin-OS-X-wrappers-and-image-generating-servlets.html\">Resin, OS X, wrappers and image-generating servlets<\/a>, <a href=\"http:\/\/blogs.rave.ac.uk\/blojsom\/blog\/mmetcalfe\/work\/2006\/01\/05\/SCode-plugin-clarification.html\">SCode plugin clarification<\/a>, <a href=\"http:\/\/blogs.rave.ac.uk\/blojsom\/blog\/mmetcalfe\/work\/2006\/01\/01\/More-SCode-servlet.html\">More SCode servlet<\/a>, <a href=\"http:\/\/blogs.rave.ac.uk\/blojsom\/blog\/mmetcalfe\/work\/2005\/12\/19\/SCode-servlet.html\">SCode servlet<\/a>.<\/p>\n<p>Those issues are basically related to image generation in general and not just with SCode Plugin. However, the fact that various people are using the plugin on various different environments is a definite good thing for the plugin documentation.<\/p>"},{"title":"When \"JIRA\" Replaced The Word \"Issue\"","link":"https:\/\/blog.cliffano.com\/2006\/01\/28\/when-jira-replaced-the-word-issue\/","pubDate":"Sat, 28 Jan 2006 11:38:25 +0000","guid":"https:\/\/blog.cliffano.com\/2006\/01\/28\/when-jira-replaced-the-word-issue\/","description":"<p>Quotes from me and some former colleagues after a few years using <a href=\"http:\/\/www.atlassian.com\/software\/jira\/\">JIRA<\/a>:<\/p>\n<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->\n<p>Without noticing, we started refering issues as JIRAs. Just like saying &ldquo;I&rsquo;ll google it&rdquo; when I want to say &ldquo;I&rsquo;ll use a search engine to find some info about it&rdquo;. JIRA might be going through the same phase of greatness.<\/p>"},{"title":"Der Wunsch","link":"https:\/\/blog.cliffano.com\/2006\/01\/24\/der-wunsch\/","pubDate":"Tue, 24 Jan 2006 07:29:27 +0000","guid":"https:\/\/blog.cliffano.com\/2006\/01\/24\/der-wunsch\/","description":"<p>About a week ago, Claus Morell contacted me about his plan to implement a German version of <a href=\"http:\/\/mbledug.com\/wish\">Wish<\/a>. Lo and behold, it&rsquo;s now live at <a href=\"http:\/\/www.derwunsch.de\/\">www.derwunsch.de<\/a>. It also has <a href=\"http:\/\/www.derwunsch.de\/rss.php\">an RSS feed<\/a>. Good stuff, Claus!<\/p>\n<p>Language support has been an interesting issue with Wish. When the web site started receiving some submissions in Italian, Portuguesse, and some other languages I couldn&rsquo;t recognize, I thought about having multiple language sections a la <a href=\"http:\/\/wikipedia.org\/\">Wikipedia<\/a>. I didn&rsquo;t go ahead with that because I knew I wouldn&rsquo;t have enough time to implement and maintain it.<\/p>"},{"title":"SCode Plugin v0.3","link":"https:\/\/blog.cliffano.com\/2006\/01\/22\/scode-plugin-v03\/","pubDate":"Sun, 22 Jan 2006 06:27:31 +0000","guid":"https:\/\/blog.cliffano.com\/2006\/01\/22\/scode-plugin-v03\/","description":"<p><a href=\"http:\/\/wiki.blojsom.com\/wiki\/display\/blojsom\/SCode+Plugin\">SCode Plugin<\/a> v0.3 has been released. If the jar and src files are not yet available from <a href=\"http:\/\/sourceforge.net\/project\/showfiles.php?group_id=72754&amp;package_id=154672&amp;release_id=333616\">blojsom plugins download page<\/a>, then email me and I&rsquo;ll send them to you.<\/p>\n<p>In order to upgrade, simply replace scodeplugin-[prev_version].jar with scodeplugin-0.3.jar .<\/p>"},{"title":"Blojsom Plugins Documentation: Moved To Blojsom Wiki","link":"https:\/\/blog.cliffano.com\/2006\/01\/22\/blojsom-plugins-documentation-moved-to-blojsom-wiki\/","pubDate":"Sun, 22 Jan 2006 05:02:16 +0000","guid":"https:\/\/blog.cliffano.com\/2006\/01\/22\/blojsom-plugins-documentation-moved-to-blojsom-wiki\/","description":"<p><a href=\"http:\/\/blojsom.com\/blog\/\">David<\/a> offered me to use Blojsom wiki, so I&rsquo;ve (yet again) moved my Blojsom plugins documentation there. Check out the <a href=\"http:\/\/wiki.blojsom.com\/wiki\/display\/blojsom\/Available+Plugins\">available plugins<\/a> page.<\/p>\n<p>Blojsom uses <a href=\"http:\/\/www.atlassian.com\/software\/confluence\/\">Confluence<\/a> for its wiki. If you have used <a href=\"http:\/\/www.atlassian.com\/software\/jira\/\">JIRA<\/a>, you&rsquo;ll know the sort of excellence that you would&rsquo;ve expected from an <a href=\"http:\/\/www.atlassian.com\/\">Atlassian<\/a> product.<\/p>\n<p>The only gripe I had was with its embedded rich text editor which uses <a href=\"http:\/\/tinymce.moxiecode.com\/\">TinyMCE<\/a>. I&rsquo;m using <a href=\"http:\/\/www.mozilla.com\/firefox\/\">Firefox<\/a> 1.5 and this rich text editor kept on replacing &ldquo;src&rdquo; with &ldquo;xsrc&rdquo; on my code snippets. It&rsquo;s a problem because users like to copy paste sample codes. At the end I just set Wiki Markup as my default edit view.<\/p>"},{"title":"Tagyu4J: Tagyu Java API","link":"https:\/\/blog.cliffano.com\/2006\/01\/01\/tagyu4j-tagyu-java-api\/","pubDate":"Sun, 01 Jan 2006 05:58:05 +0000","guid":"https:\/\/blog.cliffano.com\/2006\/01\/01\/tagyu4j-tagyu-java-api\/","description":"<p><a href=\"http:\/\/code.google.com\/p\/tagyu4j\/\">Tagyu4J<\/a> v0.1 has been released. <a href=\"http:\/\/www.tagyu.com\/\">Tagyu<\/a> provides tag suggestions for a given text or URL, and Tagyu4J is a Java API used for interacting with <a href=\"http:\/\/tagyu.com\/tools\/rest\/\">Tagyu REST web services interface<\/a><\/p>\n<p>I initially misunderstood its authentication mechanism by assuming that it prompts authentication challenges. It turned out that Tagyu checks the authentication header on every request. Wikipedia has the details of HTTP <a href=\"http:\/\/en.wikipedia.org\/wiki\/Basic_authentication_scheme\">Basic Authentication Scheme<\/a>.<\/p>"}]}}