Thursday, August 16, 2007

Blog Move

It's the end of an era. I am moving off of the Blogger platform and domain onto a new one that is all my own:

The blog feed (through Feedburner) has already been updated. If you subscribe to the feed, then chances are that you will not see this post. ;-)

Monday, August 06, 2007

New Developer Evangelist

It's old news at this point, but the replacement for Drew Robbins has been announced:

Jeff Blankenburg, previously of Quick Solutions fame, is now a blue badge!

I think the first item on his agenda will be to revamp or retire the talk that he gave at Day of .NET in Ann Arbor entitled "Google APIs: Why Aren't You Using Them?" /grin

Congratulations, Jeff. I look forward to working with you.

Sunday, July 01, 2007

Thank you, Microsoft

When I did my blog reading this afternoon, I noticed the normal flurry of "I'm a MVP!" posts that happen on the first day of each quarter. I checked my email, and there was nothing. Oh, well! Maybe next quarter.

Then, a bit later, I returned to my email. On a hunch, I checked the Spam folder and there staring back at me was a 4-hour old message from "support" with the subject line:

"[MVP] Congratulations! You have received the Microsoft MVP Award"

Thank you, Microsoft! I'm truly honored! I look forward to meeting my MVP lead, Steve Dybing, and my fellow SQL Server MVPs.

And Google, we need to have a talk about this little prank that you played on me. Please don't hide my important emails in the Spam folder, mmmmkay?

Wednesday, June 20, 2007

Lenovo Battery Recall

My new laptop's battery is part of the Lenovo battery recall. You know, because they spontaneously catch on fire and stuff.

I went through the process of submitting my shipping information, and received the following confirmation:

Thank you for placing your order for a replacement battery. We have received your order and will ship your replacement as soon as supply is available. Please allow up to 4 weeks for your replacement battery to arrive.

Boy, I'm glad that they're rushing it to me! I hope this one doesn't flame up in the next 4 weeks.

UPDATE/FYI/ETC: The details about the recall, which was issued months ago (as a reader pointed out), can be found here:

Tuesday, June 19, 2007

UAC Deactivated

I'm sorry Microsoft. I had to do it. I just joined the growing ranks of developers out there who deactivated UAC on Vista.

I gave it a try. I really did! I didn't even mind answering all of the "Are you sure?" prompts whenever I tried to do anything (it's really not as bad as what that "Hi, I'm a PC... and I'm a Mac" commercial makes it out to be).

The final straw for me was the inability to work with files on my hard drive unless they were in certain directories (folders). For whatever reason, when I copied my "C:\Dev" directory structure from a backup onto my hard drive, I couldn't edit any of the files. As a developer, this is a pretty bad thing to have happen.

Even a simple change to an XML file using Notepad would not overwrite the existing file. I tinkered around for 30 minutes trying to get this one task to work, playing with things like changing the NTFS owner of the file and directory tree. No luck.

Alas, the need for productivity superceded the security benefits. Deactivating UAC allowed me to overwrite files in my source directory.

And now, back to work!

Monday, June 18, 2007

Making SQL Server Management Server work on Windows Vista

Under Windows XP, I could define a "Stored User Name and Password" that would use a domain wildcard. That is, I could say "DOMAINX\*" and then the provided user/password would work for any computer that was a member of DOMAINX.

Note: The "Stored User Name and Password" interface is available from the User Accounts control panel, select a user (under XP; the current user is auto selected under Vista), and then click "Manage my Network Passwords" on the left.

This feature was particularly useful to me, as a consultant with a laptop that is not part of my client's domain. I log onto the laptop as a local user, yet I had the ability to seamlessly access any domain resource without being prompted for credentials. This mechanism also allowed me to override individual servers, just in case I needed to use a different user/password for specific situations.

It seems that Vista, either by design or due to a bug, does not allow this concept of domain wildcarding - at least in respect to NetBIOS or LM or any related technology. This particularly crippled me in that I could not connect to any of the SQL Servers at this location using SQL Management Studio.

Using a network packet sniffer (Ethereal), I could see that the SQL Server was challenging my client for domain credentials, but my client would reply with local credentials instead. The end result:

Login failed for user '(null)'. Not associated with a trusted SQL Server connection (18452).

I sent a few emails off to a few Microsoft folks that I knew, and then began to play around while waiting for any sort of response.

The first signs of success started when I mapped a network drive to any fileshare on the domain, just to kick-off a domain-specific connection. Then, I created one password rule per SQL Server that I wanted to connect to, and finally forced the SSMS connection to use Named Pipes. Cumbersome, but it seemed to work (albeit, a little flaky on boot-up, because the mapped drive would not automatically reconnect for some reason, requiring me to remap it before things started to work).

I then stepped back, and remembered the "RunAs" command. By creating a new shortcut to SQL Server Management Studio using my network credentials, I am able to consistantly force SSMS to authenticate with the SQL Servers using my domain user every time, including over TCP/IP (instead of Named Pipes).

The shortcut runs the following (all one command, broken up for readability):

C:\Windows\System32\runas.exe /netonly /user:domainx\myusername
"C:\Program Files\Microsoft SQL Server\90\Tools\Binn\VSShell\Common7\IDE\SqlWb.exe"

This is the workaround that I'll be using until MS fixes the "Stored User Names and Passwords" feature (or explains why the Vista behavior is different than the XP behavior as far as domain wildcards go).

Thursday, June 07, 2007

Wrapping up Tech Ed

While the conference is not yet over, the energy level is certainly winding down. Today is the last day of the Expo, so I have been making my rounds to say goodbye to all of the people who I have worked with in previous sponsorships (for CodeMash and Day of .NET in Ann Arbor).

One vendor (AvePoint) totally missed an opportunity that they had. Today, they raffled off a Ducati motorcycle, so at the time of the drawing, 1-2 Thousand people congregated in the aisle around their booth. This crowd assembled a full 15 minutes before the drawing, and were simply standing there with nothing to do (I was in that crowd, btw). AvePoint had the PERFECT opportunity to give a quick sales presentation to a very captive audience, but they did nothing of the sorts. Next year, perhaps? (And bring some amplification to the event, plskthx).

One of my favorite vendors, Red Gate Software, gave me a demo of upcoming changes to their SQL Compare tool. What's exciting for me is that SQL Compare will now include the ability to use scripts as source or destination schema. So, you can reverse engineer your development database and generate individual SQL script files for each object in the schema. Or, you can start with individual scripts (i.e., one per table or proc, etc) and push changes to the database. The greatest utility of this that I see is the ability to easily capture your database change history into source control (especially with Subversion and TortoiseSVN, which works at the filesystem/Windows Explorer level). Direct SCCM capabilities should come in a future release, they say. :-)

Last night at the influencer party, Javier Lozano (Iowa .NET User Group) and I spoke in depth about what it takes to organize a small-to-midsized conference, like a Day of .NET or a CodeMash. Look for some good things to come out of the Iowa area over the coming year!

All in all, I didn't get a sense of anything big on the horizon. All of the new product releases weren't accompanied with great fanfare, and as a result, I'm just not leaving here as excited as I was last year. Don't get me wrong: there's a lot of cool things coming out, but I think they could have been hyped more than what they are.

Lastly, I leave you with an observation: Microsoft did an outstanding job at marketing Silverlight as a new technology that has never been seen before (my observation). When you peel back the covers, though, it's nothing more than the latest iteration of the Java Applet or ActiveX control paradigm. If you start thinking of Silverlight in this way, instead of a totally new whizbang all-containing platform, then I think you'll be more successful in implementing the technology in your solutions.

I cannot wait to get back home so that I can [finally] install Visual Studio 2008 ("Orcas") and SQL Server 2008 ("Katmai") and begin to work with the new things that I've seen here.

