Why Podcasts Suck, Redux!


I weighed in on this subject some time ago here and I think it's high time for a rehash. Why?  Because they just won't give up! I'm putting links to Silverlight stuff into IttyUrl.net, which finally has a good, fast  new home (hasta-la-vista gate.com -- useless hosting company!)  -- and now I keep coming up with these podcast promotions.  NO, NO, NO!

Podcasts are linear, they are like TV, which has become virtually prehistoric for us Internet Geeks! A podcast cannot be indexed by Google, you cannot "Search" it to find the part you are interested in (if there actually is one!) , and, except in rare cases, it's not professionally produced media - not by a long shot. And you certainly cannot copy code samples from a FYOOKIN' PODCAST! I mean, if I want to listen to the BBC audiobook narrated edition of Ernest Hemingway's "The Short Happy Life of Francis Macomber", that's professional media! Podcasts, "NOT"!

As I opined in my previous post, we live in a technological era where any Joe Schmoe garage band can burn their own CD or MP3 and distribute it. That doesn't mean it will be any good. Same with Podcasts! PODCASTS SUCK.


What we have, as I've observed, is a number of blog / print authors who are, in many cases,  really good in their own right -- but who just fall to pieces when they try to produce a podcast. They are (unfortunately) spending a lot of time and effort producing these media pieces when they could be writing really good articles with downloadable source code. But they're not, because they don't understand why PODCASTS SUCK!

Marshall McLuhan, whose work is viewed as one of the cornerstones of media theory, said "The medium is the massage". What did he mean? McLuhan was the John Cage of modern media. Cage stretched the concept of what media really is, but in the musical domain. I can remember when I was younger, driving up Route 202 in Stony Point NY to see John Cage's house, and thinking "Holy Sh*t!":


You can't see much in the photo above, but Cage's house was a semi-cylinder - like a beer can with shingles on it! This guy was so avante-garde that he was light-years ahead of the crowd, in every thing he did.

I was in awe, because I believe that I understood who this guy really was.  Read the Wikipedia pages about these two giants, who set the stage for what is today, even though the Internet didn't even exist yet for either of them. They SAW the future, and they saw it with such genius vision, it is still just as relevant today!


I believe that both John Cage and Marshall McLuhan would have laughed at modern podcasts. I've also consulted with Dr. Dexter Dotnetsky, denizen of the deep at eggheadcafe.com, and he agrees. And, Dr. Dotnetsky would not play you wrong, dude!

Podcasts, even the "best of the best" by MVPs and Microsoft gurus -- many of whom I know personally -- are, in the main, essentially no more than mental masturbation with people breathing into the microphone and saying "Um" a lot. Sorry, but that's my considered opinion.

Oh, and did I forget to mention -- PODCASTS SUCK! Make no mistake, they really do. You want my unending appreciation and admiration? Write me an authoritative article with downloadable source code!  An article that I can FIND - because Google et. al. indexed it!  I'm not gonna download your dumb Mp3 podcast to my device! Go ahead, comment, make your case why I am wrong-- but, PODCASTS SUCK!

Now, if you want to see some media that is linear like a podcast, but useful and really entertaining, try this Silverlight streaming video of Chick Corea with Miroslav Vitous (bass) and Roy Hanes (drums) playing Thelonius Monk's "Rhythm-A-Ning". On October 10th, Monk would have been 91 years old. To me, Monk is quite alive and well, and his work continues to inspire jazz musicians worldwide. Recorded live at the Blue Note. ( More Monk Here)

