#1 on Google

If you search for “online aspect” on Google my blog comes up as the 1st result out of 92,800,000.

Thanks Google. You made my day.

  comments

Content aggregation: Am I missing something?

With new web services appearing every day our information is increasingly spread out over a myriad of different platforms. As a result, active web users are forced to log into dozens of different sites to keep up with their online life. There are a lot of people currently working to solve this problem with content aggregation. The idea is that you should be able to log in to one website and see all your relevant information in one place. It’s a great idea, but there are some big challenges that are worth considering.

Let me start by sharing a personal story. When the Google Maps API first came out I built a mash-up that allowed people to move around a map and see the names, addresses and phone numbers of everyone who lived in that area. I used a reverse geocoder to convert GPS coordinates to street addresses and then an address lookup service to get the information about the people who lived on each street. Since I didn’t have access to these databases myself, I extracted the data from several other websites. Everything worked great until someone found my site and posted a link on digg. About 10 minutes after my website made the front page of digg, two of the services I was using blocked my IP address. My 10 minutes of fame were over. My site was as dead as a doornail.

I learned an important lesson from this incident. When you pull content from another website you are ALWAYS at their mercy.

A good number of websites now provide API’s that allow third parties to interact with their data. Theoretically this makes the task of content aggregation more reliable since you have defined methods by which to access information from that provider. Unfortunately, even with API’s you are still defenseless to the actions of the API provider. For example, last week Facebook made several code updates that broke the majority of applications on their platform. I’ve experienced the same issues while using API’s for PayPal Pro and Google Maps. In each case, they made an “update” to their code which put my website out of business for a day. When you use an API, you must understand that it can (and will) change at any time. There will also be times when it will be broken or unavailable.

The bigger concern is when you need to aggregate content from websites that don’t have an API. The reality of the internet today is that API-offering websites make up a tiny percentage of all the websites on the internet. To provide a truly valuable aggregator you need to scrape data from all relevant websites, not just those that offer API access. The problem is that you are completely vulnerable when you are scraping data. Any time a change is made in their code, it has the potential to break everything you are doing. If they ever decide they don’t like you anymore, blocking you is as simple as adding your IP address to a restriction list. No matter what, you are at their mercy.

Keep in mind that few websites have an economic incentive to let you scrape their data. This is especially true for websites that make their money from advertising. When you scrap their content you are depriving them of their main source of revenue. If they ever decide they don’t like you, there’s not much you can do about it.

For those of you who are currently working on building content aggregators, I am curious to hear how you plan to address these issues. Is there another side to this that I am missing?

 1 comment

The story of how I became a programmer

The story of how I became a programmer is really a story about my dad.

As long as I can remember, my family has had a computer in our house. My entrance into the programming world started when my dad bought me some books on how to program our Apple IIe. I spent hours trying to write programs for that thing!

Then early in high school I decided I wanted to be a website designer. My dad encouraged me to build a website for a local company and see if they would pay for it. I guess my price was too high. I asked for $100 and they turned me down!

My dad told me not to be discouraged, but said “If you really want to be good, you should learn HTML”. So I did.

A few weeks later I was showing off what I had learned about HTML, and my dad said “That’s great, but if you reeeally want to be good, you should learn JavaScript”. So I did. And after I mastered JavaScript, I learned PHP. And after PHP, I learned mySQL.

After I graduated from high school, I went to Clemson to study Computer Science. My dad never had a college education, but he made huge sacrifices so that I could.

During the summer, my dad landed me an incredible internship with a company in Charlotte. By my second summer there, I was the project lead for multiple clients. I probably learned more about programming at Orbis, than I did in college.

For 23 years my dad has shown me how to work hard and not give up. He’s taught me to think outside the box, and has continually pushed me to take on bigger and bigger challenges.

Dad, thanks for being such an incredible example to me. Happy Father’s day! I love you.

 1 comment

The 4 coolest people I’ve met in the last 24 hours

One of the things that is really cool about TechStars is the number of amazing people we’re continually surrounded by. Here are a few people I’ve met within the past day that have really impressed me:

Todd and Eric from myBlogLog (now a part of Yahoo)

Todd and Eric win my “most-encouraging people of the week” award. From the moment we started talking about EventVue, they were excited about what we are doing. They dove right in – drawing on the white board, sharing ideas and asking deep questions that forced us to think about what we are doing. These guys are natural marketing masterminds. I look forward to learning more from them.

Casey Schorr from Printfection

