Technology, Strategy

‘Time to Value’ should be the new ‘Time to Market’


It’s fascinating how the software industry has built and leveraged technologies that could deliver software products of good quality at amazing speed.

The key technologies (in my opinion) that enables such speed are:

Cloud – Fast and Reliable distribution channel for software.

Microservices – Smaller units of software that can be developed and deployed independently and ‘quickly’  by two-pizza teams

Containers (e.g. Docker) – Making sure that the software (primarily microservices) have a reliable and consistent environment to execute.

Software vendors should now focus on how fast their customers can start extracting actual value from software instead of how fast they can get their software products to market.

Time to Value should be the new Time to Market!

Management, Technology, Strategy

The biggest challenge for “traditional” software vendors moving to a SaaS model is not technical

Image Credit:

Cloud Computing is probably the longest surviving buzzword in the IT industry for the past decade or more. From a software buyer’s point of view the important decision of going for a “Cloud Solution”  is based on economics, more specifically the CapEx vs. OpEx trade-off. The pay-as-you-go nature of cloud computing is perhaps the most important economic feature for customers.

Cloud computing has three well known service models  IaaS, Paas and SaaS. Out of these, Software as-a Service (SaaS) is perhaps the most convenient model of acquiring IT for operating a business.  The huge success of enterprise SaaS vendors such as Salesforce and more recently Workday is evidence that many enterprise customers are moving towards SaaS for software “procurement”.

These new kids on the block have prompted the “brick and mortar” software vendors that follow the old model of building software, burning it on a CD and shipping it to their customers for on-premise installation to follow suit. These vendors are now making their software more architecturally and technically cloud friendly. What this usually means is that the software is now runnable on cloud infrastructure (IaaS) like Amazon AWS or Microsoft Azure.

Now building software that is more cloud friendly is one thing, but actually moving towards a true pay-as-you-go SaaS delivery model is a whole new ballgame for the traditional vendors.

I think the biggest challenge for existing non-SaaS vendors is not technical but its rather about overhauling their business/financial model. When moving to SaaS, the customers who used to pay all the license fees upfront will now be using a subscription payment model. This means the financials (such as cash flow) of the company need to be looked at from a different angle. It may also affect how sales and marketing approach their roles since customer LTV (Life Time Value) is now a bigger concern.

Possible ways to overcome this challenge would be to partner with (or even merge/acquire) another cloud company and piggyback on their business model for SaaS delivery. But when choosing a cloud partner it would probably be a good thing to avoid another SaaS provider and instead select an IaaS or PaaS provider to avoid market share erosion due to conflicting products.

Another way to address this challenge would be to setup a separate business unit for the cloud SaaS business. This would enable all new customers to be directly part of the SaaS business unit while existing customers are gradually migrated.

General, Subversion, Technology, Version Control Systems

Subversion Revert with Externals

Disclaimer: I know Git rocks, but people still use Subversion 🙂 !

Let’s say you have a Subversion checkout containing externals. Now you’ve made changes in many places within the folder structure and you want to get back to the original clean state.

So your typical approach would be to go to the top directory of the working copy and do a recursive revert using:

svn revert -R .

But unfortunately nothing happens! The reason is that the working copy is made up of sub folders containing externals and in order to revert them you need to go into each sub directory and then issue the svn revert command. This can be cumbersome if you have a working copy containing many subfolders corresponding to externals.

Well the solution is pretty simple if you have a bash shell (Windows users will require Cygwin or something similar)