Did you know that an unusually high percentage of programmers are also musicians - particularly the jazz flavor? It's true. I studied with jazz players in New York and San Francisco; used to play string bass and flute with the Robert Hunt Trio in New York, and I still keep up my flute chops today. It's easier to get three squares a day as a programmer, though!  Dream big, Be yourself, and Swing On! (Oh, and don't forget, PODCASTS ______).


Internet Explorer 8 Beta 2 out, and compatibility tags

Internet Explorer 8 Beta 2 was released today in multiple languages, with more to come in the next 30 days. So, this represents a move beyond the "BETA 1" developer preview stage (possibly by a longshot).

As can be expected, there will be a lot of pages and sites that want to opt-out of IE 8 “Standards” mode rendering. There are two ways to do this:

  • On a per-site basis, add a custom HTTP header

X-UA-Compatible: IE=EmulateIE7 (IIS 7.0 example:)


  • On a per-page basis, add a special HTML tag to each document, right after the <head> tag

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />

Implementing the HTTP header is useful if a site owner wants most of their site to render as it did in IE7 or if there are no plans to update site content. Inclusion of this header honors any Quirks mode pages that belong to the site.

Using the meta-tag on a per-page basis is beneficial when you want to opt-in specific pages to render as they did in IE7.

NOTE: The X-UA-Compatible tag and header override any existing DOCTYPE. Also, the mode specified by the page takes precedence over the HTTP header. For example, you could add the EmulateIE7 HTTP header to a site, and set specific pages to display in IE8 mode (by using the meta-tag with content=”IE8”).

I have no immediate plans to start using IE 8 as I’ve got plenty of other problems and challenges. But you are welcome to share advice or experiences by commenting here. On second thought, maybe I'll install it on my laptop which I don't use that frequently and on which I don't have mission-critical "stuff".

BTW Department

Have you ever wondered where the new Sql Server Database Publishing Wizard is? You know, the one that installs with Visual Studio 2008? Well you can run it “standalone”, in case you were wondering -- c:\Program Files\Microsoft SQL Server\90\Tools\Publishing\1.2\SqlPubWiz.exe . On a 64-bit, here: C:\Program Files (x86)\Microsoft SQL Server\90\Tools\Publishing\1.2\Sqlpubwiz.exe


Bugs in Silverlight?

Dr. Evil: Right, people you have to tell me these things, okay? I've been frozen for thirty years, okay? Throw me a frickin' bone here! I'm the boss! Need the info.

I've seen more than a few posts on the Silverlight Forums where people are complaining (or sometimes just asking for help / guidance) on issues where they appear to be attempting to "tax the system"  and thus expose what they believe is "a bug".  Hey - Silverlight has bugs - even release software does -- that's not the issue. But creating artificial programming situations where one can claim "It's a bug" is not always a  legitimate effort.

More often than not, this revolves around issues like "memory leaks" when attempting to set up some sort of "test" code that does some operation in a tight loop, or some similar operation that does not necessarily relate to what would likely happen in a "real world" Silverlight application. The poster then takes great glee in the assumption that they have "found a bug". Sometimes, it's just "attention seeking", and other times it revolves around an incomplete understanding of what Silverlight is, and what it's capabilities really are.

I think it's important to understand that the Silverlight runtime is based on a subset of the .NET Framework which is normally installed on the client in about 10 seconds - without the requirement to even restart the browser in most cases. In order to accomplish this, a lot of "stuff" had to be left out.

There are workarounds for some things, and for others, there are not any workarounds.

The key thing to remember here is that if you are designing a new Silverlight application that relies on some assumptions that you could normally make with some degree of confidence with the full .NET Framework, when attempting to do this with Silverlight, your assumptions may very well be "out the window". It "is what it is" - and you have to be able -- and willing -- to work with it. Not just that - but you also must be willing and able to invest the time to discover "why" you may not be able to do what you want.

What's important to keep in mind is first, to test your assumptions extensively and see how they  perform.

The second, and perhaps more important principle -- is to understand that in order to accomplish your objective, you may need to refactor your approach so that it does not tax the SL runtime - which is a subset of the full Framework that runs in the browser, on the client. 

For example, if you are going to create 10,000 UserControls in a tight loop, calling GC.Collect both immediately before and then after each iteration -- and then proceed to complain about memory leaks -- ask yourself if this is a scenario that is really likely to play out in a real - world Silverlight application. If you think it is, then maybe the problem is that you simply need to revisit your original assumptions and make appropriate adjustments that come into play a little bit closer to "runtime reality".

The SIlverlight forums are rife with this kind of "complainer post" - but they also have a significant number of interesting and extremely useful posts and answers. I saw one user who signed up with the name "SILVERLIGHTSUCKS" - and proceeded to make allegations that belied a true understanding of how Silverlight media streaming works, and why. You could see that one coming from a mile away :-).

