One Piece of Advice from Seven Investors

This is a belated live blog post for the Early Stage VC and Angle Investor Event I attended yesterday in downtown Seattle. The event was organized by FundingPost and sponsored by Perkins Coie LLP.

In afternoon, Ben Straughan a partner at Perkins Coie, moderated a panel discussion with the following VC/angel investors:

  • Petra Franklin, Managing Director, Vault Capital
  • Bill McAleer, Managing Director, Voyager Capital
  • Cathi Hatch, Founder and CEO, ZINO Society
  • Janis Machala, Founder and Managing Partner, Paladin Partners
  • Lucinda Stewart, Managing Director, OVP Venture Partners
  • Bill Bryant, Venture Partner, Draper Fisher Jurvetson
  • Saqib Rasool, CEO and Angel Investor, Conceivian

For their background and expertise, check out their bios here.

There was a lot of useful information, especially for new entrepreneurs and folks considering approaching angel investors. I’m not going to rehash the event. Instead I’m going to focus on one question asked by Ben Straughan: “If you had one thing to say to these entrepreneurs, what would it be?”

Here’s their paraphrased responses from my notes:

Pick a good partner. ― Petra Franklin

Persistence and focus. ― Bill McAleer

Listen to your investors. ― Cathi Hatch

Why you? Why are you born to do this? ― Janis Machala

Find two to three CEOs to coach you. ― Lucinda Stewart

It’s about the team. ― Bill Bryant

Raise the least amount possible, build your product fast and keep your budget low. ― Saqib Rasool

Good advice indeed and for those of us with limited resources, Saqib Rasool’s point could be a daily scrum for CEOs:

  • Are we raising the least amount possible?
  • Are we building the product as fast as we can?
  • Are we keeping our budget low?

Do you have any advice to share?

One Piece of Advice from Seven Investors

Tip: MySQL Table Naming Across Platforms

If your MySQL development and production environments are Mac OS X or Windows, queries containing all lowercase or uppercase table names will work fine. This is because these platforms are case-insensitive. However, if you deploy to a Unix system, queries referencing table names in the incorrect case will not work. Consequently, adopting a standard naming convention across platforms is the best policy. I decided to go with all lowercase with underscores between words (my_table_name).

For more information here’s a post by Craig Buckler on

Tip: MySQL Table Naming Across Platforms

RESTful Serialization with Flexjson

XML is too fat for a mobile RESTful API. Therefore, I’m using JavaScript Object Notation (JSON) to exchange data between mobile devices and a cloud service I’m developing. My server environment is J2EE-based, so I chose Flexjson to serialize Java object fields as JSON. This post is a quick overview of my implementation and a lesson learned.

Flexjson is a lightweight Java library that enables object filtering during serialization. If you have a complex object model, serializing the entire object graph is undesirable. Flexjson allows you to pick and choose which objects or fields to serialize.

Here’s simple example of excluding a password field in serialized JSON.

String result =
         new JSONSerializer().
         exclude("password").serialize("user", this);
