Scott Hanselman

Google GuestMap 2007 and adding Google Maps to your Site

February 23, '07 Comments [3] Posted in ASP.NET | Javascript | Musings
Sponsored By

Two years ago I asked you "where are my readers?" Today, I ask you again, where are you?

Go sign my Google Maps Guest Map, would you, Dear Reader? It'll just take a moment, no registration required.

UPDATE: Read the Guest Map GuestBook directly, without the map.

I did a demo site with Google Maps and the GoogleMaps API recently for work. It sure is a nice clean API if you've got the data. I was able to integrate a nice map a day. I'm sure with a weeks work (which I don't have, it's just a demo) one could do some great stuff.

You just visit the Google Maps API page and sign up for an API key. You're limited to like a billion views, so don't go over! You can read the API docs as much as I can, so I won't bore you too much, but here's a little of what I did to jumpstart my demo.

(There's LOTS of ways to do this, BTW, this is just one. The sample may not be "cutting edge" but it's accessible.)

I was actually integrating the Timeline Control and its XML format with a Google, let's just say you have an existing XML format:

start="Feb 13 2007 09:00:00 GMT"
end="Feb 16 2007 09:00:00 GMT"
title="Some Window of Time">
Be sure to pay attention!</event>

start="Feb 4 2007 10:04:00 GMT-0500"
title="Chipotle $4.58"
lat="45.483484" lng="-122.800026" >Food</event>

start="Feb 7 2007 16:00:00 GMT-0500"
title="Jack in the Box $9.44"
lat="45.493112" lng="-122.805862"


I can just add geographic data "along for the ride," made especially easy because this data doesn't have a schema (although I could put it in another namespace).

You add this line to your page:

<script src=

Then add a map somewhere:

<div id="map" style="height: 200px" ></div>

Then hook up your Load and Unloads:

<BODY onload="GLoad();" onresize="GUnload()">

Then add a little script like this to get your XML and yank the data you need. The interesting bits are in red.

<script type="text/javascript">

