Flickr Badge

Sunday, July 22, 2012

Why did VCs/angels miss investing into Interview Street at an early stage?

Recently Y Combinator selected TapToLearn and Plivio into their program. This is after they selected Interview Street in an earlier batch.

I don't know TopToLearn and Plivio personally, but Vivek from Interview Street was pretty active in the Chennai startup scene for a long time before moving to Bangalore and finally into YC.

He bootstrapped for many years while pivoting on several themes. Apart from Morpheus, who bought into his idea, why didn't any other Indian investor buy into it?

I'm sure a lot of VCs and angel networks would be kicking themselves now. They had a chance to invest early into a global startup that is now going places, and they missed the chance. Instead they will invest millions into the next shaky e-commerce, travel or deal site.

It's embarrassing when they have these companies growing right under their noses, and it takes YC to recognise them.

Monday, January 09, 2012

Minimum Viable Product & the Tour My App roadmap

Recently there has been a lot of noise made about minimum viable products (MVP). MVP was the topic at this month's Chennai Open Coffee Club. Unfortunately I couldn't make it at the last minute, so there are my thoughts on MVP and our approach to building Tour My App.

We recently launched a new product called Tour My App. This is a product through which you can create "tours" to guide users step by step through the actions required to complete tasks in your web application. In this post I'll explain how we are applying the MVP concept in Tour My App.

First some history.

We've always wanted a tour functionality in our other product - Tools For Agile. We searched for various solutions, but didn't find anything that fit our needs. In the meantime, The Startup Center had an event called In 50 Hours. The premise of the event is simple - build a product from scratch in 50 hours. Kausikram went ahead and built an initial prototype of Tour My App over the weekend. The idea was to later on incorporate that into our product. However, during the demo at In 50 Hours, many people expressed interest in having that functionality in their products as well. We then decided to split this functionality into a separate product.

Tour My App was born.

Having decided to build it out into a separate product, we now needed to figure out our release plan. Here is where the MVP concept enters the picture. MVP is a principle to build just enough of the product to validate your assumptions. They may be assumptions on user adoption, pricing model, sales model, technology... anything relating to the product. We have some idea about all these factors when we start, but they are all assumptions. How do we validate it? What we do not want to do is to build a big product and then learn that many of our assumptions are wrong. So, our goal was to build the product piece by piece in order to answer the most important questions up front.

Out of all the questions, the top questions right now were
  1. Is Tour My App solving a real problem?
  2. Will people pay to have this problem solved?
The idea for Tour My App comes directly from a problem we faced ourselves. We badly wanted this functionality in Tools For Agile. Our analytics showed that many users signed up for Tools For Agile but would leave before they performed a single action. If we could get users started easily, then we could make our users much more productive - and increase the chance they would become heavy users.We were ready to spend money to get this solved, but we couldn't find any other product that we could use. We were desperate to get a solution. That is why after a few months of looking, Kausik decided to just write it himself.

But this is just one data point. Were there other companies like this? And would they pay to have it solved?

These were the questions we wanted to answer.

So we did something unconventional - we charged for the beta. 

Generally beta testers get the product free. So why did we charge for it? In usual terminology, beta testers are testers. This means that they are given a buggy product and are expected to report bugs. In exchange for this service, they get the product free. In our case, the product is not buggy. We even have a demo page showing it in action. We want people, not to test the product, but to solve their problems.

The initial beta pool is a set of companies who really have a serious problem, are willing to pay to get the problem solved and the problem is serious enough that they want to explore solutions right now, rather than wait for the application to go live later.

In other words, we want to filter out the people who signed up for beta expecting a free toy to play with, and focus on those who need Tour My App.

So what does all this have to do with MVP? And if the product is production quality, then why are we in beta?  Simple, the quality is at production level, but the product isn't finished.

You see we only built the bare minimum functionality to run a tour. There is still no UI, no sign up page, no login page. In order to save a tour, we have to go into the database and create user accounts and store the data manually.

Why did we do this? Because building those features now doesn't help us answer the questions we want answered at this point. The MVP is the minimum you need to build to get answers to your questions. So we cut out these features for now. We'll build it later.

We are sitting down with the beta companies, and together figuring out what different kinds of tours they need. Based on that we will add the data to run the tour into the database and the tour can then be deployed live into the app.