I think Silverlight has huge potential for a variety of applications including LOB apps that present exciting UI interfaces to complex business scenarios. But like Flash / Flex, everything has its limitations. In general, Developers need to invest the time to learn what these limitations are and then they will be able to ask more intelligent questions.

Visual Studio: Enable / Disable IE Script Debugging Tool

Rocky: There has already been two attempts on your life.
Bullwinkle: Don't worry, we'll be renewed.

If you are like me, you are always keeping your eye out for shortcuts and ways to make your life easier. One of the little annoyances of working with Visual Studio .NET is that it has no option to turn Client Script Debugging on or off – you have to open up Internet Explorer, go to Tools/Internet Options/Advanced and either check or uncheck the checkbox option.

All this checkbox does is control a Registry entry, so why not just make a little .vbs script and register it as an External Tool in Visual Studio?

The steps to do this are very simple. But first, you need to find out what Registry Key has your value.

The key is located at HKEY_USERS\XXXXXX\Software\Microsoft\Internet Explorer\Main\ where “XXXXXX'” could either be “.default” or one of the machine user identities such as “S-1-5-19”. Once you have identified where your actual “Disable Script Debugger” key is located, you can modify the short script below, and save it as “IEScriptDebug.vbs” in a convenient folder.  You should also make a second batch file, “IEScriptDebug.bat” that will run this, since Visual Studio doesn’t like to configure .vbs files as executables (even though they are), preferring .bat files instead.

Here’s the script:

Option Explicit
' NOTE you will need to find the HKEY_USERS\XXXXXX\Software value of "XXXXXX" for your machine.
' where this key is located; It could be \.Default\. On this machine it is \S-1-5-19\
Const cHKU = "HKEY_USERS\S-1-5-19\Software\Microsoft\Internet Explorer\Main\"
Const cDSD = "Disable Script Debugger"
Dim objWSH
Set objWSH = WScript.CreateObject("WScript.Shell")
Dim strWSH
strWSH = LCase(objWSH.RegRead(cHKU & cDSD))
Dim strMSG
strMSG = cDSD & " = " & strWSH & vbCrLf & vbCrLf & "Toggle this value?"
If MsgBox(strMSG,vbYesNo,cDSD) = vbYes Then
If strWSH = "no" Then
objWSH.RegWrite cHKU & cDSD, "yes"
objWSH.RegWrite cHKU & cDSD, "no"
End If
MsgBox cDSD & " = " & objWSH.RegRead(cHKU & cDSD),vbInformation,cDSD
End If
Set objWSH = Nothing


Once you’ve got your .vbs and .bat file saved, in Visual Studio, all you need to do is choose “Tools/ External Tools” and add it:



Now whenever you want to toggle Script Debugging, Just hit “Tools / Script Debugging” in Visual Studio and you are good to go!



Today a fellow developer who works offsite sent out an email asking for help. He is apparently using a javascript “virtual keyboard” to help with accessibility on an ASP.NET app he’s working on.  In the sample “.htm” page, it seems to work great. But when he added everything to a new .ASPX page, the virtual keyboard jumps down in the page when invoked,  and this gets worse as you add more breaks to move the target textbox down the page. He states he knows  it’s “just some IE bug, but I am going nuts trying to find it”.

I opened the app. The .htm page works great. In the .aspx page, just as he describes, instead of the virtual keyboard rendering just below the input box, it renders at least 2 or three lines below where it is supposed to appear. Yet, all the code, javascript, CSS – is IDENTICAL! Or is it?

In the .Htm page, the DOCTYPE Declaration specifies XHTML STRICT. The default DOCTYPE from the .ASPX page is XHTML TRANSITIONAL. Yep, it can sure make a difference. Its “Not a Bug” – IE is simply doing its best to follow what you told it!

This CSS will also help IE play nice:

<style type="text/css">
html, body
overflow: auto;

The moral of the story is, “Don’t DuctTape your DocTypes!”


Silverlight 2 Beta 2: ConfigUnrecognizedElement issue and Fix


When you create a Service Reference in a Silverlight App to an ASMX WebService, you may get the: 

