« September 2005 | Main | November 2005 »

October 31, 2005

Halloween Theme

OK, inspired by Brian Fugere I decided to add some personality to the site for Halloween. Hope you like it enough to make me your sole source for Microsoft blogging. Just think, if you're reading this over RSS you'll miss all this.

And watch out for those ghosties and goblins driving home.

Posted by AdamBa at 12:50 PM | Comments (0) | TrackBack

October 30, 2005

get-help about_signing

In the latest drop of Monad we changed the default ExecutionPolicy from "RemoteSigned" to "Restricted". The upshot of this is that people will likely receive messages that point them to "get-help about_signing" for more information.

Unfortunately we did not have the actual help written in time to include it with the drop--before we do a drop we have to build it, then sign it, then build a setup file, then sign that, then run a battery of tests on various architectures and operating systems, and then package it up for download. This all takes time (a couple of weeks, more or less) and we wanted to release the new bits sooner not later because the RTM of Whidbey is now available and people are hankering for Monad.

In the meantime we now have a version of the about_signing help file, written by Lee Holmes. We added it to the .zip you download with Monad, and if you want it to be picked up by get-help inside Monad, just copy the file about_signing.help.txt to your Monad installation directory. But I'm also including it right here in the hope that it will get picked up by anyone who searches the web for the file. And I'll put the name in the link text in case that helps. So here it is: about_signing.

Posted by AdamBa at 06:13 PM | Comments (4) | TrackBack

October 28, 2005

Monad Release for Whidbey RTM

The RTM bits of Whidbey (.NET Framework 2.0) are starting to become available (MSDN subscribers can get them now, and I also saw a link to a public download of the framework, although I don't know if that is officially encouraged so I won't link to it).

We have put up new builds of Monad that work with the RTM version of Whidbey. You can choose the x86 version or the x64 version.

This version also works with earlier Release Candidates of Whidbey (any version of the form 2.0.50727.xx), such as the one handed out at the PDC.

Posted by AdamBa at 09:52 PM | Comments (6) | TrackBack

Happy Birthday to BillG

It was 50 years ago today...that Bill Gates was born. I would say he's had a pretty successful first half-century. Happy Birthday, Bill.

Posted by AdamBa at 08:53 AM | Comments (1) | TrackBack

October 27, 2005

Business Poeple Speaking Like Idiots

Today I went to a talk at Microsoft by Chelsea Hardaway and Brian Fugere, authors of Why Business People Speak Like Idiots.

The basic thrust of the book is that people in business engage in all kinds of nonsense talk about synergy and positive re-energizing and cross-group harmonicas and the like. Hardaway and Fugere are out on the road hawking their book, but they decided to take the opportunity to tell Microsoft what it needed to do to "get to the next level". This was perhaps the first warning sign, that the authors of a book about eliminating lame-o business-speak would use the content-sparse phrase "get to the next level".

Still the talk started out encouragingly with the claim that what Microsoft was missing was "personality", which caused us to fall into the "anonymity trap". OK so why are we lacking in personality? Well, it seems that Google has those cool logo mashups, and Apple has nice packaging for their products. Microsoft doesn't have this stuff, so we are doomed to run in place. Plus Apple put Rosa Parks up on their homepage when she died, and would Microsoft ever do that?

OK, the Google logos are cool. I even believe Brian's claim that he uses Google as his search engine solely because of them, but that's considering the source. And Apple does have cool packaging, and they happened to have already used a photo of Rosa Parks on a bus in their "Think Different" campaign, so it made sense to post it on their homepage when she died. But does this really mean that these companies have a fundamental "personality" that Microsoft lacks?

It's funny because at first Fugere was making some sense. He talked about the book A Whole New Mind and how people are affluent enough that they can start looking for notions like meaning, beauty, experience, story, uniqueness, authenticity, and humanity when they buy things. Examples are the Michael Graves toilet brush and Starbucks coffee. OK, that makes some sense. Then he claimed that Microsoft should switch from left-brain analysis/data/logic thinking to right-brain persuasion/narrative/empathy thinking. Sure. Take off the propellors and put on berets, I can buy that. It seemed like this presentation might be the start of something big at Microsoft.

But his examples were terrible. For example he doesn't like our "dinosaur" ads for Office. OK, so he doesn't like them...that's one person's opinion! Someone pointed out that the ads were tested and he groaned (metaphorically anyway) and explained that if we had the right personality we would not need to test our ads, they would just come out right...basically if we ran everything by him first, we'd be good to go.

Then he showed the press release about our recent reorg and said he would bet all the money in his wallet ($183, to be precise) that the executives had not written that. This might be good theater but I actually think the executives DO write those things--the problem, if there is one, is that they either feel the need or have the natural inclination to write them in bland corporate language (someone else was kind enough to raise their hand and say it looked like people who wrote that way did pretty well for themselves at the company, so maybe we should all be learning to talk like that?).

But where he really made no sense was when someone asked about bloggers. He talked about how you should talk in a natural voice, not be so formal, have a personality. Individual employees should try to stand out from the crowd. Chelsea even quoted from The Cluetrain Manifesto...and then someone asked what he thought of Microsoft bloggers and his response was that Robert Scoble was "crap" and he couldn't believe we paid him to criticize the company (Scoble picked up on this; don't worry, Robert, they don't have a clue). So I was like WTF? First of all he obviously hasn't grokked Scoble, but more importantly he wants all that debate to go on internally and the external stuff should be focused on helping customers only. So scratch all the stuff with personality and a natural voice...at this point I raised my hand to challenge him but it seemed like he had lost the audience anyway, so I figured why bother.

