Monday, November 06, 2006 

King George II -or- How I Learned to Stop Worrying and Love W

This video says it all.

Go vote tomorrow!

posted on Monday, November 06, 2006 10:25:36 PM (Pacific Standard Time, UTC-08:00) 
#    Comments [0]
Thursday, November 02, 2006 

http://athena.libraries.claremont.edu/~blog/blog/images/scotty.jpg

I've seen a number of references to a Microsoft demo of speech recognition that went famously wrong, but it wasn't until this evening that I finally watched the CNBC Video that started the meme.

A TV reporter makes a snarky introduction then cuts to video of a Microsoft PM demoing the new speech recognition technology in Windows Vista. Dear Mom comma, he says. Dear aunt, appears in Word. It gets worse from there. Funny stuff. Go watch the original video.

But it's not the whole story. There's another video which sets the demo in context. Overall, the demo was reasonably successful and the speech commands worked fairly well.

If you think people talking into their cellphones is annoying now, wait until you hear them talking at their computers!

posted on Friday, November 03, 2006 3:32:41 AM (Pacific Daylight Time, UTC-07:00) 
#    Comments [0]

"This isn't an election anymore, it's an intervention."

— Andrew Sullivan on CNN.


Andrew Sullivan and Christopher Hitchens on CNN

I don't have much time for either Andrew Sullivan or Christopher Hitchens. Both of them bear a lot of blame for getting us into Iraq in the first place.

But here they are on CNN yesterday, ripping into Bush for saying that Rumsfeld is doing a fabulous job and that he and Cheney must stay until the end of his presidency.

(Via AmericaBlog)

posted on Thursday, November 02, 2006 9:13:55 PM (Pacific Daylight Time, UTC-07:00) 
#    Comments [0]
Wednesday, November 01, 2006 

http://images.google.com/intl/en_ALL/images/images_res.gif

For the last few months, every blog post that I've made has been accompanied by at least one image. Sometimes I already have an appropriate image. The rest of the time, I use whatever I could find after searching Google Images.

Earlier today, I came across 10 Tips for Google Image Search. I particularly like the Greasemonkey script which allows you to view the original image by clicking on the thumbnail.

posted on Thursday, November 02, 2006 12:38:18 AM (Pacific Daylight Time, UTC-07:00) 
#    Comments [0]

content/binary/email-kid.jpg

Email is addictive because of "operant conditioning":

This means the mechanisms by which behaviour is shaped by its consequences; how what we do depends on the rewards and punishments of what we did last time. ... The most effective training regime is one where you give the animal a reward only sometimes, and then only at random intervals. Animals trained like this, with what's called a 'variable interval reinforcement schedule', work harder for their rewards, and take longer to give up once all rewards for the behaviour is removed. There's a logic to this. Although we might know that we've stopped rewarding the animal, it has got used to performing the behaviour and not getting the reward. Because 'next time' might always be the occasion that produces the reward, there's never definite evidence that rewards have stopped altogether.

... Checking email is a behaviour that has variable interval reinforcement. Sometimes, but not everytime, the behaviour produces a reward. Everyone loves to get an email from a friend, or some good news, or even an amusing web link. Sometimes checking your email will get you one of these rewards. And because you can never tell which time you check will produce the reward, checking all the time is reinforced, even if most of the time checking your email turns out to have been pointless.

So what to do about it?

If a behaviour isn't rewarded then it will gradually disappear. The problem is that we don't want to remove the reward (email), so we need, instead, to weaken the strength of the link between the action and the reward. A simple delay would do this - imagine a five minute delay between hitting the check email button and getting new email. A delay is doubly-effective because the longer the delay the more likely you are to have email and so the more consistent the reward will be.

I didn't find any suggestions that were particularly effective, however.

I'm not addicted to email, per se. I can however surf the web endlessly. There's always one more fascinating link to follow.

posted on Wednesday, November 01, 2006 8:12:38 PM (Pacific Daylight Time, UTC-07:00) 
#    Comments [0]

I've up loaded my Halloween pictures to Flickr.

posted on Wednesday, November 01, 2006 9:20:03 AM (Pacific Daylight Time, UTC-07:00) 
#    Comments [0]
Thursday, October 26, 2006 

content/binary/linux-security-cookbook.gif

Windows deservedly gets a lot of bad press about the unending stream of security updates. But Linux, despite all of the propaganda about it being more secure than Windows, has its own security problems.

Take this post from LWN.net yesterday:

No security updates today
[Posted October 25, 2006 by corbet]

It is sad that this is worthy of note, but it is: on this day, Wednesday, October 25, we have not received a single security update for any Linux distribution.