"An unhanded exception ('Sys.InvalidOperationException: ManagedRuntimeError error #4004 in control 'Xaml1': System.InvalidOperationException: ConfigUnrecognizedElement at System.ServiceModel.Configuration.BindingsSection.ReadXml(XmlReader reader)"

Exception. This "is a real bug".  When your Visual Studio 2008 Silverlight app generates the ServiceReferences.ClientConfig file, it creates a customBinding section that it cannot parse. In fact even the IDE marks the customBinding tag with squiggles saying "The element 'bindings' has invalid child element 'customBinding'. List of possible elements expected: 'basicHttpBinding'."

This is because SIlverlight doesn't understand SOAP 1.2, which is the default for ASMX webservices. DUH! To fix, you can do this with WCF:

<binding name="myBinding">
<textMessageEncoding messageVersion="Soap11"/>

Or, with ASMX, you can do this:

<webServices >
<remove name="HttpSoap12"/>


Those of course would be in your server-side web.config file.

The problem here is that the tools are creating a custom binding that is unnecessary and improper. If Silverlight can't support SOAP 1.2  then the tools should not be creating this binding. Silverlight should also ignore any bindings it doesn't know about.

WCF is great, but for simple deployment and auto-documentation in the service discovery page, I still prefer ASMX.


FACTOID:  Count Basie would be 100 years old today. The guy made a huge contribution to American Jazz, and dozens of jazz greats came out of his band. Here’s a clip of his band doing Neil Hefti’s “Lil Darlin’”:

BTW - it was Neil Hefti who wrote the original Batman theme.


When Hosting Plans Go Bad...

Talk sense to a fool and he calls you foolish.  --Euripides

When I started using paid hosting for ASP.NET sites, I started out with CrystalTech and they were very good. Then I found Gate.com and they seemed like they had a pretty good deal going - SQL Server 2005, plenty of bandwidth (200GB), plenty of space, ASP.NET 2.0 and a control panel that would let you create custom subfolder IIS applications, set mime-types in IIS, and even your own custom 404 page - which I instantly turned into a custom UrlRewriting handler. All this for like $9.95 / mo, and a 25% discount on additional sites. Sweet. For an extra $5.00 I could go up to 500GB bandwidth.

Then, about a month ago, I got an email from gate.com promoting how they were going to have a new "improved" control panel page, new features, more this, more that -- you get the idea.

Turns out that they REMOVED features. They blew away my custom 404 handler and removed the ability to specfy "my" page for HTTP 404. They removed my sub applications AND the abiity to create one. The sites have gotten dog - slow, and the tech support is like "lo babayit" (Hebrew slang for "nobody home"). 

It is pretty obvious that for one reason or another, they simply don't care about the customer any longer – and that’s a recipe for disaster for a hosting company (or really, any company that expects to stay in business).

You know what, Gate.com? The minute I can find a better hoster with a good price and the features I need, you bastards are HISTORY.

So, what about you? Got any HCHS's (Hosting Company Horror Stories)?


Silverlight: Some HttpWebRequest Headers don't work

Parents: Talk to your kids about Linux. Before somebody else does. -- XKCD

I saw a couple of posts where people were attempting to make GET or POST requests to some service (which, if not same-domain, had the required crossdomain.xml or clientaccesspolicy.xml file) and this service required BASIC authentication credentials.

Normally, you would add an "Authorization" header with the value "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==" where the gobblydegook after the word BASIC is username:password converted to a Base64 string.  That's standard W3C Header protocol.

Unfortunately, even though there is sample code illustrating this from Karen Corby here, it does not work (she does not actually add an Authorization header, just illustrates how to add a header). It turns out that the "Authorization" header is on the "restricted list". See here for a complete listing.  So, if you have been trying to do this, or any similar header that is on the restricted list, you'll only get strange exceptions that make no sense at all, and  you can give up and look for a workaround.

Obviously, the easy workaround is to have your own proxy page or service that would accept the requisite username and password on the querystring (encrypted if desired, or as form post fields) and your server-side code  would make the full framework HttpWebRequest  -- where we do not have such restrictions, and pass the results back to the Silverlight app.  An annoyance to be sure, but "it is what it is".  Here is an article I recently put together that provides an interesting workaround.