Client's JSON result
   "user": {
   "class": "com.mycompany",
   "email": "",
   "firstName": "John",
   "lastName": "Doe",
   "phone": "555-1212"

The shallow deserialization is limited to: String, Date, Number, Boolean, Character, Enum, Object and null. Subclasses of Object will be serialized except for Collection or Arrays. Consequently, if the deserializer is unable to construct the object, an exception will be thrown.

All objects are built using an ObjectFactory during deserialization and each object must have a constructor that takes no arguments. Users can write their own factories and the library comes with many factories for types such as bytes, characters, dates, and so on. However, an integer object factory is nonexistent. Here’s mine:

public class IntObjectFactory implements ObjectFactory {

	/* (non-Javadoc)
	 * @see flexjson.ObjectFactory#instantiate(flexjson.ObjectBinder,

	public Object instantiate(ObjectBinder context,
                                  Object value,
                                  Type targetType,
                                  Class targetClass) {
		 if( value instanceof Number ) {
	            return ((Number)value).intValue();
	        } else {
	            throw context.

It was so easy to write, I’m not sure why is wasn’t included in the shipped version.

Lastly, here’s how to use the factory during deserialization:

JSONDeserializer<Map<String, List<SomeObject>>> deserializer =
       new JSONDeserializer<Map<String, List<SomeObject>>>();

Map<String, List<SomeObject>> members =
       new IntObjectFactory()).deserialize(returnValue);

For more info check out the Flexjson home page here:

RESTful Serialization with Flexjson

Java SSL: How to accept a self-signed certificate

I’ve been working on a RESTful API for use on computers and mobile devices. I have a JUnit test case that connects to the URLs and reads the responses. Given the nature of the data being transferred back and forth, I enabled SSL on the web server using a self-signed certificate I generated using Java’s keytool.

keytool -genkey -alias <hostname> -keyalg RSA

This is where my problems began. My test case is using HTTP, so I needed to refactor it to use the HTTPS protocol. Unbeknownst to me, accepting SSL connections from self-signed certificates is non-trivial, especially if you want to do it right. There is copious advice on the inter-web about how to accept any certificate. I’m not keen on that approach; therefore, I set out to find the correct way.

Without a decent Java security reference handy, I surfed the internet for answers. I found partial code snippets on stackoverflow and Example Depot. In a nutshell, I found that you need an instance of a SSLSocketFactory to set in a HttpsURLConnection. Here’s how:

// Load the keystore in the user's home directory
File file = new File(System.getProperty("user.home") + File.separatorChar + ".keystore");
FileInputStream fis = null;
KeyStore keyStore = null;

fis = new FileInputStream(file);
keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(fis, keystorePassword.toCharArray());

TrustManagerFactory tmf;

tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(null, tmf.getTrustManagers(), null);

//Get an instance of the socket factory
SSLSocketFactory sslFactory = ctx.getSocketFactory();

HttpsURLConnection connection = null;
url = new URL(newURLString);

connection = (HttpsURLConnection)url.openConnection();

//set the socket factory in the connection


Tip: Remember the alias created in the keytool must be the hostname of the server. Otherwise, an exception will be thrown on the client: No name matching <alias> found
Java SSL: How to accept a self-signed certificate

Is the hosted version of ScrumDesk truly hosted in the age of the cloud? No.

I’ve been looking for a free or inexpensive Scrum hosted tool for my micro development shop. I poked around some blog reviews and came across a recommendation for ScrumDesk by Torin on Mike Cohn’s userStories website.

ScrumDesk comes in a hosted offering, however, it’s for Windows only. This isn’t so great for us because we develop on Mac OS X, deploy server components to Ubuntu and distribute clients on Mac OS X and iPhone OS. Nonetheless, I decided to give it a shot using VMWare Fusion. I found the setup to be cumbersome. First you have to install the .NET Framework 3.5, ScrumDesk and configure a database connection to a Microsoft SQL Server.

Once I had everything setup, I started adding users in the administration screen. It doesn’t send emails automatically to new users, you have to remember to send the database connection info to them by clicking a button in the menu bar. Once they receive the message, they’ll have no idea what do if they haven’t previously been told to install the .NET Framework 3.5 and ScrumDesk because the email contains only the steps on how to load the attached file in the login screen.

After setting up a few users, I transcribed my user stories from sticky notes in the backlog view, which is a nice emulation of notes on a wall. However, after using it awhile, I found the application to be sluggish in my 768 MB VMWare image. There also was a temporary outage of service on the second day of use, due to a problem with their ISP.

After my experience, I decided against the product and exported my user stories. Too my surprise, you can only export in two formats: Open XML Paper Specification (.XPS), which requires a 3rd party viewer on Mac OS X or Microsoft Excel XML. Why not CSV?

At the end of the day the hosted version of ScrumDesk is nothing more than a Windows only client-server application. If you’re looking for cloud-based Scrum tool check out the offerings from Rally Software or VersionOne.

Is the hosted version of ScrumDesk truly hosted in the age of the cloud? No.

Troubleshooting remote connections to MySQL on Linux

If you encounter a problem when trying to remotely connect to MySQL on Linux, make sure that the bind-address property in the configuration file (/etc/mysql/my.cnf) is set to the machine’s host name. I wasted a considerable amount of time before resolving this issue.

“If the server was started with –bind-address=, it will listen for TCP/IP connections only locally on the loopback interface and will not accept remote connections.”

source: MySQL documentation

I hope this saves somebody some time.

Troubleshooting remote connections to MySQL on Linux