Archives for category: Uncategorized

Hi there, I now have a new blog at

Please update your RSS subscriptions to


Chris Savage has a great post on 5 ways to get to inbox zero. Here’s another tip.

Set aside 1 hour sometime this week to go through your emails and kill them.

Seeing and thinking “1 – 100 of hundreds” is psychologically tiring. Seeing a full inbox on my iPhone distracts me from what I want to actually get done. Get it off your mind. Set aside an hour sometime this week and get through it all. Not next week, not the month after, but this week. Set an appointment in MobileMe or Google Calendar or whatever. You might not want to inbox zero right this moment—that’s okay. Just postpone it, but when that time comes, put on some music, fire up your email, and get deleting/responding/whatever you have to do.

After the whole Chargify thing today, here’s a comparison spreadsheet of the available subscription billing services.

I left out two subscription billing services that Hacker News users mentioned: Zuora and Braintree. Zuora is more enterprise-y, while Braintree has a recurring billing solution built into it (like has) but it requires use of their payment gateway.

Gnomedex was an amazing experience and the best technology conference that I’ve been to (which is admittedly not many.) Excellent sessions, excellent setup, excellent people. These are mostly lessons learned from mistakes, a couple of what I did right, but mostly mistakes.


Gnomedex was my first speaking gig ever. Presenting in front of 280 Gnomedex attendees in addition to 850 viewers through the Ustream stream online was a nervewracking experience, which wasn’t particularly helped by some hardball questions. Nor did it help that, at 16, I was the youngest speaker at the conference.

1. You aren’t talking to 1130 people– you’re conversing with just one person.

This advice was given to me by Todd Sawicki of Lookery an hour before my presentation, which, as much as I wanted to make happen, on stage didn’t. The knowledge that more than a thousand people are watching you is intimidating. You aren’t afraid of speaking, you’re afraid of making a mistake.

After the presentation, Brian Westbrook asked me to participate in a radio interview. During the interview, I felt completely comfortable. Without stuttering or giving vague answers, I was able to bring up points I’d forgotten to mention in my presentation.

The way I’m going to look at this from now on is to think of the entire audience not as 200 people but a person directly in front of you that you’re demoing your deck to. The seats are empty.

When answering a question, you’re not addressing the entire audience, but the questioner.

As Todd also mentioned, it’s also much easier to think of that person in front of you or that questioner as someone you’ve talked to and feel comfortable with. In my case, I should have thought of this guy or that questioner as Brian or Todd or Ben Huh (of I Can Has Cheezburger.)

With this mindset, it’s much easier to hold a relaxed speaking session.

2. Actually take said advice, or you’ll be worse off.

On stage I doubted the effectiveness of Todd’s advice. (Though in hindsight, why the hell would I? He’s experienced in the matter.) Would I mess up that way, by applying that advice, taking the audience and removing them? Would it put me in the wrong mindset?

Answer is, if you don’t take it, you’ll be worse off. Still doubting? Consider my experience, first hand experience. First hand experience is what I lacked when trying to apply advice given, and now I have it. And in a way, now you do, too.

3. Don’t be a pessimist.

There are many times and places where it’s appropriate to be a pessimist. Speaking is not one of them. If you think you’ll mess up, chances are you will. Your mind will be far too preoccupied with that thought, and you’ll be dedicating concentration and attention to that, and you’ll have to ask for things to be repeated, not think correctly, forget to deliver vital points, and so on. Think positively.

4. Be humble.

Gnomedex pushed a lot of (maybe too much) recognition for myself, which was mostly my fault. I’m just as much of a developer as the next guy (or less so) and I wasn’t really anything special, nor was the stuff that I did that I was recognized for, even though that’s the idea that was given off.

Being an arrogant dbag doesn’t really go down well with the audience. When you can, refute false claims people make about you (or those that are simply exaggerated) make instead of laughing them off.

In addition, if someone underestimates you, don’t correct them unless it is vital to do so. I made the mistake of looking like an arrogant dbag, when Chris Pirillo said “he’s sold a Facebook app” and I corrected him with “actually like three.” (Update: Thanks all for your opinion. Didn’t really know what the audience thought – now I do. Many thanks!)

5. Even if you’re winging it, rehearse. A lot.

Not many presentations these days have the speaker looking down on a script (though you could say the new scripts are four-level bulleted 10 point text size slides, in which case put on your headphones and just read the slides like the speaker is.) Most presentations, people are taking it from their head. Rehearse a lot, and that doesn’t mean rehearse silently in your head. The ideas originate through your head, the ideas come through your mouth. It’ll get you into a procedure and regularity and you’ll help to prevent forgetting points and nervousness.

6. You have friends, they have a minute.