Visual Studio 2008 Service Pack 1 (release) now available

"In all recorded history there has not been one economist who has had to worry about where the next meal would come from." -- Peter Drucker

Here is a page with a bunch of related stuff, including a prep tool that will set you up in cases where you had a beta Service Pack installed:


The actual Service Pack link is about the 10th one down in the list, here:


I use UltraISO to extract this to the file system, and then you can just execute the "SPInstaller.exe" to start the install. A lot easier than burning a DVD. You can also mount the ISO using the VCD Control Tool or a similar utility such as Daemon Tools. But don’t forget if you ever need to do update or repair, you need to do so from Control Panel , not from the original install source for VS 2008 – and it will be looking for a drive letter and location. If you have space, I believe its better just to keep folders containing the Visual Studio 2008 and the Service Pack media on your hard drive.

There is also  a new Silverlight_Chainer.exe installer for Silverlight 2 Beta 2 that plays well with the new release VS Service Pack.  If you see a date of 8/11/2008 on this page:

http://www.microsoft.com/downloads/details.aspx?FamilyId=50A9EC01-267B-4521-B7D7-C0DBA8866434&displaylang=en (86461KB) File version: 9.0.30729.10
This checks SP1 RTM patches...
And installs:
      VS90SP1-   KB955214

-=- that's the new one!   Oh, and lest I forget, here’s the Readme:


So far, I have all this successfully installed on 2 machines running Vista, including one x64.

Here is a direct download link to the MSDN Library for Visual Studio 2008 SP1 (2209MB):


If you want to install VS2008 SP1 (release) and still work with Silverlight 2 applications, download the updated Silverlight tools and install this after you install VS208 SP1.

I have also installed SQL Server 2008 as an upgrade to SQL Server 2005 on a 64-bit Vista OS wtith no issues to report. Other machines follow, with updates to this post as appropriate.

NOTE: if you are having issues around Silverlight, read Heath's post.

There is one additional issue that happened to me with a third PC: If you get errors during Service Pack 1 installation such as “unable to load package xx1234.msi” this is a patch problem. The first thing to try is the Download the Microsoft .NET Framework 2.0 Registration Correction Tool package:



If this doesn’t work (and it didn’t for me) the next step would be to UNINSTALL Visual Studio 2008 and reinstall it fresh, then apply the Service Pack.

The fastest way to uninstall Visual Studio when all else fails:

An easy, reliable and very fast way to uninstall VS 2008 without having to wait an hour or more for the standard operations  is to use the Microsoft Windows Installer Cleanup Utility:

http://support.microsoft.com/kb/290301/en-us (download is midway down the page).

If you haven’t used it before, this presents you with a list of all software installations on your machine. You can select Visual Studio 2008 (any version), click the “REMOVE” button, and all registry entries pertaining to Visual Studio will be removed. If you want you can also delete the folder in C:\Program Files\Microsoft Visual Studio 9.0 but I suspect that won’t be necessary because when you install it again everything will be written over anyway. The installer will now think that VS2008 has never been installed before! Files don't really matter -- it's what's in the Registry that counts.

One final note:

Don't forget to temporarily disable your antivirus software while you are doing all this "stuff". I had F-Secure pop up an "access denial" on one file during my travels. You don't want that to happen when everything is 95% complete...

Have fun and don't forget to RTFM  on the readme file, before you jump in with both feet.

Some Interesting Silverlight Stats

According to Eweek, during the first week of the Beijing Olympics:

  • Silverlight was downloaded 8 million times per day
  • 13.5 million video streams active
  • 16.9 million users of the site
  • On August 11th Silverlight delivered 250Terabytes of data

I can remember a couple of times when the Silverlight "loading" thingies were spinning and no video got delivered, but that's still some pretty impressive numbers.


SQL Server 2008 RTM - First Experiences

FACTOID: B-2 bombers are capable of dropping 85 500-pound bombs in a single run.

I installed SQL Server 2008 RTM Developer Edition this evening. First it installed .NET Framework 3.5 SP1, no problems. Then we went with the full install and I chose an Upgrade over SQL Server 2005. Everything went fine until the prerequisites check, and it reported FAIL on Visual Studio 2008 - saying that SP1 was required.