for d in ./*/ ; do (cd "$d" && svn revert -R .); done

This little bash script will change (cd) into all sub folders using a loop and execute an svn revert within each ‘external’ folder recursively.

The solution was inspired by this thread on StackExchange.

Cloud, DevOps, General, Technology

How To Move your large VirtualBox VM disk created by Docker

So you’ve been using Docker Tool Box (DTB) on Windows and the ‘default’ docker host created by docker-machine is growing alarmingly large on your limited C: drive.

The super large disk.vmdk file for the “default” VM created by DTB is usually located at C:\Users\[username]\.docker\machine\machines\default

Now you want to move the existing disk.vmdk file to your much larger D: drive without having to recreate a docker machine/host from scratch and pulling all images on to it again.

The important thing to note here is that the vmdisk is an implementation detail of VirtualBox (VBox) not Docker. docker-machine just uses VBox as a provider to create a Docker host.

Therefore if you need to move the VM disk file to another location you should change VBox configuration for the VM instead of changing any Docker machine configurations (or using any docker commands)

So here  are the steps you need to follow.

1. Stop the running docker machine (i.e. VBox VM) like so:

                   docker-machine stop  

Note: This will effectively power off the VBox VM, named ‘default’. You can check this by opening the VBox GUI.


2. Copy the disk.vmdk file from C:\Users\[username]\.docker\machine\machines\default to a suitable folder in your bigger D: drive. I created D:\docker-machines\default for this.

Now the interesting part 🙂 We need to tell VBox about the new location of the disk.vmdk file.

3. The default.vbox file located at C:\Users\[username]\.docker\machine\machines\default\default  specifies the path to the vmdk file. This vbox file is an XML file, so just open it up in any editor and set the Machine/MediaRegistry/HardDisks/HardDisk/location attribute to the new location on your D: drive.


Note: Don’t worry about the “DO NOT EDIT THIS FILE..” statement on top since you have already stopped the VM, the file will not be overwritten. And I found this method easier than using the GUI 🙂

4. Now power up the docker machine using:

                docker-machine start

If the ‘default’ machine start without any problem then you are good to go!

Now check if all your images are still available using:

docker images

5.  You can verify that the vmdk file on D: is being used by firing up VBox and selecting the “default” VM and clicking on Settings/Storage/disk.vmdk as shown below.


6. Now you are done! Just go ahead and delete the huge disk.vmdk from your C: drive located at  C:\Users\[username]\.docker\machine\machines\default

General, Technology, Uncategorized

Post Notifications plugin tip for WordPress

If you use the Post Notification plugin in your hosted WordPress (WP) blog you will notice that it maintains a separate MySQL table called post_notification_emails for users who subscribe for email alerts about new blog posts.

But unfortunately there is no easy, configurable way to automatically subscribe a user for post notifications when he or she registers a new account in the blog.

Remember, when a new user registers he has to provide his email address which is stored in the core WP users table which has no link with the post_notification_emails table.

A simple solution for this is to create a MySQL trigger in your WP database like so;

CREATE TRIGGER `subscribe_user_for_notifications`
INSERT INTO post_notification_emails (email_addr, last_modified, date_subscribed, gets_mail) VALUES (NEW.user_email, now(),now(),1 );
INSERT INTO post_notification_cats (id,cat_id) VALUES (, 0);
END $$


  • I used the phpMyAdmin tool to execute commands on the MySQL database. This comes with the WAMP installation which is used to host the blog.
  • The table names mentioned above may have table prefixes if you provided them during the WP setup. (e.g. travelblog_post_notification_mails)

Although I’m sure there are other ways of doing this like hacking the PHP code in the Post Notification plugin (which by the way is no longer maintained) to query the users database for emails in additions to the post_notification_emails for now I prefer this backend DB solution 🙂

Management, Technology, Web Development

Stanford’s Startup Engineering is pretty cool

Recently I took a  MOOC offered by Stanford through Coursera called “Startup Engineering“. I had a lot of expectations about this since Stanford was perhaps a major reason for Silicon Valley to be the hotbed of tech startups and innovation.  Having followed the course for 10 weeks I can say that my expectations were met.  Although I missed a few “soft deadlines” in submitting assignments and homework I was able to get all the assignments done before the “hard deadlines” 🙂

But for me, the learning gained was more rewarding than actually trying to get the required grades. There were a lot of takeaways both from technical point of view as well as from a business point of view. I guess the most important aspect personally for me was the ability to get a feel of the “Startup Mentality” in Silicon Valley. This was mainly because the lecturer who was also a Stanford alumni had also been part of a successful start up and is currently it’s CTO. Additionally there were a few guest lectures from just launched startups (mainly from the valley, I think) that were quite amazing and insightful.

The final project of the course is mostly for fun since it’s not considered for the final grade but I guess getting on the leader board is really good for bragging rights. The aim of the final project was to setup a KickStarter style crowdfunding page to fund a product idea (it doesn’t have to really exist) of each student. The success of the product idea (and the project ofcourse) was determined by the amount of BitCoin received and the number social shares (through Twitter and Facebook) about the product.

Unfortunately I couldn’t submit my project to the leaderboard since I had some issues with setting up BitCoin for my product site. My product idea is something probably not that cool since I forced myself to come up with an idea before some deadline 🙂

But anyways for the sake of record, the possibility of my live Heroku dyno going down and most importantly since I cannot get on the “official” leaderbaord 😉 I just thought of publishing my crowdfunding home page as an image here.

So shown below is the crowdfunding home page of my product idea (no matter how impractical/stupid it may be :)).



Quick way to find why your NetBeans App is “stuck” on Windows7

Windows has a pretty useful “Resource Monitor” console which could be reached (among other ways ways) from your Windows Task Manager’s Performance tab. Recently I encountered a problem where my NetBeans Platform App was hanging on startup. I wanted to check the CPU and Memory status of my machine using the Windows Task Manager to find some clue. Both looked OK, which suggested that some sort of I/O is taking place (or trying to take place). Then I noticed the “Resource Monitor…” button at the bottom of the “Performance” tab.

Clicking this button takes you to the “Resource Monitor” console which has this nifty little feature called “Analyze Wait Chain” which you can launch by using the right click menu on the process that you want to analyze.

Lo and behold my NetBeans platform app was stuck since it was waiting for some heavy Network I/O to finish (as shown in the screenshot above)

Ofcourse this tool can be used for any application running on your Windows 7 machine but it really came in handy when trying to quickly figure why my NetBeans App is hanging wihout having to profile the app. So now I can have a look at my code specifically targeting the Network I/O stuff (opening HTTP URL connections etc.) and try to figure out whats going wrong.

Here’s another blog entry about this feature.