The discussions will also highlight whether we need to add more functionality into Tour My App or not. We have thousands of potential features in our minds. We are not going to implement any of them until we come across a beta customer that needs it. Then we will build it. So we are not building features based on assumptions, or coolness, but only when see a need in front of our face.

In this phase we want to answer the question: Can we build the kinds of tours that customers need?

Once we figure out the answer to that question, and are satisfied that we are doing a good job of solving beta customer problems, only then will we build out the frontend, the website, the signup page, login page and all that. All that is simple - there is no unknown risk there.

Then we will open to the public with the live application.

PS: Do you think you are losing customers (and therefore, lots of revenue) because some proportion of users cannot figure out the steps required to complete tasks in your web application? Is the problem so bad that you want a solution right now and are willing to pay to have it solved? Then give us your email and we'll bring you into the beta program.

Friday, September 02, 2011

pip re-installing wrong version of a package

I recently ran into a pip gotcha that left me scratching my head for hours.

When you install a package for the first time using pip, it will download the package into a build directory, unzip it there and install from there. Even if you uninstall it, the copy in the build directory remains intact. The next time you reinstall, pip checks if there is already a version in the build. If its there, then it directly installs that without downloading it again.

This is usually fine, unless you uninstalled in order to install a different version. In that case you might be mystified as to why the same old version is installed again.
pip install pycrypto==2.3

pip uninstall pycrypto
pip install pycrypto==2.0.1 # still installs pycrypto 2.3!!
The solution to this is to simply delete the package copy from the build directory.

If you are using virtualenv, then the build directory will be a top-level folder inside the virtualenv.

Thursday, September 01, 2011

Installing Python Imaging Library on Ubuntu

Continuing on setting up the VPS, its now time to install the Python Imaging Library. This is another major pain in the neck.

On Windows, PIL comes nicely bundled with everything. On Linux, it gets compiled, and the stupid part is that different bits of support get compiled in depending on what you have installed. PIL will silently skip components and say that the compile was successful. It's only when you run the application do you find out that some parts of PIL are not installed. Big, big, pain. If you are doing automated provisioning of machines, then you have to be careful that you have the right packages in place before you pip install PIL.

The two components that I am interested are PNG support and Truetype font support, because thats what we use for our app.

PNG Support

If you want PNG support, you need to have the zlib library installed.
sudo apt-get install zlib1g

sudo apt-get install zlib1g-dev
JPEG Support

JPEG requires libjpeg62
sudo apt-get install libjpeg62

sudo apt-get install libjpeg62-dev
TrueType Support

You'll need the libfreetype6 package installed
sudo apt-get install libfreetype6

sudo apt-get install libfreetype6-dev

Wednesday, August 31, 2011

Setting up Postgres on Ubuntu 10.04

We've just migrated our Django build server to a new box, and I'm currently installing all the necessary dependencies. Even though I've done this many times, I still keep forgetting the steps to do it properly, so this blog post will document the steps for future reference.

PostgreSQL

Installing postgres is a major pain, because there are so many annoying small things to do to get it working properly.

First, before you do anything you want to ensure that you set up your locale to UTF-8.
locale-gen en_US.UTF-8

update-locale LANG=en_US.UTF-8
If you forget to do this and its not setup by default, then postgres will use ASCII which is probably not what you want. If you sill forget this (yes, I forgot), and you haven't put in any data yet, then you can drop and recreate your postgres cluster.
pg_dropcluster --stop 8.4 main

pg_createcluster --start -e UTF-8 8.4 main
Okay, with that out of the way..

Installing Postgres

The latest version of Postgres on Ubuntu 10.04 is Postgres 8.4
sudo apt-get install postgresql-8.4
You'll also need the dev package to compile psycopg2 later
sudo apt-get install libpq-dev
And don't forget the python dev packages to compile psycopg2
sudo apt-get install python-dev
Setting up Postgres

By default postgres is configured to use your system users for authentication. If you want to use a specific user/password combination, you'll need to change this.

Open up /etc/postgresql/8.4/main/ph_hba.conf and change
local all all ident
to
local all all md5
Then restart postgres.

Create a postgres user and database

These are the two commands for creating a user and database. If you intend to run the Django unit tests, then dont forget to give CREATEDB permission for the user.
CREATE USER username WITH PASSWORD 'password' CREATEDB;

CREATE DATABASE db_name OWNER username ENCODING 'UTF-8';
Compiling psycopg2

