October 04, 2003

When you hire a yapping dog...

Imagine, for a moment, that a news program hired an annoying yappy dog to take part in the newscasts. (Given some of my experience, I imagine a Chihuahua, but feel free to imagine whatever you like.)

Now the dog is sort of cute sometimes, and mostly behaves for a while, but then one day, the dog, true to its nature, starts barking and yapping like mad, and no one can shut it up.

What is the real story here? That the dog yapped and barked and was generally an annoying pest? Or that someone thought that hiring the yappy little dog was a good idea in the first place?

So Rush Limbaugh said on ESPN that the Eagles quarterback Donovan McNabb is overrated just because people wanted to see a black quarterback do well. Three days later, he resigned over the controversy.

But who thought that hiring him was a good plan??

Posted by Mike at 10:58 PM

The depressing race for Governor

Next Tuesday, I get to cast my vote in the California gubernatorial recall election.

Ooh, what a privilege.

A mere 2 1/2 days until the election, and I still don't know how I'm going to vote. I am disgusted by Gray Davis' so-called leadership of the state of California. His blatant interference in the 2002 Republican primary for governor's race, basically engineering it so that he would face the ultra-conservative Bill Simon instead of the more moderate Richard Riordan, was deeply disturbing. (Of course, equally disturbing was the manner in which Republican voters let themselves be led like sheep into nominating a candidate that Davis knew he could beat. Davis may not have deserved to win that one, but the Republicans certainly deserved to lose it.) The only thing less impressive than Davis' handling of the budget deficit has been the astonishing lack of information on how bad the budget really was until just after last year's election. His sudden flip-flop on the bill to allow illegal immigrants to have driver's licenses is political pandering at its worst.

But the choices to replace him are even more depressing. Schwarzenegger has run an entire campaign based on saying as little as possible. It's hard to say where he stands on anything. Even his apology after the LA Times article about his alleged sexual misconduct managed to not say anything -- essentially, "I'm sorry for anyone I've offended even though I didn't do the things that article said." Huh?

Bustamante may be even worse, though. Rarely do you see a candidate quite so transparently bought and paid for by special interests. He managed to solicit enormous contributions into a 2002 re-election fund set up when he ran for Lt. Governor next year, in blatant violation of campaign finance reform laws passed to limit donations to $21,200 per donor -- or, at least, he did until a judge told him to knock it off. Where Bustamante has professed an actual position on something, I usually disagree with it. But lately he seems to be managing to say even less than Schwarzenegger. A Mercury News article earlier this week had the candidate's responses to questions about various immigration issues. Bustamante's responses were all between one and four words long. The only time they were longer than a single word was when the phrasing of the question precluded any chance of answering with a simple 'yes' or 'no'. While this certainly minimizes the chance of his being quoted out of context, it certainly does nothing to tell me where he stands on anything, either.

For the first time, I am sufficiently disgusted by the election that I am seriously considering walking into the polling place, collecting my ballot, and turning it back in untouched. I really don't know what to do.

Posted by Mike at 11:30 PM | Comments (2)

October 05, 2003

The Cubs finally win one

Well, the Chicago Cubs finally won a playoff series. By beating the Atlanta Braves tonight, they advance to the National League Championship Series. It's the first time the Cubs have won a postseason series since 1908.

I haven't followed baseball in years, but when I was a kid, I watched it all the time. I collected baseball cards, kept scorecards, the whole bit. And my favorite team? The Chicago Cubs. Making their victory even more special tonight: the team I loved to see lose was the Atlanta Braves.

It's good to see the Cubs finally win.

Posted by Mike at 09:34 PM

October 09, 2003

October 11, 2003

Oh, the humanity!

The game this weekend between UT and Georgia -- in Knoxville, no less -- was just too horrific for words. Lately, the Tennessee football team seems to have at least one game a year where they utterly humiliate themselves. Last year, it was the game against Florida. I can only hope that this year, the peak will have been the game against Georgia. It was a good game for the first 29 minutes and 58 seconds. Then, with two seconds left on the clock in the first half, UT fumbled the ball as they were about to score, and Georgia ran it back 92 yards for a touchdown.

The second half just added to the misery. At one point, Georgia scored three touchdowns within 2:35 on the clock. UT turned the ball over four times. Tennessee used to dominate Georgia so much that it was barely considered a real game. Now, Georgia has beaten us four years in a row.

