About Tom Evslin

Video Profile of Tom Evslin

Follow Tom Evslin on Twitter


Add to Technorati Favorites!
Powered by TypePad
Member since 01/2005


Advice to Entrepreneurs from What Would Google Do

My friend and sometimes colleague Hardeep asked:

"… the lists of details for each of those features keep getting longer and longer. If I ignore all the features I want, I will be nowhere close to where my competitors are (should I care where they are?) and here I am working on a project that does more than the competitor. If I focus too much on nitty-gritty details, it will be months before a release. Do I focus on these details and build the best product now or focus on the bigger picture of releasing a product even if its feature set is limited?"

It turns out my friend and fellow blogger Jeff Jarvis has answered this question in his new book What Would Google Do?

"[Google Vice President Marissa] Mayer recounted a debate among programmers before the release of GoogleNews. Days before the start of the beta, they had enough time to implement one more feature – sort by date or sort by location – but couldn't decide. So they did neither. The day the service was released. They got 305 emails and 300 of them asked for sort by date. The users answered the engineers' question for them. 'Just get the product out there and then have the users tell us where it is more important to spend our time,' [Marissa said]"

I couldn't agree more. Featureitis is a disease I've suffered from too often. A product distinguished by just a raft of features probably isn't worth doing. There's got to be one great thing that makes your product or service new and compelling. Get the basics of that done well; additional features will just obscure the main point and may make the product hard to use. You'll be astonished to find that the feature you found hardest to leave uncoded isn't missed by anyone while one you never thought of is demanded by multitudes.

But suppose you realize that some existing popular product would be an order of magnitude better if it only had one additional capability? Happens all the time; the better the product, the greater the possibilities that it opens up. Do you recreate all of Twitter, for example, and then add the missing capability? No way. Instead you find a way to build the capability on top of the existing product. You win by having invented a new service without the need to tediously recreate an old one. The owners of the old service gain by having you use their service as a platform. That's new product creation at its finest.

See Features Kill for how to manage feature creep.

Thanksgiving Poem

Over the river and thru the wood,

To grandmother's house we go.

The GPS knows the way

To guide us today,

Even if traffic is slow, oh.

Over the river and thru the wood,

We're always in the know.

My new Dash Express


To see how the traffic does flow.


Over the river and thru  the wood,

What if we need some gas?

Live Yahoo Search,

From Dash's perch,

Stuck to the windshield glass.

Over the river and thru the wood,

We do our part as well:

We broadcast our speed,

For others to read,

It's e-show and tell.


Cliff notes:

Dash Express is a car GPS with WiFi and GPRS built in. Although it can grab open WiFi connections while moving, WiFi is really more useful in your garage for getting updates. GPRS is a slow data access technology which works on cellular networks and is usually available along roads. Dash has some arrangement with the cellular operators so that Dash Express can use the GPRS networks; you pay Dash 12.99/month for this Internet access ($10.99 if you sign up for a year). This may seem a lot but it includes free map updates which are expensive on some other GPSes so not so bad.

When you're connected, you can allow your car to send automatic anonymous speed reports. These become part of the Dash database. So route calculation can take into account both historical and extremely current road conditions. You can also see how traffic is flowing assuming there are enough other Dash users driving where you are (obviously early adopters won't get all these benefits right away).

Dash also supports Yahoo local search so you can get up-to the-minute reports on gas stations, restaurants, movies etc. – much better than the canned Points of Interest (POI) files in most GPSes.

Another cool feature is you can send addresses from a web application to your Dash or even other people's Dashes (with permission). When I made hotel reservations for this trip, I immediately sent the hotel address to my Dash so it's already available as a destination.

Hat tip to friend David Isenberg who found our house with his Dash and made me a convert before we'd finished lunch.

Happy Thanksgiving.

Bad Connectivity

The only serious drag on an otherwise great vacation is the ten pound bag with computer, batteries, adapter etc. that I'm lugging around on my back. The other day we walked the literal length and breadth of Venice with it. There is no straight footpath through Venice; it's a long way to anywhere unless you're a boat.