You should be able to pip install psycopg2. Note that it needs to be compiled, so you should have build-essential package installed beforehand.
sudo apt-get install build-essential

pip install psycopg2
There is a gotcha here: psycopg2 version 2.4.2 is NOT compatible with Django 1.3. Either use the trunk version of Django or use psycopg2 version 2.4.1.
pip install psycopg2==2.4.1
Troubleshooting
  1. make or gcc is not found: install the build-essential package
  2. postgres gives the error "ERROR: new encoding (UTF8) is incompatible with the encoding of the template database (SQL_ASCII)": You haven't set the locale properly before installing postgres. See the top of the post for setting the locale
  3. Django gives the error "Got an error creating the test database: permission denied to create database": If you want to run unit tests, the user must have the CREATEDB permission
  4. postgres gives the error FATAL: Ident authentication failed for user "username": You need to edit the pg_hba.conf file to turn off ident authentication and set it to md5 instead
  5. psycopg2 gives the error 'PyType_GenericAlloc' undeclared (first use in this function): Install the python-dev package
  6. psycopg2 gives the error pg_config: command not found: Install the libpg-dev package

Monday, August 01, 2011

My Django Dash 2011 experience

About Django Dash

Django Dash is an online, weekend Django hackathon. You get 48 hours to develop a Django app of some sort, from scratch.

Apart from being a lot of fun, its a great way to squeeze in a bunch of learning over a short period of time. Kausik and I set out to build a badge generation application.

(View the site here - Make My Badge)

The idea

A lot of people probably know about the badge generation python script. This is a script that takes a list of people, a badge template and generates badges for all the attendees. The badges can be printed out and laminated beforehand for attendees to pick up at the event registration.

The badge design itself is based on a simple principle (surprisingly violated by a huge number of events!) - keep the name large and easy to read from across the hall. We wanted to avoid badges where the name of the event is prominent but the name of the person is tiny. I'm also not a fan of handwritten badges. Not only do they look ugly, but the scribbling is rarely readable.

We also wanted to auto-scale the font size based on the length of the name, and to split long names into two lines so that we could use larger font sizes. These badges have been used in a number of events in Chennai, and have always been popular, with some people even preserving them as souvenirs. (See the badge in use)

One of the problems with the script is that you need some technical knowledge to generate the badge. This made it complicated for a people to generate badges for an event. It also made it difficult to generate and print badges on the fly at the registration desk for on the spot registrants.

We decided to build a web app in 48 hours to do everything that the badge generator did, but as a Django site.

Something that we wanted to do (apart from developing the site of course) was to get up to date on the current cutting edge technology in the Python/Django space. Sure we use a lot of cutting edge tools for ToolsForAgile.com but that application is now almost 3 years old. Although we do keep updating it, its a big application and updating platforms and infrastructure can take time. Plus we wanted to do a quick spike of some of the technologies so that we could take the learning back to our product. Django Dash was the perfect opportunity for that.

Here are some of the things we learned

Django deployment scenarios

When we first developed our product, the only option for python and django deployments was to use Apache with mod_python. Then the WSGI standard was finalised and mod_wsgi came along. mod_python is now officially end-of-line with no more support available for it.

Today one popular deployment configuration is to use an nginx frontend server to serve static files, with a reverse proxy to an Apache + mod_wsgi configuration to serve dynamic files.

Apart from Apache, a lot of other backend servers are becoming popular, most notably gunicorn.

Django hosting

There are now a gazillion hosting providers for Django. When we started out with ToolsForAgile.com the only option was to roll your own setup on a VPS or dedicated server. You still want to do that for complex deployment setups, but there are now any number of django specific hosts for the common scenarios - ep.io, gondor.io, Stable, Dotcloud, AppHosted, DjangoZoom. Ken Cochrane has an excellent series of blog posts with a comparison of django hosting providers.

All these services allow you to simply deploy, while they handle setting up the deployment stack, load balancing and auto scaling for you.

And of course, for the simpler use cases, there is always good old Webfaction. I've hosted various sites with them for four years, with not a single problem so far.

ep.io

ep.io and gondor.io were sponsoring Django Dash, so apart from setting up a custom stack on a Linode VPS, participants also had the choice of deploying on one of these services. We decided to try out ep.io for our submission.