It's rare that you can say that a game with a final score of 41-14 wasn't as close as the score indicated.

Oh, the pain...

Posted by Mike at 11:00 PM | Comments (1)

October 19, 2003

Not quite the best Windows installer ever

This was the error message that greeted me when I tried to install the new iTunes for Windows: "1607: Unable to install IntallShield Scripting Runtime."

I tried following all the directions that InstallShield provides on their site for how to fix this error. None of it helped. (My favorite step: "Install the Windows Installer engine." The InstallShield installer needs to use the Microsoft installer engine to work?)

The step that finally did work? I created another administrator user on my XP box and launched the iTunes installer as that user. Then it worked fine.

This is, unfortunately, fairly typical of my experience trying to install products built with InstallShield. Why Apple picked that as an installer is beyond me.

Posted by Mike at 01:30 PM | Comments (6)

Decision making

Last week, Peter Kaplan wrote to me about the infamous 8th inning of Game 6 of Marlins at Cubs:

"You know, it all happened in that moment when Dusty Baker failed to make a conscious decision to decide whether to take Mark Prior out when everyone could see that he didn't have the Stuff he had started with and that his breaking ball wasn't breaking. I mean, if Dusty had made the wrong decision, that would be OK. If he had not gotten to the point of making a decision but had at least committed to deciding, that would have been unfortunate timing, but respectable. But by all accounts, Dusty showed no sign of being in the process of deciding to make a decision... And the thing is, once the momentum shifts that way, it doesn't matter what else happens. The Cubs just aren't going to be the winners anymore at that point, and you know it in your gut. It was a sad moment for everyone who recognized it as such."

It's an profound observation. It's profound because it's so simple.

Many times in my career, entire business organizations have become paralyzed because of an inability, on the part of an individual or a team, to make a decision.

Imagine a race that starts out in Colorado. The destination is said to be somewhere in the northeast US -- but you won't know exactly where for a few days. One driver decides to wait until he knows exactly where he's going, so he can plan the fastest route possible. The other driver starts driving North-East right away.

Who do you think wins?

He wins because he didn't start driving towards California or Texas. He wins because he realized that some forward motion, in what was vaguely the right direction, got him closer to his goal. He wins even though he will certainly drive for more time and more miles than the first driver. He wins because he got enough of a head start that the extra time doesn't matter. And he wins because, when he does get the news of the final destination, he changes his course to start heading for it.

Of course, the reality is that you can never know all the information you need at the start. I once spent about a month and a half, along with several other senior engineers, basically sitting on our hands waiting for management to come up with the Perfect Plan for the next release of our product. We didn't start the race until management had decided on the exact destination -- but the destination changed before we got there anyway. We gave up a six week head start, and still had to make a course correction.

That was Dusty Baker's problem, in the end. He actually had a plan for getting to the World Series, but he couldn't see that he might need to change his course until it was too late.

I think it comes down to two distinct, albeit related, abilities. The first is the ability to make a decision in the first place -- to realize that going forward in something approximating the right direction is better than not moving at all until you have the exact direction. And the second is the ability to recognize when you have to change your course, because the first plan isn't going to work anymore.

Posted by Mike at 05:36 PM

October 21, 2003

AOL doesn't like handling AOL email?

This is one of the more surreal errors I've seen from a mail server lately:

SMTP error from remote mailer after RCPT TO:<address@aol.com>:
host mailin-01.mx.aol.com []: 550 INCORRECT DOMAIN IN MAIL/RCPT COMMAND

I wonder what domain it wanted??

It worked the next time...

Posted by Mike at 11:45 PM

October 24, 2003

Ah, politics

The next time you're wondering why the political process seems so polarized and rancorous, consider this week's news about the act of a San Francisco member of the Board of Supervisor's move to appoint two members to that city's Public Utilities Commission while he had temporary mayoral powers.

Mayor Willie Brown was traveling out of the country, and had appointed Supervisor Chris Daly as the acting mayor for the day. Daly decided it would be a good time to fill the two vacant slots on the PUC.

Regardless of the whether or not the two appointees are good choices, it's hard to imagine how this kind of moves helps anything. The clear lesson for Brown, and for politicians everywhere, is to never give a political opponent a single inch or they'll take a mile. And stab you in the back while they're at it.