function GLoad() {
  if (GBrowserIsCompatible()) {
  var gmarkers = [];
  var htmls = [];
  var i = 0;

  // A function to create the marker and set up the event window
  function createMarker(point,name,html) {
    var marker = new GMarker(point);
    GEvent.addListener(marker, "click", function() {
   // save the info we need to use later for the side_bar
   gmarkers[i] = marker;
   htmls[i] = html;
   // add a line to the side_bar html
   side_bar_html += '<a href="javascript:myclick(' + i + ')">' + name + '</a><br>';
   return marker;

  // This function picks up the click and opens the corresponding info window
  function myclick(i) {

  // create the map
  var map = new GMap2(document.getElementById("map"));
  map.addControl(new GSmallMapControl());
  //map.addControl(new GLargeMapControl  ());
  //map.addControl(new GMapTypeControl());
  // THE 10 is the ZOOM LEVEL
  map.setCenter(new GLatLng(45.519579, -123.004303), 10);

  // Read the data from example.xml
  var request = GXmlHttp.create();"GET", "your.xml", true);
  request.onreadystatechange = function() {
  if (request.readyState == 4) {
    var xmlDoc = request.responseXML;
    // obtain the array of markers and loop through it
    var markers = xmlDoc.documentElement.getElementsByTagName("event");
    for (var i = 0; i < markers.length; i++) {
      // obtain the attribues of each marker...don't bother without lat data
      var latVar = markers[i].getAttribute("lat")
      if(latVar != null)
        var lat = parseFloat(latVar);
        var lng = parseFloat(markers[i].getAttribute("lng"));
        var point = new GLatLng(lat,lng);
        var html = markers[i].getAttribute("title"); // or whatever you like
        var label = markers[i].getAttribute("title");
        // create the marker
        var marker = createMarker(point,label,html);

  // put the assembled side_bar_html contents into the side_bar div
  // A Sidebar is optional, you can just comment this out,
  // or not have a side_bar element.
  document.getElementById("side_bar").innerHTML = side_bar_html;
else {
alert("Sorry, the Google Maps API is not compatible with this browser");
// This Javascript is based on code provided by the
// Blackpool Community Church Javascript Team

I can't show you the demo I did, because it's super-secret-financial stuff, but perhaps you'll think of a creative new way to include geographic data in the project you're currently working on!

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by SherWeb

The Programmer Phases of Grief: or Language Translation is Harder Than It Looks

February 23, '07 Comments [25] Posted in Musings | Programming
Sponsored By

One's mind should be pretty clear when programming. I'm a decent enough programmer, but I'm not a bad-ass programmer. At least not anymore.

Back in the day, before marriage, before diabetes, before babies, when I was sleeping a full 8 hours, I could code some nice stuff. Now it's just a miracle it compiles. When it does.

I also tend to, um, not think. At all.

I have been looking into OpenID lately, and had the privilege of meeting the CEO of JanRain, Scott Kveton (pronounced 'k'-vee-ton', but real fast, like the first two syllables are one) and mentioned that I was pleased they had made a .NET compatible OpenID library available (Andrew Arnott has wrapped it in a nice ASP.NET 2.0 Web Control).

I was thinking I'd add OpenID support to Corillian's Voyager eFinance Server as a Proof of Concept, as our authentication system is pluggable. It'll be a nice demo, as our CardSpace one already works great.

I went and download the .NET OpenID Library preparing for a few hours of tedious work.


The .NET OpenID library is written in Boo - I blogged about Boo in 2005 (I wonder if Ayende will update his Boo Reflector support for Reflector 5.0?) - which is a language that is damn-near Python. You can convert your code to Boo with this online tool if you want to play. Here's some Boo examples versus C# 2.0.

Right now the best and easiest way to write Boo is to use SharpDevelop, the Open Source IDE. Boo is a first-class language within SharpDevelop, along side VB and C#, and includes all the usual good stuff like debugging and what-not.

The OpenID .NET Library, as I said, is written in Boo, very likely because the original library was written in Python and Boo offered not only a clear porting direction, but also made the developer comfortable. More on this later.

I figured this evening I'd "port" the Boo source for this library over to a "proper C# library" so the masses wouldn't have to sweat Boo. This experience let me through the...

Phases of Programmer Grief*.


I was of course, like any religious zealot C# programmer, shocked and offended and looked on with disbelief that anyone would use any language that wasn't the One True Way® to produce perfectly viable and runnable IL. Microsoft's whole multi-language, single-runtime was just to prove a point to the Java guys right? I looked at the code with disdain

Shock is often accompanied by numbness...

No curly braces? Duck typing? Is this how these people live and code? Freaks. Toy Languages, man, toy languages.


At this point, I don't think it'll be hard to port this. The library includes NUnit Tests, but as the library is structured with a lot of things marked internal to the assembly, there's two libraries. The main one, and the test one - but the code is also compiled into the test assembly. I started marking things public, and separated the two.

I've already missed the forest for the trees here, and I'm happily stepping on butterflies in my quest for the big game.

My goal was to use the Test library, as is, to test my glorious new C# library - the one I hadn't started yet. If the same tests passed on my C# version, shiny. I started poking around the code, trying to get an idea on where to start. The library includes a Server and an Consumer, and since I just needed the Consumer in the short term, I figured I start there.


There's not THAT much code in the consumer, but there's not only a number of utility classes, but there's also a bunch of Boo language-specific collections and such. Also, as .NET 2.0 doesn't include Diffie-Hellman support (Orcas does, BTW), the OpenID library referenced Mono.Security to get there BigInteger class and Diffie-Hellman support.

ASIDE: Be aware that Mono is GPL'ed Mono Libraries are MIT X11. Mono produces IL, and Mono libraries are CLS compliant, you can reference them in your Windows .NET applications happily, and they'll work fine 99.9% of the time. Adding a Mono library to my Windows .NET CLR program doesn't make it run under Mono, it's just referencing a library. Some people, like myself (yesterday) look down on this like we look down on C# programs referencing Microsoft.VisualBasic.dll, but hey, it's tested code I didn't have to'll no doubt see my own personal epiphany coming later in this post...

I thought I might write my own Diffie-Hellman...

Note that I'm getting totally off the main task-at-hand already here...but I've not noticed it...yet...

...or find one that was already done. If I could just remove that Mono.Security reference...


I started to feel bad, who am I to remove this library? Someone's worked hard on it, it shipped, let's leave it be, and get to the real work. Maybe I can find a better way to port this...ah, yes, Reflector!

I'm completely delusional...lack of sleep?  Analysis paralysis or just complete lack of thought? Ah, too much soda, perhaps? High blood sugar?

I'll just reflector the assembly and decompile it into C#. Heh, maybe I'll use Denis Bauer's FileDisassembler. There's probably some Boo specific stuff, but I'll yank that, no problem. It might be sinful, but no one is looking.

Of course, Boo assemblies include dozens of anonymous generated types and adapters to make Boo's closures work (it was designed before Anonymous Delegates could be used for closures) as well as for type inference.

Gosh...this decompiled C# code isn't even close...this may express the intent to the computer, but it doesn't reflect the Programmer's Intent at all.


Stupid piece of crap Reflector! Man, Lutz can't even decompile to something I can freaking read!

Remember that IL is the applesauce on its way to becoming apple juice. Note that Stupid Scott is pissed here because Lutz's Reflector can't turn applesauce back into an apple. Darn Reflector and the Laws of Abstraction.

Shoot...this is going to take longer than I thought. Now I've got to just freaking write thing whole thing from scratch by actually thinking and understanding what the code is intending to do! Man, I wasn't planning to think tonight, I just wanted to get OpenID on my blog.


I'm not a good programmer! I've been coasting on charm for at least the last three years. I remember what closures were in college, but I've been using .NET 1.1 for the last five years and it dulls the senses...I might as well just give up and become a nurse.

Acceptance and Hope

Wait a second. I've already got a library that works. It's got unit tests. It depends on a tested and released Mono library and a 3 year old non-mainstream language, but it works. It's been used and implemented live before and someone has already wrapped it into an even better and more useful abstraction. Maybe it'll work after all. 

The moral of this story is that my time would have been better spent learning Boo, reading the source, and using the Library. The source came with a NAnt Task, but I just created a Boo Project in SharpDevelop - THAT wasn't wasted time.

After I'd learned enough Boo, if I really wanted a C# version, for whatever reason, I should have just written it from scratch using the public interface as a template and the Programmer Intent, written in Boo, as my algorithmic scaffolding. Hindsight is 20/20.

Now, how do I get my evening back?

* With Tongue Placed Firmly in Cheek.
** Image
stolen from here.

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by SherWeb

Hanselminutes Podcast 52 - End to End Tracing

February 22, '07 Comments [4] Posted in Podcast | Programming
Sponsored By

My fifty-second podcast is up - that's a full year of podcasts. Oy! This one talks about End to End Tracing, and how there's magic in the XmlTextListener. You don't need WCF to do E2ETracing, but it helps.

ACTION: Please vote for us on Podcast Alley! Digg us at Digg Podcasts!

Links from the Show

SVC Trace Viewer (WCF) (m45)
CorrelationManager Class (m48)
Live Service Trace Viewer (m4b)
Using the Trace Viewer (m46)
Traces in User Code (m49)
Who's On (m4e)
End to End Tracing (m47)
End to End Tracing is Essential - PDF (m4a)

Subscribe: Feed-icon-16x16 Subscribe to my Podcast in iTunes

Do also remember the archives are always up and they have PDF Transcripts, a little known feature that show up a few weeks after each show.

Our sponsors are /n software and Telerik.

 Telerik is a new sponsor. Check out their UI Suite of controls for ASP.NET. It's very hardcore stuff. One of the things I appreciate about Telerik is their commitment to completeness. For example, they have a page about their Right-to-Left support while some vendors have zero support, or don't bother testing. They also are committed to XHTML compliance and publish their roadmap. It's nice when your controls vendor is very transparent.

As I've said before this show comes to you with the audio expertise and stewardship of Carl Franklin. The name comes from Travis Illig, but the goal of the show is simple. Avoid wasting the listener's time. (and make the commute less boring)

  • The basic MP3 feed is here, and the iPod friendly one is here. There's a number of other ways you can get it (streaming, straight download, etc) that are all up on the site just below the fold. I use iTunes, myself, to listen to most podcasts, but I also use FeedDemon and it's built in support.
  • Note that for now, because of bandwidth constraints, the feeds always have just the current show. If you want to get an old show (and because many Podcasting Clients aren't smart enough to not download the file more than once) you can always find them at
  • I have, and will, also include the enclosures to this feed you're reading, so if you're already subscribed to ComputerZen and you're not interested in cluttering your life with another feed, you have the choice to get the 'cast as well.
  • If there's a topic you'd like to hear, perhaps one that is better spoken than presented on a blog, or a great tool you can't live without, contact me and I'll get it in the queue!

Enjoy. Who knows what'll happen in the next show?

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by SherWeb

Binary Fortress Software's ASP.NET ViewState Helper - A Treasure Trove of Tools

February 22, '07 Comments [2] Posted in ASP.NET | Reviews | Tools | ViewState
Sponsored By

I was working on some demos here at Corillian and I needed to check the size of the ViewState on a page. There's lots of ways and lots of tools that can help you do this. Certainly FireFox's Web Developer Toolbar, while not specific to ViewState, can help you analyze a page.

Nikhil Kothari's Web Development Helper is also very good at this, but requires a little more setup and ASP.NET 2.0. An awesome tool, though.

I stumbled on Binary Fortress Software's ASP.NET ViewState Helper (their support forum is brand new, but if you have trouble go there).

What a slick tool! A 300k download, and works on ASP.NET from the outside - by futzing with IE's object model. It watches you surf and collects statistics. You can then double click on any of the pages and view the decoded ViewState.

I like a tool that does its job, doesn't run inside of IE (I've had it with Browser Helper Objects), and gets out of the way when I'm done. Recommended. This tool is a very useful addition to your c:\utils.

(BTW, their Web Performance Monitor has promise too, but I haven't looked at it yet).

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by SherWeb


February 22, '07 Comments [20] Posted in Tools
Sponsored By

Use OpenDNSDNS is one of these things that we just take for granted. You type and it resolves to an IP Address.

Who've have thought you could take a stodgie old protocol like DNS and hack a business model around it?

UPDATE: One of the founders of OpenDNS, David Ulevitch, has responded with some helpful info in the comments area.

OpenDNS has. Just set you DNS settings to and or click the button in the upper right corner of this post.

Interestingly, that button is a SMART button. If YOU are already using OpenDNS, you'll see one image, while everyone else sees the other.

They not only offer faster DNS lookups, but they'll

They make their money when you completely booger up a domain name, or DNS doesn't resolve, and you'll get a search page with their advertisers on it.

Now, to be clear, the protocol purists will hate this, declaring things like in the comments here:

I also don't like that "spelling correction" or "anti-phishing" feature. That doesn't belong in the cache; it belongs at the resolver. I would agree [snip] — OpenDNS is unsuitable for use as an enterprise DNS cache. It might be a good solution for people who want to run their own personal cache on a local node.

Personally, I'm loving it. I loves me a clever hack and this be one. Take a look at their FAQ. Since there's no software to install, and you can undo it anytime, it seems harmless to me.

If you want to try it with nslookup on Windows, remember to include the trailing . after the domain name.


Non-authoritative answer:

C:\Users\Scott>nslookup www.craigslist.orr.

Non-authoritative answer:
Name: www.craigslist.orr

Notice how the misspelled domain points to a 208.67.x.x address? That's OpenDNS. They'll redirect requests to craigslist.orr to the real site, that's how they handle misspellings - they're actually misspelled in the cache.

Take a look at their Status page. They are pretty hard core. I'll be hooking the parents and relatives up with this one, ASAP. If you're a parent or relative of me, go here to the Getting Started Page if you like, and follow the instructions, and call me if you have trouble. When you're done, visit and you'll know if it worked or not.

Comcast's (my ISP) DNS tends to suck, and I have been compensating by running DNS Masq here at the house on my Linksys Router.

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by SherWeb

Disclaimer: The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.