WebTV Anecdotes

Two stories that shouldn't be allowed to fade out of history.

I also put a couple of old 30-second TV spots up on youtube.

The wrong error message

In the late hours of September 17th, 1996, the day before the WebTV service was scheduled to go online, a group of us (Rick Daley, Lennart Lövstrand me (Andy McFadden), probably Arnold de Leon, plus several others I can't remember) had gathered in the operations center in 275 Alma St., Palo Alto. A collection of network operations and service software engineers were hanging around to bear witness to the official launch of WebTV.

When the fated hour struck, one of the netops folks, Bryce Jasmer, started to go through the registration process with his WebTV box. As with any online service, we figured the good names would go quickly, so it was important to get in and register before The Masses signed up. Besides, there was something nifty about being one of the first people to ever sign up on the "real" service. Until this day, all accounts were "disposable" test accounts.

A few of us were standing around, watching him type, feeling giddy with anticipation and lack of sleep. He'd entered his name, address, and other personal information, and was typing in his user name. This is the name used as the e-mail address. He typed in "jazz", so his e-mail would be "jazz@webtv.net". When he hit "enter" on the wireless keyboard, we heard the "whoom" sound that meant an error dialog was coming up. All eyes turned to the screen.

To understand what happened next, it's important to understand a little something about how the service worked. WebTV was meant to be a family-oriented service, so it was important to screen all user names and other externally visible features for profanity. It's impossible to catch everything, but it's not hard to catch obvious things.

The user names were compared against a set of regular expressions. Regular expressions allow you to match against a pattern. For example, " fu.*bar " would match against all names starting with "fu" and ending with "bar". With carefully-chosen patterns, you can catch and reject blatant instances while accepting words like "shitake" and "matsushita" that have a profane word embedded within them.

The same mechanism was also used to prevent users from selecting "forbidden" names, such as "postmaster", "root", "admin", and "help". We had a text file that looked like this:

admin.*

User names may not start with "admin".

postmaster

You're not the postmaster.

poop

That's a bad word.

weenie

That's a bad word.

An entry had two lines. The first was the regular expression to match, the second was the error message that would be displayed to the user. The service code read the file, grabbing two lines at a time, and when a user name was entered it compared the name against every regular expression. An error dialog was displayed for the first one that matched. If nothing matched, the user name was accepted.

The code that read the file knew how to skip over comments. It did not, however, give any special treatment to blank lines.

Someone had made some changes to the file with the profanity expressions, and while doing so had added a single blank line after the end of the "reserved" names and before the start of the profane words. When the code read the filter list, it grabbed the blank line as the regular expression, and the word that followed as the error message. As luck would have it, a blank-line regular expression matched anything.

It's midnight. We're all a little punchy. Bryce types in a user name, and the box responds with a very simple message (click here to view).

We start laughing hysterically. Other people come over, wondering what's up. We point at the screen. They start laughing hysterically.

Over in a different building, Mark Armstrong (the guy in charge of QA) is sitting with Bruce Leak (one of the company founders) in front of a rack of sixteen WebTV boxes. The setup, dubbed "racksville", is connected via a video multiplexer to a large TV that is showing all 16 boxes simultaneously. They've started through the registration process with all of the boxes, using the infra-red keyboard to broadcast commands. We call them up on speaker phone.

Us: "So, how's it going?"

Them: "Everything's fine here."

Us: "Oh, okay. You might notice something when you register a box."

Them: "Really? We haven't seen anything odd yet."

Us: "You will."

Them: "Okay. We're entering the zip code... seems fine. <more typing> <pause> WHOA!!"

The friendly dialog was now popping up on the screens of all sixteen boxes. They suggested that maybe we ought to fix that glitch sometime soon. We thought that was a fine idea.

We fixed the filter file, and eventually changed the code to recognize and ignore blank lines. As far as I know the WebTV service never said "oh, f--k" to any actual customers.

Ode to a cron job

When the service was still under development we had some daily scripts, run by a program called "cron", that would generate reports. The reports were run by a user called "production". This wasn't a real person, and in fact any mail sent to "production" went to a few dozen people.

For a brief period, the report generator was malfunctioning and spitting out hundreds of error messages. The "cron job" dutifully reported the full text to "production", which meant that a few dozen people would get a rather lengthy collection of highly repetitive nonsense every morning. It usually looked like a few hundred lines of this:

*HandleHTTPAction() ReportUsage.c:975 (unknown)[6851] -/- 07/23 00:38:03 Missing "bytes-served" for action "http" *HandleHTTPAction() ReportUsage.c:983 (unknown)[6851] -/- 07/23 00:38:03 Missing "visit-url" for action "http" *HandleHTTPAction() ReportUsage.c:975 (unknown)[6851] -/- 07/23 00:38:03 Missing "bytes-served" for action "http" *HandleHTTPAction() ReportUsage.c:983 (unknown)[6851] -/- 07/23 00:38:03 Missing "visit-url" for action "http"

This had been going on for several days, and the owner of the reports didn't seem inclined to fix it. Late one night -- actually, early one morning -- I composed the following. Lines starting with '>' are from the original message.

From: Andy McFadden <fadden@artemis.com> Subject: Re: Output from "cron" command To: production@monster.artemis.com Date: Tue, 23 Jul 1996 01:17:57 -0700 (PDT) In-Reply-To: <199607230739.AAA06882@monster.artemis.com> from "production@monster.artemis.com" at Jul 23, 96 00:39:03 am >Your "cron" job It's not my cron job. >cd reports && ./do-report Can we have dont-report instead? >produced the following output: Oh boy. >*ProcessPendingOptions() Options.c:658 (unknown)[6851] -/- 07/23 00:38:03 > *** No such file or directory *** Whassamatta, you never heard of "find"? >*DoLogV() Log.c:666 (unknown)[6851] -/- 07/23 00:38:03 > *** No such file or directory *** DoLogV? I ThinkV AllV WordsV ShouldBeV MixedCaseV AndEndInVV. >*HandleHTTPAction() ReportUsage.c:975 (unknown)[6851] -/- 07/23 00:38:03 > Missing "bytes-served" for action "http" I don't care. >*HandleHTTPAction() ReportUsage.c:983 (unknown)[6851] -/- 07/23 00:38:03 > Missing "visit-url" for action "http" I don't care about that either. >*HandleHTTPAction() ReportUsage.c:975 (unknown)[6851] -/- 07/23 00:38:03 > Missing "bytes-served" for action "http" You already said that. I didn't care the first time. >*HandleHTTPAction() ReportUsage.c:983 (unknown)[6851] -/- 07/23 00:38:03 > Missing "visit-url" for action "http" You seem to be obsessed with visiting. >*HandleHTTPAction() ReportUsage.c:975 (unknown)[6851] -/- 07/23 00:38:03 > Missing "bytes-served" for action "http" I don't care. >*HandleHTTPAction() ReportUsage.c:983 (unknown)[6851] -/- 07/23 00:38:03 > Missing "visit-url" for action "http" Stop that. >*HandleHTTPAction() ReportUsage.c:975 (unknown)[6851] -/- 07/23 00:38:03 > Missing "bytes-served" for action "http" Stop sending me these messages. >*HandleHTTPAction() ReportUsage.c:983 (unknown)[6851] -/- 07/23 00:38:03 > Missing "visit-url" for action "http" I'm calling the police. >*HandleHTTPAction() ReportUsage.c:975 (unknown)[6851] -/- 07/23 00:38:03 > Missing "bytes-served" for action "http" Really. I'm calling the police. >*HandleHTTPAction() ReportUsage.c:983 (unknown)[6851] -/- 07/23 00:38:03 > Missing "visit-url" for action "http" Why do you keep touching me? >*HandleHTTPAction() ReportUsage.c:975 (unknown)[6851] -/- 07/23 00:38:03 > Missing "bytes-served" for action "http" Quit it! >*HandleHTTPAction() ReportUsage.c:983 (unknown)[6851] -/- 07/23 00:38:03 > Missing "visit-url" for action "http" Leave me alone! >*HandleHTTPAction() ReportUsage.c:975 (unknown)[6851] -/- 07/23 00:38:03 > Missing "bytes-served" for action "http" Shaddup! >*HandleHTTPAction() ReportUsage.c:983 (unknown)[6851] -/- 07/23 00:38:03 > Missing "visit-url" for action "http" Stop >*HandleHTTPAction() ReportUsage.c:975 (unknown)[6851] -/- 07/23 00:38:03 > Missing "bytes-served" for action "http" it >*HandleHTTPAction() ReportUsage.c:983 (unknown)[6851] -/- 07/23 00:38:03 > Missing "visit-url" for action "http" now >*HandleHTTPAction() ReportUsage.c:975 (unknown)[6851] -/- 07/23 00:38:04 > Missing "bytes-served" for action "http" Burma Shave. >*HandleHTTPAction() ReportUsage.c:983 (unknown)[6851] -/- 07/23 00:38:04 > Missing "visit-url" for action "http" Get a life already. It's just a damn visit-url. >*HandleHTTPAction() ReportUsage.c:975 (unknown)[6851] -/- 07/23 00:38:04 > Missing "bytes-served" for action "http" Your concern about the number of bytes is touching. >*HandleHTTPAction() ReportUsage.c:983 (unknown)[6851] -/- 07/23 00:38:04 > Missing "visit-url" for action "http" Come visit and see the majestic m00ses. >*HandleHTTPAction() ReportUsage.c:975 (unknown)[6851] -/- 07/23 00:38:04 > Missing "bytes-served" for action "http" I'm being oppressed! Come see the byte servitude inherent in the system! >*HandleHTTPAction() ReportUsage.c:983 (unknown)[6851] -/- 07/23 00:38:04 > Missing "visit-url" for action "http" Have you tried putting its picture on a milk carton? >*HandleHTTPAction() ReportUsage.c:975 (unknown)[6851] -/- 07/23 00:38:04 > Missing "bytes-served" for action "http" GO AWAY AND LEAVE ME ALONE. >*HandleHTTPAction() ReportUsage.c:983 (unknown)[6851] -/- 07/23 00:38:04 > Missing "visit-url" for action "http" The mail-daemon hits... killed by a mail daemon on level 0. >*HandleHTTPAction() ReportUsage.c:975 (unknown)[6851] -/- 07/23 00:38:04 > Missing "bytes-served" for action "http" Is this the World Wide Superhighway? >*HandleHTTPAction() ReportUsage.c:983 (unknown)[6851] -/- 07/23 00:38:04 > Missing "visit-url" for action "http" I'm SO glad I get this, because I don't get enough mail. >*HandleHTTPAction() ReportUsage.c:975 (unknown)[6851] -/- 07/23 00:38:05 > Missing "bytes-served" for action "http" You're in a maze of twisty log output, all alike. >*HandleHTTPAction() ReportUsage.c:983 (unknown)[6851] -/- 07/23 00:38:05 > Missing "visit-url" for action "http" This is an ad for that "multiplicity" movie, right? >*HandleHTTPAction() ReportUsage.c:975 (unknown)[6851] -/- 07/23 00:38:05 > Missing "bytes-served" for action "http" If at first you don't succeed, say it again another 40 times. >*HandleHTTPAction() ReportUsage.c:983 (unknown)[6851] -/- 07/23 00:38:05 > Missing "visit-url" for action "http" Maybe you should just stop and shoot yourself in the head when there's errors? >*HandleHTTPAction() ReportUsage.c:975 (unknown)[6851] -/- 07/23 00:38:05 > Missing "bytes-served" for action "http" Maybe a human being should run this a couple of times? >*HandleHTTPAction() ReportUsage.c:983 (unknown)[6851] -/- 07/23 00:38:05 > Missing "visit-url" for action "http" Maybe it shouldn't go to production? >*HandleHTTPAction() ReportUsage.c:975 (unknown)[6851] -/- 07/23 00:38:05 > Missing "bytes-served" for action "http" Maybe I should be doing work instead of responding to do-report output? >*HandleHTTPAction() ReportUsage.c:983 (unknown)[6851] -/- 07/23 00:38:05 > Missing "visit-url" for action "http" Which part of "shut the hell up already" didn't parse correctly? >*HandleHTTPAction() ReportUsage.c:975 (unknown)[6851] -/- 07/23 00:38:05 > Missing "bytes-served" for action "http" Missing In Action IV: http://www.pow.com/Rescue.html >*HandleHTTPAction() ReportUsage.c:983 (unknown)[6851] -/- 07/23 00:38:05 > Missing "visit-url" for action "http" Say, we're getting near the end, aren't we? >*HandleHTTPAction() ReportUsage.c:975 (unknown)[6851] -/- 07/23 00:38:05 > Missing "bytes-served" for action "http" Will there be a test on all this material later? >*HandleHTTPAction() ReportUsage.c:983 (unknown)[6851] -/- 07/23 00:38:05 > Missing "visit-url" for action "http" And now for something completely different. Not. >*HandleHTTPAction() ReportUsage.c:975 (unknown)[6851] -/- 07/23 00:38:05 > Missing "bytes-served" for action "http" So a byte walks into a bar and asks to be served... >*HandleHTTPAction() ReportUsage.c:983 (unknown)[6851] -/- 07/23 00:38:05 > Missing "visit-url" for action "http" I'm really going to miss these messages when they go away. >*HandleHTTPAction() ReportUsage.c:975 (unknown)[6851] -/- 07/23 00:38:05 > Missing "bytes-served" for action "http" It's good to have a daily affirmation that our service doesn't work. >*HandleHTTPAction() ReportUsage.c:983 (unknown)[6851] -/- 07/23 00:38:05 > Missing "visit-url" for action "http" New from Time-Life: The Best of the Do-Report Failures >*HandleHTTPAction() ReportUsage.c:975 (unknown)[6851] -/- 07/23 00:38:05 > Missing "bytes-served" for action "http" I'm Earl Schieb, and I'll paint that report generator for $39.95. >*HandleHTTPAction() ReportUsage.c:983 (unknown)[6851] -/- 07/23 00:38:05 > Missing "visit-url" for action "http" Can we mail these to John's box a few hundred times? >*HandleHTTPAction() ReportUsage.c:975 (unknown)[6851] -/- 07/23 00:38:05 > Missing "bytes-served" for action "http" This is some sort of Olympic event I don't know about, right? >*HandleHTTPAction() ReportUsage.c:983 (unknown)[6851] -/- 07/23 00:38:05 > Missing "visit-url" for action "http" Stop the madness! >*HandleHTTPAction() ReportUsage.c:975 (unknown)[6851] -/- 07/23 00:38:05 > Missing "bytes-served" for action "http" Good bye cruel message, I'm leaving you today. >*HandleHTTPAction() ReportUsage.c:983 (unknown)[6851] -/- 07/23 00:38:05 > Missing "visit-url" for action "http" > > - Andy