Overall, I must say that I really liked ep.io. It was a bit complicated to get my head around first. It took a while to get file uploads, static files and celery set up. That was more to do with the fact that we were using ep.io for the first time. Once setup, deployment was a breeze. All we had to do was to upload the project using their command line client and ep.io would automatically provision the app with all the required services. They also have an interface where you can push your project directly via git or mercurial.

I should note here that the ep.io client only works in linux as it requires ssh to execute remote commands. Since we were on windows, it took us a fair while to hack up the client and hook it up to do its work through Putty instead.

pip

This is the first time we exclusively used pip along with a requirements.txt file to sync up the python dependencies of all the local dev environment as well as the remote server setup. It worked really well. pip rocks!

Celery

Celery is a distributed task queue. It's amazing how popular it has become in such a short span of time. For our submission, we decided to try out celery to generate the badge images asynchronously through the tasks queue.

Celery can work on top of a number of transports. Popular configurations are to use it over an AMQP broker like RabbitMQ or over Redis. We used it over RabbitMQ (which in turn requires Erlang), whereas ep.io supports celery over Redis. The nice thing is that we just had to tell ep.io that we wanted to use celery and it would set everything up, including launching the celery daemon, configuring it to use redis and what not.

On our side, we used django-celery, a Django integration of celery. With djcelery you can create a tasks.py file in your app with a bunch of task definitions which you can call asynchronously through a view.

After some initial setup hiccups, it worked like a charm, allowing us to push out the badge image generation out to the workers. When badge generation was done, it would trigger another task to zip up all the images and allow the user to download a single zip with all the badges. Everything happening through Celery. It was pretty exciting to see the whole flow in action.

Django 1.3

We used Django 1.3 for this submission. Our product is built on a version of django that is somewhere between 1.1 and 1.2.

We got a chance to play with some of the new stuff in 1.3. We got a chance to try out class based generic views, the new logging setup, TemplateResponse, some improvements to the admin, and a bunch of other stuff.

The admin interface itself is a huge section to explore. We briefly thought about doing the whole site through a custom admin interface, but we were running out of time so we shelved the idea for the time being.

Django 1.3 also has a completely new way of dealing with static files. The old django-staticfiles app has been added as a contrib package and is now the official way to handle static files. The old way had a single static directory with all the static files in it. You now have to put your static files either under an app folder, or in a global static dir. You then call the collectstatic management command to pull in all the static files into a directory that the frontend server will serve.

Similarly, there seems to have been a change in the way uploaded files are handled. Previously they used to go under the static folder. They now get a folder of their own.

What got done in 48 hours

We eventually ran out of time on all the features that we wanted. Thats not surprising, with the amount of new stuff we were using for the first time. It took almost one and a half days to setup and get comfortable with ep.io, celery, django-celery and all the changes in Django 1.3, and getting them to work properly on the local dev environment and online on ep.io.

However, since we built the whole app incrementally, we managed to get the important features in. If you go to Make My Badge you'll be able to login, generate and download a sample set of badges. You can create events, though you need to go to the admin interface to add people to the event.

What is left to do?

We ran out of time before we could integrate django-registration for new users to register. We've created a sample user through the admin interface for now. We also wanted to be able to upload a list of event attendees through a CSV upload form, but couldn't put that in. As a workaround, you need to add people through the admin interface.

Apart from those two main features, there were lots of UI design work that we wanted to do which we couldn't finish.

Where are we going from here?

Once the event judging is over, we have a bunch of enhancements to add. The CSV upload feature, for example, got done about 2 minutes past the deadline. We want to put that in. Integration with django-registration is also ready on the development environment.

We want to eventually add integration with a payment system. Charge Rs.1 per badge generated or something like that.

Overall Impressions

Django Dash was awesome fun. Although we couldn't complete everything we sure did learn a lot of new things that we can take back into other projects. And now that we know the tech, I'm pretty certain we can have a similar app complete in 48hrs.

I was just going through some of the teams, and here are some submissions that I found. Remember, all these were done by scratch in 48 hours! - Drawn by, Family Feed, ProposalMatic, FutureFI, Goal Rally, Django Lint, ConsoliTweet, Courtside, Linky, Git Awesome, Stardust, Set With Me, Libman, Show Offfr, SmartLinky, Staste, Django Docs, Code War, Grepo, Codr Space, My Img, Gearoscope

Thursday, March 17, 2011

