Teaching computers to make "Better Mistakes"

TRN has an interesting piece here about how the MIT media lab has accumulated a vocabulary usage database that helps speech recognition by reducing mistakes and boosting recognition speed.

The researchers evaluated their common sense speech recognition technique by logging the errors and dictation times of users who dictated text that contained topics covered by the Open Mind database. It prevented 17 percent of the errors and reduced dictation time by 7.5 percent. Kind of a "Social AI", if you will.

This is a concept that can be used in business intelligence as well, not just voice recognition. I see some real business opportunities here for good DB people.

ASP.NET 2.0 Speed Tests: Where's the Fire?

I read a very nicely done piece on MSDN about how the ASP.NET 2.0 pipeline, even though it is more complex than the ASP.NET 1.1 pipeline, has been optimized to be 30 percent faster.

"Great!", I thought. "Let's do a couple of tests."

So I whipped up a page in ASP.NET 2.0 that just outputs "Testing...", and removed all extraneous HTML from the ASPX portion except the FORM Tags. Did the same in ASP.NET 1.1. Pages were substantially identical, being designed primarily to test the pipeline itself - get a request, set up and process the Page, send it out.

I did two sets of tests on each using "Homer", 1 with 100 threads, no delay. and another with 100 threads, a 10X multiplier (the equivalent of 1000 simultaneous requests), and no delay between requests.

In both cases, the ASP.NET 2.0 pipeline was SLOWER, not faster. Both sets were compiled and run in Release, not Debug mode.

I suppose I should consider the fact that it is still BETA, but - SLOWER? Guess we'll be running more tests. . .

Anybody want to comment on this? I have plenty of experience doing web stress testing, having several weeks experience at the MS Testing Lab in Charlotte, NC. This is with IIS 6.0 on Windows Server 2003 64-Bit running on an AMD Athlon x64 3400+ with 2 G RAM.

NOTE: I did have a brief interchange with MS about this and after talking with them, I believe that the discrepancy has a lot to do with ASP.NET 2.0 running under 64-bit WOW. Unfortunately as of right now, the only other machines I've been able to test this on are Windows XP with a 10 connection limit, where it appears that there is less of a discrepancy between the 2 frameworks when both are running under 32 bit IIS. However, I certainly did not notice a "30%" faster pipeline. Having said that, I suppose that anybody really interested in pursuing this should do 2 things:

1) Run different kinds of tests - with both simple and complex pages. Run them on 32 bit only, and then if possible, 64-bit under wow64 and compare the results.
2) Ultimately, wait until RTM since that's really where the "HTTP Request meets the Browser" so to speak.


RSS - Aggregate the Aggregators?