(Attendee party tonight! See you there!)

Wednesday, June 06, 2007

Sky Diving.... Indoors?

Jason Flying

This evening, I was invited to the Central Region's gathering at an indoor skydiving place (thanks Drew and Josh). This is a huge vertical wind tunnel that you actually "fly" in, due mostly in part to the 120+ MPH wind that is generated right under you.

Our time per flight was about 90 seconds. According to the instructor, a normal freefall from an airplane (before you deploy your chute) is about 60 seconds.

Dustin Campbell was also in the same group that was in the airlock at the same time, so I have his pictures on the DVD's that were provided to us as a keepsake:

Dustin Flying

Tuesday, June 05, 2007

Tech Ed: Day 1 Wrap Up/Day 2

For me, one of the bigger product announcements this year is SQL Server 2009 (Katmai). I'm trying to take in as much content as I can, because I definitely see some of my trademark presentations being changed to account for new functionality.

For instance, and I've been thinking a lot about this over the past few months, but just haven't articulated it:

SQL Server is evolving into much more than just a transactional data system. It's becoming its own data platform. Not every database has to be highly tuned to support millions of transactions per second, and as a result, you can begin to move more of the data processing locally (by means of SQLCLR, or by taking advantage of XML processing on the server, etc). By doing so, you eliminate the need to transfer data across the wire before starting to take action upon it, which is a good thing in my book. YMMV, depending on your particular situation.

In session yesterday, they made a point that the cost of storage is quickly approaching zero, which means that we're going to have more storage than we'll ever be able to use. Suddenly, you don't need to have all of the questions that you'll be asking about your data before you store it.

For instance, let's say that you acquire a piece of data in XML format. You have several tables defined in the system, and shred the XML in order to extract the data that you need. But, you also discover that the XML has more data than you're using (more information than the tables are set up to hold). Just because you don't have a use for that extra information today doesn't mean that you have to throw it away. Go ahead and shred it to populate your tables, but then keep a copy of the XML intact. If you need to later query all of the XML for data that you never thought you would need, you have it (and SQL Server makes it easy to do so).

SQL Server 2008 will also come with support for "Policies". Like the same concept in Windows, etc, a Policy is just a rule that is executed at runtime (query time). Let's say that you don't want anyone to create tables in the "DBO" schema. Just create a policy, and the server will enforce it for you. (That's great, and all, but I'm not really a DBA, so I'm hoping that there's utility for this functionality beyond that).

Also, SQL Server 2008 comes with built-in support for spacial geometry. Do you have two geocodes and want to know how far apart they are? No problem! Find all stores within 50 miles of your customer location? Just put it in the WHERE clause. Have a complex polygon, maybe with "holes" or "rings" in it, and need to know if a point is within the polygon? Supposedly, it's a breeze with Katmai.

Last, there's "UPSERT" support. This is the ability to either perform an INSERT or an UPDATE on a table, depending on whether the data already exists or not. UPSERT is actually implemented using the MERGE statement, as in the following simple example (provided to me by Christian Kleinerman, Group Program Manager for Microsoft SQL Server):

MERGE dest_table
USING src_table ON (src_table.keycol = dest_table.keycol)
UPDATE SET dest_table.datacolumn = src_table.datacolumn
INSERT VALUES (src_table.keycol, src_table.datacolumn)

Disclaimer: These were handwritten notes, and I haven't tested on a Katmai installation yet to ensure that I transcribed his example verbatim

Today, I sat in a pretty cool session led by Karen Liu (that's Dr. Karen Liu, Ph.D, btw, who likes Raytracing, so she's got to be cool in my book!) of the Visual C# IDE Team where she demonstrated some useful features in the new IDE. My take on it: There's nothing that I saw that CodeRush and Refactor! can't do. You'll definitely be happier if you bought the Developer Express product to supplement the out-of-the-box experience that OrcasVisual Studio 2008 provides.

That's it for now... Don't expect any more entries this week (so you'll be pleasantly surprised when I do in fact write one).

Monday, June 04, 2007

TechEd: 64-bit Question Game Show

I had forgotten all about this until I walked past the "Virtual Tech Ed" glass booth this afternoon: Carl and Richard will be hosting a "64-bit Question" game show at 6PM this evening (during the Expo party).

BTW: Carl is sitting inside of that glass room at the moment with his flashing laptop, looking out at people passing by. It somewhat reminded me of an exhibit at a natural history museum. ;-)

Tech Ed: Day 1

This morning's keynote was... just okay. As is typical with Microsoft keynotes, there was a Hollywood theme to the presentation that kept introducing itself, and this year's theme was Back to the Future. They actually had the Delorian and "Doc" (Christopher Lloyd) there on stage with Bob... That was the highlight of the morning, IMHO. If you slept through the keynote, just watch the beginning of it online, and you'll be caught up. ;-)

This morning, I've been walking around the convention center to get a handle on how things are layed out. I stopped by the INETA booth and talked with Chris (Pels) and Nancy for a little while, and then Nancy introduced me to Kate Gregory (super nice lady from east of Toronto).

The wi-fi here seems to be a bit spotty, not so much the signal strength, but just getting an address. I'm forced to compose this blog post from one of the CommNet terminals.

On to lunch and then a tour of the Expo hall...

Sunday, June 03, 2007

Tech Ed Orlando: Day 0

I'm in beautiful Orlando, staying at the Hilton in the Walt Disney World Resort. This hotel is on the conference shuttle route, and Keith Elder is also here with his wife Ellen.

Getting to this point wasn't without incident, though. First off, since my employer paid for the flight, I had to make reservations with the company's travel agency. Despite my desire to fly Delta TOL-ATL-MCO, they wanted me to take Northwest TOL-DTW-MCO. That flight was actually cheaper with the connection, if you can believe it, than if I drove to DTW and just took the second leg flight by itself... So, I agreed.