It wasn't meant to be this way. Last time Mary was in Italy her host had a USB GSM data modem from TIM (Telecom Italia Mobile). When Mary put it in her laptop it worked fine and she became Skype central in return for the use of the USB device. Since we're staying on a canal boat we rented; we knew we wouldn't have any Internet access from a hotel; but I figured I'd just get one of those modems which Mary said we're on short-duration plans, probably just pick one up in the airport; mobile coverage is great so I'll be online everywhere.

But in the airport I got caught up in immigration, slow luggage, hidden ATMs, and local transportation and forgot.

In Casier there was no Internet access I could find.

In Treviso we found a TIM store but closed on Sunday which is when we were there. On Monday, as we went down the River Sile, we found some open WiFi when we had lunch and got the first connectivity fix since coming to Italy. The computer took a ten mile bike ride on my back.

No WiFi in the marina we stayed at in Portagrande.

Asked if there was a TIM store or any Internet Cafés on Burano; told no. There were some locked networks which looked commercial if I'd only known how to get the WEP credentials (legitimately) to access them; certainly you wouldn't name a network Venice>Connect unless you meant for someone to do that. Also a couple of open signals but too weak – which brings up mistake #2: I have my highpowered WiFi card and antenna with; almost surely could find something with that; but the drivers aren't installed on this computer and I didn't bring the driver CD. Looking for them online not much of an option.

Found the TIM store in Venice! It's open. Through a language barrier, the sales person explains that they are out of (or no longer make, I'm not sure which) the USB modem. But they have a PCMCIA card. Great and a 25 Euro twentyfour connect hour plan. Great! Doesn't work with a Mac, though. No problem. Only works with Widows XP. Vista? Only XP.

The sticker on the box says compatible with the Mac and Windows Vista. Not, insists the sales person; coming in two weeks. Would cost $300 non-refundable dollars to call his bluff and I'd be trying to debug problems in Italian. But he says a computer store may have a solution; points me to one down an uncertain street; turn at the optometrist (I assume that's what he means when he makes glasses with his fingers); make a left somewhere. Somehow we find it.

They do have a USB modem; claim 7meg download. Wow. Only available with a two year subscription. No other way to buy it.

So we find an Internet café for an hour.

But now it's a day and a half later. Signal everywhere here in Stra but nothing I can connect to.

Looks like the computer'll have to go to Padua for the day. Yuk.

e-Sitting in Nerdville

We never did see Baby Jack during our early morning stint of e-sitting.

Son-in-law Hugh had to catch the 6AM flight from Burlington to get to a conference (been there, done that). He, Kate, and Jack stayed at Nerdville summer headquarters because it's relatively near the airport. Kate had to drive Hugh there early enough for security etc. "Don't wake Jack up," we (Mary) said. "We'll watch him."

"OK," Kate said after just a little persuasion. "Should I install the monitor in your room?" The monitor is the device on the left. The device on the right is the transmitter and it stays near Jack's crib. We hear everything Jack says or doesn't say from our room above his.

"One problem," Kate said, "you'll have to wake up to turn the monitor on when I leave."

"Why don't we just turn it on now?" I asked.

"You don't want to listen to us snore," Hugh explained tactfully. Just to test, I turned the monitor on when we went to bed. It gave the roaring sound that indicates that the transmitter is off.

At 4:15 our alarm went off and I turned the monitor on. Its green light told us that the transmitter was now active.

Jack burbled a few times and we woke up – even me. Nothing serious enough to require a trip downstairs. Next sound we heard was Kate coming back from the airport.

BTW, under Jack's mattress is a breathing alarm. We would have heard it go off through the monitor if he'd held his breath. He didn't.

Glad to learn about all the latest technology.

Friendly Hackin at Nerdville

Daughter Kate, son-in-law Hugh, and first grandchild Jack have moved back to the US. Enroute to their new lives, they're staying with us in Vermont. Only problem is that they got to our house before we did.

Should have been no problem: the lock is electronic; Kate had the code for both it and the alarm. But the door wouldn't open. Jack is patient but not infinitely so.