After quite a bit of peripheral research on RSS (not just what is is, because we've been using it for a long time - more about where the "whole thing is headed"), I decided to try my hand at "aggregating the aggregators". There are enough search engines of various types now that offer to return their results as RSS that it made sense to build a "Multisearch RSS aggregation engine" -- and so I did.

Basically what this little puppy does is take your list of search URLs - which usually have two parts - the main URI part, then your query term(s), and then an optional "part 2" that determines RSS, number of results, etc.

These all take your query and send it out to each engine asynchronously on a threadpool (I like Ami Bar's "SmartTthreadpool" - a really magnificent job). The results are stored in a hashtable with the link as the key so as to be able to easily weed out duplicate links. Then, they are ordered by pubDate most recent first, and returned to the caller as a DataSet - allowing the calling app or page to decide how it wants to present the results. What I do with this search page that uses my "engine" is perform an XSL Transform and is save the result html on the filesystem and keep a list of "Recent search" links right on the page that people can choose from. These, of course, will come up immediately since there is no need to go out to the search engines to get the results. It even inserts up to three "ads" in the result page, and the page automatically deletes searches that were cached and are older than X number of days. The engine portion uses an "EngineState" class that holds all the parameters and uses the XmlSerializer to serialize itself to and from an XML configuration file.

After a trial period and some more tuning and cleanup, I'll probably write an article and make the source code available. Meanwhile, if you would like to preview the RSS Multisearch Engine, here's the location.

RSS is exploding in the last year or so. It's actually kinda scary when you think about it...

Comments are always welcome.


Get Ready for the next Book Tsunami . . .

All the Microsoft "2.0" stuff (whatever it really is, VS.NET 2005, ASP.NET 2.0, SQL Server 2005, etc) is expected to be released later this year, and we are in for a hell of a learning curve. For starters, Scott Guthrie says the number of classes in .NET 2.0 has doubled! Well! Pie r Square, and Cornbread r Round! Or is it the other way?

Hey, we're still having trouble grappling with all the classes in .NET 1.1. I'm an MS C# MVP, I've been working with this stuff since the first .NET Beta in 2000. I have a lot of books on the shelf about .NET Some I've bought, others are review copies from publishers because I've written reviews for them. But, man - we are in for an onslaught. I can see it now:

"Professsional ASP.NET 2.0"
"ASP.NET 2.0 Revealed"
"C# Iterators for Dummies"
"Sql Server 2005 Service Broker Quick Start"
"Team System Developer's Reference"

Umm, you get the picture.


PatternShare Community: An Idea Whose Time has Come . . .

Recently I came across Daniel Cazzulino's post about the CUA (Composite UI Application Block) they are working on
jointly with Microsoft. Now we know, Daniel, why you've been so quiet lately! I sense from Daniel's excitement about it that we are in for a very nice present!

Among the referenced links was one to the new "Patternshare" web.

Among others, Gregor Hoepke's work is mentioned. I've been reading his Enterprise Patterns book off and on and it has been a real eye-opener. This Patternshare site is well-organized and has lots of friendly features.
Highly recommended.

Windows 64-Bit Registry Tricks Department

The Windows 64-Bit Registry on x64 versions has a new section "Wow6432Node" in each major Registry hive.

By adding:


in the proper position, many older 32 - bit registry .REG files will suddenly become functional. This applies to things like license keys,
settings entries, and some shell extensions.

Look at where your .REG script put the original entries, and see if there is a corresponding Wow6432Node to match. Modify your
script to put the entries under that node.


Dual Boot Windows 64 bit and Windows XP 32 Bit Scenario

I held off for quite a bit on installing Windows XP Pro 32-bit on the other drive, but surprsingly, despite all the cautionary tales I've read, it was a non-event.

I have two drives, a big SATA 200G primary, and another ATA 60G I threw in there as a slave. Simply booted off the XP CD, chose the correct drive, installed XP, and it was fine. Contrary to what I had read, it DID NOT replace the NTLDR and related files on the primary partition with their 32-bit counterparts (Although I'd still recommend backing them up somewhere safe -- that's boot.ini, NTDetect, and NTLDR).

The only remaining task was to edit the boot.ini file on the primary to allow for the dual boot. Mine looks like so:

[boot loader]
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows Server 2003 Enterprise x64 Edition" /fastdetect /NoExecute=OptIn
multi(0)disk(0)rdisk(1)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fastdetect

Note that the key number is rdisk(1) in the second OS line. Rdisk(0) is your primary drive, then rdisk(1), etc. That's all there is to it! I have a 5 second timeout set so if I do nothing when the list comes up, I get my desired default OS.

DISCLAIMER: No wild animals were injured in the creation of the UnBlog post. Your mileage may vary. Not responsible for... etc.


Here's the Thing about BETAs

The thing is, the reason for all these fixes and workarounds is partly because the developers at Microsoft are testing their installations on pristine machines with a fresh OS and a brand new Registry. But the developers out here (you and me) aren't doing that. We're installing it on a working development machine (yeah, yeah, I know what they say, but nobody listens) and so we need to uninstall our old BETA or CTP and try to install the new guy. The uninstalls leave orphaned Registry entries (that's the primary culprit) that interfere with the new guy getting in and being completely happy.

So you have junk where you either can't install, or your Help doesn't work, or your IIS ASP.NET Tab isn't there, and so on, ad - infinitum.

So what's the answer? Well, you can't change human nature. We aren't going to stop installing BETAs and CTPs on our regular development boxes. What the people at Microsoft need to do is spend more time doing it the same way we do it, and they'll discover these issues before they make a release.

Hey, nobody EXPECTS a BETA to be perfect. But, you can still do a lot to make the developer's experience a better one.


Does anybody read this stuff? Uninstall order, Visual Studio.NET 2005 Pre-Beta 2 items:

Uninstalling Previous Versions of Visual Studio 2005
If you have installed previous versions of Visual Studio 2005, such as Beta 1 or Community Technical Preview (CTP) builds of Visual Studio Team Suite, Visual Studio Standard or Visual Studio Professional, then you must uninstall the pre-Beta2 components in the exact order below before beginning to install any version of Visual Studio 2005 Beta 2.
Go to the Control Panel and launch Add/Remove Programs
Remove "Microsoft Visual Studio 2005 Professional" or other related IDE installs such as (Visual Studio Professional/Standard/Enterprise Architect/Team Suite, etc.)
Remove "Microsoft SQL Server 2005 Express Edition"
Remove "Microsoft SQL Server 2005 Tools Express Edition"
Remove "Microsoft SQL Native Client"
Remove "Microsoft Visual Studio 64bit Prerequisites Beta"
Remove "Microsoft MSDN Express Library 2005 Beta"
Remove "Microsoft Visual Studio Tools for Office System 2005 Runtime Beta"
Remove "Microsoft Device Emulator 1.0 Beta"
Remove "Microsoft .NET Compact Framework 2.0 Beta"
Remove "Microsoft SQL Mobile 2005 Development Tools"
Remove "Microsoft Visual J# Redistributable Package 2.0 Beta". If you receive an error message,
see Note 1.
Remove "Microsoft .NET Framework 2.0 Beta". If you receive an error message, see Note 2


1) If you see an error removing J# .NET Redistributable Package 2.0 from Add/Remove Programs, please run "msiexec /x {9046F10C-F5E7-4871-BED9-8288F19C70DF}" from a command line window
2) If you see an error removing .NET Framework 2.0 from Add/Remove Programs, please run "msiexec /x {71F8EFBF-09AF-418D-91F1-52707CDFA274}" from a command line window

ASP.NET 2.0 BETA 2: Hey, my ASP.NET IIS Tab is missing!

Chris Adams says this:
This is a problem caused by the change between Beta 1 and Beta 2.

To fix, check the following 3 regkeys -
HKEY_CLASSES_ROOT\CLSID\{FD5CD8B1-6FE0-44F3-BBFB-65E3655B096E} \InprocServer32

Under (expand) InProcServer32, look for the presence of a non- (example and remove it.
It has a reference that causes this to break.

If you do not have this MMC interface, you can use aspnet_regiis.exe aspnet_regiis -s
where path equals the location in the metabase where you want the mappings to change.
Note: There is also a switch to do this non-recurvisely if you desire.

and Stebner's VS.NET 2005 beta removal tool:



Visual Studio.NET 2005 Beta 2 and ASP.NET 2.0 -- First Take

1) Installed VS.NET 2005 Beta 2 on an AMD 3400+ with Windows Server 64Bit version, without a hitch!
2) If you want your ASP.NET 2.0 web apps in IIS to run properly, have to drop to the Framework 2.0 32 bit Framework (you may have both 32 bit and 64 bit frameworks) folder and run ASPNET_REGIIS -i -wow64
The -wow64 switch is required for a full install on 64 bit machines. Otherwise, when you attempt to run or debug your app, you will get an HTTP "Service Unavailable" error.