Well, I showed up at the airport bright and early (well, not so much bright, since the SUN WASN'T UP YET!!!), and find that the first leg had been cancelled. Luckily, Northwest had already booked me onto a Continental flight. TOL-CLE-MCO. When I check in at the Continental desk, I learn that the flight is oversold. I'm instructed to wait on the side with other people who were in the same situation. 60 minutes left until that flight leaves...

The first two of those folks were bumped to Delta. Yep, they got to fly my desired TOL-ATL-MCO route. I chuckled to myself, thinking that I would get my way after all. Then it was my turn to check in, and as luck would have it, the flight was no longer oversold, so I was forced to take the Continental route... :(

Going through security, I was told to step into a special line. Then some big TSA guy walks towards me, pulling on a pair of rubber gloves! Despite all of the horror stories that I had heard about cavity searching and whatnot, he only patted me down while another agent went through my carry-on belongings.

I made it onto the small turboprop commuter plane (16 seater?) which flew me to Cleveland, passing by Cedar Point on the way, and flying low over Jacob's Field on our final approach. I actually like these low-and-slow flights, especially when I have a window seat (on this bird, all seats were window seats).

Then the flight to Orlando: You know, the home of Disney World. Parents take their kids to Disney World, and a "kid" can mean a pleasant 8-year old just as much as it can mean a screaming 1-year old. Well, on this 737-800, there were 1-year olds all around me, and not a one wanted to sit still or be quiet. That made for an relaxing 2-hour flight (I'm using a little thing that we call "sarcasm" here).

Oh, did I mention that before the flight even began, we were stuck at the gate with the doors closed because the sorting room had lost 8 bags for my flight... Did I also mention that this was a 45-minute delay waiting for those bags? I didn't? Hmmmm...

I arrived at MCO about 45 minutes late (go figure), and headed down to the car rental counter. There I stood in a line for an hour! But, when I did finally make it to the counter, I learned that my "intermediate" car that the travel agency booked turned out to be this cool charcoal-colored Mustang! Wowsers! Not a convertible, though...

I've done a bit of exploring around the area of the hotel, as I tend to do in all new cities. Since Tina isn't here with me, I don't have to worry about getting lost. I'm impressed by the different plant and wildlife here, especially the little lizards and spanish moss growing on trees. Also, the grass here isn't the fescue that I'm used to at home, which I thought was interesting.

Here at the Hilton, there are regular bus stops to take you to the various Disney parks in the area. I thought that it would only be natural for the Tech Ed shuttle to also stop at that entrance. So, I waited on a bench for about 45 minutes. After three Disney shuttles came and went, I gave up and asked the hotel. It seems that there's a "Convention Entrance" where the Tech Ed busses stop. Glancing at my bus schedule that the front desk gave me, I do see handwriting that says "Microsoft Transportation Convention Entrance".... Oh, so THAT'S what that means... :-/

Registration at the venue was extremely easy, thanks to a large number of staffers. Get in line, approach a staffer, provide your ID, they print a badge, and then you walk down to the "Materials" section to pick up your laptop bag (a convertible backpack/man purse concept, it appears) stuffed with marketing slicks and whatnot.

That was enough excitement for me, so I returned to the hotel to compose this blog post and then work on loading software onto my newly paved laptop. Party with Palermo tonight!

Wednesday, May 23, 2007

How I Managed To Successfully Update My Zune to 1.3

Until today, I haven't been able to update my Zune from firmware version 1.2 to the 1.3 release, which has been out for about 1.5 months now.  I would get the screen inside of the Zune software (running on my computer) stating that there was an update, but when I tried to actually install it, the software would simply stare back at me with a messagebox stating "It is not possible to change sync settings at this time. Try again later."

Searching the Internet proved that others were having the same issue, but there wasn't a clear explanation about what the problem was, or more importantly, how to resolve it.  It also seems that this error message is generic in nature: if any problems at all are encountered while trying to upgrade the firmware, you get this message box.  (That's my disclaimer to state that what worked for me may not work for you)

In typical fashion, there were a lot of posts saying "ZOMFG, Microsoft is teh sux0rz...  Screw dis, I'm buying an iPod".  But, I personally love my Zune, so I made it my morning mission to figure out what was wrong, and then fix it if it turned out to be something that was under my control.

My particular environment (details that matter, in this case):

  • Windows XP SP2
  • A corporate network using ISA Server (that requires authentication against Active Directory) for web proxy.  Note that I never attempted the upgrade from home or any other network - I just never thought about the firmware except while at work.
  • I log into my machine as a local user and have password rules established for network resources (Control Panel -> User Accounts | Manage My Network Passwords).

The first thing that I did was try to find where the new update might have been saved to my disk (to see if it actually existed, and then to see if there was a way that I could manually install the update).  I found the following (hidden) directory:

C:\Documents and Settings\yourUserNameHere\Local Settings\Application Data\Microsoft\Zune\Firmware Updates

Inside was another directory with a GUID name:


And inside of that, a lot of zero-byte files like: BIT6A4.tmp, BIT4C2.tmp, etc.

Hmmm... That looks an awful lot like temporary files for the Background Intelligent Transfer Service (BITS).  Since there were scores of these files (roughly coinciding with the number of times that I've attempted to install the update), I think that I found an important clue.

I fired up Fiddler, the HTTP Debugging Proxy, and started logging HTTP traffic that took place on my machine.  I then selected "Check for Zune Device Updates" within the Zune software (context menu for the device itself), and observed the resulting HTTP traffic. 

One request retrieved an XML document from a Zune server that contained information about the latest firmware version, including a link to the updated file.  There were actually 3 HTTP requests that occurred before the XML itself was returned: the first tried without proxy authentication, and failed with a 407 status code.  The second was to get the NTLM challenge from the proxy server, and also resulted in a 407.  The third was the same request again with an appropriate NTLM response in the Proxy-Authorization header, and this time, the resulting status code was 200 and the payload from the remote web server was successfully returned.  The user agent for all three of these requests was "Zune/1.3.5728.0", so it was the software itself trying to make the connection.

Note: This might seem like a noisy exchange, and it kind of is, but this is what happens behind the scenes when you web browser makes HTTP requests using a proxy server and NTLM authentication.

Another request, which tried to get the updated firmware CAB file itself, would fail with a status code of 407 in the same fashion as the very first web request made by the Zune software.  Interestingly enough, the user agent for this request was "Microsoft BITS/6.6", confirming my suspicion that the Zune software uses BITS to download the firmware images.  Furthermore, as soon as the 407 came through, the error messagebox displayed in the Zune software, and no further attempts were made to negotiate authentication with the proxy server by the BITS service.

At this point, I concluded that the Zune software was able to connect to the Internet, but the BITS client was not. 

Since I couldn't change the Zune software, I looked around to see if I could force the BITS client to authenticate against the proxy server, just like Internet Explorer (and even the Zune software itself) does automatically.  One option sounded promising: I could set up a small proxy server on my computer that would accept an unauthenticated request, but would then authenticate with the real proxy server when it forwarded that request to the Internet.

Luckily, though, I stumbled upon the following KB article:

Interesting snippet from the article:


BITS 2.0 clients may not successfully complete the transfer of a file

HTTP 407-Proxy Authentication.

Note When the BITS 2.0 client receives this error message, it may also receive error code 0x80190197.

This problem occurs when all the following conditions are true:

  • The client program that is using BITS 2.0 does not specify that the credentials of the client can be used by calling the IBackgroundCopyJob2::SetCredentials method.
  • The Microsoft LAN Manager compatibility level (LmCompatibilityLevel) on the BITS 2.0 client contains a value that is set to 1 or to 0. You can find the LAN Manager compatibility level entry n the following registry subkey:

  • The file transfer is performed through a Windows-based server or a Windows-based Internet proxy server that requires Integrated Windows authentication.

Authentication behavior in BITS 2.0

For security reasons, to avoid passing credentials to any proxy or server that requests logon credentials, BITS 2.0 allows logon credentials to be used only if one of the following conditions is true:
  • A program prompts for credentials to be applied by calling the following function and similar parameters:
    IBackgroundCopyJob2::SetCredentials. (target=ProxyorServer, Negotiate/NTLM, username=NULL,password=NULL)
  • If the LmCompatibilityLevel value on the client is set to a value that is greater than or equal to 2.

Important By default, Windows XP sets the LmCompatibilityLevel to 0. With BITS 2.0, logon credentials will not be used if the LmCompatibilityLevel is set to 0.


Now I was getting somewhere!  I checked the registry, and LmCompatibilityLevel was indeed set to 0, which exactly explains why BITS was not automatically authenticating with the proxy server.

Before changing values, I used the BITSADMIN program (you can find it on your XP CD-ROM in Support Tools) to see how many BITS jobs existed (bitsadmin /list) and then cleared out the list (bitsadmin /reset).  This eliminated the scores of failed (inactive) jobs that were still hanging around.

I then changed LmCompatibilityLevel to a value of 2, and then restarted the BITS service, reset the Zune (hold the Back Arrow and Up at the same time until it resets), and restarted the Zune software.  This time, the firmware CAB file was successfully downloaded by the BITS client, and the moment that this finished, the Zune client proceeded with installing the firmware onto the device.


Note: The reason for this BITS behavior is based on security: you really don't want background processes to be automatically authenticating with servers on your behalf if you're not aware of what they might be doing.  The nature of BITS is that you can disconnect from one network, and later connect to a different network (maybe at a coffee shop), and your download will resume automatically without requiring any action on your part.  So, if you do happen to change your LmCompatibilityLevel in order to upgrade the Zune, then be sure to change it back when you are finished in order to preserve your system's integrity.

Friday, May 18, 2007

RDP Console Session: Did You Know About It?

I continue to be surprised by how many IT professionals that depend on Remote Desktop to access servers for administration do not know about this:

For Windows 2003 servers, you can use the following:


mstsc /v:whqs7610 /console

(without the “/console”, it just connects regularly.  With “/console”, you grab the actual console session, as if you were at the monitor and keyboard downstairs in the server room).

Out of the box, Windows Server 2003 provides two regular RDP sessions (for Administrators), plus the ability to connect to the actual console session.  So, in effect, there are now three RDP sessions available for use at the same time.

Here at my client site, it seems that multiple people will jump onto a server and then not logoff when they are done.  The two "free" RDP sessions then become occupied, not allowing anyone else to connect.

But, by connecting to the Console Session itself, you can logoff one (or both) of the regular sessions using the Terminal Services Manager application (Administrative Tools program group), and then reconnect not using the "/console" switch to grab a regular session.  (That is, we try to reserve the use of the Console session for "emergencies").

Wednesday, May 16, 2007

Party with Palermo: Tech Ed Style

I'll be there!

June 3rd, 2007 @ 7PM - 11PM

Monday, May 14, 2007

VirtualPC Console Not Displaying

For the past several weeks, I've had a problem with VirtualPC.  Whenever I started the program, I would see it running in the taskbar, but the console itself would not show up on the screen.  Luckily, I could still start all of my VPC images using the context menu of the task item.

Today, I finally looked for a cause, and found it. 

VPC stored it's configuration in the following file:

%APPDATA%\Microsoft\Virtual PC\Options.xml

Within that XML file, I found the following node:


<height type="integer">246</height>
<left_position type="integer">4294935296</left_position>
<top_position type="integer">4294935296</top_position>
<visible type="boolean">true</visible>
<width type="integer">359</width>
<left_position type="integer">449</left_position>
<top_position type="integer">329</top_position>
<left_position type="integer">727</left_position>
<top_position type="integer">184</top_position>

Interesting to see the values that were being used for "left_position" and "top_position"... 

4,294,935,296 = 0xFFFF8300

Expressed as a 32-bit signed integer, this is the same as -32,000.  Doesn't tell me anything specific, but I found it interesting nonetheless.

Resetting these to 0 fixed the issue.

Monday, May 07, 2007

Day of .NET in Ann Arbor: RECAP

The Day of .NET in Ann Arbor 2007 Edition is over!  Like its predecessor last year, this event turned out to be very well received, and therefore, I think very successful.

The conference was again organized by three .NET user groups in this area: GANG, NWNUG, and AADND.  Specifically, the following people are who performed the day-to-day activities in bringing this event together:

  • John Hopkins (president of GANG): overall chairman of DoDN/AA 2007
  • Jason Follas (president of NWNUG): speaker/session coordinator
  • Darrell Hawley (program chair of AADND): registration coordinator
  • David Baldwin (AADND webmaster): sponsorship/public relations
  • Scott Zischerk (AADND): the DoDN webmaster (and T-Shirt designer)
  • Dave Redding (vice president of AADND): sponsorship
  • Chris Kotsis (secretary of GANG): sponsorship

The day of the event, we had some attendees who volunteered to help out with registration (and ended up missing the first session as a result).  Many thanks go to:

  • Dan Hounshell, Telligent
  • David Patow, Compuware

In all, we're pretty confident that there were actually 205 people in attendance!  This represents less than a 20% dropoff from our registration numbers.  For a free event like this, and for weather being as nice as it was, that is actually a great number (speaking from experience in having organized several events like this). 

However, we were anticipating a greater dropoff rate, and as a result, we ended up a little short on food at lunchtime.  Our sincere apologizes to anyone who might not have gotten any pizza, but we truly were trying to avoid last year's problem of having way too much food (which we even had a hard time trying to give it away to people passing by).  For full disclosure, we were anticipating the need to feed 180 people, not 205, to give you an idea of the challenge that we faced in trying to plan meals.

Another hiccup the day of the event was the fact that the campus facilities deactivated the air conditioning units in order to conserve energy (because WCC is in between semesters).  So, while there was airflow in the rooms, it wasn't necessarily "cool air".  The result was a very sauna-like experience while attending some of the sessions.  Let me just say that this very much took us by surprise as well!

We also considered people's feedback from the prior year, and tried to make little changes to improve on the experience this time around.  One thing that we tried hard to avoid was raffling off 100+ books during the closing.  So, we pre-selected book/software winners based on raffle tickets, and staged a giveaway in the hallway leading to the event. 

This actually worked well, but was not clearly communicated to all of the attendees as to how it worked (i.e., we didn't have enough books for everyone this year, so only the posted numbers were actual winners).  Also, we had unclaimed books when it came time to go into the closing session, so they were boxed up and left in the hallway in case someone came to us after the event to claim a winning prize.  To my surprise, all that was left afterwards were empty boxes, so even remaining valid winners were unable to claim their books.  I just hope that they went to good homes, and won't show up on eBay or Amazon.

Up to this point, I haven't heard anything negative about the Vendor Sessions that we inserted into the lineup.  I'm very much in agreement with the "Code Camp" mentality that our attendees shouldn't be over-marketed to by sponsors.  However, our sponsors are what make this level of event (which truly is a conference and not just a gathering of geeks who have nothing better to do) totally free to the attendees, so we have to show some love to them. 

In the past, I've often received inquiries from sponsors asking if they can have a breakout session to show off their products.  I've always had to deny such requests because I felt that sessions should be somewhat neutral in topic with concern to third-party products.  Otherwise, there might be a sense of mistrust by the attendees as to what the motives of the event organizers might be.

The Vendor Session, though, was the attempt to satisfy both worlds.  This was a dedicated timeslot where only vendors were presenting concurrently with one another.  The goal was to offer value-added sessions, and not just blind marketing, because session audiences would probably consist of current customers, or people who have already started researching the products.  These timeslots were also 1/2 the length of normal sessions, which helped to focus the presentations, and also helped to prevent boredom from developing in the audience.  More than anything else is the fact that there was no pretense involved: you knew going in that the content would be centered around a vendor's product.

The organizers will be having a post-mortem conference call tonight to discuss how we can improve upon this experience for next year's event.  If you happen to have any ideas, we would be glad to hear them!

Monday, April 30, 2007

TechEd 2007

Yup, I'm allowed to go again...

Thursday, April 26, 2007

IntelliSense for App.Config Stopped Working

Ugh!  I've wasted the past hour trying to figure out why I no longer had IntelliSense while hand-editing my App.Config file in Visual Studio 2005.

Among all of the noise from my search results, I found an old newsgroup post stating that the XML Schema file that VS2005 uses for .NET config files is kept at:

C:\Program Files\Microsoft Visual Studio 8\Xml\Schemas\DotnetConfig.xsd

Hmm, I don't have that file.  Could it be that this was an old file used by a beta of VS2005, and that it's just not distributed in RTM?

I IM'd Dustin, and sure enough, he had that file on his machine.  So, something was not playing nice, and actually DELETED it from my machine.  The nerve!

My solution: Download a new one to that directory (there's an improved version here), and wouldn't you know: IntelliSense started working again!

Wednesday, April 25, 2007

Closures in SQL?

Through my daily blog reading, I came across this post making an argument for not using the SQL "IN" clause as a substitute for a JOIN.  I saw something familiar and interesting in one of the examples listed, and will try to demonstrate it here.

The right-hand side of an "IN" clause is simply a set of values.  This can be provided by means of a comma-separated list of literals, or by a SELECT statement.

To demonstrate the syntax, consider the following table:


If I wanted only the miles for trips taken by Cars and Bikes, then I could provide those literals as:

SELECT Vehicle, Miles 
FROM TripLog
WHERE Vehicle IN ( 'Car', 'Bike' )

Or, I could store the values within fields of another table, and SELECT them (the caveat is that I can only select a single field in my subquery):

Rocket Ship0.0000000421Hydrazine

SELECT Vehicle, 
FROM TripLog
WHERE Vehicle IN ( SELECT Type
FROM PreferredVehicle )

The point that the other blogger was trying to make was that you might just want to use a simple INNER JOIN.  But, I'm not here to argue that point.  Instead, I'd like to expand on a path that he just touched on in a counter example.

Suppose that I mistyped the subquery used in the "IN" clause, and used "Vehicle" instead of "Type" for the selected column:

SELECT  Vehicle,
FROM TripLog
WHERE Vehicle IN ( SELECT Vehicle
FROM PreferredVehicle )

The result is that I would get all rows returned, including the one for "Truck".  This is despite the fact that there is no column in [PreferredVehicle] called "Vehicle", and that "Truck" doesn't appear anywhere in the [PreferredVehicle] table.  Why?

Let's first look at another query that sort of demonstrates what is happening:

FROM PreferredVehicle

The result is that you'll get one row returned in the resultset for every row in the table, with each returned row containing only the value "Car".  This is because a SELECT FROM query evaluates for every row in the FROM clause (filtered by a WHERE clause, if present). And, since we're only selecting a literal string and no other fields from the table, then the output will however many rows there are in [PreferredVehicle] with each row containing only that string value.  Simple, right?

But how does this explain why all rows were returned when the subquery used a column name that doesn't even exist in the subquery's table?

From the language point of view, the subquery from the "IN" clause is executing within the context of the outer query.  An interesting side effect is that the subquery has access to all of the "locals" in the outer query.  That is, if you think of this executing row by row, then think of the subquery having access to the columns in each row returned by the outer query.  That is, you have a Closure! Sort of... (Since you can think of the subquery as being sort of like an anonymous function defined within another function)

So, if you're still imagining this row-by-row evaluation of the subquery, then you can see how the "Vehicle" from each row in the outer query is simply selected as the output of the subquery -- much like when the literal string was used.  And, because the "Vehicle" from the row of the outer query matches a value in the set returned from the subquery (it actually matches every value in the set that is returned for that row), then that WHERE clause predicate is satisfied, and the row from the outer query is returned. 

"Truck" is in the set ["Truck", "Truck", "Truck"]
"Car" is in the set ["Car", "Car", "Car"], etc, etc. 

As a developer, knowing and exploiting this behavior will likely scare the hell out of your DBA's if and when they perform code reviews.  But, it also allows you to do some "elegant" things in your code.  And some unexpected things, too, if you're not careful.

For example, let's try to select [TripLog] entries for vehicle types where I was able to drive at least one day for under $5.00.  I'll use an amazingly cheap current gasoline price of $2.90 per gallon in this calculation, grabbing the Miles from the [TripLog] row, and the MPG from the [PreferredVehicle] table.

You would think that the following query would do the job of building a set of Vehicle Types that match our criteria, and then using that set as the right-hand side of the "IN" clause.

SELECT  Vehicle, Day
FROM TripLog
WHERE Vehicle IN ( SELECT Type
FROM PreferredVehicle
WHERE ( 2.90 * Miles / MPG ) < 5.00 )

As such, I would expect the query to output the following:

Mo     Bike     50
Tu Car 85
Th Bike 74
Fr Car 23

because both Bike and Car have days where the cost of the trip were under $5.00, so therefore, I would think that all Bike and Car rows should be returned.  Truck is not in [PreferredVehicle], so, it would not be returned.

However, here is the actual output:

Mo     Bike     50
Fr Car 23

Yes, I got the rows where the trip price was under $5.00.  But, the query actually filtered out all rows where the price exceeded $5.00. 

That certainly doesn't seem correct from a set-based point of view, but is very consistent to a Closure-based point of view.  When evaluated row-by-row, the [TripLog] entries with too many miles will fail the "IN" clause test, and will therefore, not be included in the output.

In reality, the results are exactly the same as if we had used an INNER JOIN with a WHERE clause:

JOIN PreferredVehicle AS PV
ON TL.Vehicle = PV.Type
WHERE ( 2.90 * TL.Miles / PV.MPG ) < 5.00

But, the execution plans are different.  In fact, despite all of the negative comments said about using INNER JOINs versus IN clauses, the "Closure" version is less than half the cost of the JOIN/WHERE version of the query...  which totally surprised me.


Closures in SQL... Who knew!!??!

Monday, April 09, 2007

Level 70

We spent the holiday weekend at my parent's place in Louisville, KY.  Because a certain Dwarf Paladin (a.k.a., my wife) permitted me to play a little more than usual, I was able to finally knock out the last level of WoW-TBC...


You know what? There were no balloons or confetti falling from the sky, no fireworks, no noisemakers, no "Welcome to the 70-Club" tells sent by Blizzard, and not even a "grats" whispered by anyone online (not for a few hours after the fact, at least).  Kind of anti-climactic, eh?

Now I can resume my normal life....  Yeah, right!  This just means that the experience known as EGC (End Game Content) is just beginning.

Monday, April 02, 2007

ZMachine.NET Moved to CodePlex

With the eminent shutdown of GotDotNet, I have created a CodePlex workspace to serve as the home of the ZMachine.NET project:

With any luck, I'll have a chance soon to breathe some new life into this dormant project (and finally add the V5 support that people keep asking for).

Thursday, March 29, 2007

Impromptu Channel 9 Videos

Scott Hanselman and Rory Blyth going into a random office in Building 42 and letting the camera roll: it could have turned into a disaster, but what happened was that they stumbled into Polita Paulus's office, and discovered the developer who created the ASP.NET GridView and ObjectDataSource controls (as well as BLINQ)!!!

(This one's well worth watching: just under 15 minutes)

Of course, about 1/2 way through the video, I was screaming at Scott and Rory to go across the hall and talk to the guy that wrote the XmlDataSource and find out why there's no Namespace support (Scott even brought that up in the video)

Friday, March 16, 2007

It Talks!

Almost two years ago, I threw together an interpreter for the Infocom Z-Machine using C#.  This was actually an exercise that I used while teaching myself the internals of the Z-Machine itself.  I've said it before in this blog, but in my opinion, the single best way for a high-level language developer (like myself) to learn the low-level aspects of a particular machine architecture (be it a Z80, 6802, Atmel AVR, PIC, Z-Machine, etc), is to write an emulator to run the native code bytes.  Once you've gone through that exercise (especially the debugging process), you pretty much know exactly how each opcode works.

I've pulled out this Z-Machine library a couple of times when I wanted to test the capabilities of a particular technology.  For instance, when I wanted to see what SQLCLR could/could not do, I created a stored procedure interface to my library, and was able to play Zork completely on the database server itself (it turns out that you can do a lot using SQLCLR if you wanted to).

Last year, I plopped the source code into a GotDotNet workspace, and pretty much forgot about it.  Until yesterday when James Ashley from the Atlanta area emailed me to let me know about a little project of his that he is working on.

It turns out that James is really into SAPI (much like an INETA speaker from my area, Martin L. Shoemaker), and was able to create a System.Speech-based interface into my Z-Machine library.  What a great demo of the SAPI capabilities of the .NET Framework v3.0 by playing a text adventure game using only your computer's speakers and a microphone!

UPDATE: James' article can be found here:

Thursday, March 15, 2007

Day of .NET Blog Badges

Scott Zischerk, the guy behind the fantastic looking Day of .NET in Ann Arbor website, has created a couple of badges that you can post on your blogs!

Day of .Net May 5, 2007 - I'll be there!

Day of .Net May 5, 2007 - I'll be there!

HTML code is available at:

Wednesday, March 14, 2007

Great Bill Gates Story

Lorin Thwaits tells a great story about asking Bill Gates a question this week at the MVP Summit.

I won't spoil it with details, but give it a read!

Tuesday, March 06, 2007

Day of .NET in Ann Arbor: Postponed 1 Week

Due to some previously unforeseen coincidental events taking place on April 28th, we have decided that the Day of .NET in Ann Arbor conference had to be postponed one week.  Otherwise, there would just not be any lodging available within a 40+ mile radius of Ann Arbor.

So, cross off the previously reserved date, and create a new entry in your calendar for MAY 5, 2007

Also, if you have the means, then please help to spread the word that the Day of .NET in Ann Arbor conference is now being held on MAY 5, 2007.  All other details remain the same.


Saturday, March 03, 2007

My Programmer Personality

I saw this on Keith's blog, so I had to do it too.... It's kind of like the Myers-Briggs personality test, but for programmers (and not as in depth). (For the curious, my MBTI is INTP...)

From, I am being told:

Your programmer personality type is: DHSB

You're a Doer.
You are very quick at getting tasks done. You believe the outcome is the most important part of a task and the faster you can reach that outcome the better. After all, time is money.

You like coding at a High level.
The world is made up of objects and components, you should create your programs in the same way.

You work best in a Solo situation.
The best way to program is by yourself. There's no communication problems, you know every part of the code allowing you to write the best programs possible.

You are a liBeral programmer.
Programming is a complex task and you should use white space and comments as freely as possible to help simplify the task. We're not writing on paper anymore so we can take up as much room as we need.


One of my readers (we'll call her Mom, because that's her name) sent me this photo today:

This was the first "PC" in my house growing up, speaking specifically of IBM-compatible machines. My house had always had a computer in one form or another, from TRS-80's to a Commodore VIC-20 and the Commodore 64. This is the machine that took over the main computing needs of the family at the tail end of the C-64 days (my late high school days, if I recall).

Notice the important details though:

  • This 286 had the spiral phone cord-like keyboard cable. They just don't make them like that anymore!
  • The mouse has a definite home in its holder affixed to the case. I don't know how many times today that I wish I had a place to put my mouse when I'm done using it.
  • Speaking of the mouse, I don't know if you can make it out, but there's a mousepad there with gridlines on it. You know, for when you need the highest precision in mouse usage, or so that you can pretend that you're at a CAD workstation or something.
  • Even in the days of this 286, there was a format war going on between 3.5" floppies and 5.25" floppies. Thankfully, this computer could handle both. Imagine if it only had a 3.5" drive: those disks in the cases to the right wouldn't work, and I bet inside of those cases were copies of MS-DOS 4.01. (Do they even sell computers with floppy drives these days?)
  • There's no Windows keys on that keyboard. No sir, they didn't exist back then. I don't even think that we would have seen a pirated copy of Windows 3.1 for a few more years, and by that time, I think that this particular machine was in retirement.
  • There are no speakers because... well, there was no sound card in this thing. And no CD-ROM drive because if they were out, then they probably cost as much as this computer.
  • And, lastly, there's the ever-important beer can lamp that I think my younger brother made in shop class.

Friday, March 02, 2007

Still using Data Dude... Still not "Wow'd"

I'm forcing myself to use VSTEDP for my current project, which involves making a wide variety of changes to an existing database schema in order to support new functionality required by my web application.  Hopefully, I'll have a seemless deployment of the changes into production when the time comes (holding breath).  I mean, that is one of the advertised benefits...

What I like is visibility into any breaking changes.  "Data Dude" does all of the dependency checking for me, and will create errors in the Visual Studio task list if a change breaks other objects.

What I dislike is how painful it is to actually make the changes using VSTEDP itself. 

Come on, guys.  Visual Studio is known for being more than just a text editor.  Microsoft is known for providing great GUI database tools in addition to just "Query Analyzer" functionality.  IMHO, you shouldn't have released "Data Dude" without the same level of database editing support that Visual Studio itself supports against live databases. 

Am I just using the product incorrectly, or coming into it with way too much expectation? 

The only solution that I found was that I could make changes to a live (development) database and then use the schema compare functionality in order to capture the deltas.  This seems to work, and allows me to use tools that I'm already familiary with.  I would just have preferred to do everything against my "one version of the truth" right in the tool itself.  Not to mention that if I were actually in a "team" environment, then this solution does not provide a very solid way to prevent people's changes from stepping on each other.

Wednesday, February 28, 2007

Congratulations Drew!

This is actually old news, I guess, since the email arrived yesterday... But, I've been in training this week, and just checked my work email this evening and saw the notice from Drew Robbins that stated:

Toshinori Robbins was born at 8:07a on 2/27. He weighs in at 7lbs 1oz and
is 20 inches long. Mother and baby are doing well. However, I’m still pale in
the face after leaving the room twice during delivery. ;-)

Congratulations Drew and family!

Monday, February 26, 2007

Podcast: WebDevRadio

I met Michael Kimsal at CodeMash this year, thanks to a casual introduction through Keith Elder.  I didn't know at the time, chiefly because it wasn't specifically mentioned, but Michael has a podcast called "WebDevRadio".

He recently interviewed a few friends of mine, and fellow user group leaders from southwestern Ohio: Jim Holmes and James Avery, authors of Windows Developer Power Tools

 I'm listening now, and it's actually a great interview (/grin)! 

Friday, February 23, 2007

Finally Using "Data Dude"

Microsoft Visual Studio Team Edition for Database Professionals:

I've had it installed ever since the product RTM, but up to this point, I have resisted using it to actually manage my database projects.  But, today, I decided to bite the bullet and see exactly what it could do for me.

Ever since I saw the first demos at TechEd, I've been a fan of the features of VSTEDP.  Especially appealing to me is having full source control around every single database object, as well as the refactoring capabilities like renaming a table or column and have every reference (i.e., in views and stored procedures) also change to reflect the new name.  I imagine that deploying a schema change will be a delight, but truthfully, I haven't gotten that far yet (this is a real SQL 2000-based project that I'm working on, btw).

In fact, VSTEDP appears to be the first "Team Edition" SKU that adds value to Visual Studio that even a small ISV can take advantage of right out of the box.  I'm not easily impressed by the functionality of the other VSTE SKUs.

Despite all that it is, "Data Dude" apparently does not include all of the functionality that you are used to for managing live databases using Management Studio, or even Visual Studio's Server Explorer for that matter. 

My case-in-point for today's experience is the fact that everything in VSTEDP appears to be SQL-only.  There's no graphical capabilities for editing tables or relationships (Table Designer), etc.  Everything that you do (aside from the Rename Refactoring, as it would appear) results in a DDL script appearing in a code editing window.  Heck, even clicking on a Column name in Schema View doesn't let you edit any of the properties that show up in the Property list.

For what it's worth, I'm not DDL-dumb.  But, by the same token, I've gotten used to using the Table Designer to do my work, since I've been doing this using SEM since SQL 7.  I just shouldn't need to abandon that design paradigm in order to take advantage of "Data Dude's" useful features.

Wednesday, February 21, 2007


A month ago, before the release of BC, this might have meant more...  But, tonight, after about 16.5 days (/played), Jaesyn of Dalaran leveled to 60. 

Not too bad for starting this particular toon in November and not being part of a guild.

Guess Who's 60?

Now the push to 70 begins...

Tuesday, February 20, 2007


Dustin Campbell has written a great series over the past few weeks on functional programming topics, which despite being a classic computer science topic, tends to be a little bit ahead of the curve as far as modern day .NET programming is concerned (that will all change in the near future, though - trust me!).

"Closures" is one of the topics that both he and Bill Wagner are expressing a lot of passion for these days, because understanding what they are and how they work are a critical as we move forward into everyday acceptance of Anonymous Methods, Lambda Expressions, and scary things like that.

I've had a pretty good understanding of what a Closure was up to this point, thanks mostly to seeing Dustin present on the topic, as well as spending six hours trapped in a car with him as we drove to and from Dayton one evening.  However, I read something today that really made it click.

I was reading up on the programming language LUA, which just happens to be used to create add-on modules for World of Warcraft (wink, wink).  LUA is a dynamically typed language that supports using functions as first-class variables.  It also supports the concept of anonymous/inline functions, as demonstrated by the following:

function makeaddfunc(x)
-- Return a new function that adds x to the argument
return function(y)
-- When we refer to the variable x, which is outside of the current
-- scope and whose lifetime is shorter than that of this anonymous
-- function, Lua creates a closure.
return x + y
plustwo = makeaddfunc(2)
print(plustwo(5)) -- Prints 7


From that Wikipedia article comes this quote, which resulted in my "ah-ha!" moment:

A new closure for the variable x is created every time makeaddfunc is called, so that the anonymous function returned will always access its own x parameter. The closure is managed by Lua's garbage collector, just like any other object.

So, the simplified point is that because makeaddfunc(x) contains an anonymous function that uses "x", a closure is created each time that makeaddfunc(x) is called in order to preserve the state of variables that are defined outside of the scope of the anonymous function.

I'm not sure if this will help to clear things up for other people as well as it did for me, but here's hoping!

Monday, February 19, 2007

Day of .NET in Ann Arbor: We're Doin' It Again!

Just a quick announcement that we're busy organizing another Day of .NET in Ann Arbor, which will take place on Saturday, April 28, 2007May 5, 2007 on the campus of Washtenaw Community College.

Last year's event was a huge success, with around 150 people in attendance. At the end, over $40,000 worth of swag was raffled away, with everyone walking away with something.

Keep an eye on the web site for further details as they evolve:

Day of .NET in Ann Arbor

The "Call for Speakers" is currently underway, with submissions being due by March 10, 2007.

Friday, February 16, 2007

The Specified Module Could not be Found

This week, I'm helping another branch out with some bug fixes on a web application that I originally assisted with years ago. Or, I should say that I'm attempting to help them out. The first challenge is getting my development environment set up to run this massive application.

Today, everything was working until I tried to test reporting (which happens to also be the area of the system that my issue involves). These reports use a third-party tool to create Excel documents on the server. Despite everything that I could think of, I kept getting a pretty generic error message during the ctor() call of one of the objects in that Excel writer library:

"The specified module could not be found."

The problem, as it turned out, was not due to ASP.NET's inability to find the assembly. What happened was that the assembly was merely an interop wrapper for a COM library, and because I had just "xcopy deployed" the web application, the COM library never got registered.

The solution: regsvr32 the COM DLL that the Interop Assembly required.

Wednesday, January 24, 2007

Working on Blog Template

I upgraded to Blogger's new account, and need to rework my template to take advantage of new features. Until I get the time, I just picked one of their existing templates to start working off of (though, I really didn't need to since the classic templates still work, but I wanted a fresh start).

As a result, things like Haloscan are not yet linked up.

Sunday, January 21, 2007

PDC '07: What's going to be revealed?

Dustin, Steve, and I were chatting at the Developer Express booth at CodeMash about what we thought might be revealed at PDC '07. The Professional Developer Conference is an event where Microsoft usually reveals all of the cool stuff that will be upcoming (1-2 years out).

So, what can possibly be revealed that hasn't already been? Certainly, they won't be talking about Visual Studio 2007 (Orcas), because that's old news by that time.

Then we started speculating. With Ray Ozzie at the helm, I think I know exactly where they're going with the Visual Studio IDE:

<TotalSatire PleaseDoNotSueMe="true">


CodeMash: Closing Thoughts

CodeMash 2007 v1.0 is now complete, and I've had the chance to finally get plenty of sleep in my own bed.  I uploaded the last photos from my camera to Flickr, and now I'm just sitting here amazed that the event went so smoothly and is getting great feedback on the Blogosphere (in fact, "CodeMash" is the #2 #1 search term on Technorati at the moment--how cool is that!??!?).

The reason the conference was such a success really comes down to planning.  We didn't have all of the details nailed down when we arrived at the venue on Wednesday, but we did have the vast majority of them handled.  This created a natural momentum that allowed the event to just drive itself to completion, whether we were there or not! 

The Kalahari staff was just amazing in being responsive to our needs on that first day (I think we wore out the help line's digits on their phones).  They were able to provide anything that we needed, from tables and chairs to extension cords to stapling banners to the wall. 

As usual, I didn't get a chance to attend many sessions because I was traveling from room to room to make sure that there were no issues.  I also tried to chat with the exhibiting sponsors to handle issues or help them feel welcomed, and I popped into the speaker lounge on occasion to see who was hanging out.  By the end of the first day, my legs were really aching, and I had a wicked blister on my toe.

I thought it would be cool to start compiling a list of "fun facts" about the event.  Perhaps the other organizers will follow suit with trivia that I left out/was not aware of.

  • The CodeMash "Gear Head" logo was originally brown, not green.
  • The conference was originally named "Free Your Mind", but that sounded like a better tagline than a conference name.  John Hopkins, president of the .NET User Group in Southfield, MI, owned the domain name "", and let us have it. 
  • "DevMash" was one of the names being considered alongside "CodeMash".
  • There is a little error on the cover of the Conference Guide, but it's really only apparent to me (since I'm the one who did the layout).  The "2007" under the CodeMash logo is supposed to be in a wider/thicker/more-technical typeface.  However, I used a non-standard font when I created it, and forgot to provide this to the print shop.  The result is that MS Publisher defaulted to Arial, and the final "2007" came out small and weak looking.
  • Speaking of the Conference Guide, the clever "Welcome" message was written by Jason Gilmore.
  • The blurry code that you see as the background of the cover is actually from my ZMachine.NET project (the opcode handler methods section).
  • There's a reason why this event's T-shirt strongly resembles the Day of .NET in Ann Arbor shirt: I'm not all that creative, and I happened to have produced both shirts...  Maybe the next one will be done by a real designer!  /grin
  • The registration fee that you paid went entirely for food (venue prices are expensive, for those of you playing along at home).  If we charged more, then we could have had hot meals all of the time.  But, I think that Jim Holmes and Dianne Marsh did a fantastic job of balancing the menu and the pricing.
  • Even with all of the planning around meals, we were surprised in the last week by the venue pricing for soda, bottled water, and coffee service.  A big thanks goes out to two of the sponsors in particular who stepped up after making their initial commitment to ensure that attendees would have free beverages throughout the days:

    Microsoft paid for coffee service (i.e., "Microsoft provided the Java")

    Pillar Technology was a superb sponsor in stepping up and offering to cover the pop and bottled water expenses with no hesitation after we approached them while they were setting up on site at the conference. 
  • Many of the books that were given away at the close of the event were written by our speakers, and we had those speakers sign the books (look to see if yours was signed!).
  • Scott Ambler signed each of his Refactoring Databases books with a unique message.
  • Josh Holmes and Brian Prince shaved their heads before the blog-post threshold was actually met...
  • Ted Neward loved the venue in part because they served Coke instead of Pepsi.  I didn't have the heart to tell him that I personally found this to be a flaw... ;-)


Wednesday, January 17, 2007

CodeMash: Day 0

The exhibitor tables are in place, and a little more than half of the sponsors have already set up (some are not arriving until tomorrow morning).  There are some pretty neat displays, but one that everyone is talking about already is Quick Solution's booth, where there's a Wii that you can try out (and enter for a chance to win at the end of the event)!

The Expert Panel on Programming Languages is currently under way.  I snuck off to a quiet corner to crank out this blog post, and then I'll be returning.  Be sure to check out the Flickr tag "Codemash" for photos from the conference.

CodeMash: Today's The Day!

I'm trying to finalize all of my email and blogging before throwing some clothes into a bag, loading up my pickup truck with sponsor swag, books, t-shirts, and other conference material that have been piled up in my dining room for a week, and then jumping onto the Ohio Turnpike to head out to Sandusky to help set up CodeMash.  The organizers are arriving mid-day, and sponsors will start to arrive soon after to set up their booths.

Don't worry: the conference itself doesn't officially start until tomorrow (Thursday).  But, if you're arriving this evening (Wednesday), try to get there around 5:00PM or so to check in.

We recognized that there would be a nice crowd of attendees arriving today, so there's an Expert Panel on programming languages scheduled for 7:00pm this evening as a pre-conference event.  Immediately after, Bruce Eckel will be introducing the concept of Open Spaces (this is another "something extra" that we're offering to enhance the conference experience).  Open Spaces is a little bit like Birds of a Feather, but from what I can gather, it's even more ad hoc and informal than BOFs typically are.

Of course, maybe you just want to swim tonight, and that's perfectly alright!  Make the most of the venue, which is a beautiful indoor waterpark.

Sunday, January 14, 2007

WoW, Someone Messed Up...

A few days ago, Blizzard announced that there are 8 Million subscribers playing the World of Warcraft.  At $12-$15 a month (USA pricing), this is A LOT of revenue that they are bringing in.

This Tuesday, the much awaited expansion pack (Burning Crusades) is being released.  In an attempt to make sure that the game is ready, Blizzard forced the second patch in a week today (Sunday).  This means that instead of me jumping into the game this morning, I instead sat drinking my coffee and watching the ever-so-slow "Downloading Updates" screen.  15-20 minutes later, the game was patched, and I logged in.

Or, I attempted to log in.  Again....  and again.... and again...

"Ok, the authentication servers must just be busy because everyone patched at the same time, and now they're all trying to get in," I thought.

After maybe an hour of this insanity (trying the same thing over and over, expecting different results), I finally noticed a message from Blizzard on the login screen:

[8:10am PST January 13th 2007]

The 2.0.5 client-side patch has caused issues with our authentication system. These issues can cause players to be suddenly disconnected from the game, as well as prevent them from logging in to the game. We are working to resolve this issue as soon as possible and will provide you with updates as soon as they are available.

Nice!  So, what they were probably doing is updating WoW in the 11th hour preparation for BC's release on Tuesday with some new top-secret authentication/anti-piracy system, but instead, they managed to lock out 8 Million paying subscribers!

Wednesday, January 10, 2007

Bright Comet in the Sky

If you haven't been paying attention, there's currently a very bright comet visible in the evening sky. 

Comet McNaught (C/2006 P1) is approaching the sun, and has really brightened in the past week.  A few weeks ago, you would have needed a pair of binoculars or a telescope to see it, but now, it pops out of the western sky even before the sky is completely dark! 

The last comet that I was able to see was Hale-Bopp, and I remember that to be pretty bright.  McNaught is supposedly brighter!  In fact, only Venus shines brighter at the moment, and they say that this is currently the brightest comet in 30 years.

Today is really the first day that we have sunshine in Toledo, so I'm hoping to be somewhere with a view of the western horizon when the sun sets this evening.  However, I don't know if being at the Ann Arbor IT Zone to hear about Windows Workflow Foundation would necessarily qualify...  Maybe tomorrow...

UPDATE: We've been cloudy and rainy here ever since I wrote this.  However, has been running a series of articles stating that you can see this comet during the day!  The caveat being that you first must stand in a shadow to block out the glare of the sun, and then search about 5 degrees above the sun (roughly the size of your fist when held at arm's length from your eye) for the bright head (which will likely appear dim because of the blue sky surrounding it).  Supposedly, the tail can also be seen during the daytime, too, once you locate the comet.  I'll be sure to try this, if the clouds ever disappear.

Wednesday, January 03, 2007

Tag, I'm It...

Dan Ciruli, the "I did 66,795 pushups last year and now my wife loves that I'm chiseled" guy tagged me.  I'll play along.

Five Things You May Not Have Known About Me:

1. College?  Uh, Yeah... I Went to College

Despite being a decent student and taking college-prep courses in high school, I didn't start college right away, opting instead to work as a sorter for an overnight freight company.  When I did start at the University of Toledo, I only attended part time while I kept working for the same company.  I might have accumulated enough credits to be classified as a Sophomore before moving from manual labor into a programming position "upstairs".  Shortly after, I took a break from school in order to concentrate on my career.  That break is still continuing today, a decade later, as is my successful career...

2. Sure, I can swim.  Watch me!

The summer between my 2nd and 3rd grade, I almost drowned at my town's public pool.  I wasn't a strong swimmer, and leaped into the "5-foot section".  I found myself further away from the wall than I should have been, couldn't touch bottom, and began to panic.  I remember being out of breath, and starting to take in water before a friend (Myles Cartwright) pulled me to safety.  Thanks, Myles!

For the record, I'm a great swimmer today, despite my adversion to cold water (and thus, my general adversion to swimming when presented with the opportunity)

3. I've Traveled the World..... of Warcraft.....

I'm hopelessly addicted to the World of Warcraft at the moment.  I resisted playing for so long, because I know my inability to control myself when presented with a game, let alone a never-ending game.  But, a couple of friends finally convinced me (damn you Blizzard and your free trials), and now I have two Tauren Druids that I'm alternating between (Jaesyn of Dalaran is currently a level 42, and Jaesyn of Dragonblight is currently a level 22).  Interestingly enough, my wife now plays, too, and her Dwarf Paladin is a level 28 on Dragonblight.

4. Potty Pumper

I am an Eagle Scout, and worked at different summer camps for 3-4 years.  One of the most respected camp employees, IMHO, was the Camp Ranger who lived on-site year round and served as a caretaker for the property.  The ranger at the first camp that I worked for became a very influential role model to me, and helping him out was a very desireable activity among my circle of friends (because we drove trucks and tractors and did cool things that nobody else got to do). 

Interestingly enough (as I look back on this time of my life), a great assignment to receive was to "pump potties".  This involved pulling a large "honeydipper" (tank) behind a tractor, backing up to the latrine, connecting a big hose to a pump, and filling the tank with whatever was in the latrine vault before you got there...  I'll leave that to your imagination.  Then, you had to transport the "stuff" to a septic pond and switch the pump from "suck" to "blow" in order to empty the tank.  I'll let you ponder the visual on that detail for a moment, too.

Another interesting fact: I later married the daughter of a different camp ranger.

5. Skilled Performer

In high school, I used to perform for audiences all of the time.  I was a member of our Choir and Show Choir, and also acted in plays and musicals.  This is probably why I don't mind standing up in front of a group.  However, don't ask me to sing or dance today...  These activities are no longer performed... in public, at least.  I don't think I was exceptionally good back then, and certainly things have not gotten better over time.


Now, in the honored tradition of this Meme, I come to the point where I must tag five other bloggers in order to keep this pyramid scheme alive (and to give future Googlers more fodder to enjoy): Greg Huber, Dustin Campbell, Bill Wagner, Josh Holmes, and Jim Holmes...  Have fun, guys!