They couldn't call us on their cellphones because they hadn't yet gotten US versions and there is no GSM roaming (even though there's GSM service) in Nerdville. Nerdville isn't exactly near any phone booths even if there were any that still work.

But Kate's not a hacker's daughter for nothing. She had her laptop and WiFi; it didn't take long to determine that there was a usable signal on the porch. She knows how to get through my security. Voila.

Well, not quite. We were offline on the road; didn't respond to email. Hmmm….

Kate downloaded Skype; created an account; bought some SkypeOut minutes, and called me. We gave her an alternate path in.

Turns out the door had a mechanical problem; bummer. But fortunately there was a software fix.

Programmers Helping Programmers

One of the nicest changes to have happened since I was last an active programmer almost twenty years ago is the help programmers give each other. Programming used to be pretty lonely; it still requires unsocial concentration and lack of distraction; but we programmers aren't alone with our bugs anymore. When we get stuck, we search the forums inevitably setup around the products, tools, and APIs we're using or just google a description of what's happening to us and we usually find that someone else has been in the same place, figured out the problem, and posted a solution.

But the other day I had a problem I couldn't find an answer to. The rest of this post is a pretty nerdy discussion of the problem and a workaround. It's here so that other people with the same problem can find it by googling and as my contribution to helping each other.

I've been testing the code I'm working on with Internet Explorer and Firefox. Before it can be released to production it'll have to be tested with Safari as well and with some mobile phone browsers but for now I'm just using these two. Obviously, this is a web app that runs in a browser although portions are also PHP running on a server. Recently Mozilla released Firefox 3.0. I deliberately didn't upgrade because I figure that most people are still using 2.x and will be for some time so I wanted to test with that.

My colleague Hardeep, however, did upgrade and promptly reported that my code didn't work at all with FF3. He was kind enough to send me console debugging logs and pointers to some known compatibility issues between FF2 and FF3. These issues weren't what was affecting me but the logs he sent pointed me in the right direction. FF2 and FF3 work differently when retrieving objects by tag from an XML structure when the XML is defined in a specific namespace (I'm trying to use as many of the right keywords as possible so that other people with the problem will find this explanation). The javascript method getElementsByTagName(tagName) requires that the prefix be part of tagName in FF2 but does NOT want the prefix as part of tagName in FF3 (or Internet Explorer, for that matter).

I used to have code that looked like this:

if (window.ActiveXObject) { // if IE

var thePrefix="fi:"; // need prefix

} else {

var thePrefix=""; // else no prefix


var responseAttributes=xml.getElementsByTagName(thePrefix+"response")[0].attributes;

It wasn't good technique anyway and promptly broke on my bad assumption that IE was the outlier (as it often is) and that all other browsers would work differently. The statement looking for attributes caused a browser error since there were no elements with the tag "response" from FF3's POV. It wanted "fi:response" instead.

New code looks like this:

var thePrefix="";

try {

var responseAttributes=xml.getElementsByTagName("response")[0].attributes;


catch (e) {


var responseAttributes=xml.getElementsByTagName(thePrefix+"response")[0].attributes;


This implementation adjusts itself to whatever the particular browser wants. The reason I bother to set thePrefix is that I have many other invocations of getElementsByTagName() further down in the code. Note that I also could have written:

If (xml.getElementsByTagName("response").length==0) {


} else {



var responseAttributes=xml.getElementsByTagName(thePrefix+"response")[0].attributes;

Also note that both of these examples rely on my certainty that the tag "results" does actually exist in the XML. Once we knew what the problem was. Hardeep did find that someone had blogged about it. Also, when I went to post the bug to bugzilla, I found that it had been reported (several times) but will not be fixed because the FF3 (and IE) behavior is correct and FF2 is not. BTW, the absolute correct way to do this is with getElementsByTagNameNS – but this doesn't work in IE according to W3.

Fun With Google Maps

If you have a list of locations, eventually you'll want to see them on a map – count on it.

An organization I work with gathered addresses and other useful information relevant to their mission with a web form and neatly downloaded all the information into a Google Docs spreadsheet. Eventually they decided they wanted to see it on a map. Turns out they can do that rather easily – no programming involved – by using one of the paid versions of Google Earth.

All spreadsheets can save their content as a .csv file (cells in a row are separated by commas). The paid versions of Google Earth have an import function for CSV files, which asks you which columns contain which address elements and then puts a dot on its map for each row. It works whether you have each element of the address in a separate column or have the address elements all run together as you'd enter them into a query for Google Maps. Non-address data from the spreadsheet can be displayed in the balloons for the entries when they're clicked on. Google Earth Plus is $20/year and can import up to 100 addresses at a time; Google Earth Pro is $400/year but will import as much as your machine has stomach for. Once the addresses have been loaded by a paid version of Google Earth, they can be saved as a KML file which even the free version of Google Earth can open.

There are a few drawbacks to this approach:

  1. If the addresses are entered incorrectly initially in the form that gathered them, they don't get coded so they don't appear on the map. "Incorrect" is whatever the map provider Google is using says it is so some addresses are bound to get rejected no matter what.
  2. You need to pay for one copy of Google Earth to create the KML files.
  3. Whoever is going to view the map with the points on it needs to have Google Earth (free version is fine). However, there are web-based viewers for KML available. One is here; only hitch is I haven't gotten it to work and don't have time to debug right now. But, if this works, it gives you an easy way to make your location data available on the web.
  4. Address-based geocoding is only available for certain countries.

If you can do it, it's better to gather your data on a map so the user has a chance to verify the location and correct any errors or negotiate a compromise with what the map provider expects as far as street names are concerned. That's what we did with Vermont Telecommunications Authority's "who has what broadband where" map. But collecting on a map takes some programming and may not be worth it for your project. With limitations, you can gather data on a form and make it visible on a map – no programming required.

JavaScript or PHP – Why It Sometimes Matters

It's all about whose computing power gets used – yours the application provider or yours the end user. If you're the user, you probably don't care since you are waiting for your browser to show you something in either case and you already paid for your computer. If you're the application developer, you may care a lot because you have to pay for server processing cycles one way or the other but you don't have to pay for user machine cycles.

If you are not involved in providing web applications in any way, you may want to bail out of the rest of this post at the end of this paragraph. Before you go an interesting factoid is that PHP stands for "PHP: Hypertext Preprocessor" – the acronym is recursive. Of course, if you're not a nerd you may not think this is interesting so I'll give you one more factoid. You may have noticed that many web addresses end with ".php". These are web pages that are created on the fly on servers using PHP. Pages which are more static OR are made dynamic on the user machine often end with ".htm" or ".html". Now you know.

OK; only us nerds are left now. You all know that a page which is pure HTML is pretty static; appropriate for lots of things but pretty static. But you also know that you can add some JavaScript and have the page become interactive; even better, you can use AJAX (Asynchronous JavaScript and XML) and load all kinds of data into an existing page to create an interesting and dynamic application. This data doesn't even have to be XML.

Pretty much anything you can do with JavaScript on a user's computer you can also do with PHP on your own server. The two languages are similar so the complexity's about the same either way. One huge exception is that you can't do anything with PHP that requires lightening fast interaction like reacting to a mouse-over, a click, or a key-press instantaneously. All PHP interactions gotta go from the user's computer to the host and back and that takes noticeable time.

One thing that you can do in PHP on your server that you can't do in JavaScript is load data or XML from domains other than the one the current page or iFrame was served from. That can be a significant limitation. You also can't keep your code secret if it's JavaScript; it's there in source form on every user's computer. You may want to keep it secret either because it's where your value comes from OR because it would be a security risk to you or the user to expose the code.

Many APIs like the Facebook API or the Amazon S3 API assume that you have a server at your disposal. I did manage to use S3 and maintain necessary security with only a client application and no server but had to jump through hoops to do it (see Amazon S3 – Backstory for Nerds - Part 1 and Amazon S3 – Backstory for Nerds – Part 2). 

In many ways it's easier to test and debug using PHP than JavaScript. The problem with JavaScript is that different browsers treat it differently. You sometimes have to ask in the code what browser you're supporting. You have to do extensive cross-browser testing. I spent (wasted) most of today on a problem caused by the fact that Firefox fills in the "Content-Type" header in an HTTPRequest and IE doesn't. The PHP you run on your server is going to execute the same way no matter what browser the user has – of course, the resultant HTML may not image the same way but that's a problem no matter how you do you development.

You can mix JavaScript and PHP so you can use each to get around the limitations of the other.

That gets us back to whose CPU cycles do you want to burn. If you're planning to have a blockbuster virally-spreading world-changing application (which, of course, you aren't going to charge for) then you don't want to have to buy a huge server farm. You can outsource to Amazon EC2 or perhaps use the Google apps server; but millions of users are still gonna be expensive to support. That'll often be a good reason to use JavaScript and the user's cycles rather than PHP and cycles you pay for. The user isn't hurt by this because she's already waiting for her machine to do something and just wants it done fast – it may, in fact, happen faster with local JavaScript execution than if an interaction with the server is required.

The P2P services, including Skype and BitTorrent and Napster, all rely on user resources – both bandwidth and computing power. My guess is that many web services running in browsers will be successful because scalability is instant and "free" when each user's machine provide the resources to handle most of the incremental load that user represents and when the bandwidth for communication between application and server is used sparingly. That's a big reason for doing as much in JavaScript as you can.

Vista Misery and Mysteries

Wasn't planning to install Vista on my new Toughbook CF-30 because it's been hard to deal with on Mary's new HP; but I did and now have both some misery and an Internet Explorer protected mode mystery which I'd be glad for nerd help with.

I liked the fact that the new Toughbook came with XP installed plus recover DVDs for both Vista Business and XP. That meant, I thought, that I could give Vista a while to stabilize and then install it. Unlike Mary's preinstalled Vista Home, I knew I could even uninstall Vista and reinstall XP since I have the business edition and Panasonic supplied me with both recover DVDs including all the crucial drivers needed to go back and forth.

But then the fine print: you have to wipe your hard drive of all content to install Vista. Do I want to spend weeks getting things the way I want them on a new machine, run a couple of months with XP, then start all over again with Vista and a "clean" machine? No, I decided, since I have nothing of mine on the machine now, this is the time to install Vista. Then I'll get the Vista version of everything.

Right now I'm regretting the decision. And looking for nerd help with a mystery.

Vista is running and isn't noticeably slow on my new machine; it hasn't crashed. That's the good news.

But Vista seems determined to protect me from myself even though I run with administrator privileges.

At first I couldn't get any ActiveX extensions to install. The yellow bar above the browser window which usually warns me that I've clicked on something which wants to install an ActiveX extension now didn't give me the options of installing; it just told me that my security settings didn't permit ActiveX extensions to be installed; this despite the fact that I'd deliberately clicked an option to prompt for permission before installing an extension. Couldn't even get Microsoft's own software verification extension to install to get the latest fixes to Office 2007.

Turning off "Protected Mode" in the browser let extensions install (but without a warning which I don't like either). Then, while trying to figure out why there were no time-wasting games like minesweeper around, I discovered (by Googling, of course) that you can go through Control Panel/Programs/Programs and Features to "Turn Windows feature on and off". This not only lets you turn games on; it also lets you turn on the ActiveX installer service. I've verified that games instantly appeared; haven't stumbled across an uninstalled ActiveX component since so not sure this is working properly.

But here's the mystery:

Web pages that used to work fine including basic Facebook pages now SOMETIMES break because, according to IE, it can't load a DLL (doesn't say which DLL). This never happens when Protected Mode is turned off. It doesn't get cured by a reload but sometimes the same page WILL load without an error much later even when I know the HTML of the page hasn't changed. It never happens in Firefox but Firefox doesn't have a Protected Mode. If it happened in Firefox, it'd be easier to debug because of Firebug. It doesn't seem to happen in Protected Mode on Mary's machine because some of these are pages she goes to often and she hasn't complained (but she's running Vista Home). I can't run a parallel test or compare all the settings on our machines because she and her machine are traveling.

It's not a solution for me to just run Firefox or run in unprotected mode because, as a developer, I need to know why pages sometimes break. If they break for me, they'll break for other people as well.

Haven't been able to Google my way to a solution or find one on Microsoft's site.

Ideas anyone?

Why Old Computers Get Slow

My Toughbook CF-29, bought back in 2004 when I left the corporate world and expected to spend many days in physically tough places, has been getting slow. Mouse clicks and resulting actions are increasingly far apart. Windows open blank and don't fill in for eons. Programs go into non-responding status; sometimes they recover; sometimes they don't. Rebooting temporarily speeds things up but it takes longer and longer to shut down and restart.

Why? You ask. The speed of light hasn't changed. The circuits can't be slower than on the day you bought the thing. Why are old computers slow computers.

A small part of the problem is barnacles. Most of the problem is that programs are written for the average two year old machine and its capabilities. The old computer bogs down under limits of memory and processing power when asked to do tasks designed for its more modern successors.

The barnacles are all the stuff you installed over the years and probably aren't even using anymore. Inactive programs don't do any harm except take up disk space but some of what you installed, printer and communication programs and drivers for example, have a small part which loads itself at startup and absorbs resources all the time the machine is running. With some trouble (and some tuneup utilities I've never tried), you can find these and turn them off. If you don't, they absorb more and more memory and processing power. There is some "printer subsystem" on my old Toughbook which reports its own failure every couple of hours and asks permission to tell Microsoft about the problem. Microsoft doesn't offer any solutions when told and the failure of this subsystem doesn't seem to affect my printing; but it's there somewhere.

When I bought the old Toughbook I installed as much RAM (memory) as it would take: 512 megabytes; seemed huge to a guy who wrote programs for the 128 kilobyte Mac (the first Mac) and 16kb TRS-80 model 1. (a megabyte is a thousand kilobytes). "My" first computer was an IBM 7090 the size of a basketball court with the equivalent of about 156kB. It cost millions of dollars. But I've digressed to my age… back to the old computer.

The CF-29 has a single processor which runs (walks by today's standards) at 1.3GHz. It has a 40 gigabyte hard drive which is almost full.

When I first used the machine I had one window open on the Internet most of the time. Now I have at least six tabs open in Explorer – because I can. I've gotten a bigger screen and, when at my desk, I have windows spread across two screens for easier cross reference and cutting and pasting or perhaps because I have code in one window and I'm watching how it runs in another window. Whatever, I've got more stuff running at one time.

There isn't enough memory on my machine for all this stuff to be running at once so Windows puts some of it in "virtual memory" – really on disk from which it must be reloaded before use. Often it is clear that my computer is "thrashing" – the technical term for swapping pages in and out of memory so often that it can't do any real work. Picture a hundred people trying to work on something in a room with only space for ten; every time someone else is needed for the task at hand; someone has push his way out so someone else can push her way in. But the guy who went out hadn't finished so he reenters and pushes someone else out. Pretty soon it's all elbows and no productivity. That's my computer.

Programs like Google Earth and Sketchup assume that my computer can draw lightening fast. It can't at the resolutions they're feeding it. Turning the scroll wheel for zooming a graphic image results in a jerky ascent or descent like a rocket with misfiring engines.

Web pages now contain incredibly elaborate Javascript – easy to write; cool to use; but a big burden on an old CPU to interpret and execute. Then there's Flash. And videos embedded in everything. You can almost hear that lonely old CPU groan.

So that's why it's time for a new computer. My new Toughbook CF-30 (I still plan to go to all those tough places) has 4 gigabytes (4 billion bytes) of RAM (although Windows can only see 3.3 gig). It has an 80 gig hard drive. It has TWO processors each screaming along at 1.6GHz. It has more auxiliary graphics processors to take the load off the main processor. It has an embedded EV-DO radio and GPS to reduce the clutter in my gadget bag.

And it has Vista… So far not at all to my liking.

Now on Kindle!

hackoff.com: An historic murder mystery set in the Internet bubble and rubble

CEO Tom Evslin's insider account of the Internet bubble and its aftermath. "This novel is a surveillance video of the seeds of the current economic collapse."

The Interpreter's Tale

Hacker Dom Montain is in Barcelona in Evslin's Kindle-edition long short story. Why? and why are the pickpockets stealing mobile phones?

Need A Kindle?

Kindle: Amazon's Wireless Reading Device

Not quite as good as a real book IMHO but a lot lighter than a trip worth of books. Also better than a cell phone for mobile web access - and that's free!

Recent Reads - Click title to order from Amazon


  • adlinks
  • adsense