Word to the wise.

Little Known ASP.NET Debugging Quirk Solved

I like to run Windows Server because IIS 6.0 allows me to add as many IP addresses as I want and configure completely separate web sites.

This is a big advantage with ASP.NET projects because now everything you do is relative to the real web site root (not the Virtual Directory root) and so you can expect exactly the same behavior in your app during development and debugging as you will when it is deployed to a real web site remotely.

The problem I've run into is that ASP.NET debugging doesn't always work. There are lots of reasons why ASP.NET debugging doesn't work, and there are lots of fixes, but this one is germane to the specific situation mentioned above:

If you have an ASP.NET app that is targeted to a specific web site root at a specific IP Address in IIS (not "all avalable" as is the default), you may need to modify both the .sln file and the .webinfo file to replace the site name with the actual IP address of the site. Then, ASP.NET debugging will work fine (provided you comply with the other 25 things you might still have wrong!).


.webinfo file:
<Web URLPath = "" />

.sln file:

Microsoft Visual Studio Solution File, Format Version 8.00
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MyWebSite", "", "{1EB1C062-1990-4483-AB4C-EA7854FE0E22}"
ProjectSection(ProjectDependencies) = postProject

Note that in both the above, the previous entries would have been "MyWebSite" and have been changed instead to the actual IP address the hosts file entry for it points to, or "" in this case.

That does it!

Here, Beta Beta! It's here!