Despite this I think the book itself--ignoring the random opinion on Microsoft that occupied most of the talk--looks interesting. They pointed out that Microsoft's site is full of SGPs (Stupid Generic Photos) which is true. Our recruiting site--key for the future--looks bland and uninviting compared to some other companies. The book probably has other good ideas in it. So maybe buy the book, but skip the talk.

Posted by AdamBa at 09:43 PM | Comments (8) | TrackBack

October 26, 2005

Willy Wonka Cane

Our oldest son wanted to be Willy Wonka for Halloween. Costumes from the recent movie are easy to obtain, including the jacket and vest and even a hat with the hair included.

But for some reason nobody is selling the cane which he had in the movie. It's the one Johnny Depp is holding in this poster; a white and black swirly-pattened ball on top, a glass tube filled with candy, and a black point at the end (Johnny Depp revealed in an interview with Nickelodeon Magazine that he had taken the one used in the movie as a souvenir for his kids). Since nobody is selling them, a market for homemade ones has sprung up on eBay.

Well, I figured if these people could make them, I could too. A quick trip to Home Depot and this is the result:

The top (see picture on the left) is a white curtain-rod end which I drew on with a sharpie, and the bottom is a bed footing of some sort, painted black (actually I really don't know what it is; it was shelved with the spindles for stair railings, but it doesn't look like any part of a railing I recognize). They are both screwed into a dowel that runs inside the plastic tube, which is for covering fluorescent lights. Fill the rest of the tube with Rainbow Nerds (available at 7-11), some electrical tape to seal the bottom, and you are good to go. It only took two boxes of Nerds because the dowel occupies a lot of the room inside the tube.

Our youngest son really wanted one of these so out of the extra parts I had lying around I made a miniature one for him, about ten inches tall (see picture on the right). The curtain rod thing came in a pack of two and I had cut down the dowel and the plastic tube to match our son's height better, so I had extra bits of those. We had extra Nerds also. However I didn't draw the swirl quite as well because the Sharpie ran out of ink. He still loved it and brought it into preschool for "sharing" (which is what they call "show and tell" now).

Our oldest son brought the big cane to Microsoft today for trick-or-treating in the halls (which as per my hope last year, they did earlier than actual Halloween), and everyone was quite impressed with the cane.

Posted by AdamBa at 10:06 PM | Comments (2) | TrackBack

October 25, 2005

The Gates Foundation