Chances are, your friends would be down with helping you rehearse your presentation and giving feedback on them, like my friend and business partner Dan Grover of Wonder Warp Software. Not only is it a relaxed environment, you’ll get better feedback than that voice in your head since they’re like an audience member. Do this with a few people to get a diverse range of minds. Do it over iChat theatre, Adobe Acrobat Connect, or send them the slides (if applicable) and do it over Skype or the phone. If you do this a few times, with the right people (as in those that are like the audience that you’re presenting to) you’ll get a general idea of what the audience will think.

Furthermore, don’t shrug off criticism, find out what caused it, if changing things would help, and then decide whether if you need to fix it. And, remember to return the favour.

7. Say “I don’t know.”

At my Gnomedex session, 30 minutes of the 45-minute session were devoted to Q&A. Many of their questions asked me to predict the future and make blanket statements and observations about Generation Y. Many of these I couldn’t answer; I’m an entrepreneur, not a fortune teller. So I opted to bullshit my way through. As a friend suggested, it would have been more effective to just say “I don’t know.”

8. You can’t please everyone.

After I stepped off the stage, I was in a state of panic. I thought I had screwed up badly. This wasn’t helped by the anonymous reviews on RateMyTalk, which contained a few “not interesting”s (more than one which made my blood pressure high.) J.P. Taylor offered the following, though: You can’t please everybody. There will always be critics. And that’s the risk you take when doing a speaking thing or presentation like this.

Jason L. Baptiste of Publictivity also offered the following to me online. You can’t lose confidence with yourself. Once you do, you’ll lose everything.


9. Continue the connection.

Often during the conference, someone would say “hey Mark, nice presentation” and I would say “hey, much thanks!” followed by an awkward period of both of us walking and not looking at each other. In this situation, STICK OUT YOUR FUCKING HAND and introduce yourself. Nothing sucks more than a loose end, and immediately after you miss the connection you’ll feel a sharp pang of regret, followed by you looking for that person, but they’re not anywhere in sight.

9a. Just network, damnit.

Like mentioned at Gnomedex by Ignite speaker, “relax, damnit!”, just network. Damnit. Chances are, the other person you see is just as happy to network with you as you are with them. Again, stick out your hand and introduce yourself. The worst thing that can happen is that they ignore you and don’t want to talk to you. And in such a case, is that a connection you really want to have anyway?

9b. If you’re just walking around trying to find someone to talk to, look for the guys that are as lonely as you are.

Actively seek, don’t passively wait. If you’re walking around, so is at least one other person that is trying to find someone to talk to. And don’t be afraid to get into a group conversation. Return the favour; if you see someone trying to get into a discussion circle you’re in, invite them and introduce them to the group.

10. Follow up.

This was a step I (and many other people) kinda forgot a lot. Following up serves two purposes, as a courtesy, and more importantly to initiate conversation that would have not been possible during the five minutes that you talked. This is part of continuing the connection. Don’t follow up immediately afterwards (“hey, it was a pleasure meeting you a minute and a half ago”) but rather the night or the next day after the event. And, it’s always nice to follow up, and since not many do so, you’ll be a more memorable contact, so do it.

11. If they don’t have a business card, you have a pen.

“I don’t have a card [with me]” and “oh, that’s fine, you have mine anyway” kind of sucks. A majority of people don’t follow up (and I used to not do so, so I’m also guilty of the sad truth) so grab an extra card of yours and a pen, and have them write it down on yours.

I’m extremely grateful for Chris and Ponzi Pirillo and Maryam Scoble for inviting me to speak at Gnomedex. That was the best weekend I’ve had, ever.

I’m also very thankful to have great people supporting me and giving me advice either at Gnomedex or outside of it.

Much thanks to Dan Grover of Wonder Warp Software for editing a first draft of this article.

News.YC readers: After receiving feedback on my original post, I decided to delete that posting and to rewrite it, with some more insight into less of what I did and rather why.

After being somewhat burned out of my Avecora OnDemand project (because my CSS and Javascript were throwing fits in Internet Explorer) (yes, this is the cause of my burnout) and after seeing a few “how I built a webapp with just $x,000 and x people” I decided to go ahead and build something I’ve been thinking about for a while.

Thus SpeakHQ was born. SpeakHQ is a service that lets you take the micro-update/micro-blogging idea that is embedded within Twitter, for your group. This was originally developed for Avecora OnDemand, however I wanted to make it free to use for all, and with some other features like joining multiple groups.

Just to clarify, this doesn’t use the Twitter API (or else I’d have to deal with it going down every 10 minutes, hitting 70-requests-per-hour limits with 35 requests, etc.) and it’s built from scratch.


  • Mark Bao, developer, designer, everything else
  • July 3rd: 10am – 12am EDT.
  • July 4th: 10am – 2pm.