Why your startup should not start with a Freemium biz model

I'm reading Ash Maurya's book Running Lean that I picked up from AppSumo's Lean Startup bundle [The bundle gives you $6000 worth of ebooks and web app subscriptions for only $99. Its a total bargain, but only 3 days to go before the offer expires, so get it soon - use this link and I'll get a $10 credit :)].

There is a section on the freemium pricing model and why startups should not start with freemium. This part really resonated with me because we fell into many of these problems early on. The reasons against freemium are:
  • Low or no conversions: Startups often give away too much in the free plan, leaving users with no need to upgrade
  • Long validation cycle: Conversion rates on upgrades are low, so its hard to validate the pricing model
  • Focusing on the wrong metric: Causes a premature shift in focus from building the right product for paying customers to new user sign up
  • Low signal to noise ratio: Free users may give feedback that paying users dont care about
  • Free user's aren't free: It costs time and money to support free users
Do you think freemium works? What are your thoughts?

This post is a part of the selected archive.

Tuesday, January 18, 2011

Why New Ideas Can Be Bad

This is a great post from Tim Kastelle: Why New Ideas Can Be Bad which ties in with my blog post from last year: Too many people are ideating, not enough are executing.

Tim references a talk by Scott Belsky at the 99% conference. Here is what Belsky says:
When ideas are new, we have lots of excitement and energy. However, once we settle into trying to make the idea real, the levels of both excitement and energy go down – it starts to feel more like work. How do we respond to this?

According to Belsky, the natural response is to look for the excitement of a new idea again – and succumbing to this temptation is deadly.

Read the whole thing.

This post is a part of the selected archive.

Tuesday, December 21, 2010

Sales Stories

This post is the first in a series of stories on selling.

This stories in this post are from the book Hope is not a strategy.

On targeting the pain point
Early in my sales career as an account manager, I was in the back of the room while one of my product specialists was presenting a system. We were extremely proud of the functionality and about halfway through the presentation, our product rep put up a slide and said, "Now, if you were a hospital, you'd really like this feature."

What!? I was utterly stunned. I thought to myself, "They're not a hospital-they're a bank! They're never going to be a hospital; they'll always be a bank!"

How preposterous, the idea of showing a hospital feature to a bank.

But this is no less preposterous than showing somebody a solution to a problem they don't have-or a feature for which they have no need. You might as well show a hospital feature to a bank.

On trust
The evaluation process was grueling. Two vendors were pitted against each other and were required to do detailed benchmark implementations in the evaluation of their products. It was an exhausting, detailed process with perhaps twelve to twenty people on each vendor's side.

In the end, we won by a couple of points, but we broadened that advantage into a business partnership. Their executives met our chairman. We had a corporate visit. We continued to talk about implementation and support and widened the gap. We actually reached a measure of business partnership before they signed the contract.

At dinner the night before the contract signing for multiple financial systems, the client said, "Oh by the way, do you have a fixed asset system?"

"Certainly"

"How much is it?"

"Seventy-five thousand dollars."

"Add it to the proposal."

I thought, "They just bought a system sight unseen. How could they have required such detailed evaluation in the beginning and now they have bought a system they never even looked at?"

But they went further.

They added the graphic user interface for all the systems, which they knew was in the prototype phase. There were no references for this three-hundred-thousand-dollar product at that time. The opportunity went from six hundred thousand dollars to almost a million dollars, and forty percent of it was on products they had never seen.

How could they evaluate in the beginning in such detail and buy products sight-unseen now?

The answer is trust. They trusted our products based on the ones they had evaluated. If those worked, then these must. They trusted us as a company because they had met our top executives, they'd been to our headquarters, and they knew we were a stable industry leader with a good track record of delivery. And they trusted us personally because we understood their business and we had become friends
Got more stories that you would like to share? Add it in the comments below.

This post is a part of the selected archive.

Sunday, December 19, 2010

The Scavenger app from my Chennai Geeks presentation

This weekend I presented at the Chennai Geeks meet on using HTML5 to build mobile applications. As a part of the talk, I showed a sample scavenger application that was built using HTML5.

The application defined a list of scavenger locations, and used the Geolocation API to check you in when you were close to one of the defined locations. The app used Local Storage to save the list of previously visited locations and the timestamp when you last checked in. Finally we used some CSS3 Media Queries to show some additional information when the app was accessed through a desktop browser.