There was an article in The New Yorker this week about the Bill & Melinda Gates Foundation (I read these long articles so you don't have to--just another service this blog provides).

The Foundation is arguably the most powerful charity in the world. It's vision--ridding the world of disease--is breathtaking, and even more astonishing is the amount of progress that it could make towards that goal. The foundation presently has about $30 billion in its endowment, and the money can have a huge effect. $1 billion doesn't buy you much: part of a runway, 10 airplanes, a few miles of monorail, a Las Vegas casino. But put it to work fighting disease and it could easily save a million lives (and if you really do want to help save the world, the Foundation is hiring).

A quote from Gates: "You think in philanthropy that your dollars will be marginal, because the really juicy obvious things will all have been taken...When somebody is saying to you we can save many lives for hundreds of dollars each, the answer has to be no, no, no. That would already have been done...We go to events where people are raising money for various illnesses where lives are being treated as if they were worth many millions of dollars. And here we were learning that you can save even more lives for a few hundred each. We really did think it was too shocking to be true."

I can't think of a better use for Bill's Microsoft money, and I'm proud that the success of Microsoft has enabled this. How many people-years has the aggregate workforce of Microsoft put in since 1975--maybe half a million? 12 of those are mine. So if the foundation gives $50 billion to charity, you could argue that $1.2 million of that is from my time there.

The article points out that there is some criticism of the direction of the foundation, specifically in the pursuit of technological solutions (such as vaccines) over lower-tech but working solutions (such as distributing insecticide-treated mosquito nets to combat malaria). The foundation, possibly in response to such criticism, recently gave a $35 million grant to Zambia to fund nets, existing drugs, and insecticide. But Gates, with the best of intentions, is sincerely committed to the pursuit of technology as the main solution.

One would assume that Gates approaches Microsoft with the same attitude, and therefore favors sweeping technological visions over incremental measures--WinFS over Spotlight, to give one real example. The difference is that when Gates interacts with the world of medicine, he is not coming in as the Chief Software Architect (he is of course coming in as the Chief Grant Funder, but I will give him credit for not playing that card). The doctors and researchers he meets are not directly beholden to him, and therefore more likely to tell him that he is wrong (While reading the article I thought of this comment). And of course Gates cannot claim that something is the stupidest idea he has ever heard, or threaten to do it himself over the weekend, as he is notoriously rumored to do in software discussions.

Posted by AdamBa at 10:02 PM | Comments (3) | TrackBack

October 23, 2005

Get Environment Variables from a .CMD script

One issue that crops up with Monad is that when you execute a .CMD script, it launches a child cmd.exe process to run it--Monad doesn't directly interpret the .CMD language. If the .CMD files just does something, like copy a file, then this is fine, but cmd.exe has this "feature" (which makes some Unix people gag) that any environment variables set inside a script affect the environment table for that process. This lack of scoping is often taken advantage of to write scripts that set up the environment (for example, the command-line environment that the Windows team uses is setup by such a script, called for historical reasons "razzle.cmd").

So people running Monad often hit this problem--they run a .CMD script to set up the environment, it sets up the environment of the child cmd.exe process, and then when that is done it exits so the environment changes are not reflected in the parent. One solution is to run the .CMD program first (with the /K parameter so the cmd.exe window sticks around) and then run msh.exe. This works, but you can't run another .CMD-environment-setter once you are inside msh.exe.

So I wrote this script to grab the settings from a .CMD script--it runs the script also, so any actions performed by the script are also done. Usage is:

scriptname.msh foo.cmd

where scriptname.msh is the name you give the script when you save it, and foo.cmd is the .CMD file you want to run (Note to Andy, the syntax for setting an environment variable in Monad is $env:goo = "Hello"):

#
# First save the current environment in a hash table

$oldenv = @{}
get-childitem env: | foreach-object { $oldenv[$_.Key] = $_.Value }

#
# Now create a temp file to hold the new environment and temp .cmd file

$envfile = [System.IO.Path]::GetTempFileName()
$tmpcmdfile = [System.IO.Path]::GetTempFileName()
$cmdfile = $tmpcmdfile + ".cmd"

#
# Create the temp .cmd file

add-content -Path $cmdfile -Value ("call " + $args[0])
add-content -Path $cmdfile -Value "@echo off"
add-content -Path $cmdfile -Value "set > `"$envfile`""

#
# Run the temp .cmd file

cmd.exe /c $cmdfile

#
# Get the environment after

$newenv = @{}
get-content $envfile |
  foreach-object {
    $eq = $_.IndexOf("=")
    $k = $_.Substring(0,$eq)
    $v = $_.Substring($eq+1)
    $newenv[$k] = $v
}

#
# Compare the old and new environments

$newenv.Keys |
  foreach-object {
    if (!$oldenv.ContainsKey("$_")) {
        set-item -Path env:$_ -Value $newenv[$_]
    } elseif ($oldenv[$_] -ne $newenv[$_]) {
        set-item -Path env:$_ -Value $newenv[$_]
    }
}

$oldenv.Keys |
  foreach-object {
    if (!$newenv.ContainsKey("$_")) {
        remove-item -Path env:$_
    }
}

#
# Clean up the temp files

remove-item $envfile
remove-item $tmpcmdfile
remove-item $cmdfile

This script is old (I wrote the first version in July of last year) and could probably be optimized. In fact Bruce Payette saw it and immediately whipped up essentially the same thing in one line:

cmd /c “mybatchfile.cmd&set” |
foreach {
  if ($_ -match “=”) {
    $v = $_.split(“=”); set-item -force -path "ENV:\$($v[0])"  -value "$($v[1])"
  }
}

However my longer one does a bit more (it handles deleted environment variables) and also shows some hash table usage and creation of temp files.

Posted by AdamBa at 05:35 PM | Comments (2) | TrackBack

October 20, 2005

Prettifying Monad Code Listings

This is cool. Wes Haggard started using Monad a couple of weeks ago and he already has added Monad support to CodeHTMLer. When I show code I replace spaces with &nbsp;, change < to &lt;, etc. by hand. But this thing does the needed encoding (well OK it just slaps <pre> around the whole thing) and adds colors also.

Here's a comparison. Old way:

[int]$n = $args[0]
for ($i = 2; $i -le $n; $i++) {
    while (([int]($n / $i) * $i) -eq $n) {
        $i
        $n /= $i
    }
}

With CodeHTMLer:

[int]$n = $args[0]
for ($i = 2; $i -le $n; $i++) {
    while (([int]($n / $i) * $i) -eq $n) {
        $i
        $n /= $i
    }
}

As my son would say, Nice! I'm continually impressed by what the Monad community is doing.

Posted by AdamBa at 10:21 PM | Comments (1) | TrackBack

October 19, 2005

Riding the Bus

I was having some bling put in at Car Toys in Bellevue the other day, and I took the bus back to work after dropping the car off, and then back to pick it up. Although the bus service on the Eastside is a little sparse (and some of the routes only run into Seattle in the morning and back to the suburbs in the evening), Microsoft is somewhat of a local hub, and with the campus situated between the Overlake Park & Ride and the Overlake Transit Center you have somewhat decent coverage.

I do enjoy riding the bus. Partly it's because I grew up on the east coast in a city with good public transit so I consider it normal to ride the bus, and partly it's because with Seattle traffic heading further down the tubes I feel morally virtuous when I ride the bus. It also avoids me having to scam a ride from someone to/from wherever my car is being worked on (most dealers have a complementary shuttle, although Car Toys doesn't; this makes being dropped off at work very easy although for pickup you still have to coordinate with them which is a slight pain). And since Microsoft provides a free bus pass to any employee (it's a sticker you can put on the back of your cardkey) there's no financial reason not to use the bus.

If you want to join in on the fun, these are useful some bus routes to/from campus:

The 256 runs right down Northup Way (aka NE 20th), which gets you Car Toys, plus Park Place (Lotus/Saleen/etc), the BMW dealer, and let's not forget the Rolls-Royce dealer, although they may attack you with a feather duster if they see you catching a bus from their dealership. By campus it runs up 156th, so it passes 40/41, 26/27 etc. and then winds up at the Transit Center by 44 (my building). It's very convenient. Unfortunately it only runs at rush hour. It has 5 runs towards campus in the morning but the last one gets to the Transit Center at 8:33 which may be too early (Car Toys doesn't open until 9). Going back it is much better, there are 5 evenings runs departing from the Transit Center between 3:40 and 5:31. And the bus originates there, so it's on time and you can sit down inside it if you get there early.

If you miss the 256 you can try the 249. It only goes to the Overlake Park&Ride (although I believe you can call for a campus shuttle from there), and it basically only runs every hour, but it runs all day.

If you want to go down to Honda Auto Center in Bellevue (which I sometimes do), you have a couple of choices. The 222 doesn't quite go there but it puts you within walking distance (at the corner of SE 36th and 142nd Pl SE, which is the bridge over I-90) and the walk includes this fascinating switchback in the sidewalk. The 222 also originates from the Park & Ride (so it will be on time), hits the Transit Center, and curls up on 51st so it is near Red-West. A better ride for me is the 245, which goes right by Honda Auto Center, and also goes by Red-West (in fact it goes by there on 148th, unlike the 222 which turns south on 148th from 51st). Both the 222 and 245 run every half-hour, although not as spread out as it could be between the two buses (most of the day, heading south the 222 leaves the Overlake TC at :02 and :32 and the 245 at :07 and :37, while coming north the 222 arrives at :10 and :40 and the 245 arrives at :17 and :47).

If you want to go down NE 8th to where Barrier Mercedes and Volvo are, you can use the 230, which stops at the Overlake Transit Center. It also goes by Bellevue Square and later (after a circuitous route) winds up in Kirkland by Honda of Kirkland and then eventually up in Totem Lake. If you want to go that way, you may be better taking the 245 the other direction from campus to go more directly west, and then transferring at the Kirkland Transit Center.

Meanwhile you can use the 253 to get a little closer to Barrier Audi, but I usually just walk there.

And if you're thinking "Gee there's a lot of high-end car dealers near Microsoft"...you're right.

Posted by AdamBa at 10:37 PM | Comments (3) | TrackBack

October 17, 2005

All-American Secrets

I was watching MTV2 this morning and I saw a video from the All-American Rejects that was entirely based on postcards from PostSecret.

Here's an article about the video. The director found the site by googling for "secret", how post-postmodern of him. Also, from the PostSecret site, I gather there's a forthcoming book (check out the CWBTBAB for it, including the group hug book Stoned, Naked, and Looking in my Neighbor's Window) and also a travelling exhibit.

I SUSPECT

everybody already knows this

ExCePt Me...

Posted by AdamBa at 10:11 PM | Comments (0) | TrackBack

Sudoku

On the flight home from Chicago I noticed that the United in-flight magazine was proudly proclaiming itself the first airline magazine to offer a Sudoku puzzle. Sudoku is a logic puzzle where you have to fill out (as an example) a 9x9 grid with numbers such that each row, column, and 3x3 subgrid have the numbers 1 through 9 appearing once. For each puzzle the grid is presented with some of the numbers filled in and then you have to deduce where the other numbers go. For example if eight of the spots in a row are filled in and the only number missing is 8, you know that 8 goes in the remaining empty box.

I worked through the four examples in the magazine...the instructions estimated 10 to 30 minutes each but they took longer, as I figured out how to solve these things. You can solve them just by looking at a column and saying "OK the 4, 5, 7, and 9 are missing and the 4 can't go in this row or this box so it goes here..." but you quickly adopt some shortcuts such as noticing that a 4 appears in two out of three 3x3 boxes in a row, which means there must be a 4 in the third box but not in the row that the other two were in, which narrows it down to 3 spots...etc, etc (it's hard to explain exactly what I mean but you'll see if you start solving them).

These are evidently the latest craze in puzzles. Personally I'll stick to the cryptic crossword in the Atlantic but they are an interesting diversion (as it happens sudoku just got first-posted in this Slashdot roundup of math/logic riddles). One nice thing is you can make them basically any size. For example here, from a website that has them in various sizes, are some 4x4 ones (so each row, column, and 2x2 box has to have the numbers 1 through 4 in it).

Posted by AdamBa at 06:36 PM | Comments (4) | TrackBack

October 15, 2005

At Illinois

On Thursday evening I gave a presentation on Monad at the University of Illinois, hosted by the local ACM chapter. It was a whirlwind tour: total time from my alarm going off at home on Thursday morning to arriving back home on Friday afternoon was 35 hours. That included flying to Chicago, driving down to Champaign/Urbana, the talk, dinner afterwards, sleep in a hotel, drive back up to Chicago, and fly home.

The talk went well, as Monad talks always do. Lots of good questions and people seemed very interested. Only mistake was I forgot to demo my aliens.msh game, which I intended to close the talk with. Oh well.

I had actually spent some time in Urbana previously. My father taught there for four years and I lived there from age 1.5 months (when we returned from a summer in Switzerland with newborn me in tow) to 11 months (when we decamped for a summer in Seattle and thence off to Montreal to raise us kids). I started my presentation with the picture below, taken during the time in Urbana:

That innocent looking lil' dude is me, age I would guess about six months. The person with the curly hair and green shirt is my sister Becky, who as you may be able to discern is CAUGHT IN THE ACT OF STEALING MY PACIFIER. You can almost see my heart break as I realize that a dark current of evil does indeed lurk below the sunny sheen of happiness that I had heretoforce known. Hmmph.

Anyway UIUC was nice and I appeciate them having me. They have a fancy new computer science building, courtesy of Tom Siebel (NCSA, where Marc Andreessen and cohorts cooked up the Mosaic web browser, has a fancy new building across the street). The CS department has 1000 students (including grad students) which is roughly the size of my entire class at Princeton. They had various doodads in the ACM office like a web-enable vending machine and a foosball playing robot (prone to mechanical breakdown, evidently).

Posted by AdamBa at 09:23 PM | Comments (0) | TrackBack

October 13, 2005

Would You Buy This Shirt?

Someone is taking a survey to see if you would buy this bloggy shirt. The gift for the blogger who has everything? It's 64% No right now (small sample)...let's boost it up, I want one of these!

Posted by AdamBa at 04:27 AM | Comments (1) | TrackBack

October 12, 2005

Bad Car UI

We just bought a new Honda Odyssey. Lovely car, but it has one serious flaw in its UI design.

For some reason, the designers decided to have the instrument panel always lit, even if the headlights weren't lit. You may think this is innocuous, but it turns out that I (and everyone else I know who has this car) use the instrument panel as a way to tell if our lights are on. You may not think that's how it is--that people check for headlight on-ness by looking out the windshield to see if the object in front of them is being illuminated--but it really is. So the net effect is that if you get in your car at night in a well-lit place (like your garage) you will drive off with your headlights off.

Honda's solution to this was to add an indicator when your headlights are on. No really, they point this out in the manual. "If the indicator is off, your headlights are off"...boy that's useful. How is the absense of something supposed to remind you of anything? I'd hate to see them design an alarm clock..."If you don't hear anything, wake up!"

The car has a feature that almost mitigates this problem, but just misses. You can leave the headlights in the "On" position and they turn off 15 seconds after you stop the engine (or close the driver's door or something). So you might think, great, I'll just always leave my headlights in the "On" position and then I won't ever be fooled by the instrument panel. We used our old Odyssey (which did NOT illuminate the instrument panel all the time) like that and it worked fine, we never forgot the headlights at dusk or other times where you sometimes leave them off longer than you should.

BUT, our new one also has a navigation computer and that switches from "day" to "night" mode based on the headlights being on. So if you leave the headlights on it is always in "night" mode and then it is too dark during the day. In fact you can configure the navigation display to be in "day" mode when the headlights are on, but then if you are planning to always keep them on (due to problem described in the first paragraph) the display will be too bright at night. The net result is leaving the headlight switch in the "On" position all the time won't work.

The reason I bring this up (besides general ranting) is to comment on something. People make jokes about if Windows were a car, har de har. But Microsoft spends a lot of time beta-testing Windows. And this flaw in the Odyssey involves the interaction of different UI components -- exactly the thing you don't catch in internal testing, because you don't use the product like a user does. Cars, of course, are not beta-tested. But if they were, I bet this problem would have been found the first day (or first night anyway). So there's one way that software development has it all over car development.

Posted by AdamBa at 04:46 PM | Comments (3) | TrackBack

October 09, 2005

State of the Mini

Mini-Microsoft, our favorite anonymous insider, has been in the news a lot. I don't think he has necessarily hopped over the carcharodon, but I do think the blog is losing a bit of focus.

The following happened at a group meeting a few weeks ago. Questions for management had been submitted in advance and one of the questions was something like, "Employees are unhappy, go read Mini-Microsoft's blog for details." So our GM, rather than just say "WTF?", said that he actually did go read the blog for an hour (I would suspect that most Microsoft managers would approach it this way, although SteveB has chosen not to). But the problem is he saw a pretty random set of complaints about Microsoft, which aren't really directly actionable. Yes, if you read the blog enough you will start to see a pattern emerge about a perception gap between executives and the rank-and-file, but you have to wade through a lot of complaints about stack ranking and the review curve.

Let's talk about that. Try a little exercise: imagine 100 people at Microsoft who think they got an unfair review. If you assume there was some impartial way to *really* do "fair and balanced" reviews, how many of those 100 would you predict had a legitimate complaint? What's the first digit of your answer? Is there another digit next to it? Bear in mind the words of the American poet Dexter Holland: "The more cynical you become, the better off you'll be."

As has been pointed out elsewhere, 85% (or whatever) of people think they are above average, but of course many of them are wrong. Review curves and its close cousin stack ranking were put in place to try to make reviews MORE objective and fair. I am puzzled when people complain about personalities playing a role in reviews (there's a big surprise) and their solution is to put more leeway and subjectivity into the process. To me Microsoft has worked hard to try to make reviews based on hard facts and results, and prevent bad bosses from hosing people for arbitary reasons. And now managers are being rated more on the growth of their people. Yes, if you have two bad managers in a row it can gum up the process--welcome to planet Earth. I contend that at least at Microsoft it can gum things up less than elsewhere. The fact that Microsoft reviews are not perfect speaks more the inherent imperfection of any review process than it does to an overriding need to try to fix them.

At my old company, which had about 50 people, annual reviews were like this: "Adam, you're doing a good job. $5000 raise." That was it. Sounds good, maybe, but was the guy next to me getting $10000? Who knew? Sure people at Microsoft complain that the average raise was whatever percent it was, but this is independent of the stack ranking--Microsoft has had bountiful years with stack ranking and lean years with stack ranking. And if you want Microsoft to be lean and mean, that's also separate. Microsoft could be lean and mean with stack ranking and it could be bloated and slow without it. The cases where Microsoft has been extremely agile in chasing a competitor--Internet Explorer in the late 1990s, MSN Search now--guess what, they had stack ranking and review curves also.

Which brings up my real concern. There is an opportunity, I think, to change Microsoft's culture for the better, and Mini-Microsoft is uniquely positioned to help with that. Trying to fix stack ranking and the curve plays well to the madding crowd but it is sidetracking this initiative. The core problem, if I can attempt to summarize it, is that the everyday employees do not see a clear upwards career path, because they feel that they will be unable to shine due to the "tax" they have to deal with in their daily jobs, and will be passed over in favor of external hires who were able to grow their careers elsewhere (let me clarify for Business Week readers: that's my analysis of a certain set of complaints I've seen, not necessarily my personal opinion). OK, so let's work on fixing that perception. Slimming Microsoft down seems like a good part of the solution, since it will remove intermediate layers of management and give employees more chance to shine. The real goal of the Mini-Microsoft blog/movement/religion should be, as Mini has always stated at the top, "slim down Microsoft into a lean, mean, efficient customer pleasing profit making machine!" So let's slim down Mini-Microsoft into a lean, mean, Microsoft-slimming machine.

Posted by AdamBa at 08:51 PM | Comments (3) | TrackBack

October 06, 2005

Using Our Own Products

At the company meeting, David Cole from MSN mentioned in his talk that every time we clicked on a Google search ad they got some number of cents, and every time we searched for a florist on Google and then clicked on the result they got some (higher) number of cents, and that by doing this we were sending money down to a competitor that they could use to compete against us.

Now in general I'm opposed to this sort of official opprobrium. I heard a rumor that a certain jeans company wouldn't let people wear jeans from their rivals to work. OK, so you can strongarm your employees into wearing your stuff. But what does it mean when employees buy your competitors' products. Doesn't it mean your products need to be improved? And shouldn't you welcome the immediate feedback you get? Rather than surrounding yourself with "yes-consumers", you should let people use what they want...and then when they use your stuff, it means something.

I also don't like the "don't send money to our competitors" argument. Shoot, we own like 3 iPods and an iMac, I use CorelDraw for editing, I buy books by various competitors of Microsoft Press (not to mention publishing with one). Heck, I run Firefox as my browser, although I guess that doesn't involve money. Anyway I probably make dozens of decisions every day that indirectly affect Microsoft's bottom line in a small way. Does this airline that uses Microsoft for its backend servers? Does that restaurant run Windows on its cash registers? Is all the Microsoft software at my doctor's office properly licensed? Who knows. Yes, I'm an employee and shareholder of Microsoft, but I'm also a consumer and I feel free to exercise my right to dispense my money (or my eyeball impressions) as I want.

At the same time, however, Cole has a point. When people choose to buy an iPod they are presumably actively choosing it for its features. Meanwhile when you go to Google and search on "florist Redmond WA" you are generally NOT looking for a specific florist, so the results from MSN Search should be just as good as the ones from Google (and they certainly appear to be so). Plus, I personally tend to be a lazy geek, who will probably continue using Firefox for a couple of years after Internet Explorer passes it in functionality (if it does). So you could view Cole's comment as a nudge to stop people from reflexively using Google, and give MSN Search a chance.

But I still didn't like his appeal to use it because of the money involved. I'm perfectly happy to use Microsoft software if asked--I'm on the Exchange 12 beta, I run nightly stress on Windows Vista, etc. So I'd find a request to use MSN Search more appealing (and less tacky) if it were just "Hey, our search is really good now, come give it a try...oh and as a side effect you may steer a couple of bucks our way instead of down south."

Posted by AdamBa at 10:10 PM | Comments (6) | TrackBack

More on Fort Clatsop

The followup stories are starting to appear and several of them focus on the community effort to build the replica 50 years ago.

Here's one from the Eugene Register-Guard "Astoria old-timer Robert Lovell remembered the site before he and others pitched in to build the replica. It was a neglected piece of historical real estate, with a bronze marker and, usually, litter left behind by its few visitors. A new chapter of the Jaycees had just been launched at the time, said Lovell, 85, and several of the group's up-and-coming businessmen seized on the idea of building a replica of the Corps of Discovery's winter shelter...A Finnish foreign exchange student who had built log cabins for the Finnish army provided technical advice for a crew of Scandinavian-immigrant carpenters and others who volunteered to build the fort, Lovell recalled. The wife of a businessman organized baby-sitting on the construction site so young parents could put in a few hours on weeknights before dark, Lovell said."

And then this part: "After the replica fort was built, Lovell recalled, the National Park Service had little interest in maintaining the structure. The local Lions Club managed the site until 1978, when it was added to the Fort Clatsop National Memorial." So it went from being something the community built on its own, to something the National Park Service somewhat grudgingly took on, to being the centerpiece of the bicentennial celebration.

Here's an article from the Salem Statesman Journal (consolidation has evidently swept through small-town Oregon newspapers): "Three Salem men who helped build Fort Clatsop five decades ago were saddened Tuesday to learn that the historic landmark had been destroyed by fire...Lauderdale helped clear brush at the site. Jacobson steadied many of the heavy logs. Long nailed some of the large cedar shakes to the roof." I didn't realize that it had just had a celebration of 50 years on August 21.

It's also been pointed out that the replica wasn't super-authentic (the logs were milled on a machine) and here's a call to rebuild it the old-school way--using only technology available 200 years ago (although the local elk population has taken a beating, so they may need to head down to Fred Meyer to buy chow).

Posted by AdamBa at 10:10 AM | Comments (0) | TrackBack

Actual Email I Received Yesterday

From: [someone]
Sent: Wednesday, October 05, 2005 4:34 PM
To: [my group]
Subject: this is a very random question but...

…does anybody own a goat?

<smiley> Seriously. Please let me know if you own a goat or a goat-like farm animal. <smiley>

Thanks!

A very random question indeed...although I think it probably has something to do with the Microsoft giving campaign. Maybe one of those ones where you're better off not knowing.

Posted by AdamBa at 09:53 AM | Comments (1) | TrackBack

October 04, 2005

Fort Clatsop Destroyed by Fire

This is really sad...Fort Clatsop, a replica of the fort the Lewis & Clark expedition stayed in 200 years ago, was destroyed by fire last night. Cause is unknown, although evidently there is a "vehicle of interest." This article mentions a group of people who went on an 18-day tour following the Lewis & Clark trail, who arrived at the fort today. "We were looking forward to see it, today was the day. We can't get over it."

I visited Fort Clatsop with two of my sons over labor day weekend. It was very cool, and I'm glad I got to see it. Although it sounds like it will be rebuilt. L&C build the original in about 15 days with no electricity, so there's hope it can be done soon (the one that burned was not a 200-year-old original one, but a replica built 50 years ago).

Posted by AdamBa at 04:22 PM | Comments (1) | TrackBack

October 03, 2005

This is Funny: Fake Harriet Miers Blog

Someone is writing a pretend Harriet Miers blog. "2,140 HITS ON GOOGLE NEWS! LOLOL okay I'm the biggest dork..."

Posted by AdamBa at 10:09 PM | Comments (0) | TrackBack

Word of the Day: Chav

Here's an article that starts off rather innocuously (but amusingly) talking about a someone who won the lottery in Britain: "'Before he won the lottery, he was a nuisance,' Charles Joyce, a local official, said. 'He decided to carry on being a nuisance.'"

But about halfway through, it segues into something else: "Mr. Carroll is an object of national fascination in part because of his apparently pathological criminality, and in part because he represents a kind of Briton known as a chav." From then on, the article talks about chavs, a word I never knew existed until now. "Male chavs wear tracksuits and baseball caps; female chavs pull their hair tightly back in buns or ponytails." Oh yes, we have them over here in America also, except we call them Federlines.

The story covers the origin of the word ("the theory that it is an acronym for Council Housed and Violent is most likely untrue") and examples of chav behavior ("outrageous spending sprees, drunken brawls, inappropriate public displays of affection, screaming matches with loved ones in bars, destruction of property, late-night stumbling and/or vomiting").

Once you know the word, of course, you can hop on to your favorite search engine and discover there are over a million hits for it (in one year!). You've got ChavScum, ChavWorld, the chav test, Chav Olympics, chav dating site...and on and on and on.

Posted by AdamBa at 09:05 PM | Comments (5) | TrackBack

Monad documentation pack available

We just posted some documentation on Monad, available from Download Center.

It includes:

  • The "Getting Started" guide, an 80-page introduction to using the shell and the MSH language supported by the Windows "Monad" Shell (GettingStarted.doc).
  • A single-page summary of the MSH language, formatted as a tri-fold (LanguageQuickReferenceTriFold.doc).
  • A quick-start guide to tracing in the Windows "Monad" Shell (TracingQuickStart.doc).
  • The three Hands-On Labs from the 2005 Professional Developers Conference: "Monad Scripting" (MonadScripting-HandsOnLab.doc), "Building Monad Cmdlets" (BuildingMonadCmdlets-HandsOnLab.doc) and "Creating Monad Providers" (CreatingMonadProviders-HandsOnLab.doc).

Posted by AdamBa at 02:35 PM | Comments (1) | TrackBack

October 02, 2005

Let's All Write a Cmdlet, Part 2

The first cmdlet example was pretty basic and didn't really show the advantages of writing a cmdlet. So this is a more relevant example. Put the following in the adam.cs file you created before (or make a new file with it), then compile the source and make-shell as before:

  [Cmdlet("palindromify","name",SupportsShouldProcess=true)]
  public sealed class PalindromifyNameCmdlet : Cmdlet
  {
    [Parameter(Position=0,Mandatory=true,ValueFromPipeline=true,ValueFromPipelineByPropertyName=true)]
    public string Name
    {
      get { return _name; }
      set { _name = value; }
    }
    private string _name;

    protected override void ProcessRecord()
    {
      if (ShouldProcess(Name)) {
        char[] name_array = Name.ToCharArray();
        System.Array.Reverse(name_array);
        string reversed_name = new string(name_array);
        string palindrome = "I saw " + Name + ", " + reversed_name + "was I";
        WriteObject(palindrome);
      }
    }
  }

This defines a cmdlet called palindromify-name which takes a single parameter called Name. So at its most basic it works like this:

MSH> palindromify-name -name foofa
I saw foofa, afoof was I

But what do the other parts do? Well:

  1. The Position=0 metadata means you can type the parameter without specifying -Name:

    MSH> palindromify-name foofa

  2. The Mandatory=true metadata means if you type the cmdlet with no parameter, it prompts you:

    MSH> palindromify-name

    Cmdlet palindromify-name at command pipeline position 1
    Supply values for the following parameters:
    Name:

  3. The ValueFromPipeline=true metadata tells it to bind the entire pipeline object to the parameter--this means you can pipe any string in to it:

    MSH> "evian" | palindromify-name

  4. The ValueFromPipelineByPropertyName=true metadata tells it to bind any input object *property* that is called Name to the Name parameter; process objects are one example of an object with a Name property:

    MSH> get-process adamsh | palindromify-name

  5. Finally, the SupportsShouldProcess=true cmdlet-level metadata, along with the call to ShouldProcess() before the cmdlets does anything, gives you the following:

    MSH> "murder" | palindromify-name -whatif
    What if: Performing operation "palindromify-name" on Target "murder".

    (-whatif shows what would happen, without actually performing the operation) and

    MSH> "amanaplanacanalpanama" | palindromify-name -confirm

    Confirm
    Are you sure you want to perform this action?
    Performing operation "palindromify-name" on Target "amanaplanacanalpanama".
    [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help
    (default is "Y"):

    (-confirm asks you before processing objects; as with -whatif, it makes a bit more sense if you pipe in something that produces a lot of objects that either are strings or have a string property called Name. get-process or get-childitem would work in this example, as would a simple array, as in: ("foo","bar","ertegun") | palindromify-name.)

Posted by AdamBa at 10:31 PM | Comments (0) | TrackBack

Let's All Write a Cmdlet

Perhaps you've been playing with Monad and you're thinking of writing a cmdlet--but it seems like a big commitment. It turns out it's actually really easy. Just follow along with these simple steps.

First you need to create a C# file (you could write cmdlets in managed C++, VB.Net, etc but we'll use C#). Put the following in a file called (for this example) adam.cs:

using System;
using System.Management.Automation;

namespace MyNamespace

{
  [Cmdlet("test","write")]
  public sealed class TestWriteCmdlet : Cmdlet
  {
    protected override void BeginProcessing() {
      WriteObject("My cmdlet worked!");
    }
  }
}

This is the code for a cmdlet called test-write which just prints out the string shown. The filename adam.cs is just an example...I'm not trying to create a legacy of source code named after me, call it whatever you want.

Now you need to compile it. No hiding under the bed saying you don't have Visual Studio installed...we don't need any fancy-pants IDE, a simple command-line compiler will work. And if you have the .Net 2.0 Beta 2 runtime installed (which you do if you're running Monad), then you have the C# compiler. Run the following command (this assumes your adam.cs file is in the directory Monad is installed in, and that is your current directory):

\windows\microsoft.net\framework\v2.0.50215\csc.exe /target:library /reference:.\system.management.automation.dll adam.cs

This builds an assembly called adam.dll. You should see the banner from the C# compiler, and then lickety-split the compile will complete (it doesn't display anything else if it succeeds):

Microsoft (R) Visual C# 2005 Compiler version 8.00.50215.44
for Microsoft (R) Windows (R) 2005 Framework version 2.0.50215
Copyright (C) Microsoft Corporation 2001-2005. All rights reserved.

Now with current Monad builds you need to compile this into a mini-shell to run it--we're improving that so you can load a new cmdlet into an existing shell, but for now run the following:

make-shell -out adamsh.exe -namespace MyNamespace -reference adam.dll

This builds a mini-shell named adamsh.exe from the adam.dll assembly you compiled above. It reflects on the assembly to discover the test-write cmdlet so that part's all $%#ing magic. A couple of things:

  1. You will see some disheartening output:

    Microsoft Command Shell MakeKit
    Copyright (C) 2005 Microsoft Corporation. All rights reserved.

    warning : A 2-way version violation is found for assembly Microsoft.VisualC.
    The list of assemblies referencing Microsoft.VisualC are:
    , adamsh, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null\System.Managemen t.Automation, Version=1.0.60319.0, Culture=neutral, PublicKeyToken=31bf3856ad364 e35\System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e0 89\Microsoft.VisualC, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f1 1d50a3a
    adamsh, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null\System.Mana gement.Automation, Version=1.0.60319.0, Culture=neutral, PublicKeyToken=31bf3856 ad364e35\System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561 934e089\Microsoft.VisualC, Version=8.0.1200.0, Culture=neutral, PublicKeyToken=b 03f5f7f11d50a3a
    Shell adamsh.exe is created successfully.

    Ignore all that "2-way version violation" stuff--that message has scared off even hardened Microsoft developers, but it's a harmless issue with the .Net assemblies. Instead focus on the "Shell adamsh.exe is created successfully." message at the end. That one means "Good times".

  2. DO NOT called the shell adam.exe (the same as the name of your .cs file)--make-shell.exe generates some code for you (which will go in adamsh.cs in the example above) and if you call your shell adam.exe it will generate the code in adam.cs and silently overwrite your source file--this should be fixed soon, but for now be careful.

OK, so now you have adamsh.exe and you can just run it (by typing adamsh.exe), it will give you the MSH prompt, and then inside it run the test-write cmdlet and you see the expected output. No I won't show you, go do it yourself.

You will probably get a message when you start up adamsh.exe about:

Error loading the extended type data file:
Cannot find the registry key: "SOFTWARE\Microsoft\MSH\MyNamespace.adamsh\Path",
using "D:\msh" to load the configuration files.

There were errors in loading the format data file:
Cannot find the registry key: "SOFTWARE\Microsoft\MSH\MyNamespace.adamsh\Path",
using "D:\msh" to load the configuration files.

If you read it closely it does say that it recovered from the missing registry key, but if you want to get rid of the message, then do the following (this is shown from msh.exe, you can do the equivalent from regedt32 if you want but why? You've got your own mini-shell, use it!):

new-item hklm:\software\microsoft\msh\MyNamespace.adamsh

and then

set-property hklm:\software\microsoft\msh\MyNamespace.adamsh -property Path -Value d:\msh\adamsh.exe

You are creating a key called "MyNamespace.adamsh" under "software\microsoft\msh", and then setting a Path value containing the path to your mini-shell. You should adjust this based on the actual mini-shell name, namespace, and path to the one you built. Note that you can get the "shell id" (the namespace/executable combo that is the registry key name) from the $shellid variable inside your new mini-shell. It's based on the -out and -namespace parameters to make-shell.exe.

So that's it--simple source file, compile, build mini-shell, and now you're cooking with Monad.

Posted by AdamBa at 08:24 AM | Comments (5) | TrackBack