During Little Godzilla’s term 3 school holidays back in October 2024, he joined a 2-day camp where the kids learnt “coding”. I later figured out they they learnt to program an Edison using EdScratch . 
 He wasn’t initially enthusiastic about this coding camp because he wanted to do an animation camp instead but the schedule didn’t work out for us. So I…
First post since 2018! 
 This long hiatus has been unplanned since the last blog post . This is the result of raising a young child, combined with busier-than-ever work, topped off with COVID-19 . 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… we made it through…

 OpenAPI Generator The Babel Fish of The API World (Paris) - slides | video apidays Live Paris 2021 
 OpenAPI Generator The Babel Fish of The API World (Australia) - slides | video apidays Live Australia 2021 
 A Journey To Improve Infrastructure Compliance With InSpec - slides | video ChefConf ‘21 Online 
 Swagger AEM - An OpenAPI Specification for AEM - slides | video…
Wayyy back in May 2018, I presented a talk at Adobe Experience Cloud Meetup - 5th Edition titled AEM OpenCloud . 
 AEM OpenCloud is an open source cloud platform for running Adobe Experience Manager environments on Amazon Web Services . This provides the bells and whistles in terms of auto recovery, failover, blue green deployment, repository migration, back up management, content health…
Back in June 2018 (I should really really really work on my blogging), I presented a talk at Adobe Immerse ‘18 titled Beyond AEM Curl Commands . This is basically the culmination of my effort in tackling the widespread (mis)use of cURL commands for provisioning Adobe Experience Manager environments, and the lack of official AEM web API. 
 This event was promoted as “The global…
Back in November 2017 (I should really work on my blogging), I presented a talk titled How To Play Music On A Vacuum Cleaner at ANZ Technology Unconference 2017 . 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. 
 
 Lo and behold,…