To run the application, just copay and save the code below and open the html file in Firefox 3.6, Google Chrome, iPhone or Android browser.

Here is the source code for the application:
<html>
<head>
<title>Fivesquare</title>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
<script type="text/javascript" src="json2.js"></script>
<style>
header {font-size: 11px;}
h1 {font-family: Verdana,Helvetica,sans-serif; font-size:25px;}
.error, .notice, .success {padding:.8em;margin-bottom:1em;border:2px solid #ddd;}
.error {background:#FBE3E4;color:#8a1f11;border-color:#FBC2C4;}
.notice {background:#FFF6BF;color:#514721;border-color:#FFD324;}
.success {background:#E6EFC2;color:#264409;border-color:#C6D880;}
.location {background: #eeeeee; border-radius: 15px; -moz-border-radius: 15px; -webkit-border-radius: 15px; margin: 5px 0; padding: 10px;}
.visited {background:#ccff99; font-weight: bold;}
.location-distance {display:block; color: #555555; font-weight:normal; font-size: 0.8em;}
.location-checkin {display:block; font-weight:normal; font-size: 0.9em;}

/* Dont show distance and timestamp on small screens */
@media only screen and (max-width: 480px) {
.location-distance {display:none;}
.location-checkin {display:none;}
}

</style>
<script type="text/javascript">

Number.prototype.toRad = function() {
return this * Math.PI / 180;
}

// List of locations. Format: ["location name", lat, long]
var LOCATIONS = [
["Thoughtworks", 13.01245, 80.201451],
["Ashoka Pillar", 13.035028, 80.212512],
["Kathipara", 13.007359, 80.20394]
];

// Haversine formula to calculate distance (in km) between two lat/long coordinates
function distance(lat1, lon1, lat2, lon2) {
var R = 6371; // km
var dLat = (lat2-lat1).toRad();
var dLon = (lon2-lon1).toRad();
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(lat1.toRad()) * Math.cos(lat2.toRad()) *
Math.sin(dLon/2) * Math.sin(dLon/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c;
return d;
}

function check_in(index) {
jQuery("#status-bar").html("<div class='success'>Checked in to " + LOCATIONS[index][0] + "</div>");
var check_ins_str = localStorage["check_ins"];
if (!check_ins_str) { check_ins_str = "{}"; }
var check_ins = JSON.parse(check_ins_str);
var location = LOCATIONS[index];
check_ins[location[0]] = new Date();
localStorage["check_ins"] = JSON.stringify(check_ins);
}

function show_distance(index, d) {
var container = jQuery("#locations-container").find("#location-"+index);
container.append("<span class='location-distance'>" + Math.floor(d*100)/100 + " km away</span>");
}

function success(pos) {
var distance_list = [];
for (var i=0; i<LOCATIONS.length; i++) {
var d = distance(pos.coords.latitude, pos.coords.longitude, LOCATIONS[i][1], LOCATIONS[i][2]);
show_distance(i, d);
distance_list.push([i, d]);
}
distance_list.sort(function(a,b) { return a[1] > b[1]; });
if (distance_list[0][1] < 2) {
check_in(distance_list[0][0]);
} else {
jQuery("#status-bar").html("<div class='notice'>No checkins</div>");
}
}

function error() {
jQuery("#status-bar").html("<div class='error'>Unable to get position</div>");
}

function locate_user() {
navigator.geolocation.getCurrentPosition(success);
}

function render_previous_check_in(index, check_in_date) {
var container = jQuery("#location-" + index);
container.addClass("visited");
container.append("<span class='location-checkin'>Last checked in on " + check_in_date + "</span>");
}

function show_checkins() {
var check_ins_str = localStorage["check_ins"];
if (!check_ins_str) return;
var check_ins = JSON.parse(check_ins_str);
for (var i=0; i<LOCATIONS.length; i++) {
var previous_check_in = check_ins[LOCATIONS[i][0]];
if (previous_check_in) {
render_previous_check_in(i, previous_check_in);
}
}
}

function show_locations() {
var container = jQuery("#locations-container");
for (var i=0; i<LOCATIONS.length; i++) {
container.append("<div class='location' id='location-" + i + "'><span class='location-name'>" + LOCATIONS[i][0] + "</span></div>");
}
}

jQuery().ready(function() {
show_locations();
show_checkins();
locate_user();
});
</script>
</head>
<body>
<header>
A HTML5 mobile app demo by <a href="http://siddhi.blogspot.com">Siddhi</a>
<h1>Fivesquare</h1>
</header>
<div id="status-bar"><div class="notice">Checking your location...</div></div>
<div id="locations-container"></div>
</body>
</html>

Monday, November 29, 2010

HTML5 Multimedia: My presentation at Doctype Html5

Here are the slides from my presentation at Doctype Html5 (Chennai edition). The presentation is a very quick, very high level overview in using SVG, canvas and video with HTML5.

Wednesday, November 24, 2010

Really disappointed with TiE Entrepreneur Awards

I attended TiECon Chennai today. This is the big annual event organized by TiE Chennai for the entrepreneur community here. I'll put down my detailed experience notes elsewhere, in this post I want to talk about the TiE Chennai Entrepreneur of the Year awards.

TiE gives these awards to entrepreneurs every year in a variety of categories - social entrepreneur, start up, family entrepreneur and so on.

This time I had a chance to check out the award winners for the last three years, and to say I was completely disappointed is an understatement.

The entrepreneur awards were all given to huge, well established companies. Most of these people had been running their companies for 15 years or more. Some over 25 years. I can understand giving them an award when they were in the startup phase, but 20 years after they established their company? And we are talking companies that have hundreds of crores in revenue. Many of these are publicly listed companies. See the previous award winners here.

How the heck can you call these startups? Why is TiE giving Entrepreneur of the Year awards to them? Will we see Narayana Murthy and Mukesh Ambani being awarded next year?

There is no way that entrepreneurs in the audience are going to relate to these companies. Far from being an inspiration, it is extremely deflating that a forward thinking organization like TiE chose to ignore actual startups and instead promote the big, well established names :(

Monday, October 04, 2010

3 Oct OCC Meetup Roundup

We had the October 2010 meetup of the Chennai OCC. Tony Aug, VP IT of Sanmina had come down to attend the meet. Once of the big problems startups often have is understanding how large enterprises make decisions. This is really important in the context of B2B enterprise sales. So it was really good to have Tony come down and talk about the executive perspective when purchasing software.

Some points from the meetup -
  • The #1 reason for purchase in a recessionary environment right now is to cut costs. If you can show substantial cost reductions, then that is a big win.
  • Many cloud/SaaS startups dont understand the security and privacy needs of enterprises. Eg: A company like Sanmina with operations in 20 countries need to run only on certified infrastructure that comply to EU security and privacy regulations, HIPAA, and a host of other regulations. Startups right now cannot guarantee all this
  • Pricing: $10/user a month sounds reasonable, but multiply it by 50,000 users and it becomes huge. So you will need to find a way to get it into the team on one pricing model and then switch to another pricing model (possibly a flat price) when rolling out to the whole organization
  • Dont forget about switching costs. Once an organization has spent tons of money on training and integration, it is unlikely that they will switch over, even to a superior product, unless there is a really easy path for them to do so
  • Subscription pricing is great because it allows organizations to get started without expensive capital expenditure. The old model was to buy expensive servers, install expensive software, training, integration and then you could look to get RoI. The new model is to subscribe and cancel if it doesn't work out
  • You can expect a small team to pay by credit card, but larger orders will need a purchase order and go via the purchasing department. Once that happens a lot of other stakeholders will look at it and question the need for the purchase. So you will have to answer to these other stakeholders too.
  • Lock-in is important in a subscription service. Most companies will want to be sure that they can get their data out at any time
  • Sanmina is a huge believer in open source - cuts costs and there is a community to help. For mission critical systems they pay for commercial support
  • Escrow: Larger companies will usually ask startups that the source code be put in escrow. In case the startup closes down, the company gets access to the source.
  • Using tools like Linkedin, it is really easy nowadays to find a path to get to a decision maker in any company

Wednesday, September 22, 2010

The difference between a conference and an unconference

One of the things I really like about unconferences is that there is very little "gyan" and a lot of experience sharing. This came home to me when participating in a session on hiring.

The question was: "What strategies do you follow for hiring and building a team?"

This same topic was discussed in a panel in the NASSCOM Product Conclave last year, with some VCs on the panel. In typical panel style, a lot of gyan was thrown around: "Hire only the best people", "Top people create top teams" etc.

That's stating the obvious. I mean which startup doesn't want to hire the best people? Do these VCs believe startups are intentionally hiring poor people because they believe its a better strategy??

The fact is that there are a lot of on the ground challenges to hiring that these panelists are hand waving away with their gyan:
  1. Startups are always short of cash and cannot match the compensation in bigger companies
  2. A lot of startups hire good guys only for them to leave in 6-12 months
  3. Really good guys are hard to find
  4. Most employees are not interested in stock options (a lot of Silicon Valley returned VCs talk about stock options... one wonders if they have actually recruited in India)
At the end of the panel, the audience is usually unsatisfied. The panelists tell them what they already know without a word on tackling ground level challenges that they face.

Now compare that with an unconference. Once more this topic came up at the TiE unconference.

Look at the answers this time:
  1. Many top people are around in smaller cities, who are not taken by big companies because of a lack of english skills. They are smart and make good startup employees
  2. Find a few people who believe in your vision and then complement them with freshers
  3. Look at 6 month internships - lots of smart people available as interns
  4. Look at your requirements - not all types of work require the best people. Some types of work are repetetive and may just make good employees bored.
  5. Look at the attitude and teach the skills
These are strategies that are coming from the experience of people who actually have to tackle these on-the-ground problems. At the end, the participants feel charged up with ideas to take back and implement the next day.

This is really what makes an unconference different for me. The focus on real solutions to real problems is invaluable.

Saturday, September 11, 2010

Interesting Themes for the TiE unconference

I was looking at the position papers for the TiE Unconference. Position papers are topics that participants want to discuss at the unconference.

I've taken some that caught my eye and organized them into themes.(Find these topics interesting? Then register for the TiE Unconference and participate in the discussions)

Product-Market Fit
You may have an initial hypothesis about why your product is useful to enterprises. How do you validate it? There are several factors: which customers to reach out to feedback? How do you identify the *right* person within the org. for feedback? How do you evaluate their response? etc.
How does an entrepreneur determine if his product really has a market fit that can guarantee rapid growth for the enterprise? The question becomes relevant when the product addresses a latent need that is not very explicit in the market place. What are the typical pointers to a 'successful' or an 'unsuccessful' product?


Scaling
there are many good companies which are doing great jobs in their niche. but very few Ideas scale, how can these companies tweak their business model, and focus to become large profitable organization
A good idea and you start enthusiastically by yourself or with friends. The founding team is all excited and there are no 'rules'. Works for sometime, but after a few years, when revenues start happening and the start up has to move to next level....


Marketing/Sales
Bootstrapped startups have very low or nonexistent marketing budgets. If you're making a product for the global market, how can you make sure your product is found by the right people?
We are a young startup with a service offering of online ERP and HR software. We are facing a lot of roadblock in marketing SAAS to our target clientèle (which are mostly old-style brick and mortar firms) and especially with a slim sales force. Would like to see if some inputs could be got on this.
We are a startup with a service offering of Management Consultation and Leadership training. We are facing a lot of roadblock in marketing our Webinar to the right audience inspite of knowing them. Would like to see if some inputs could be got on this.
The idea is to understand the dynamic behind catching customers into a cloud and to retain them by providing continuously improved services.
Building a product that can be consumed online implies that it's location agnostic. How to target companies in the valley being in India ? Is it a necessity to be in the US?
Would like to hear about market entry experiences of product startups with specific reference to early stage high yield marketing techniques.


Direction of TiE
For TiE education, Mentoring and Networking are the pillars. These are delivered through various events in different formats: Talks, My-Story sessions, Panel discussions, Member networking sessions, Unconference (from now) etc..It will be useful to know how our members value these and what additional or alternate delivery formats and activities should we consider to be relevant and aligned with our members' expectations.
To understand better where TiE stands in the entrepreneur ecosystem today, and what role do start ups think TiE can play for them and how?


Innovation
There is no dearth of ideas on solving problems. How can we leverage all the collective intelligence in the high tech industries to foster social innovation. How can we leverage technologies to improve the life of rural folk?


Recruiting
How do we identify great co-workers ? How do we build a team that lasts through the rough years ? How do we build a team that creates great products ?
How Recruiting the right people is the Key to Scale up and Establish your Start up


Services to Products
The difference starts from recruitment, development, environment and also the technology. The things to be taken care for getting the people shift their base from project based working to products.