Yup, the long awaited BETA 2 of Visual Studio.NET is up on Subscriber Downloads! And from the speed I am getting from Transfer Manager, looks like a lot of other developers have the same news...


Microsoft Anti-Spyware on Windows Server x64 - Yes!

It works "like a charm" - sprang into action and killed the little bastards, every single one of them!

Nice, get yours here.

Nyaa, nyaa you nitwit spyware mongers! Up yours! Bastards!


AssemblyLoadFrom and CAB files and multiple assemblies

Junfeng Zhang is one of the few MS folks that focus on and are acutely aware of the lower-level intricacies of the .NET framework. His blog is at:


One of the valuable snippets I've picked up from Zhang is about using CAB files. I reproduce a portion here. Note that when Junfeng uses the word "we", what he means is "This is what the Framework does":

You can deploy assemblies using cab files.

There are two ways to load assemblies from cab files.

1. Assembly.LoadFrom

You can give the URL of the cab file to Assembly.LoadFrom. For example,


2. Use app.config, and specify codebase hint, then use Assembly.Load.

For example:

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity name="myasm" culture=whatever publicKeyToken="0123456789abcdef "/>
<codeBase version=""


When we locate the cab file, we extract them to a temporary directory. The temporary directory becomes the application base now and we will probe the desired assembly in the temporary directory. We then copy the assembly to download cache, and remove the temporary directory we created. The final assembly location you see from Assembly.Location will be in download cache directory.

There are subtle differences in using Assembly.LoadFrom and codebase hint.

In Assembly.LoadFrom case, after we extract the cab file, we will only look for assembly with the same name as the cab file, excluding the extension. In our example above, we will only look for myasm.dll/myasm.exe.

In codebase hint case, we will look for the assembly specified in Assembly.Load, instead of the name of the cab file. This means, the cab file does not have to have the same name as the assembly.

A side effect of codebase hint behavior is that you can put multiple assemblies in one cab file. You will need to specify multiple assemblyBinding statements in app.config file to use the same cab file as codebase hint for different assemblies.

If you use this technique, due to how we extract the cab file and find the assembly (see above), we will download, and extract the same cab file multiple times. So bundling multiple assemblies in one cab file may actually hurt performance, instead of improving performance.

Of course, in reality, we use IE to download the cab file. You may benefit from IE's caching of the downloaded cab file. You really want to measure your scenario, to decide if you want to use this technique or not.


You can also actually put a complete MSI Installer inside a CAB and have it run when the downloaded CAB is unpacked:

Installer.inf -- The Inf file for the CAB file. It has the following contents:

[Setup Hooks]

run= msiexec /i %EXTRACT_DIR%\ActiveXInstaller.msi /qn

; This section is required for compatibility on both Windows 95 and Windows NT.

Here run specifies the command we would like to run after IE extracts the CAB. The command line will install the MSI ActiveXInstaller.msi under silent mode.


ASP.NET 32-bit on Windows Server x64 IIS - Yes?

Windows Server 2003 x64 edition is so cool, now that I have a new 64 bit AMD machine to play on. One thing I was worried about, though, is how do you get ASP.NET 32 bit support in IIS 6.0 - which is now 64 bit! Uh-Oh!

Turns out there's a script mod you can make (the only place I found this is here.)

if you run the following command in Command Prompt, you will be able to use .NET 1.1 ASP.NET in x64s IIS6 (which runs in 32-bit mode):

cscript %SystemDrive%\inetpub\AdminScripts\adsutil.vbs set w3svc/AppPools/Enable32bitAppOnWin64 1

Oops! -- And here is the info from the "horses mouth" at TechNet.

Running 32-bit Applications on 64-bit Windows (IIS 6.0)
Windows Server 2003TM, Service Pack 1 enables IIS 6.0 to run 32-bit Web applications on 64-bit Windows using the Windows-32-on-Windows-64 (WOW64) compatibility layer. IIS 6.0 using WOW64 is intended to run 32-bit personal productivity applications needed by software developers and administrators, including 32-bit Internet Information Services (IIS) Web applications.
On 64-bit Windows, 32-bit processes cannot load 64-bit DLLs, and 64-bit processes cannot load 32-bit DLLs. If you plan to run 32-bit applications on 64-bit Windows, you must configure IIS to create 32-bit worker processes. Once you have configured IIS to create 32-bit worker processes, you can run the following types of IIS applications on 64-bit Windows:
Internet Server API (ISAPI) extensionsISAPI filtersActive Server Page (ASP) applications (specifically, scripts calling COM objects where the COM object can be 32-bit or 64-bit)ASP.NET applicationsIIS can, by default, launch Common Gateway Interface (CGI) applications on 64-bit Windows, because CGI applications run in a separate process.