I liked Casey from the minute I met him. Casey is only 23, but already he’s the president of his own profitable company in Denver. Printfection provides on-demand printing over the internet for a fraction of the cost of traditional screen printing. Their industry is changing rapidly, and Casey’s company is in the best position to take advantage of these new opportunities. Check them out for yourself. Get a custom designed t-shirt for only $2!

Noah Kagan from Facebook and now Mint

Noah is a genius with a hyperactive mind. He spent the morning talking to us about what he learned from his time at Facebook and how we can build better products. He gave us some great insight on how to get people on board with what we are doing. Apparantly, this comes under the new buzz word called “onboarding”. Yep, I learned something new today! Noah’s passion is contagious and I’m looking forward to getting to know him better.

Todd, Eric, Casey and Noah, you guys blow me away. Thanks for taking the time to hang out with us. I want to be as cool as you when I grow up.

  comments

Introducing my 1st Facebook app, Platypus

For those of you who were wondering about the Facebook application that I wrote about yesterday, you can now see it live on Facebook. If you don’t want to install it, you can click here to see a screenshot from my facebook profile.

As I mentioned in my last post, Platypus isn’t what I’m working on this summer. If it takes off, great! If not, it’s not going to hurt my feelings. Platypus was just something I threw together in a few hours to explore the capabilities of the new API.

I must say that I’m already intrigued by the viral nature of these new Facebook applications. I just released the application this morning, but every time I log on to Facebook I find 3 or 4 more strangers who have added Platypus to their profiles. I have no idea how so many people are finding it! It’s going to be interesting to see what happens once the application gets approved for the public directory.

Don’t worry. I’ll be posting lots of insider statistics along the way as more people keep adding my Platypus to their profiles.

 5 comments

The side project

Perhaps it’s inevitable anytime you get a bunch of smart people working together in one place. We live in a world where new opportunities abound and intelligent minds are overflowing with dreams of how to seize them. As an entrepreneur, you see the world, not as it is now, but how it could be. Everywhere you look, you see things that could be done better. There’s something in your nature that wants to jump at every opportunity you have.

So you have a new idea, but unfortunately it doesn’t fit into your company vision. It’s just a good idea that you know you can execute. Perhaps it’s enticing you with the promise of quick results and easy money, or maybe it’s just more fun than what you’re working on now. Either way, you get caught up in the excitement and before long a new entity is born: aka, the side project.

Over the weekend I had an idea for my own side project. It’s something that I have wanted to build for a long time and the release of the new Facebook API suddenly made it possible. I spent my day yesterday pursuing the idea, before coming to the conclusion that this isn’t the right time to be working on it. A big influence in this decision was the book Good to Great by Jim Collins. I went back and reread chapter 5 this morning. This time, the illustration about the fox and the hedgehog really hit home.

I can’t afford to let anything (not even a great idea) take focus away from what we are really doing this summer.

I know of several other teams at TechStars that working on side projects right now. That’s okay – your idea is probably more on target than mine was. My only challenge for you is to look at your goals and make sure your project is taking you closer to them instead of further away. You see, that’s the problem with side projects – they tend to distract us from what we first set out to do. They make us lose focus and we become scattered, diffused, and inconsistent in our vision.

As Jim Collins said, it is better to know only one big thing than to know many things. Go find that one thing that you can be great at, and focus all of you attention on that.

 1 comment

Auto detect a time zone with JavaScript

This blog post will attempt to explain how to automatically detect your user’s time zone using JavaScript. If you’re in a hurry, you can skip directly to the JavaScript timezone detection code on Github.

Previous attempts to solve this problem:

Server side:

Time is not included in an HTTP request. This means that there is no way to get your user’s time zone using a server side scripting language like PHP.

IP address geocoding:

Another method that people have used to address this problem is to geocode your visitors IP address. IP geocoding is what is used when you go to a website and are shown an ad to “meet other singles in Boulder”. Unfortunately, for simply detecting a timezone, IP geo-coding is an expensive way to go. Just check out the prices for Maxmind and ip2location. There’s no way I’m paying for that. I did find a free provider called hostip, but it is worthless as it couldn’t decide whether I live in CA or NC.

With JavaScript:

The common JavaScript that is used to detect a visitor’s timezone is:

var myDate = new Date();
document.write(myDate.getTimezoneOffset());

As I started reading up on the getTimezoneOffset code I realized it was too buggy to be used in any critical application. The function returned inconsistent results in different browsers and it never seemed to account for daylight saving time correctly. It quickly became clear that I was going to have to write my own script if I wanted this to work.