(This post was composed on a laptop running Kubuntu 6.06.)

posted on Friday, October 27, 2006 6:40:36 AM (Pacific Daylight Time, UTC-07:00) 
#    Comments [0]

http://lolcat.com/pics/pcdrivestealer.jpg

I found a series of amusing cat pictures, via Ned Batchelder's blog.

Update 2007/10/04: That site is gone, but fairly similar photos can be found at LOLCats.

posted on Thursday, October 26, 2006 8:42:37 PM (Pacific Daylight Time, UTC-07:00) 
#    Comments [0]

content/binary/italian-girl-opera.jpg

My operatic education continues. Tonight we saw the Seattle Opera's production of The Italian Girl in Algiers, aka L'italiana in Algeri .

The plots in opera, especially comedic opera, are always wildly improbable. This one revolves around Mustafà, the buffoonish Bey of Algiers, who wants to pass off his wife Elvira to Lindoro, an Italian slave, and take instead the newly arrived Italian girl, Isabella. Isabella has come in search of her lost love -- Lindoro, of course -- and has brought another lover, Taddeo, also a buffoon, who poses as her uncle. Isabella is more than a match for every man who crosses her path, twisting them around her little finger.

The performances are delightful and the music is a treat. Mustafà, the petulant Bey, as played by Simone Alberghini, is particularly funny. Recommended.

posted on Thursday, October 26, 2006 7:14:09 AM (Pacific Daylight Time, UTC-07:00) 
#    Comments [0]
Tuesday, October 24, 2006 

In my wanderings, I recently came across two sites where you can ask all kinds of strange questions, with a reasonable expectation of getting an answer.

content/binary/questions.gif

Little Details: "writers have questions, other writers have answers". A LiveJournal community for writers seeking all kinds of background information for their plots. Some samples:

  • 1920's cold remedies

  • Danish drinking songs

  • Control parents have over their children testifying.

Ask MetaFilter is more general purpose. It's a good place to go when your question can't be reduced to a keyword search on Google. Sample questions:

  • What's the fastest and cheapest way to paint a red room white?

  • Is there a program for the Mac that will scroll a window to capture a screenshot of its entire contents?

  • I want to be my own YouTube/Google video. Is there an easy way to show videos on my own server embedded in a page?

  • What's the best vegan substitute for lard?

posted on Tuesday, October 24, 2006 7:01:29 AM (Pacific Daylight Time, UTC-07:00) 
#    Comments [0]
Thursday, September 28, 2006 

In the past few weeks, I've received not one but two letters from Christine Gregoire, the governor of Washington State, looking for support in re-electing her. The thing is, is that she's running in 2008, not 2006.

I threw away the first one. On the second one, I wrote something like this and mailed it back:

If this had come in December, I have been willing to support you. But not six weeks from a high-stakes election. What the hell are you thinking? Don't bother me again before 2008.

Sheer idiocy. Why would anyone send her money at the moment, instead of making donations towards the mid-term elections?

posted on Thursday, September 28, 2006 11:39:20 PM (Pacific Daylight Time, UTC-07:00) 
#    Comments [0]
Wednesday, September 27, 2006 

I experimented with Google's new service, Google Transit.

It suggested this route for traveling from my home to my work:

 Begin by walking
1 Start at 4XXX 13th Ave S
2 Go to Airport Way S & S Industrial Way (takes about 7 mins)

Take the King County Metro 131 (Direction: NORTH)
3 7:17pm leave from Airport Way S & S Industrial Way
4 7:24pm arrive at 4th Ave S & S Jackson St

End by walking
5 Go to 315 5th Ave S (takes about 2 mins)

This fails badly in two respects.

First, four bus routes run along 15th Avenue S, two blocks east of my house: the 39, the 32, the 36, and the 60. The 39 drops me one block from work at 4th & Jackson. The 60 leaves me at 12th & Jackson. The 36 only runs along 15th after 7pm; earlier than that, I a 10-minute walk to Beacon Ave. And the 32 is an express bus that only runs at rush hour.

Second, it suggests that it's a seven-minute walk to Airport Way S & S Industrial Way. Actually, it's a two-mile walk, because I-5 and the railroad are in the way. You have the unpleasant choices of walking north to Spokane Street and climbing down an endless set of stairs at the freeway onramp, or south to the Lucile St bridge. And even if there were a direct route, it would take at least 10 minutes to walk down there.

That said, it integrates very nicely with Google Maps.

The Google Transit page links to Metro Trip Planner, which does a better job. Their disambiguation of addresses sucks, however. Try entering 5th & Jackson. It suggests a short list, starting with 5TH AVE S & S JACKSON ST (in SEATTLE). However, if you actually type that address into the main page, it offers you a long list of suggestions. In other words, it can't consume its own output.