I hastily wrote Feedpaper in 2011 (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. 
 Lo and behold, it is still up and running in 2017, and it still is the fastest way for me to consume…
I was in San Francisco this week for Jenkins World 2017 where I also gave a talk titled Bringing Jenkins Remote Access API To The Masses . 
 
 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…
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: failed to allocate memory , but there was no stack trace to be found. Great…
My dad is visiting Melbourne and he brought his 1987 copy of Hideaki Chijiiwa’s Color Harmony - A guide to creative color combinations for me to keep. This is one of the many books from his home office’s library in Jakarta which I flipped through far too many times during my childhood. 
 
 This colour combinations knowledge helped me with my first few gigs as a front end…
With the same squad as AWS Chatbot Hackathon , I also participated in another hackathon as part of Adobe Marketing Cloud Community Expo (AMCCE) . 
 We presented Swagger AEM , an ecosystem of AEM API clients that Shine Solutions 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,…
Last month me and two buddies from work, Michael Diender and Stephen Shim, participated in AWS Serverless Chatbot Hackathon hosted by Devpost. This hackathon was announced by Jeff Barr on AWS Blog on August 10th this year. 
 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: Chaos…
Due to lack of coding time outside of work hours, I’ve handed some projects over to these intrepid volunteers: 
 
 Repoman is now maintained by Bastian Krol 
 SiteMonitor Plugin is now maintained by Francisco Hernández Suárez 
 
 Some other Jenkins plugins had organically been inherited by the community: 
 
 ChuckNorris Plugin with Baptiste Mathus 
 NodeJS…
As awesome as those AMIs from AWS Marketplace are, it’s often not possible to use most of them AS-IS at various organisations due to policies that enforce: 
 
 Mandated operating system with specific distro and version 
 Blacklisted operating system packages for security reasons 
 Whitelisted versions of various tech stacks, tools, libraries, etc 
 
 I’ve never…
Now that the fine folks at Ninja Blocks already started shipping their next generation IoT controller, the Ninja Sphere, I better write about my old school Ninja Blocks setup before it gets too late. 
 First off is the Watts Clever socket that I used with Ninja rules to switch a table lamp on at 8.30pm and then switch it off at 10.30pm during weekdays. 
 
 The second socket is used to…
If you ever had the experience (no pun) of using Adobe Experience Manager (AEM), you would already know that curl commands are arguably the de facto way of interacting with AEM over http. 
 Whenever you google for various AEM /CQ HOWTOs, it’s easy to find examples with curl commands: 
 
 
 Adobe CQ- Is it possible to execute CURL command? 
 
 
 How to create pages…
One problem I’ve had with Ansible playbook since its early 0.x days is with its verbose log output. Jsonified by default, it’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. 
 Here’s how it looks like: 
 
 changed: [ gennou.local ] => { 'changed' : true , 'cmd'…
A few weeks ago I participated in Node Knockout 2013 (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). 
 And here’s a video of what I hacked: Roombox , a Roomba vacuum cleaner turned into a boombox using node.js . This demo shows the Roomba playing Rocky theme, Beverly Hills…
About a month ago, I joined D-Shaw, Nizar Khalife, Erik Isaksen, and Matt Creager on NodeUp 53 where we discussed about NodeUp podcast and node.js community from NodeUp listeners point of view, and I also talked a bit about Australia, kangaroos, and node . Thanks to Rodd Vagg for pinging me about this particular episode. 
 Recording the show itself was an interesting experience :). For one, it…
This was another quick weekend hack to fix my old dryer’s busted timer problem (busted timer = having to stay around when it’s time to switch off the dryer). 
 
 Step one was to use Watts Clever Easy-off Remote Control Socket 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…
Here’s how I’ve been monitoring my Jenkins setup… 
 
 A combination of Nestor + watch + Terminator » 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. 
 If you want to set up something similar, here are the…
I released DataGen 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’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 Rod Vagg ’s worker-farm module. 
 Why is this necessary? 
 The problem with previous…
Sometimes I get the feeling that people think database sharding is like flipping a switch. 
 
 In reality, I think it’s more like tuning a set of dials.
About half a year ago our team started working on a project with micro-service architecture , 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…
I attended CITCON 2013 in Sydney last February. This year’s sessions covered more non-technical issues compared to CITCON 2010 . 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. 
 Those were some of the problems that I’ve been…
Q: _How do you clone 30 repositories from your personal GitHub accounts and 150 repositories from your organisation GitHub accounts in just one line?
_
 A: repoman --github-user myuser1,myuser2 --github-org myorg1,myorg2 config && repoman init 
 Q: _How do you execute a set of commands against all repositories in just one line?
_
 A: repoman exec 'git stash && git pull --rebase…
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. 
 
 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…
Here’s a video of my latest quick weekend hack, using voice to switch a lamp on and off: 
 
 
 

 Ok, so it’s actually a combination of Watts Clever + Ninja Blocks + Node.js + Automator + Speakable Items . Speakable Items takes the voice commands via MacBook’s internal microphone, then calls the Automator applications, which then runs a Node.js script (which…
Nestor v0.1.2 is out and one of its new features is nestor ninja for monitoring Jenkins and displaying the latest build status on Ninja Blocks RGB LED device (if you have a block, it’s the ninja’s eyes). 
 Here’s a usage example:
 export JENKINS_URL=<url> export NINJABLOCKS_TOKEN=<token_from_https://a.ninja.is/hacking> nestor ninja 
 Red for build failure, green for…
For the past few weeks, I’ve been reading Made In Japan , a story about Akio Morita ’s life and the first three decades since the founding of Sony Corporation. 
 I haven’t finished this book, but the last chapter titled ‘On Management’ was very interesting and it struck a chord with me. I’ve seen enough management decisions that were short sighted and proven…
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’s the replicator document that I ended up using: 
 {
 '_id' : 'registry' ,
 'source' : 'http://isaacs.iriscouch.com/registry/' ,
 'target' : 'registry' ,
 'user_ctx' : {
 'name' :…
This favourite corner of mine in the living room is the latest revision of my home studio.
My main computer for the past couple of years has been an 11" MacBook Air, codename: kakashi . 
 
 The study desk had been disassembled and now rests in the garage.
A few months ago my awesome Roomba vacuum cleaner started dancing instead of cleaning the carpet like it’s supposed to. It reversed, then rotated to the right, left, right, left, all the time. I call it ‘doing the Twist’ (Chubby Checker’s). 
 The closest explanation I could find on the Internet regarding this problem was something that’s commonly known as Roomba…
Today I made my 100th micro loan on Kiva.org . I joined Kiva in July 2007 and today I have $275 across 15 active loans, so I’m one of those people with a minimal fund who re-loan as soon as there’s enough repayment. 
 Here are some stats from my portfolio: 
 
 The interesting numbers here are the 1.62% delinquency rate and 0.68% default rate. Yep , default happens in…
We had a hack day at Sensis a couple of days ago where I ended up writing Sapi , a Node.js client for Sensis API . This module is now available on NPM . 
 The latest version (v0.0.5) was tested against Sensis API open beta version ob-20110511. I think I’ve got all of its documented features covered. Let me know if I missed anything. 
 Sapi module provides a chainable interface to…
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. 
 I quickly came up with a script that loops through N times, generates dummy data, and creates an XML…
Let me guess what you’re going to say in 3… 2… 1… 
 **WTF??? Why would anyone want to do that?** 
 Right? 
 Some of us don’t have the luxury of a local NPM repository , while some others have their delivery pipeline tightly integrated to an Ivy repository . 
 So, for those few who are stuck with the unholy union of Node.js and Apache Ivy, you can…
Look what I found at my dad’s home office in Jakarta? 
 
 Apple Facts 8.95 - a concise guide to Apple products offered worldwide. 
 
 I didn’t know Apple used to have gazillion of products. Apple printers? 
 
 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…
I’m a fan of NodeUp , a podcast of all things Node.js-related, and a great source of thoughts/opinions from the who’s who in Node.js community. 
 Putting the serious stuff aside, the show has a running joke where the hosts put on their best effort to prop up Bislr , one of the show’s sponsors, by saying hilarious things about Australia. And it actually worked, us Australians…
I went to Canberra this week to attend Open Source Developers Conference 2011 and also to give a talk titled Continuous Delivery Using Jenkins . OSDC ran for 3 days, and was held at Australian National University. 
 
 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…
I was watching I, Robot the other day, and thought how great it would be to use voice to control Jenkins. 
 So last night I did a quick read , and then recorded this video.
This used Mac Speech Recognition, so in theory I talked to my Mac, which then opened Jenkins pages on Firefox. Here are the commands: 
 
 
 ‘Open Jenkins’: opens Jenkins home page (dashboard)…
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 Jenkins BuildMonitor and Jenkins web interface useless most of the time. So I looked for an alternative and gave Jenkins CLI a go. 
 Like most Java applications, Jenkins built-in CLI also suffers from slow start up…
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. 
 
 
 
 The above pictures were taken at the garage of my parents’ house back in Jakarta, Indonesia,…
I gave two Node.js-related talks within the past week. 
 The first one was titled “From Java To Node.js”, at Shine Technologies ’ developers meeting on August 5th, 2011. 
 
 

 The second one was titled “JavaScript Everywhere From Nose To Tail”, at Melbourne JavaScript usergroup on August 10th, 2011, with Carl Husselbee from Sensis . 
 
…
I’ve just added a new feature to Nestor to discover Jenkins on the network, and as it turned out, it’s pretty simple to do thanks to Node.js Datagram sockets API (hat tip Paul Querna ). 
 Jenkins has a discovery feature as part of its remote access API where it listens on UDP port 33848, and whenever it receives a message, Jenkins will respond with an XML containing the…
I still have 80 pages to go on Skunk Works , but this book has been one of the best I’ve ever read. 
 The story revolves around an elite group within Lockheed Martin 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 Ben Rich , Skunk Works second director, and central to the story was…