Configuring IIS to run 32-bit Web applications on 64-bit Windows
Before you configure IIS to run 32-bit applications on 64-bit Windows, note the following:
IIS only supports 32-bit worker processes in Worker Process Isolation mode on 64-bit Windows.On 64-bit Windows, the World Wide Web Publishing service can run 32-bit and 64-bit worker processes. Other IIS services like the IIS Admin service, the SMTP service, the NNTP service, and the FTP service run 64-bit processes only.On 64-bit Windows, the World Wide Web Publishing service does not support running 32-bit and 64-bit worker processes concurrently on the same server.
After configuring IIS to run 32-bit Web applications on 64-bit Windows
After you configure IIS 6.0 to run 32-bit Web applications, IIS stores 32-bit DLLs and ISAPIs in the %windir%\syswow64\inetsrv directory. All other IIS files, including the MetaBase.xml file, are stored in the %windir%\system32\inetsrv directory. File access to the System32 and sub directories are transparently redirected based on the bitness of the process making that file access (64-bit processes have full access, while 32-bit processes have access to System32 redirected to Syswow64). If your legacy applications have specific 32-bit file access needs and you notice application failures, see if the application needs to reference the new %windir%\syswow64\inetsrv to resolve the problem.


More Pyew from Pew on SPAM

Yah, well Pew Internet and American Life Project has their latest thingy: they say we're not any less annoyed by spam, just more accepting of it.

They say that 53% of adult e-mail users in the United States now say they trust e-mail less because of spam, down from 62 percent a year ago and about the same as a June 2003 Pew survey.
They found that 22 percent of e-mail users say they are spending less time on e-mail because of spam, down from 29 percent last year.
(BTW, the chart below is not from "PEW", but I thought it would be an interesting and informative addition so you can see how SPAM is focused on the member).

Deborah Fallows, a senior research fellow at Pew and the study's author, opines: "This shows some level of tolerance that people are manifesting," and continues "Maybe it's their getting used to it. Maybe it's like other annoying things in life - air pollution, traffic - they are just learning to live with it."

Do you believe this absolute junk they come up with? God, I hope clients aren't actually spending real money to get this trash research, based on a telephone survey of 1,421 Internet users! (looks like they gained 10 people, because the last one I noticed had fewer participants, although you can bet the people they called are all the same ones)

Tolerance, my butt! The technology has been here for a while to put an absolute stop to SPAM and the bandwidth - sucking, time wasting dweebs who purvey it. When the HELL are we gonna put "Me, Me Me" aside and all get together and put these bastards out of business for good? You know, I"ve been using yahoo web - based email (and the Yahoo Pops! local proxy for Outlook) for a long time. Their SPAM Filter is top-notch. What kind of a crappy world do we live in when my daily diet consists of 20 or 25 real emails only to be accompanied by 800 or so SPAMS routed into my junk mail folder? The 419 vigilantes got it right.

I tend to be Conservative on fiscal and other issues, but quite Libertarian on others. The death penalty is one issue. Man shouldn't sink to the level of the creature who commits a heinous crime by executing them. I prefer banishment for spammers. If you aren't familiar with the concept, Napoleon was banished to Elba. There are two kinds:

1) You can never come back here (whereever "here" may be) and if you do, we will capture you and send you away.
2) We will physically take you to a place of banishment (a deserted island, whatever) where you will be allowed to live out your remaining years.

Number two is the one that works just fine for spammers.


Here Beta Beta! Here Beta! C'mon boy! At'sa good fella. Hey, Beta? . . . Uh, BAY-TAAA!

I'm sure it will be here. It's gotta be here. Maybe it already came and I missed it? What happened, did he run away?

You probably could check the new MS Forums, they have a thread on it there.

Uh, hello? Yes! You have my resume?....


Open Source .NET Forum Started

We get so many questions and requests for open - source .NET components and libraries to do this, that or the other, that we decided to open a new

Google Groups Open Source .NET Forum

Anyone can join and post information. The focus is OPEN SOURCE SOFTWARE for .NET PLATFORM (not advertising "your" product, spamming, or whatever).