How I ended up doing it:

There are basically two things needed to figure out a visitor’s time zone. First, we need to determine the time offset from Greenwich Mean Time (GMT). This can easily be done by creating two dates (one local, and one in GMT) and comparing the time difference between them:

var rightNow = new Date();
var jan1 = new Date(rightNow.getFullYear(), 0, 1, 0, 0, 0, 0);
var temp = jan1.toGMTString();
var jan2 = new Date(temp.substring(0, temp.lastIndexOf(" ")-1));
var std_time_offset = (jan1 - jan2) / (1000 * 60 * 60);

The second thing that you need to know is whether the location observes daylight savings time (DST) or not. Since DST is always observed during the summer, we can compare the time offset between two dates in January, to the time offset between two dates in June. If the offsets are different, then we know that the location observes DST. If the offsets are the same, then we know that the location DOES NOT observe DST.

var june1 = new Date(rightNow.getFullYear(), 6, 1, 0, 0, 0, 0);
temp = june1.toGMTString();
var june2 = new Date(temp.substring(0, temp.lastIndexOf(" ")-1));
var daylight_time_offset = (june1 - june2) / (1000 * 60 * 60);
var dst;
if (std_time_offset == daylight_time_offset) {
    dst = "0"; // daylight savings time is NOT observed
} else {
    dst = "1"; // daylight savings time is observed
}

Once I had this code written, the next step was to compile a list of the various time zones around the world along with their opinions on DST. I actually ended up using the list of time zones from Microsoft Windows. It was rather time consuming to compile this list, so I hope you can make use of my work to save yourself some time.

Please let me know if you have any comments, questions or problems with this code. As with anything that I post on this blog, feel free to use this code however you want. Just don’t blame me if it breaks.

Update (06/27/07):

My code wasn’t correctly detecting timezones in the lower hemisphere. I have added hemisphere detection for all our Aussie friends out there. I also fixed a bug in the convert() function that was leaving off the + sign at certain offsets. Thanks Val for pointing this out and helping me with the fix.

Update (10/24/08):

Fixed the bug that Rama and Will pointed out in the comments.

Update (12/22/10):

Jon Nylander has taken my original code and written a a more robust solution. Use his version instead.
 134 comments

Beautiful new design from OrangeCoat

Evan Tishuk from OrangeCoat just sent me a link to the new site they designed for Wilderness Systems. Evan, I believe you outdid yourself this time. That design is beautiful!

Evan is one of those people that I hope to hire someday. I’m saving up, ’cause he’s worth a lot. Not only is he an amazing designer, but he’s also a great entrepreneur. Evan, I’m looking forward to building something cool together one of these days. Just let me know when you’re ready to start. 🙂

 1 comment

How to build great forms

Aristotle said, “We are what we repeatedly do. Excellence, then, is not an act, but a habit”. What many people don’t realize is that excellence isn’t achieved at the macro level. You don’t reach excellence by making one great decision. Instead, you reach excellence through making lots of small decisions consistently well. Here are some simple guidelines to help you improve the quality of your user forms:

1. Do your research

When designing a user interface, take the time to read up on stuff like eyetracking research before you design your forms. For example, did you know that you can reduce your users saccade time from 500ms to 50ms per input field, just by placing form labels above the field instead of left aligning them in another column?

2. Know your user (see #1)

Talk to people! Ask questions. And when all else fails, use common sense. For example, we recently redesigned our date input fields. We were using the popular date picker which allows user’s to select the date from a popup calendar. We thought this feature was cool, until we realized that conference organizers usually register their events 6 or more months in advance – that means they have 6 or more unnecessary clicks just to get to the right month. This didn’t make sense to us, so we went back to the drawing board and opted for regular drop-down date inputs instead.

3. Reduce friction

Every input field that you have people fill out is friction. With every second that you keep people waiting, you increase your likelihood of losing them. You need to do everything you can to reduce this friction. Sit down and evaluate every question in your form design and ask yourself what it would take to get rid of it.

I came across a good example of this yesterday as I was working on the registration form for EventVue. Since our conferences can be located anywhere, we need to collect time zone information. Every website I’ve found requires the user to manually enter their time zone. Why do they do that? Why can’t the browser just tell you which time zone the user is in and automatically select it for them? I spent a day looking into this problem, and sure enough, all it took was some time and some javascript to detect the user’s time zone automagically. So what fields do you have that you could eliminate?

 1 comment