Why it’s useful:
  • Communication with micro-updates forces people to be concise and not go into large amounts of detail, one of the problems that plagues email (and skimming email)
  • Twitter demonstrated this – small updates are easy to digest. If they didn’t have a 140 character limit, Twitter would be nothing but a simplified weblog community.
  • Groups with Twitter is hard to do – the easiest way I’ve seen to do this is distributed direct messages. Although it leverages the user database of Twitter, it doesn’t present a clean solution.
  • Keep track of your own private groups with groups or projects, with co-workers, friends, or other group members, as well as public discussion groups with public groups through the group finder.
How it went down:
  1. July 3rd. 10am EDT: I used a PHP MVC framework I wrote a few months back called ActiveVC. Doesn’t have anything to do with venture capitalists, though it is a MVC framework without the Model; essentially it is a simple template engine. (See Decisions Made below for more information.) I might release it sometime for the hell of it. Decided to use moo.ajax with prototype.lite.js at first, but decided that jQuery would be better for more useful Ajax calls as well as the rest of its set of features in CSS manipulation, etc. Started database schema and planned out the UI.
  2. 12pm: User account system ready, session data is able to be handled. Working on the basic user-group membership association, and loading groups and posting messages via Ajax.
  3. 3pm: decided on the name speakhq (it was either that or groupchan) and registered the domain. Cost: $6.99
  4. 4pm: new group, group settings, user settings… and preview testing with some friends.
  5. 5pm: refreshed the interface, looks a little less bad now.
  6. 7pm: groups directory. joining/leaving.
  7. 9pm: new account creation, email invitations to public and private groups.
  8. 11pm: data sanitization (should have thought of it first) using a php function called __() (two underscores) that instead of using echo $var I use __($var) and it echos sanitized output.
  9. 12pm: bugfixing and then sleep.
  10. July 4th. 10am EDT: checking on domain registration (T_T) and then fixing miscellaneous bugs and stuff.
  11. 12pm: opening VMware to test in IE6 and IE7. OH MY GOD IT IS SO BROKEN
  12. 12:30pm: half an hour wasted fixing IE problems with PNGs, margins, random stupid width problems, etc. Thank you stilleye guy for IEmarginsFix.js, and to whoever came up with the underscore hack.
  13. 1pm: uploading to server, changing database stuff, and it’s released. yay!
Decisions made:
  • PHP MVC framework. Although my primary PHP development framework is Kohana, I decided to use my ActiveVC framework as it was light and fast at processing pages – and I didn’t need all of the features and larger library of Kohana (as it would only get in the way.)
  • Usernames or emails + name? To ensure that all user accounts were universal in the application, and to reduce confusion, I decided to deviate from Twitter’s username + name model (which made things somewhat confusing) and just went with usernames.
  • Database schema. I didn’t get a chance to catch Twitter’s SQL yesterday, but decided to set it up as follows:
    | Tables_in_speakhq |
    | groups            |
    | invites           | (table holding invite codes)
    | members           |
    | messages          | (these are status messages)
    | users             |
    5 rows in set (0.00 sec)
    This makes things logical for SELECTs and JOINs, and I'm not sure how Twitter does their schema. I chose InnoDB for its better locking levels (row level lock in InnoDB vs table level lock in MyISAM.) Since I'm updating the groups table as new messages are posted, and that new messages are easily (and frequently) posted, InnoDB was the better choice for the database.
  • Public vs. private groups. I implemented the different privacy levels to easily facilitate SpeakHQ “discussion groups” on a certain topic, such as the group speakhq suggestions where users suggest improvements for the service. Based off of this, in public groups anyone that is a member of that group is allowed to invite others to the group, whereas in private groups only the group owner is allowed to invite (with a one-use randomly generated invite code that adds them automatically to the group upon registration completion.)
  • No private messages and no profiles in first release. SpeakHQ is based on group discussion and collaboration, whereas Twitter is based on individuals sharing information to a group of other individuals (followers.) I’m still looking into what kind of messaging system should be put in place – form for email, or a system like Twitter’s direct messages?
  • Lack of replies and permalinks. I will be implementing permalinks in the future, but I don’t see the value in replies in a group space – unlike Twitter, conversations aren’t between a large number of people (at least in private groups.) However, I’m going to expect that people will be asking for it, so I will implement it soon.
  • User levels. Implemented into the database (binary member or administrator) but I didn’t implement a member level editor, for the reason that it would become more confusing in terms of how much control other group owners other than the group creator had over the member list, and the group privacy level (and we’re trying to keep things simple here.) Group owners don’t usually have much control over a group, other than changing group privacy level and the name of the group (and later deleting status messages, kicking people from the group, etc.)
Still left to do:
  • forgot password / password and email changing
  • deleting status updates
  • public group viewing
  • member list for administrators to be able to edit the group members (kicking, admining?)
  • customizable group avatars, environment (background colors, etc.)
  • yes, I will be releasing an API soon
  • outgoing SMS gateway
  • new design (it really needs one)
  • incorporate some colors