April 18th, 2006
10:28 am
If you need to run the Office 2007 server products on a single machine, you probably know it’s a bit of a hassle to get everything set up correctly. Martin Kearn has a very detailed set of instructions for how to set up B1TR on a single machine for development and testing purposes.
If you’re not in the beta program, keep in mind that the public Beta 2 will be out in just a few weeks now. After that’s released, anybody can get the bits, and we can all talk freely about any and all features. For now, you either have access to the beta already (in which case the above link may prove useful), or you’ll have to wait for Beta 2, since the Beta 1 program is now closed. Don’t shoot me, I’m just the messenger!
This afternoon, Falun Gong protestors silently held banners at the corner of 40th and 156th, the entrance to Microsoft. The protests were aimed at the alleged harvesting of organs from live inmates at Chinese concentration camps. The ladies holding the signs handed out pamphlets depicting a Chinese labor camp inmate named Zhang Xiaohong, and describing the rates for organ transplants at a Chinese hospital with alleged connections to a concentration camp.
Tomorrow, Chinese President Hu Jintao will visit the Redmond campus. Todd Bishop of the Seattle Post-Intelligencer covers some of the business implications of the Chinese President’s visit.
I’ve been too busy to write anything new for the blog the last couple of days, but after catching up on my Bloglines feeds today, I thought I’d share a few links to blog posts I found interesting …
John Durant, a Program Manager on the VSTO team, has a blog. John’s an interesting guy, very energetic and upbeat about the work the VSTO team is doing. (Mom, that stands for Visual Studio Tools for Office, and it’s an add-on to Visual Studio that developers can use to more easily write code that is tightly integrated with the Office suite of applications.)
Another interesting new Microsoft blog is the one from the Sharepoint records management team. John Cahill and Etahn Gur-esh have posted so far, and with people like them active on this blog it should be a great source of information about this rapidly growing area of emphasis for Sharepoint.
I recently told my friend Tom not to worry about usage stats and blog rankings. Here’s a much longer rant on that topic, with a lot of great thoughts and observations about how Technorati’s rankings are permeating blogging discussions these days.
I also posted recently about Scoble’s decision to start moderating comments on his blog. Dare Obasanjo has an interesting related post on the things he has done to simplify his life lately. Go, Dare!
Jeff Atwood has a great blog about programming in general. Here’s a recent post he wrote that riffs on how programming and painting compare.
One the OpenXmlDeveloper front, Brian Jones and Jean Paoli are headed to London for the next meeting of Ecma TC45 this week. Stay tuned for a lot more information on Brian’s blog and www.OpenXmlDeveloper.org.
Finally, I must admit I wish there were more people wandering the hallowed halls of Redmond who shared Rory Blyth’s approach to blogging.
Happy reading …
No longer will anyone with an axe to grind be able to post their vicious little rants on Scobleizer. As of today, Robert Scoble announced that he has decided to moderate comments on his blog. As he says, “I will delete any that don’t add value to either my life or the lives of my readers.”
He describes a “family room” rule for moderation, which reminded me a bit of the Mom rule I have on my home page: “I moderate comments here, but I approve anything I’d be comfortable having my Mom read, and she can take quite a bit.”
I like this change. There is often interesting information on Robert’s blog, and various opinions worth reading, but I can’t stand to spend time wading through the childish name-calling that some people feel compelled to “contribute.”
This is a recurring issue on otherwise useful blogs, and I’m hopeful that we’ll all find some reasonable norms soon and look back on blogs of the last few years as a chaotic and messy period of transition. It seems insane for busy people to waste time every day sorting through name-calling tantrums that only interest their participants. But that’s often what happens, if you try to read a variety of technology blogs each day.
We all have better things to do. Thanks, Robert.
April 15th, 2006
12:14 pm
Back in 1999, when I start developing SERVIS (a line-of-business application for DAA Northwest auto auction in Spokane), I was still living in the Chicago area. During those months I flew back and forth, I stayed at the Ramada across the street from Spokane International Airport many times, and I usually ate breakfast at Remington’s, the Ramada’s in-house restaurant.
So I got to know the help there: the waiters, waitresses, bus staff, manager and chef. Bob Katzaman, the chef, was a 50-year-old teenager in many ways. A recent arrival to the Spokane area himself (from Arizona in the mid-90s), he lived alone on the northwest side of town, and his hobbies were golf and weight-lifting. He was muscular, usually laughing about something, often with an evil grin, and he would walk through the dining area of Remington’s periodically to look for customers he knew. He’d stop by the table and talk, usually too loud, usually about golf, usually staying a bit longer than the wait staff would have liked. But that was Bob.
He and I played golf a few times over the years I lived in Spokane. We’d play in the summer, and we’d also drive to warmer areas like Pasco or Yakima to play in the winter when Spokane had snow on the ground. Bob could hit the ball a ton: I can remember hitting a solid 5-iron to the green and then watching him hit a 9-iron from beside me to the same green. He had a little superstitious ritual about not tying his shoes until he got a birdie. So his shoes were always untied when he stepped up to the first tee, laces flopping around on the grass, and he’d stay like that until he got a birdie, at which point he’d slowly tie the shoes, savoring the accomplishment.
Bob had quite a temper when the game wasn’t going as he liked. If his shoelaces were still dragging through the grass on the 18th hole, you could be sure Bob would be in a surly mood. I liked to play golf with more Zen-like approach, taking pride in my calm acceptance of everything that happened, and sometimes the two of us were like the Odd Couple, snapping and snarling at each other on the course. I’d be over the ball, getting ready to hit, Bob would be yelling across the fairway about what went wrong on his last shot, I’d step away and start over, we’d do this a few times, then I’d get pissed and step up and shank one into the rough, then Bob would switch from talking about his terrible shot to talking about my terrible shot.
Remington’s had a more varied menu than most hotel restaurants, especially in Spokane. Bob experimented with combining the Tex-Mex styles he knew from his time in Texas and Arizona with the staples of the Inland Northwest restaurant scene such as barbecue and salmon. Every year when the Copper River salmon were in season, Bob had specials on the menu featuring it, and they were great. I usually ate pretty simple fare there, but I thought the Ramada’s reuben sandwich was the best in Spokane.
In 2002, I had Bob help me put on a team-building dinner at my house for my co-workers in the little computer department at the auction. Four of us, all guys, cooked a fancy multi-course dinner for our wives/girlfriends, and the rule was that Bob could instruct us but neither he nor the girls could do any of the work. Guys like myself who had rarely cooked anything fancier than a ham sandwich found themselves carmelizing walnuts, making exotic sauces, and doing other things that we never knew we could do, and we all had a great time. (Those who’ve read a lot of software management books may recall Demarco/Lister’s “Peopleware” recommended an exercise like this for helping teams to gel: yes, that’s where I got the idea.)
Bob’s brother died after a long illness in 2004, down in Texas, and Bob went there to clean out his house and handle matters. He came back with a computer that his brother had bought but hadn’t set up before he died, and I went over to Bob’s house and taught him a bit about it and helped him hook it up to the internet via Qwest’s DSL service. Bob had heard that the internet had lots of pictures you could just download for free, and the first thing he had me show him how to do was to locate a photo of Shania Twain in tight jeans and make it his desktop wallpaper. When I left him that evening, he was happily downloading the infamous Paris Hilton video.
I hadn’t seen Bob since moving to Seattle last fall. A week ago, Megan and I had planned to stay at the Ramada when we visited Spokane, and probably would have seen Bob in the morning at the restaurant, but the hotel was full so we stayed elsewhere.
Anyway, Chef Bob died yesterday. He dropped dead of a heart attack at work, and that’s about all I know so far — there hasn’t been an obituary notice yet, although I assume one will run in Sunday’s edition of the Spokesman-Review. When I searched for it this morning, I did find one article about how Bob’s arrival at Remington’s brought some new influences to the menu in the spring of 1996.
Rest in peace, Bob.
Every now and then I come across a web site that’s really cool, but then I can’t remember how I found it — a search, then a link, then a link to another site, and so on. I’m guessing I’m not the only one that happens to!
Anyway, I found this really cool business-oriented site that I added to my RSS feeds last week, and the author, John Sviokla, has posted some great articles. He’s extremely prolific, and the posts are sometimes huge, but he has some great observations.
Today, he wrote about why Wal-Mart is afraid of Google. Good stuff.
The world of web apps is getting pretty complicated. In a good way: there are so many cool new sites out there, and so many developers coming up with creative new applications. From .NET to Ajax to widgets and gadgets and services, oh my, a guy could waste a lot of time just looking around at what’s going on these days. Theoretically speaking, of course.
In the last month, there has been a great conversation taking place about the various architectures for web applications. This conversation has been taking place on a few blogs, with lots of people chiming in, linking back and forth to each other, and so on. If you’re into thinking about the difference between GETs and POSTs or what’s in an HTTP header (and what typical software typically does with that information), you’ll find it all fascinating.
The conversation started with Don Box’s $100 challenge, then Dare added his take on things, and now today Don linked to this great little post by Sun’s Tim Bray.
Check it out. Reading those posts, I feel like the internet is still in the American “Wild West” stage. A hundred years ago, I’d imagine that the technological future of the United States wasn’t obvious to most people. “Gee, honey, think about how big Western Union will be at the end of the next century! Think of how many horse ranchers it will take to deliver all the horses people will need! Think of all the telegraph poles that will be needed … I’m going to invest in a telegraph-pole startup!”
Tim and Don and Dare and a few others are looking forward with a little more insight than that. All good blogs, all worth reading if you develop software or just like to muse about the future of the world-wide web.
It’s hard to believe it’s been less than a year since I said to Megan “what’s up with this blog word? Back in the 90s, we called those web sites.”
I hoped that the word blog would just go away, to tell the truth. I couldn’t see that it added anything to the English language, and I had an attitude about it, like I have an attitude about “utilize” — a nicely pretentious term for impressing those with limited vocabularies, but merely a synonym for a more widely known and therefore more effective term. Like “use.” Or “web site.”
In hindsight, my reason for feeling that way was simple: my web site had always been a place where I post the kinds of random thoughts and pictures and links that people tend to put on blogs.
Blogging, 90s-Style
Back in 1996, the first thing I put on my web site was a picture of my dogs and a little story about taking them out for a romp in the forest preserve outside Chicago. And in the years after that, I would put new things on my blog — er, web site — pretty regularly. It became the way I kept in touch with friends and family. You could look at my web site to see what had been going on in my life lately, where I’d been on vacation, or things like that.
After I learned a bit about HTML in 1996, I had a Saturday afternoon get-together at my house for a few geeky friends in the spring of 1997, to swap tips about how this new thing called the “world-wide web” worked. We drank beer and ate pizza while discussing the details of HTML tags and all the cool (mostly free) software you could use to build a web site: Netscape Navigator, CuteFTP, Eudora Pro and Notepad.
Of course, my old static-HTML web site never allowed for a conversation. It was all one-way. I remember in 1999, when I sent all those emails from from a 5-week Asia trip with Mom, thinking that it would be cool to somehow upload my thoughts to my web site, but it seemed more interactive (and fun) to send emails to a big list of people. That way I’d get some responses from them while we were still on vacation. I guess, with 20/20 hindsight, that was my first interest in blogging.
Web Site, 21st-Century Version
At the beginning of October of last year, I got a blog and started allowing others to post comments. I did that because I had interviewed at Microsoft the week before, and my final interviewer — VicG — told me that he wondered whether I “got it” about the internet because I couldn’t name my favorite blog.
Now, a few months later, I read dozens of blogs and I post on my own blog more days than not. I also post a lot of comments on other people’s blogs now. And the number of visitors to my blog has increased steadily.
But, as the last few posts here show quite clearly, my blog doesn’t have much focus these days. I used to write to a specific audience — Mom, close friends, a few people I had met in my travels — but now I’m writing to many different audiences. In general, most of the things I post on my blog are aimed at one of three main groups:
Is This a Problem?
I’ve been thinking a lot lately about how to address this lack of specific focus on my blog. Is it a problem to be solved? Or not?
I’ve wondered whether I should narrow my focus to just technology topics. That would probably be a way to draw more visitors over time, but it would offer nothing to the specific people who’ve been regular visitors to my site for many years. I certainly don’t want to do that. Right, Mom?
And I’ve thought of just posting personal observations and photos like I’ve done in the past. That would be the easiest, and most consistent with what Mahugh.com was all about for many years. But it would offer nothing to my techie colleagues and the developers I’ve enjoyed getting to know through my job at Microsoft, and I certainly don’t want to do that either.
I feel torn between these two worlds whenever I post something on my blog lately, and I haven’t found other bloggers who seem to be facing the same dichotomy. For example, I don’t know of another blog that has technical posts and also has regular comments from the blogger’s Mom. I was traveling a lot in February, and I emailed my Mom and apologized for not keeping in touch. She responded “”I read your blog and that way I know what’s going on, so I feel like we’re keeping in touch even if we don’t talk for a while.” I could be wrong, but I’m guessing Mini-Microsoft’s Mom doesn’t feel that way.
It’s Not a Bug, it a Feature!
So after considering some options, I’ve decided to stay the course. In other words, to have no course, no goal, no well-formed mission statement or goal or success metric, and just keep posting whatever I want, whenever I want.
I realize that can make subscribing to my blog a little tedious, if you’re interested in one of the above areas but not the others. Sorry about that. As the saying goes, “a compromise is when two parties agree to do something they both know is wrong,” and my blog is all about compromise these days. But it’s unrealistic to think I’ll keep two or three blogs going — I can barely find the time to keep one blog going — so I need to find a way to make it all work right here. And that means no rules, no focus, and no consistency.
Speaking of which …
Announcing: Tom’s Blog