For all I know, this may even be a good thing for San Francisco in the short term. Many people seem to think that the two appointees are positive choices. But this can't be a good thing for the political process in our country in the long term.

Posted by Mike at 11:34 PM

October 25, 2003

.NET AsyncCallbacks and completions

I ran into a bug in my code at work the other day that turned out to be because I misunderstood something how .NET Asynchronous Delegates work.

The basic idea behind Asynchronous Delegates is that you can split a function into two calls -- BeginInvoke to start the call asynchronously, and then EndInvoke once it's done in order to clean up the state and to get the return value (if any). There's also a WaitHandle exposed through IAsyncResult (IAsyncResult.AsyncWaitHandle) that you can use to wait for the call to be completed. Async Delegates are useful obviously for any async task, but are especially useful when you start working with .NET remoting, which lets you run code remotely. Since it's going over a network link, there's a huge advantage to being able to invoke the call asynchronously without having to block on the network call.

A C# example of calling an async delegate might look like:

	m_delegate = new DoSomethingDelegate(this.DoSomething);
	m_callback = new AsyncCallback(this.CompletionProc);
	IAsyncResult iar = m_delegate.BeginInvoke(m_callback, null);

My mistake was in thinking that the AsyncWaitHandle would be set (i.e., the call to WaitOne would finish) once the async callback (m_callback) had finished. But this isn't true: it is set as soon as the async call (the call through m_delegate) finishes.

In other words, once the async call finishes, the framework sets the AsyncWaitHandle and starts an async call to the AsyncCallback completion proc. If you really need to block until the AsyncCallback function finishes, you'll need to use something other than IAsyncResult.

You can download some C# sample code to see this in action. DoSomething is the async delegate, which sleeps for 1000 ms and returns. The completion proc also sleeps for 1000 ms and returns. When you run it, you'll see something like this:

About to call DoSomething at 0 ms
Enter DoSomething at 40 ms
Exit DoSomething at 1041 ms
WaitOne finished at 1041 ms
Enter CompletionProc at 1041 ms
Exit CompletionProc at 2042 ms

You can clearly see that IAsyncResult.AsyncWaitHandle was set ("WaitOne finished") at the same time as the async callback was called -- not when the async callback finished.

As a final note, you might wonder why there's a 40 ms delay between calling DoSomething asynchronously and having it actually start. This is true only the first time you use that asynchronous delegate -- subsequent calls have virtually no delay.

Posted by Mike at 10:54 AM

October 26, 2003


My sister, Amy, is living west of Los Angeles. You know, where all those fires are. She writes:

Just wanted to check in with everyone about the fires. They are very close but at this time our house is not in immediate danger. The fire line and evacuation is about 5 miles away. We're covered in ashes, but no flames so we're thankful.

Hope the fires are put out soon...

Posted by Mike at 06:18 PM | Comments (2)

October 28, 2003

Damning the world for a cause

For years, Microsoft has had an annual giving campaign where they encourage employees to donate money to their favorite charities. Microsoft matches 100% of employee donations to qualified charities up to $12,000 annually. Last year, employee contributions, Microsoft match, and corporate donations resulted in over $39.9 million in cash and $207 million worth of software being given to charitable causes around the world. In 2001, it was over $36.7 million in cash and $179 million in software.

At the upcoming Microsoft annual shareholders meeting, shareholders will be voting on the following proposal:

Resolved: The shareholders request the company to refrain from making direct charitable contributions. If the company wishes, it could pay a dividend and send a note to shareholders suggesting they contribute it to their favorite charity.

This proposal was put forth by an individual shareholder, not the Microsoft board. Why would she -- or anyone -- want to stop this kind of giving to needy charities?

Because some charities -- such as Planned Parenthood -- support abortion. So, to make sure that no money goes to charities that this person doesn't like, she has proposed that it is best to just stop the entire $247 million/year flow. Sheez.

Microsoft's board of directors has sensibly recommended a vote against this vindictive and destructive proposal.

Posted by Mike at 07:34 PM | Comments (1)

October 29, 2003

Free Bird

I'm up in Redmond for an MSTV launch party and the MS company meeting (tomorrow). Tonight was the launch party.

You know it's a party when you get to see your manager doing Free Bird karaoke.

Posted by Mike at 11:59 PM | Comments (1)