Update 2006/12/29. I just tried the same experiment again. Google Transit now correctly suggests walking two blocks east to 15th Ave S and taking the 39.

posted on Thursday, September 28, 2006 3:11:03 AM (Pacific Daylight Time, UTC-07:00) 
#    Comments [0]

content/binary/iraq-torture-dogs-thumb-tm.jpg

I just sent the following letter to my senators, Patty Murray and Maria Cantwell, as well as to the Seattle Post-Intelligencer's Letter Page :

How has America come to this? Is the United States of America truly about to repudiate the Geneva Convention? Is the Senate about to let the President decide when and whom to torture?

This is foul. This is wholly un-American. This is deeply immoral. Every civilized society abhors torture.

How can we claim to be spreading Democracy in the Middle East at the same time that we commit torture? Are we to lose all of our moral standing in the eyes of the world under this wretched Administration?

Tell me that we're better than this. Please!

Senator, you must oppose this wholeheartedly. Do not let it come to a vote on the floor of the Senate.

posted on Wednesday, September 27, 2006 7:43:47 AM (Pacific Daylight Time, UTC-07:00) 
#    Comments [1]
Tuesday, September 19, 2006 

Via AmericaBlog, an amusing video of a cockroach taking on a weatherman. Twice.

posted on Wednesday, September 20, 2006 2:28:53 AM (Pacific Daylight Time, UTC-07:00) 
#    Comments [0]
Wednesday, September 13, 2006 

I ran into a problem installing some COM+ components today. The installer was using Regsvcs.exe to register each COM+ component. I noticed after a while that the installer wasn't making any progress and that my dual-proc system was stuck at 50% CPU utilization. I attached a debugger to the offending process, regsvcs, and found that it was stuck in the following infinite loop (disassembly courtesy of Reflector):

internal void System.EnterpriseServices.CatalogSync.Wait()
{
if (this._set)
{
RegistryKey key1
= Registry.LocalMachine.OpenSubKey("SOFTWARE\\Classes\\CLSID");
while (true)
{
int num1 = (int) key1.GetValue("CLBVersion", 0);
if (num1 != this._version)
{
break;
}
Thread.Sleep(0);
}
this._set = false;
}
}

There are two severe problems with this code.

  1. The loop should time out. There must be some reasonable limit after which you can incontrovertibly say that something must have gone wrong, and throw an exception. There has to be some way to terminate a loop.

  2. Never use Sleep(0) in a loop. Sleep(0) yields the processor only if there's a runnable thread. If there isn't, Sleep(0) will return immediately. If the code is sitting in a tight loop, the net effect is that it will maximize the CPU until the thread's quantum is exhausted. There are no other runnable threads, so the scheduler immediately starts this thread again. This code will run until your CPU burns out.

(And, yes, I have committed both of these sins in shipping code. Why do you ask?)

I don't know what the calling code is doing or why CLBVersion isn't being altered by some other thread or process. I had to use RegEdit to modify this value to get the loop to terminate, whereupon RegSvcs immediately did its work and terminated. And then it started all over again, with the next invocation of RegSvcs on another COM+ component. I don't know if the components are really installed properly. I had to leave at that point.

posted on Thursday, September 14, 2006 6:53:47 AM (Pacific Daylight Time, UTC-07:00) 
#    Comments [0]
Monday, September 11, 2006 

As I mentioned last month, I participated in this year's AIDS Walk on Saturday.

I raised over $1300 online, handily exceeding my goal of $1,000. I also raised another $300 in cash and checks at the fundraising barbecue that we threw on September 1st.

I've lost count, but I believe that in the last 15 years, I've raised about $10,000 for charity. Most of it has been for the Northwest AIDS Walk. The last few years that I was at Microsoft, I raised $2,000-$3,000 each year, thanks to the power of Microsoft matching, which doubled the amount of money that I raised. I've also raised money two years running for Ugandan orphans sponsored by Vim: Microsoft Vim Users raised $2650 for orphans in Uganda.

Go me! ;-)

posted on Tuesday, September 12, 2006 6:29:15 AM (Pacific Daylight Time, UTC-07:00) 
#    Comments [0]

Nine-Eleven. The date burned into everyone's brain. One of those dates where everyone remembers where they were when they heard the news. Emma and I awoke to the radio telling us that planes had crashed into the World Trade Center. We went downstairs and watched the TV in horror.

For a time, an all-too-brief time, the country pulled together in a show of unity and grief. The world joined us in an outpouring of support.