Both Scoble and Mini-Microsoft are taking a little time off these days, so if you’re having trouble getting your blog fix I have a recommendation: head on over to Kepler’s Laws of Planetary Motion. My friend Tom Kepler has just started a blog, and there’s still a chance you could be one of his first dozen commenters if you move fast.
Tom is the kind of person who should blog: a good writer, great designer, a lifelong techie geek, and a very funny guy. So his blog will be an interesting place to watch. Given my recommitment to the principle of inconsistency on my blog here, I’m expecting Tom to give me some serious competition: his first posts are already all over the place. And he’ll probably do some creative stuff with HTML; Tom was one of my geeky friends mentioned above who got together in the 90s to swap HTML tricks.
Tom and I go way back. In the early 80s, we were regulars at some of the coin-op arcades around Chicago and Evanston. I was 24, and he was 12, but we shared a level of emotional maturity and irreverence that made us fast friends. I like to think we haven’t changed, hairlines and waistlines notwithstanding.
Blogging Advice For a Friend
So I’d like to close this long rambling post with some advice for Tom about blogging. Hey, everyone else who’s been blogging for more than 5 minutes gives advice, so here comes mine.
Let’s make it a top-10 list … ten things to remember when you start a blog:
#10: Blogging is not real life. This concept frees up everyone involved. It frees you to post almost anything you’d like (as this post is a good example). And it frees your readers to do things like speculate about your sexual habits because you’re using the wrong brand of compiler. Embrace this freedom.
#9: Don’t stop writing because your readers are silent. They’re still there, even when nobody says a word. I’ve had people make casual references in email or conversation to things I’ve put on my blog weeks or months before, and often they were posts that didn’t get a single comment. The street is always listening.
#8: Don’t pay any attention to your blog statistics. I’m not even sure how to get to mine. Who cares? If Mom reads my blog, that matters. Whether or not 10,000 nerdy Slashdotters read it doesn’t really matter to me. Well, as long as you read it, Tom! Seriously, checking your blog stats is like measuring the size of your own … well, just don’t go there.
#7: Email response are great. If somebody sends you an email about something you’ve posted, that’s even better than a public comment sometimes, because both of you are then free to say what you really think. I know this is the opposite of the advice all the A-list bloggers will give you, with their focus on driving traffic to their blogs and their pride in being so popular that they can’t possibly respond to all the fan mail they get. Email exchanges with your readers are always a good thing, and anyone who takes the time to read your blog and write you about it is worth responding to.
#6: You’ll meet new friends on your blog you wouldn’t have met any other way. I’ve met so many people through my blog, and they’re a much more varied crowd than the friends I’ve met in person. Just to pick one out of the bunch, consider Dave. I don’t even know his last name. And based on his Liberal Quicksand blog, we’d probably have gotten into a fight if we had met talking politics in a bar. But Dave shares a bunch of my technology interests and experiences over the years, from Dan Bricklin’s Demo program to Wordpress, and I think it’s cool that he drops in from time to time. I feel like he’s a friend from the old neighborhood, even though we’ve never met and I don’t even know where he lives.
#5: Include lots of links. Some days your readers will find you annoying. Hell, some days you are annoying. I have the same problem. But if you always include a few cool links to other sites, they can click on those links, get lost in somebody else’s little world, and come back when they’re ready to appreciate you again.
#4: Don’t optimize your layout for tiny screens and cell phones. Sure, make it work on those devices, but make it look best and work best on a full-size monitor with a full-size keyboard and a mouse. That’s where most people will be when they visit, and that won’t change for decades, if ever, because of this little fact that the A-list bloggers don’t seem to realize: most people don’t want to read blogs when they’re away from their computers. It’s true. I know, because I’m a people, too.
#3: Link to people who link to you. This is a good way to increase your relevance in search rankings, and it’s also a good-Karma thing to do.
#2: Include in-line images. You’re already doing this; cool. The A-listers will tell you this is dumb, because you need to “expand your reach to the widest possible audience” by designing to the least common denominator: a low-res display on a slow dial-up connection. The next step in that kind of thinking is to shut down your blog and start sending out text-based spam.
#1: Don’t let the bastards get you down. (See #10 above.)
Have fun, Tom!
Here’s a question for all you C#/Visual Studio studs who live and breathe .NET: how do you display an XML file? Specifically, I’m interested in displaying the raw XML for a developer, as a learning aid. I’m putting together a utility that lets people browse through the parts that make up an Office Open XML document, and this is for the “view selected part” functionality.
As near as I can tell, I have three options: a TextBox, a WebBrowser control, and a TreeView. Am I missing anything there? Is there any other option?
The TextBox is easy, programmatically: just take the XML stream, read it into a byte buffer, encode that into a string, and then set the TextBox’s Text property to the string. But the resulting display is pretty hard to comprehend, because it’s just the raw text, with no indentation to show the structure of the XML, and there may or may not be carriage returns between tags.
Then there’s the WebBrowser control, a very cool addition to .NET 2.0 that makes rendering HTML and related content types much simpler to implement than in the past. That one seemed promising, but I haven’t got it working the way I’d like.
First I just tried setting the WebBrowser’s DocumentText property to the string containing the XML, like setting the TextBox’s Text property. This causes the XML to be actually rendered in the browser, rather than displaying the raw XML. So, for example, a messy chunk of XML with lots of tags and attributes that is the main “start part” for a Hello World document will just show Hello World and nothing else.
Instead, I’d like to see the same thing I see in Internet Explorer if I open that XML file: all the tags and attributes, in a nice expandable/collapsable treeview sort of display.
It seems that there’s another option with the WebBrowser control: do an XSL transformation to make it into HTML, then show that. I think that shows the tags, although the examples of this technique I’ve found don’t make that clear and don’t show sample output. So I’ve been trying to get it working, something like this …
XslCompiledTransform MyTransform = new XslCompiledTransform();
MyTransform.Load(”c:/windows/system32/wbem/xml.xsl”);
MemoryStream MyMemStream = new MemoryStream();
Stream sr = documentPart.GetStream();
XmlReader MyXmlReader = XmlReader.Create(sr);
MyTransform.Transform(MyXmlReader, null, MyMemStream);
MyMemStream.Position = 0;
webBrowser1.DocumentStream = MyMemStream;
But that second line chokes on “The ‘http://www.w3.org/TR/WD-xsl’ namespace is no longer supported.” So do I need a newer xml.xsl file? Or what? I’ve seen references to this transform online as just xml.xsl, with no explanation of where that comes from, so I’m not sure how to find an XSLT that I can use here. And to tell the truth, I’m not 100% certain what I’m going to get if I work through that problem: is this just another way to display “Hello World” and nothing else?
Finally, I decided to just bite the bullet and do it in a treeview. That gives me maximum control over the details, and it means I get to write a recursive routine. (We assembly-language old-timers have a blissful nostalgia for recursion, you know.)
So I’ve got code that looks something like this, and it works great:
private void Xml2Treeview(XmlNode xmlNode, TreeNodeCollection treeNodes)
{
// add this XML node as a TreeView node ...
TreeNode newTreeNode = treeNodes.Add(xmlNode.Name);
// handle the various types of content we might have in this node ...
switch (xmlNode.NodeType)
{
case XmlNodeType.ProcessingInstruction:
case XmlNodeType.XmlDeclaration:
newTreeNode.Text = "< ?" + xmlNode.Name + " " + xmlNode.Value + "?>“;
break;
case XmlNodeType.Element:
newTreeNode.Text = “< " + xmlNode.Name + ">“;
break;
case XmlNodeType.Attribute:
newTreeNode.Text = “ATTRIBUTE: ” + xmlNode.Name;
break;
case XmlNodeType.Text:
case XmlNodeType.CDATA:
newTreeNode.Text = xmlNode.Value;
break;
case XmlNodeType.Comment:
newTreeNode.Text = ““;
break;
}
// call myself recursively for each attribute of this node …
if (xmlNode.Attributes != null)
{
foreach (XmlAttribute attribute in xmlNode.Attributes)
{
Xml2Treeview(attribute, newTreeNode.Nodes);
}
}
// call myself recursively for each child node under this node …
foreach (XmlNode childNode in xmlNode.ChildNodes)
{
Xml2Treeview(childNode, newTreeNode.Nodes);
}
}
I just call that method with the root node collection of my XML document, and it populates the TreeView. I can decide how I want to handle attributes, and I can add clever functionality to look up other info (say) when you click on a node, or whatever my little heart desires. It looks great, and it’s fast on most normal-sized documents (i.e., a few megabytes or less). It doesn’t scale to documents larger than available RAM, but I really don’t care about that for this type of learning tool/utility.
So is this how people display XML in WinForm apps in general? I’d love to hear that I’ve overlooked something simpler. Is that wishful thinking?
Meanwhile, I’ll keep playing around with this approach and enjoying the bliss of recursion.
April 10th, 2006
10:09 am
We were sitting at the bar at Northern Quest Casino late Saturday night and a song started playing. “What’s the name of this song?” Patti asked. It sounded vaguely familiar, but none of us could place it.
Unbeknownst to me, I had the solution right on my hand, with my Cingular cell phone. I could have pressed #43, held up my phone to let it “listen” for a while, then hung up. And I would have received a text message a little while later, telling me the name of the song and the artist who recorded it. How cool is that?
It costs $.99 per song, and there’s no charge if they can’t identify the song. You can use any portion of the song to identify it. So I’d guess that they have a big database of songs, and they do some type of low-fidelity matching (to eliminate ambient noise) that find a match for your sample within the database.
I learned about this on an internal email DL, and apparently there are several of these services available. There’s the Cingular service, a service offered in Australia, and a site where you can just tap out the rhythm of a song and have it identified from that.
This is a great example of creative thinking about how to use digital technology to create new systems that offer new types of services. And the technologies required for this particular service have been around for a while: all that’s new here is the way they’ve been combined into an easy-to-use integrated service.
What else could we be doing with our cell phones that we haven’t envisioned yet?