Well, I already went through this stuff with Visual Studio 2008 SP1 Beta and it clobbered Silverlight.

So, when you guys solve this issue and provide a Visual Studio 2008 SP1 that preserves all my existing Silverlight 2 BETA 2 work and doesn't put me out of business - then I'll be happy to install SQL Server 2008. Meanwhile, I'm choosing the safe route, which is to keep my powder dry.

Be advised.

UPDATE (8/8/2008): 

According to Microsoft sources, VS 2008 SP1 will be accompanied by a new Silverlight Tools Beta 2 chainer.  The new chainer will have the patch for VS SP1 RTM, and SP1 beta will no longer be supported at that point.

The final Silverlight 2 release is still a ways off.  This is good news. 

NOTE: An interesting statistic: As of Aug 9th, Since August 1, 2008, NBCOlympics.com has accumulated more than 127 million page views, nearly half the total for the entire Athens Games. I bet that is one heck of a lot of Silverlight installations.


On Documentation for (and by) Developers

The government's view of the economy could be summed up in a few short phrases: If it moves, tax it. If it keeps moving, regulate it. And if it stops moving, subsidize it.  - Ronald Reagan

This has become a personal pet - peeve of mine, having been in various developer groups using the .NET platform since 2001 (ancient history, to be sure -- at least by Internet standards).

When I write a class library, if there is even the HINT that it may be used by other developers (or  -- even by me myself at some later date) I've learned to produce decent documentation in the standard XML comment format that has been available in .NET since the very first BETA 1.0 was distributed at the Orlando PDC (Professional Developers Conference) in 2000. 

Here's the "thing": as you progress in your career as a professional .NET developer, you'll learn to produce libraries and classes of useful code that you'll use again and again. The idea is that as you gain more and more experience, the personal resources you have developed to solve common programming tasks will increase, and your job as a programmer should get progressively easier - provided that you have documented your code!  Code I look at that's over six months old - unless it is documented well -- presents a challenge as I try to remember what it does and how it does it. Maybe I'm just having a Senior Moment - but I suspect that this  problem exists for everyone.

The standard XML  format of documentation works well  because there are well established tools (NDoc, Sandcastle, etc.) that can use this metadata to produce professional - quality CHM or HSX Visual Studio / MSDN type help files.

But even more importantly, if you as a developer enable the "XML documentation" path in the Build tab of your project's configuration property sheet, Visual Studio will generate it's standard XML documentation file that normally sits right next to the built assembly in the build output path.

And guess what? When you or anybody else loads this project, that XML documentation file is used  by Visual Studio to provide the developer with - Intellisense! The Intellisense that you - the original developer - authored. You can use, for example, the <remarks>... element to give developers instructional comments that will shorten their learning curve in using your code -- which they probably have never worked with before, no? Looky here:


Putting comments inline inside the body of your methods, or after the end of a line of code, or even inline inside a parameter list with /* comment here */ is useful of course. But standard XML documentation has a specific schema and must be placed just above the class or method declaration in order to be used by the IDE in the manner I've described.

There are several tools that can be used to make this task easier; the best of which (I think) is GhostDoc produced by Roland Weigelt.

In fact I distinctly remember Roland emailing me some time ago asking if it was OK to use some code that I had published for his GhostDoc add-in project -- and of course the answer was that I was delighted.  GhostDoc is indispensible if you strive to be a professional developer and document your code. It automatically produces "best - guess" documentation that you can embellish or improve very easily - and all you need to do is highlight the first (signature)  line of your method, right - click, and choose "Document this". Jeesh -- it doesn't get any easier than this!

Producing quality, standards - based documentation for your work not only establishes you as a professional who cares about others, it can also save a lot of man-hours of work for any developer who is expected to use your creation in their work. Developers often say or think, "I don't have the time to produce documentation". Actually, it's the other way around - if you don't make the time to  produce documentation, you may not have time left for development.

Remember - we don't develop code in a vacuum, even if we are "a team of one". Some months from now, YOU may be the person who is happy that the documentation was provided (by you).

Roland, thanks for providing a great tool!