There are many reasons why history will condemn George Bush, but one of the most serious is his squandering that good will for quick partisan advantage. A better man could have built a bipartisan consensus to tackle terrorism in a serious way. Ask not what your country can do for you -- just go shopping.

He should have finished the job in Afghanistan. Instead, his attention turned to fomenting the irrational, immoral Iraq war, which turned the world against us.

In many ways, the terrorists have won. This country slides slowly towards a police state, as Bush arrogates imperial powers to himself. Bush and bin Laden have a symbiotic relationship. Bush has turned Iraq into a recruiting ground for Al Qaeda. Bin Laden is the ever-threatening boogeyman to scare the American people.

posted on Tuesday, September 12, 2006 5:34:57 AM (Pacific Daylight Time, UTC-07:00) 
#    Comments [0]
Wednesday, September 06, 2006 

MoneyCentral is reporting that our Video On Demand product is running a major pilot:

Cable television operator Sunflower Broadband and MTV Networks today announced that they are launching a market-leading campaign to dynamically insert national advertisements into on-demand cable television. Sunflower will begin dynamically placing ads into MTV Networks on-demand programming this week. The first campaign, created and managed by the agency Mediaedge:cia, promotes the theatrical release of Paramount Pictures' and MTV Films' major motion picture "jackass number two", in theaters nationwide on September 22. Ads for the movie will be inserted into Comedy Central On Demand programs at the moment that viewers request the free on-demand shows.

more ...

posted on Wednesday, September 06, 2006 6:43:31 PM (Pacific Daylight Time, UTC-07:00) 
#    Comments [0]
Friday, September 01, 2006 

My colleague, Greg, and I spent all day debugging a build break in some unit tests that exercise a webservice interface in legacy .NET 1.1 code. Last night, the tests stopped working on our CruiseControl.NET build server. We couldn't understand it. The tests had been working for months. Now we were getting timeouts in SOAP. The tests essentially mock a SOAP service using the soap.inproc transport and a stub implementation that signaled an event to acknowledge a method being called.

The only thing that had changed in the code tree was that another colleague, Pavel, had discovered that two of our .csproj files somehow shared the same GUID, and had repaired that. But that could hardly have any effect on the WSE2 runtime. Could it?

Turns out that it was the cause of the break. NAnt 0.85 rc2 and rc3 silently failed to build the NUnit assembly because of the duplicated GUIDs. The assembly was not getting propagated to the directory where all the other NUnit assemblies are placed. The CC.NET task that ran the tests never noticed the missing assembly because the test was couched in terms of *.NUnit.dll. And we never noticed that the test hadn't been run in months because we have ~20 such NUnit assemblies, and the NUnit summary output goes on for several screens in CC.NET.

Morals of the story

  1. Use NAnt 0.85 rc4, which detects the GUID collision and treats it as a fatal error.

  2. Create .csproj files through the IDE, not by taking an existing file and hacking on it. (At least, that's we assume happened.)

  3. Assumptions can bite you. We assumed that the code was being run all along, so it took us several hours to draw the connection between Pavel's checkin and the failing NUnit assembly.

  4. Don't mock a webservice by implementing a dummy SoapReceiver, hauling in the WSE runtime and a boatload of non-determinism. (Instead, make fun of its dress sense.) For our newer code, we've been taking an approach like this, using partial classes and Rhino Mocks.

  5. We have also taken to including our test fixtures in the same assemblies as the code they test. I have mixed feelings about this: it offends my sensibilities to have all this test code compiled into production code. But it would certainly have been hard to miss the build break in production code.

posted on Saturday, September 02, 2006 3:17:42 AM (Pacific Daylight Time, UTC-07:00) 
#    Comments [0]
Tuesday, August 29, 2006 

In mid-July, most of the Atlas Solutions developer teams moved from our old offices at Fifth and Jackson in the International District four blocks west to swanky offices in Pioneer Square. The new offices are at the State building on the corner of Occidental and Main, the pedestrianized block with the antique stores and art galleries. Occidental Park across the street has been refurbished. There are three coffee shops within two blocks, and Elliott Bay Books is one block west of us. It's all very pleasant, with the exception of the large number of homeless people.

The only thing that I miss from the old offices is that we're further from the large number of Asian restaurants in the International District.

I move back to 5&J the week after next. Two developers from my team, Atlas OnDemand, are being loaned to another team for a few months.

The picture of me on a milk carton arises from the email exchange after the loan was announced. Our boss said that he would post pictures of the two of us so that the OnDemand team wouldn't forget what we look like. I demanded to see my picture on a milk carton and, lo, that was arranged forthwith.

posted on Wednesday, August 30, 2006 6:20:02 AM (Pacific Daylight Time, UTC-07:00) 
#    Comments [1]