Friday, August 11, 2006

XmlDataSource: XPath Workaround For Default Namespaces

Having not worked with the XmlDataSource control in ASP.NET 2.0 until this week, I was surprised to learn that there was no way to force it to use namespace-qualified XPath queries, which are critical for querying XML with a default namespace set (either at the root or for some branch of the tree).

PRIMER
XML is a text-based data format that utilizes the concept of tagging data in order to form a tree structure. A simple XML document might look like the following:

<xml>
<Person name='Jason'>
<url>http://jasonf-blog.blogspot.com</url>
</Person>
</xml>
(Listing 1)

XPath is a way of specifying which tagged element, or a collection of elements, that you are interested in. For example, I can query the above XML for the "url" element of the "Person" named "Jason" by using the following:

/xml/Person[@name='Jason']/url

Each slash separates the individual elements that are in the path of the nested data. The square bracket after an element is known as a predicate, and is used to filter the results (i.e., in case there are multiple "Person" elements, this predicate only returns those elements with a "name" attribute containing the value of "Jason").

As XML became more and more popular, developers started merging data obtained from different XML documents into one. This led to tag name conflicts, because one XML document might contain a "Person" tag that has a totally different meaning than another XML document's "Person" tag. The workaround for this situation was to define Namespaces to identify the context of the elements within the XML. Consider the following:

<xml>
<Person name='Jason' xmlns='WebsiteUserNamespace'>
<url>http://jasonf-blog.blogspot.com</url>
</Person>
<Person name='Jason' xmlns='UsergroupLeadersNamespace'>
<url>http://www.nwnug.com</url>
</Person>
</xml>
(Listing 2)

This demonstrates how two nearly identical Person elements can be assigned to different namespaces (implying that they have two different meanings). The first "Person" element (and all of its child elements) belongs to a namespace called "WebsiteUserNamespace", while the second one belongs to "UsergroupLeadersNamespace". Another way to write the same data, but make it a little easier to work with, is as follows:

<xml xmlns:a='WebsiteUserNamespace' xmlns:b='UsergroupLeadersNamespace'>
<a:Person name='Jason'>
<a:url>http://jasonf-blog.blogspot.com</a:url>
</a:Person>
<b:Person name='Jason'>
<b:url>http://www.nwnug.com</b:url>
</b:Person>
</xml>
(Listing 3)

Here, we're actually defining aliases that are used as prefixes for the tag names. In this case, "a" represents the "WebsiteUserNamespace", and "b" represents "UsergroupLeadersNamespace". Notice that the first "Person" element has all of its tags prefixed with "a" while the second "Person" element is prefixed with "b". This is what makes Listing 3 equivalent to Listing 2.

Now, to query for the "url" of the "Person" with a name of "Jason" that belongs to the "UsergroupLeadersNamespace", I would use the following XPath:

/xml/b:Person[@name='Jason']/b:url

The reason why I said that using prefixes is easier to work with has to do with the concept of default namespaces. Notice that the namespace declarations in Listing 2 does not include an alias prefix definition. This makes every unprefixed element from that branch in the tree a member of that namespace. It is common for the entire document to have a default namespace set, meaning that every element within the XML belongs to that namespace.

The problem with unprefixed elements in XML belonging to a namespace is that you cannot construct a XPath query to drill into these elements (because XPath is what requires the prefixes).

The .NET XML parser solves this problem by allowing you to create a XmlNamespaceManager, and defining a prefix at runtime to represent any particular namespace. Then, you can evaluate XPath queries using these custom prefixes that do not exist in the XML document so long as you supply the instance of your XmlNamespaceManager object (i.e., as an optional parameter on a SelectSingleNode(), etc).

Back to the Topic
Now, what I discovered this week was that the XmlDataSource control in ASP.NET allows you to specify a XML document and an XPath to use in order to return a set of nodes (that can then be bound to a TreeView control, etc). But, it did not provide any mechanism to allow the developer to pass in a XmlNamespaceManager. So, if your XML had a default namespace declared, you were pretty much screwed because you could not construct a XPath query.

Searching the internet found these posts:

(I gave up on searching at this point because everything seemed to come to the same conclusion)

The closest thing to a valid workaround was Bill Evjen (pronounced like the bottled water, Evian) suggesting that you just transform the XML first using XSLT in order to remove the default namespace (XSLT transformation is another feature of the XmlDataSource control). Then, you can construct a valid XPath query without worrying about prefixes.

There is an alternative solution that does not require the transform, and allows you to still use namespaces if and when you need to. It's kind of a head-slapper for those who know XPath.

Consider the following XPath:

/xml/*[name()='Person' and namespace-uri()='UsergroupLeadersNamespace' and @name='Jason']/*[name()='url']

It is a little more complicated, yes, but allows you to work with the original XML as-is. Here's the magic of how it works (using Listing 2 as a source of data):

The root "xml" element did not have a default namespace defined, so it can remain in the XPath as is (no prefix). However, the "Person" element belonging to the "UsergroupLeadersNamespace" needs a prefix in XPath. Or does it?

Turns out that if I just use "*" as my second step, then that selects all elements that are children of the root "xml" node. I can then create a predicate that utilizes the built-in XPath functions of "name()" and "namespace-uri()" in order to match these to the values that I need to use.

Finally, because my second step matched the namespace-uri to "UsergroupLeadersNamespace", and I know that in the case of Listing 2, all elements below that point belong to the same namespace, I don't have to continue checking the namespace-uri() value in the predicates of subsequent steps (i.e., I can get away with only checking the name() value).

Bottom line:

/xml/*[name()='Person' and namespace-uri()='UsergroupLeadersNamespace' 
and @name='Jason']/*[name()='url' and namespace-uri()='UsergroupLeadersNamespace']
becomes equivalent to being able to use
/xml/b:Person[@name='Jason']/b:url
if you could pass in a XmlNamespaceManager object.

kick it on DotNetKicks.com

UPDATE 2006-08-14: I just wanted to disclose that after Googling a bit more, I found plenty of references to the XPath method described here for querying namespace-qualified XML (just not in the context of the XmlDataSource). It's still a neat method to keep in mind in case the scenario ever presents itself again.

Monday, August 07, 2006

IE7 for Windows Vista: Protected Mode Annoyance

I like the fact that IE7 for Windows Vista will have a Protected Mode that it will run in by default for any untrusted security zone. This is actually very similar to something that I blogged about last year before installing Vista or even IE7. It just makes sense.

But, something that doesn't make sense to me at the moment is really hurting the WAF of running Vista: it seems that the Protected Mode also affects File Upload capabilities of web sites by limiting what you have access to.

You see, Tina uses the web-based GMail almost exclusively. She also does a lot of work in Microsoft Publisher, and often needs to email files to her friends. These are saved as simple flat files (i.e., TIFF or JPEG).

But, when she is in GMail, and needs to attach a file, the Open File dialog just shows empty directories. That is, unless she goes into Internet Options and turns off Protected Mode.

It very well could be that I just need to change a magic checkbox setting or something. But, there has to be a balance between running in a protected mode sandbox and allowing access to files for email attachment purposes, etc.

Has anyone else beta testing Vista come across this same issue?

CLR processModel memoryLimit

People like Sam and Dustin probably like crawling around the CLR Internals and garbage collection (that is, the sewage system that keeps everything clean and running properly). For me, it's sometimes interesting, but mostly frusterating. I just want things to work without necessarily knowing why they are working.

Enter a case that my friend and co-worker (btw, you need a website/blog, Murph) has been trying to research and resolve for a month or two now.

The client uses Crystal Reports for web-based reporting. Despite my distaste for CR, this actually isn't the problem, and the reports work just fine for what they need to do. The problem is more related to the fact that web-based reporting needs to use a postback when paginating through the report. The reports are based on Datasets, which are retrieved from a web service (for security reasons). Therefore, in order to prevent querying the database every time the user goes to the next page, the Dataset is cached in the Session.

Well, some of these reports have huge amounts of data associated with them. It seems that if too many reports were requested since the last time that the server was bounced, that they would start to get OutOfMemory exceptions. This, in spite of 3.5GB of RAM on the server.

My first thought was to move away from In-Proc session management (i.e., try the SQL Server-based model). That still didn't work. It was as if garbage collection wasn't doing its job.

Murph then started messing with the setting in machine.config. By default, there's a memoryLimit="60" setting, which means that when the memory pressure of the ASP.NET worker process reaches a 60% threshhold, that it will start a new process (i.e., recycle itself, which by definition, gets rid of uncollected garbage and frees up physical memory).

This sounds all well and good. After all, I like when the system has a failsafe mechanism that cleans up after itself. But, in this case, there was 3.5GB of RAM:

3.5GB * 60% = 2.1GB. If memory usage hits 2.1 GB, then the ASP.NET worker process will recycle itself.

Only, it seems that by default, .NET only allows 2GB of memory for its processes. Therefore, before the 2.1GB threshhold was reached, they got the OutOfMemory exception.

The following was invaluable for helping to resolve the problem:

Source: Improving .NET Application Performance and Scalability - Chapter 17

Configure the Memory Limit
The memory threshold for ASP.NET is determined by the memoryLimit attribute on the element in Machine.config. For example:

<processModel ... memoryLimit="60" .../>

This value controls the percentage of physical memory that the process is allowed to consume. If the worker process exceeds this value, the worker process is recycled. The default value shown in the code represents 60 percent of the total physical memory installed in your server.

This setting is critical because it influences the cache scavenging mechanism for ASP.NET and virtual memory paging. For more information, see "Configure the Memory Limit" in Chapter 6, "Improving ASP.NET Performance." The default setting is optimized to minimize paging. If you observe high paging activity (by monitoring the Memory\Pages/sec performance counter) you can increase the default limit, provided that your system has sufficient physical memory.

The recommended approach for tuning is to measure the total memory consumed by the ASP.NET worker process by measuring the Process\Private Bytes (aspnet_wp) performance counter along with paging activity in System Monitor. If the counter indicates that the memory consumption is nearing the default limit set for the process, it might indicate inefficient cleanup in your application. If you have ensured that the memory is efficiently cleaned but you still need to increase the limit, you should do so only if you have sufficient physical memory.

This limit is important to adjust when your server has 4 GB or more of RAM. The 60 percent default memory limit means that the worker process is allocated 2.4 GB of RAM, which is larger than the default virtual address space for a process (2 GB). This disparity increases the likelihood of causing an OutOfMemoryException.

To avoid this situation on an IIS 5 Web server, you should set the limit to the smaller of 800 MB or 60 percent of physical RAM for .NET Framework 1.0.

/3GB Switch
.NET Framework 1.1 supports a virtual space of 3 GB. If you put a /3GB switch in boot.ini, you can safely use 1,800 MB as an upper bound for the memory limit.

You should use the /3GB switch with only the following operating systems:

Microsoft Windows Server™ 2003
Microsoft Windows 2000 Advanced Server
Microsoft Windows 2000 Datacenter Server
Microsoft Windows NT 4.0 Enterprise Server
You should not use the /3GB switch with the following operating systems:

Microsoft Windows 2000 Server
Microsoft Windows NT 4.0 Server
Windows 2000 Server and Windows NT 4.0 Server can only allocate 2 GB to user mode programs. If you use the /3GB switch with Windows 2000 Server or Windows NT 4.0 Server, you have 1 GB for kernel and 2 GB for user mode programs, so you lose 1 GB of address space.

IIS 6
For IIS 6 use the Maximum used memory (in megabytes) setting in the Internet Services Manager on the Recycling page to configure the maximum memory that the worker process is allowed to use. As Figure 17.12 shows, the value is in megabytes and is not a percentage of physical RAM.

Friday, August 04, 2006

Another NWNUG Blogger

I had lunch yesterday with Dustin Campbell from Developer Express, and we talked about the fact that he was perhaps the last technical person in this section of the Milky Way Galaxy to have a blog. Heck, even my mother has a blog.

His boss, Mark Miller, owns a pretty clever domain name: Do It With .NET (doitwith.net). I mentioned to Dustin how funny it would be if "Did It With .NET" was also available. Well, turns out that it was!

Immediately after lunch, Dustin jumped at the opportunity and purchased the domain name. Then he signed up for ASP.NET hosting with Webstrike Solutions, who we use for www.nwnug.com chiefly because the first 12 months of hosting is free. After a few glitches with their server, I was able to install the latest build of DasBlog (1.9.x), and now he's off and running:

http://www.diditwith.net/

Dustin is always working at really low levels in the CLR. I hope that he will start to report little things that he finds, like when Microsoft changes the meaning of certain HRESULT values in their APIs, etc. He had a good idea for a little behind-the-scenes series on LINQ, too, that he could write about.

Wednesday, August 02, 2006

Should Companies Pay More For Legacy Development?

This week, I scoped out a statement of work for some legacy development: enhancements to a Visual Basic 6.0 application.

It sounds really weird to call VB6 a legacy platform. But since ~2000, the whole Microsoft Platform paradaigm has shifted away from COM-based development to managed code (.NET). With that, so did the skillset of the developer community as a whole.

When everyone was regularly doing VB6 development, myself included, it was called a commodity skillset, and therefore, brought in relatively low billrates for consultants (when compared to more cutting edge languages, like Java). This was just classic supply-and-demand economics.

That mindset still exists today in my customers. They think, "VB6 is old and, therefore, it should be very simple to work with." With that, there is also an expectation of low billrates to perform the work. But, is this necessarily true?

There's now a reverse learning curve involved for me to perform this work: I have to unlearn some .NET syntax in order to write VB6 code, and that directly cuts into my productivity. Not to mention that I primarily work in C# now. (But, for disclosure, I still do A LOT of VBScript development since I have to work on classic ASP/ADO web applications for this same customer).

And that brings me to the title question: Should companies expect to pay more for legacy development, even if the legacy system is less than a decade old?

Friday, July 28, 2006

20,000 Hits

I just checked my stats, and realized that I crossed the 20,000 pageload mark earlier today. Sure, people like Scoble, Scott, or Jim Holmes probably get this many hits in any one day, but at least my readership is growing! These website hits are primarily from Google searches.

Just for fun, the stats about that milestone hit:

Date/Time: July 28, 2006 3:20:48 AM

URL: http://jasonf-blog.blogspot.com/2005/01/gb-pvr-plugin-tutorial-released.html

Referrer:

http://www.google.com/search?q=gbpvr plugins&btnG=Search&hs=03L&hl=en&lr=&client=firefox-a&rls=org.mozilla%3Aen-US%3Aofficial

Client: A Penteledata Inc. - Cable user in Lititz, PA (USA) using Firefox 1.5 on Windows XP and a screen resolution of 1280 x 1024.

(Stats provided by StatCounter)

Thursday, July 20, 2006

Guitar Tabs Are Now Illegal?

So I went to one of my favorite guitar tablature repositories [GuitarTabs.cc] tonight hoping to continue practicing a song that I've been working on, and discovered that the Fair Use nature of the site is currently in dispute. Now, as a background, the majority of these tabs have been created by people who "reverse engineer" songs and then transcribed their results for public consumption. Some tabs have even been on Usenet since the early 1990's (you can use Google Groups to prove that).

The search by Song Title and/or Author still works, but individual tabs have been removed from the site (replaced with a 'Download of this file has been disabled' image).

The note on the homepage reads:

July 17, 2006

To all "Guitar Tab Universe" visitors:

The company which owns this website has been indirectly threatened (via our
ISP) with legal action by the National Music Publishers' Association (NMPA) as
well as the Music Publishers' Association (MPA) on the basis that sharing
tablature constitutes copyright infringement. At what point does describing how
one plays a song on guitar become an issue of copyright infringment? This
website, among other things, helps users teach eachother how they play guitar
parts for many different songs. This is the way music teachers have behaved
since the first music was ever created. The difference here is that the
information is shared by way of a new technology: the Internet.

When you are jamming with a friend and you show him/her the chords for a
song you heard on the radio, is that copyright infringement? What about if you
helped him/her remember the chord progression or riff by writing it down on,
say, a napkin... infringement? If he/she calls you later that night on the phone
or e-mails you and you respond via one of those methods, are you infringing? I
don't know... but I would really like to know. If anyone has information on
this, please email support@guitartabs.cc.

Apparently, the NMPA/MPA believes that the Internet may be on the foul side
of the legality line they would like to draw here. For me, I see no difference.
It's teachers educating students and covered as a 'fair use' of the tablature.
The teachers here don't even get paid nor do the students have to pay this
website to access the lessons.

An attack on this website is really an attack on every one of you who have
told someone (in person, or via the written word, telephone, or e-mail) how you
play a song on guitar. And who, especially among small websites, has the deep
pockets to fight the NMPA/MPA? They use scare tactics while there is, in fact,
no legal precedent on this matter (to the best of our knowledge). If you are
interested in expressing your opinion to the NMPA/MPA, contact them via their
respective websites. Please do not resort to vulgar language or insults.

Millions of people use the Internet to learn guitar, in one form or
another. It appears the NMPA/MPA and their members do not want to support us and
help us further our education. To you visitors from outside the USA or UK, can
you find your favorite artists' "official sheet music" at your local music
store? Even in the United States and United Kingdom, we often can not. The
NMPA/MPA have a choice to make: either they support us as aspiring guitarists,
or they choose to alienate their customer base. To date, not one sheet music
publisher has contacted this website to either inquire as to our activities or
to express interest in any type of dialogue or collaboration whatsoever. All we
deserve is a cold, indirect, impersonal threat without any explanation? They
should embrace new technologies or else become relics of the old economy.

Since I'm now 'worried' about working around tabs at all, I'm in a tough
situation! Luckily, I'm fairly confident that if I alone listen to a song and
then figure out how to play it by ear, I will then be able to enjoy using that
knowledge to practice and improve my guitar playing skills. Is that what is
necessary for everyone to do? Work these things out alone? What a sad situation.

Sincerely,

Rob Balch
Manager of "Guitar Tab Universe"

If you would like to help out and join the effort to fight for our freedom
to tab and share, please check out MuSATO. You can comment on this
statement and/or situation here.

Wednesday, July 19, 2006

New Air Filter Does Wonders

Of everything that I replaced on the motorcycle, I let the air filter go. It's not a part that you can just pick up at the local auto parts store, so it has to be mail ordered, and I just never got around to it. Besides, the one that came with the bike looked clean enough to me!

Well, on Friday, I decided to finally clean the filter (which uses a reusable foam element). As soon as I applied any pressure to the foam with my fingers, it just crumbled! Uh, oh!

That motivated me to order a new one (cheap replacement, nothing fancy), which arrived last night. I oiled it and installed it this morning, and then rode into work.

WOW! What a difference that made. I could instantly tell that the engine sounded different, I got even more horsepower (which there was already more than I was ever used to), and the idle smoothed out. The new filter even fixed a flat spot/stutter in the revs between 2000 and 3500 RPMs! It's like I have a totally different bike, just by installing a $20 part.

Now the only remaining defect is something that developed about 200 miles ago: leaky fork oil seals. I guess I didn't polish up the forks well enough, and the light rust/pitting that was present was enough to roughen the seal. They're leaky now, but due to how involved the repair is, I will likely wait until after the riding season.

Tuesday, July 18, 2006

My IM

I regularly use a half-dozen different email addresses, so it's not obvious to people which ones are tied to some form of instant messaging. Well, do not fret any longer: if you need to IM me (or if you just want me in your contact list), here's what you can try:

Windows Live Messenger (MSN): firstname nospace lastname at hotmail dot com
Yahoo: firstinitial nospace lastname

BTW: With the new Windows Live Messenger client, there's a new XBOX tab that will show your XBox Friends (if you're using the same "passport" for IM that you use for your XBox ID).

Monday, July 17, 2006

Don't Forget Those Domain Accounts

I got a call today stating that one of the reporting servers at my client's location was down (SQL Server 2000 Reporting Services). We haven't touched anything on that machine for a few days, so I was pretty sure that it wasn't anything with the server itself.

When I finally arrived onsite, I opened a web browser to the URL: http://server/reports

The response was simply a generic "Server Application Unavailable" message. Ok, time to troubleshoot.

I first looked at the Application Event Log. There was a message logged, but didn't tell me anything special:

aspnet_wp.exe could not be started. The error code for the failure is 80004005. This error can be caused when the worker process account has insufficient rights to read the .NET Framework files. Please ensure that the .NET Framework is correctly installed and that the ACLs on the installation directory allow access to the configured account.


Ok, so it did tell me that the problem likely involved the worker account. Now, normally, the ASP.NET worker account is the ASPNET user on Windows XP and the NETWORK SERVICE account on Windows 2003. However, just to make sure, I took a peek at the Machine.config file, and discovered that in this case, my client changed the ASP.NET worker account to a domain account instead. It was a good thing that I double checked: there's nothing worse than spinning your wheels trying to fix a problem using the wrong user ID.

Out of curiosity, I also took a peek at the Security Event Log since the client has auditing enabled on all of their servers. I found some failures logged:


Logon Failure:
Reason: Account currently disabled
User Name: someuser
Domain: somedomain
Logon Type: 8
Logon Process: Advapi


Wouldn't you know it: the same domain account that was specified as the ASP.NET worker account (SOMEDOMAIN\SomeUser in this case) was disabled, per this Login Failure event message. Well, that would explain why the ASP.NET process could not start!

In this enterprise, domain accounts are set to automatically disable after a set time period. This is done in order to help prevent an unused account from remaining active, and potentially becoming a security exploit. There is normally a process to renew an account before it becomes inactive, but sometimes, one will slip through the process, as happened this time.

Tuesday, July 11, 2006

Upcoming Book: Windows Developer Power Tools

Jim Holmes just announced the project that he and James Avery have been collaborating on. It's going to be one monster of a boat anchor book (1100 pages) all about tools that Windows Developers can use to make their work easier (think something along the lines of Scott Hanselman's Ultimate Tools list, but with a detailed article about each tool).

Check out Jim's announcement:

http://frazzleddad.blogspot.com/2006/07/announcing-our-book-windows-developer.html

Disclosure: As a Tech Reviewer, I've gotten to see early drafts of the chapters that they have completed.

UPDATE 2006-08-02: I see that Amazon is taking pre-orders. Reserve your copy today! (link below)

Windows Developer Power Tools: Turbocharge Windows Development with More Than 140 Free and Open Source Tools (Paperback)

Friday, July 07, 2006

Defining Web 2.0 to a Layman

Somebody asked me the other day what the term "Web 2.0" meant. This is a topic that has been debated to death on the blogosphere, since there is no standard or official definition. (Think of this post as being my contribution to that old debate).

Some people will say "It's the next generation of the World Wide Web", but that doesn't tell me anything. I mean, how do you distinguish Web 1.0 content currently on the web from Web 2.0 stuff? For instance, I would consider Google Maps as a Web 2.0 application, while Mapquest is a Web 1.0 site. The distinguishing factor to me: the level of interactivity within the user interface that does not require a complete postback.

Wikipedia has an entry discussing Web 2.0 here:

http://en.wikipedia.org/wiki/Web_2.0

After thinking for a while, I simply told this person that Web 2.0 refers to thick-client functionality that is built using thin-client technologies. IOW, it's a Winforms-level of application running within a web browser.

This isn't a perfect definition, but it did get the point across in this case. Are there any better/more concise definitions available?

Tuesday, July 04, 2006

ISS and STS-121: Visible from North America

About 5 minutes after the local fireworks show concluded this evening, we watched STS-121 (Space Shuttle Discovery) make a flyover. It is currently racing to catch up with ISS, which passed over almost an hour beforehand.

At least in my neck of the woods, Discovery and ISS will both be visible in the evening sky over the next few days. Check out Heavens Above for your local times and flight paths. Be aware that the orbit for STS-121 will change as the shuttle makes maneuvers to intercept the space station, so any passes listed today can and will change as new orbital data is published. It's best to check the site in the early evening before dusk in order to get the most accurate flyover estimations.

Maybe you'll get lucky and see both satellites fly in tandem just before they dock--it's quite a sight to see.

Tuesday, June 27, 2006

Sam Gentile Tonight at NWNUG!

Tonight at the Northwest Ohio .NET User Group, we're hosting Sam Gentile, an internationally-known speaker and architect in the Microsoft space:

http://www.nwnug.com/PermaLink,guid,4f57c890-e64a-4c96-b8eb-418dfe8f0b57.aspx

That's 6:00 PM at the HCR Manorcare building, if you're in the area. We're planning on going out to Tony Packo's (new stadium location) afterwards, and anyone interested in talking SOA/Agile/Groove/Life/Etc with Sam is invited to join us.

Friday, June 23, 2006

Look What Elder Won

While at TechEd, I was introduced to Keith Elder, who as it turns out, actually was one of my blog readers (small world). Not only did he have a good time every night, but he also came home to find that he won a mobility package from Cingular that includes an 8125 Pocket PC Phone, 2125 WM5 Smartphone, and a Sierra Aircard 860!

http://dotnetpimps.net/blogs/theelder/archive/2006/06/21/26.aspx

Maybe I should have signed up at the various vendor booths at TechEd instead of just walking past them...

Happy Birthday Greg

Greg Huber, Chairman of the Northwest Ohio .NET User Group, Microsoft MVP (ASP.NET), and all-around nice guy turns the big 30 in style:

Friday, June 16, 2006

TechEd 2006: See Ya!

It's over. There will never be another TechEd 2006. Did you make the most of it?

For me, it was all about getting exposed to things that I've only read about, but didn't have a chance to play with. Ok, it was really about the networking and conversations that take place at events like this, but we'll tell my boss that it was about the sessions. ;-)

I think that Sharepoint 2007 wins my vote for best product coming out of this event. Not only does it appear that they finally got the architecture right, but it appears that MS products will use Sharepoint whenever they need a server-based presence (i.e., I was in a session that talked about publishing InfoPath forms to the web, and Sharepoint came up as a requirement). So, whether you realize it or not, you'll likely be running Sharepoint services from here on out.

The other exciting thing about Sharepoint Portal Server was that they combined Content Management Server into the same SKU. This strategy falls inline with what the other portals out there do (Vignette, WebSphere/WCM, etc).

Thanks anyone and everyone that I had conversations with, whether you knew me or not, or whether you'll remember me or not (I swear that every time that Mark Miller sees me, he says "You look familiar. Do I know you?"). It's been a blast!

TechEd 2007: New Orleans

I just found this posted on the msteched.com site (has it been there all of the time???)

Save the Date for Tech·Ed 2007 in New Orleans

Join us next year in New Orleans, June 3–8! Tech·Ed 2007 will be held at
the Ernest N. Morial Convention Center in the Big Easy. Sign up to receive e-mail related to next year's conference.



TechEd in New Orleans after the start of hurricane season. Could be interesting! Lightning never strikes twice at the same place, right?

TechEd Party: Train

Microsoft rented Finway Park last night for the Attendee Party. The main event was a concert put on by Train (you know, Drops of Jupiter, etc).

At one point, the lead singer (Patrick Monahan) invited women from the crowd to dance on the First Base dugout where the stage was set up. Two things were particularly interesting about this:

First, Josh's wife was one of the dancers (he promises that the dancing video will show up on his blog, which is probably a welcomed break for Drew Robbins, who usually gets that honor).

Secondly, towards the end of the song, two girls fell off of the side of the dugout and they had to stop the concert while medics attended to them! As Keith Elder and I were walking to a T-Stop last night, we stopped at a McDonalds and ran into some folks from Florida (Air Force) who had it on video. One of the guys emailed it to me this morning, so I'll take a look to see what exactly you can see, because I missed it myself.

(I've asked him to post the video to YouTube.com so that everyone can see it--if anyone else has video from last night, please do the same).

It was during that break in the concert that I ran into Keith while getting more to drink. Before that, I was sitting pretty far up in the stands. He invited me back to his section where everyone was standing anyways. It was on the center-left part of the stage, and only about 10-rows back, so I got a much better view of the show from that point forward. (So, in some kind of twisted way, I'd like to thank those girls for falling off of the stage... I certainly hope that they are okay, though).

UPDATE: ChavisC uploaded it to youtube!

http://www.youtube.com/watch?v=dnCLCCC8bPQ

Thursday, June 15, 2006

Intellisense in VSTS for Data Professionals

I heard it brought up several times that there is no intellisense in VSTS for Data Professionals. One explanation from the product team was the complexity of writing SQL statements, and how you would efficiently gather and present the intellisense information.

This didn't seem right to me. I mean, only weeks ago, Red Gate released SQL Prompt, which gives you intellisense capabilities in Management Studio (and, I believe in Query Analyzer too). So, the problem's obviously been solved, so why can't MS just include in in VSTS?

I saw Matt Nunn in the TLC area, so I sat down to ask him. Matt was on the SQL team for the longest time, and then went to the VSTS team either late last year or early this year (which I now know was for this product).

Matt's official marketing-speak response was that the capability exists, and even was in Management Studio at one time. But, it can't be released to the public because it needs far more QA/regression testing first. This is actually a satisfactory answer to me, because saying that "we have a quirky version in the lab" is more logical than "we're still thinking about how to do it".

I would have to think that the regression testing for VSTS is several multitudes harder than what Red Gate had to do, so I'll just wait for further word.

TechEd Day 3 Update

The days are actually starting to blend together. Despite my every intention to blog often, it just doesn't work that way when you are here.

So, I'm writing this on Thursday morning, trying to remember what I did yesterday or even the day before that I didn't blog about yet.

One thing that stands out in my mind was Scott Hanselman and Patrick Cauldwell's presentation on Dirty SOAP. It rocked! Scott added the perfect amount of humor, which totally rounded out the whole session. There are only a couple of sessions that I watched all the way through, and this was one of them (the others, I'll catch on the DVD).

Speaking of Scott, one other thing that stands out was watching him and Clemens Vasters hash out some new architecture details for DasBlog on a whiteboard in the TLC area. (Where else besides TechEd could a commoner like myself have a chance to see Scott and Clemens bouncing ideas off one another and a small audience). Totally fascinating. A flash mob started to form, but I didn't think to take a picture. [Disclaimer, whether it is appropriate or not: DasBlog is what we use for nwnug.com]

I was also fortunate to attend the Influencer Party last night, and met quite a few of the other influencers/bloggers/rock stars who I've only known by name: ActiveNick, Sahil, Julie, Michele, and others who I can't recall this very second.

To add to my NetFX 3.0 surveying, I found out from Tim Landgrave (RD out of Louisville, KY) that the WinFX stuff does do some magic under the hood to redirect calls into the 2.0 assemblies to elsewhere, so in his mind, the 3.0 version number might be justified because it's not the exact same 2.0 framework that we're used to using. While I followed what he was saying last night, I have yet to verify it personally in order to totally grok how it works, so I'll leave it at that.

Oh, and the obligatory mention of talking to Carl for more than 1 minute (10-15 actually) goes here... ;-)

Wednesday, June 14, 2006

Teamsters Could Make Riding the Bus at TechEd Interesting

Hmm, seems that the Teamsters who drove our shuttle busses for the first few days of the conference walked out at midnight last night in protest of "a terrible contract". They have been using managers and other non-union employees to keep the lines going.

My hotel is about 10 miles out of the city (Quincy Marriott), so I kind of need the bus to get to and from the convention center. Luckily, there's a T-Stop nearby, so in the worst case, I can take the train.

But, I wonder if a contingency plan exists???

NetFX 3.0 Kool-Aid

It's funny what kind of reactions you get when you casually bring up the whole "WinFX is now combined with the .NET Framework, and now it's going to be version 3.0" thing.

Now, this is in no way scientific, but in all of the conversations that I've had with people on this subject, it's overwhelmingly obvious that the blue badges are drinking the company's Kool-Aid, while the folks in the field that I've talked to (MVPs, RDs, fellow developers) are not as convinced about the merits of this move.

Bill Evjen (which I learned is pronounced EH-vee-on, like the water Evian) said last night that he doesn't support the move of the WinFX APIs into the Framework at all. Jeff Julian is thinking more like me in that the major version number change is inappropriate, regardless of what level of additional functionality that the new APIs add to the BCL. There were other opinions from the floor, but to my point, I haven't found a non-MS developer that has said that this was a great idea (but I'll continue to ask people today).

I'm not 21 Any More

Long story made short:

1-2 beers: a good thing.
Whatever number that I had last night: most definitely a BAD thing.....

Tuesday, June 13, 2006

TechEd Day 2 Update

Just a handful of updates:

  • Last evening, there was a reception in the Exhibit area. Microsoft planted food and beverages all throughout the event sponsors, so you had to walk through the maze of booths in order to get food.

  • Something that is particularly funny is that Mark Miller of Developer Express had lost his voice, yet was still at the DevEx booth giving the CodeRush/Refactor! demo. His booth babe was providing the voice while Mark provided the keystrokes. But, Mark would always want the presentation to go a certain way, so he was constantly whispering commands to the other guy. It was HALARIOUS! (Might not be funny if you don't know who Mark Miller is, but just be aware that he likes to talk).
    This morning, I hit a Sharepoint session that Ted Pattison gave. Wow, what an excellent presenter. It also made me a little more excited about the new features of 3.0 (Sharepoint 2007).

  • I'm doing a lot of walking around the convention, popping in and out of different sessions and chalk-talks. For the second day in a row, I caught the tail end of Scott Hanselman's powershell talk (what a powerful shell that thing is!).

  • I met up with Chuck Boyce today, and we talked for a bit and then ate lunch together (the food here is not all that great, for those playing along at home).

  • I have a few sessions this afternoon that I'm going to hit, not so much for the content as for the opportunity to see certain presenters.

Monday, June 12, 2006

TechEd Update

This is the first chance that I've gotten to actually blog. My laptop battery was completely drained this morning, and I haven't had a chance to park myself near a power outlet until now...

First off, Boston: Tell me why people live here? The traffic on a good day is like the worst construction traffic in Ohio. Stop and go for miles on end. For instance, this morning, it took my shuttle bus an hour to travel from the hotel to the conference (a 10-mile trip). It definitely explains why public transportation, like subways, is an important idea here (and why we just don't need it in Toledo, OH).

Anyways, last night's keynote was pretty so-so. Chloe from 24 (Mary Lynn Rajskub - a Detroit native) was the highlight IMHO. Then there was also a bunch of stuff about people being the reason behind software, or something like that... ;-) All that I could think about, though, as 20,000 people were crammed into the conference hall, was that there were 4x as many people there than were in the town that I grew up in.

Today (Monday), I attended an Infopath 2007 session (takeaway: there's a neat import tool that can generate Infopath forms from a Word document), Richard Campbell's Querying presentation (takeaway: I cover the right amount of information in my SQL Server 2005 T-SQL Enhancements talk), and the live taping of .NET Rocks! (takeaway: VSTS for Data Professionals is the first VSTS SKU that I see value in).

After DNR, I talked with Richard for a minute, and also shook Carl's hand, but I have the feeling that he either didn't recognize me (and didn't read my badge), or still thinks that I'm a little obsessed: He was kind of stand-off'ish, like he wanted to get away. ;-)

At the moment, I'm in Hans-Peter Haberlandner and Wolfgang Portugaller's session on storing complex object graphs in SQL Server. These are the folks from Austria that I met in San Francisco last November as part of the Connected Systems Developer Competition. I spoke to them briefly before the talk, and so far, they're doing pretty good (for German being their native language).

More later when I get a chance.

Oh, I've set up a Flickr tag for my photos:

http://www.flickr.com/photos/81259708@N00/sets/72157594163762723/

Sunday, June 11, 2006



Leaving for Boston this morning!

Saturday, June 10, 2006

Ooops, They Did It Again: WinFX Confusion

Now the story coming out of Redmond is that having WinFX as a separate brand was confusing people who thought that it was totally unrelated to .NET.

In reality, the WinFX is a set APIs that currently bolt onto the .NET 2.0 framework to enhance the Windows platform (things like communications/web services, workflow, presentation, XAML, etc). That is, the architects and developers who actually put systems together knew what WinFX was, and we also knew what was in the .NET Framework 2.0.

Well, in their infinite wisdom, the folks in Washington decided to drop the WinFX brand, and bring everything into the .NET Framework itself. That, by the way, is fine by me. But, then they decided to version this new framework as 3.0.

What's the problem with this? Well, included in the 3.0 framework will be all of the 2.0 APIs, like CLR 2.0, C# 2.0, VB.NET 2.0, ADO.NET 2.0, etc., plus the new WinFX stuff. They have just broken the continuity that we knew to expect in framework version numbers.

Now, when Orcas (next version of Visual Studio) comes out, they'll probably version the new framework as 4.0. What would be included? CLR 3.0, C# 3.0, VB.NET 3.0, ADO.NET 3.0, and WinFX 2.0 (speculating). Where's the 4's in this list?

Versioning the new framework as 2.5 would have been far more appropriate than a whole new version number. I know it's semantics, but their whole reasoning behind doing this was to eliminate confusion, but I think it caused more problems than it fixed.

References:

http://blogs.msdn.com/somasegar/archive/2006/06/09/624300.aspx
http://blogs.msdn.com/jasonz/archive/2006/06/09/624629.aspx

Tuesday, June 06, 2006

Grid Computing Next Week on DNR

The .NET Rocks homepage currently shows next week's (6/13/2006 UPDATE: Now 6/27/2006) show topic as:

Dan Ciruli shows us Grid Computing with .NET!

Cool! Dan, I believe, still reads this blog (and I'm still trying to figure out why...).

Of course, I was interviewed by Carl and Richard once:

http://jasonf-blog.blogspot.com/2005/11/sfo-post-event-party.html

(look at the dramatic recreation about 80% through this long post). :-)

Monday, June 05, 2006

My Carberator Synchronizer

Ok, I didn't invent this--the design comes from:

http://forums.ninja250.org/viewtopic.php?p=267907

In my case, I took a couple of baby bottles (we've got plenty laying around) that had screw on caps (not nipples, but caps that seal the bottle for transport, etc).

Cut two 3/16" holes in each cap. 1/4" vinyl tubing will be fed through each hole (the slightly larger but pliable tubing will seal the hole).

Tape the bottles together. Feed a length of tubing from one cap to another, but make sure that when the caps are on the bottles, that the tubing inside is long enough to go to the bottom of each bottle.

Feed two more lengths of tubing into each of the remaining holes. These only need to penetrate about 1/2 to 1 inch into the bottle. The other ends of this tubing is what will be connected to the vacuum ports of your carberator.

Fill each bottle about 1/3 full of liquid. I used 5w30 motor oil because it was onhand. Other people have tried water, ATF, or 2-stroke oil. I think any liquid will work, but you have to consider the "what if" scenario of having the liquid sucked into the carb.

Screw the caps onto the bottles (you'll have to twist the tubings to keep everything straight).

Now, equalize the bottles. Blow into one side to force the liquid through the linking tube until all of the air is forced out. Then blow into the other side until the liquid in both bottles are level.

At this point, you can connect the tubes to your carberator and start the engine. If the carbs are not in sync, then the liquid level in one bottle will go higher than another. Make your adjustments, and see what happens to the levels.



This picture shows my #1 and #2 carbs in sync after adjustments were performed.

It's cheap, but a little bit of a hassle for 4 carbs. I had to do #1 and #2 (left screw), and then #3 and #4 (right screw), and then #1 and #4 (center screw), which required unhooking the tubes each time.

Bike

One word: VROOOM!

Friday, June 02, 2006

Connie Parts: Check Murphs First!

While tearing into my carbs to free up the stuck float needle valves, I ripped one of the rubber tips. In calling around for this part (16030-1007), I was getting prices in the neighborhood of $30! (If you can see this part, you might guess that it's worth $0.50, but never $30!).

Well, I was just about to hit Submit on an order with RonAyers.com, when I decided to see if MurphsKit.com would have it. As it turns out, they sell this part along with other parts in a Carb Rebuild kit. The price of an individual kit: $20 shipped! I opted for the 4-kit option, so that I can just replace parts in all 4 carbs. This was $65 shipped.

Unbelievable how the dealerships (or rather, their distributors) can screw you on this pricing. Thanks Murph!

http://www.murphskits.com/zgcarbs/zgcarbs.htm

Thursday, June 01, 2006

Concours Update

For those of you following along at home:

  • The rear end is finished, including new rubber, lube, and a caliper rebuild (which involves replacing all of the rubber parts and cleaning the piston down to just brass). For what it's worth, the mufflers are extremely easy to remove, and this is almost necessary in order to gain access to the rear wheel. Plus, it's a lot easier to shine up the mufflers off the bike!
  • A new battery has been installed. This led to the discovery that the fuel sender suffered the same fate as the petcock valve: it has to be replaced because the insides are basically gone! That part is on order, but I still haven't received the new petcock from Ron Ayers yet, which is disappointing because I could have had the part in hand by now if I went through my local Kaw dealer (Honda East in Maumee, OH).
  • Oil has been changed. Now, this one was interesting. I had never drained used synthetic oil before, so I was expecting some dirty sludge resembling pitch to slowly drain out. But, this 8-year old stuff was still very "watery", and almost reminded me of Automatic Transmission Fluid. I had to check twice to make sure that I opened the right drain!
  • The front end is finished, including new rubber and two rebuilt calipers. When I took my tire in to the dealer to have it mounted, they informed me that I had a 17" tire, but an 18" rim. Blah! So, I had to buy another front tire--no big deal... Except that 120/70R18 is not a common tire size, and it was 4:30 PM on a Friday before the Memorial Day weekend. Luckily, they did have a 130/70R18 onhand (Goldwing front tire), so I agreed to purchase that. Other people on the COG forums use this size, so I think I'll be okay.
  • Valve clearance was adjusted. The biggest pain about doing this is that you have to remove so much plastic to get to the valves. I used a 0.006" feeler for intake, 0.008" for exhaust, and every valve was tight. The books just tell you to adjust the clearance, but don't really describe what this means. What you're trying to do is allow the feeler to fit in between the valve adjuster stud (rocker arm) and the valve stem itself, and when it's there, there should be no play in the adjuster (i.e., you're setting the total play to the thickness of your feeler gauge). I also noticed that sometimes, when I would torque the locknut, that the adjuster stud would tighten a little (this only happened for a few of the valves, but still made me work a little bit for the proper adjustment). So, be sure to check the clearance after the locknut has been torqued.
  • The Fuel Tank IS FINISHED!!! This includes restoring the tank with the POR-15 kit, and replacing both the petcock valve and the fuel gauge sending unit. I'm a little peeved, though, because one time when I had the tank upside down, it slid off of the towel that it was sitting on and took some nice scratches from the concrete. >(

So, I went to start it up today. It just cranked, but never fired. Tested spark, and it was good. Squirted a little starting fluid into the airbox, and the engine ran on it, but stalled when the ether was used up. That means that it's a fuel problem, and that also means that I have to do something that I now dread: pull the carbs again.

Well, off came all of the plastic, and just before nightfall, the carbs were freed. The only carb that had gas in it's float bowl was #4, so this should be an easy fix: I just need to free up the stuck needle valves. While I'm in there, I'll make sure that all of the jets are open and that there's no residual varnish anywhere... Sigh... I knew I should have done this when the carbs were off before (putting them back on is a little challenging).


IMG_4575
Fairings removed

IMG_4576
Under the valve cover

IMG_4579
Everything put back together

IMG_4583
Allie on the bike

Wednesday, May 31, 2006

Listen to Me on The Where Clause

Last night, I was interviewed on Chuck Boyce's podcast called The Where Clause (along with Rushabh Mehta).

It was a technically challenging interview because we used Skype. Due to the way that his recording rig was set up, all audio from the Skype conference was sent to all participants. This means that my voice would echo back to me at about a 1/4 second delay (I had to remove my headphones whenever I spoke). So, there were some awkward pauses and times where I kept talking over Chuck when he would ask me a question.

Also, in listening to the playback this morning, I noticed that the way that Skype handles dropped UDP packets is that it keeps playing the last packet until a new one comes in. The result is kind of a stuttering effect (my Wi-Fi connection at home was a little weak last night back in the bedroom where I was located). Or, at least I don't think that I normally stutter!

It was a good time, and I look forward to being back on the show (maybe Chuck will find a different way to record Skype, or we could each record local audio and he could edit in the tracks using Audacity or something).

Monday, May 22, 2006

Archive.Org

I just stumbled upon this:

I knew that archive.org hosted the Wayback Machine, which contains snapshots of almost every web site for different dates. What I didn't know (or didn't realize) was that there's also a huge repository of video and audio. It is an interesting place to spend a little bit of time.

In my case, I stumbled upon the Computer Chronicles collection (I remember watching this program almost every weekend on PBS):

http://www.archive.org/search.php?query=collection%3Acomputerchronicles...

Cedar Fair is Purchasing Paramount Parks

I live an hour's drive away from what is arguably the best theme park on the planet, especially if you are a roller coaster fan: Cedar Point.

Today, their parent company (Cedar Fair L.P.) announced the acquisition of Paramount Parks. This means that "the other" major theme park in Ohio, King's Island, will now become a sister park to Cedar Point instead of an intra-state rival.

Cool! I doubt that my season pass for CP will allow entrance to KI, though (it does not allow entrance to another nearby Cedar Fair park: Geauga Lake and Wildwater Kingdom).

Wednesday, May 17, 2006

Gas Tank Repair: Take 2

Last night, I used the 3rd stage of the fuel tank restoration kit. This is a sealant, which is probably a fancy name for "paint that gasoline doesn't destroy". The POR-15 instructions says to use latex gloves when handling this stuff, and I would strongly recommend heeding that warning: my fingers are currently stained, and NOTHING takes it off once dry (the stains just laughed at mineral spirits and acetone).

So, you pour this 8 ounce can of silver paint-like stuff into your tank, and then slowly roll it around so that it covers all surfaces. And then after 30 minutes or so, you're supposed to drain whatever excess is still in the tank. Herein lies the problem: the Connie's tank is not really designed to allow fluid to easily pool around the petcock hole or the fuel sender hole, so I was not able to get ANYTHING to come out of the tank!

My solution, after giving up, was to keep rotating the tank so that the sealant didn't pool up in any one area (i.e., every 10 minutes, turn the tank to a new position). This worked until I fell asleep in my La-Z-Boy watching TV. So, one sidewall of the tank is going to have a thicker layer of POR-15 than the rest of the tank. ;-)

The sealant is now curing for the remainder of the week, and then I'm allowed to put gas into the tank.

But, while I had the petcock (or Tap Valve, as Kawasaki refers to it) removed, I opened it up to see why fuel wouldn't flow through it when on the Prime position. Wouldn't you know it, it was made of the same cast aluminum that the fuel cap was, and the gasoline had done a number to it. I should have taken a picture before trying to clean it out, but all of the internal ports were completely blocked by some kind of crystaline precipitate.

I tried cleaning away as much of this gunk as possible, but there's too much of that cast aluminum that is damaged. I don't think that a rebuild kit would do any good, so, I'm ordering a new Tap Assembly (51023-1388) for $65 shipped from Ron Ayers Motorsports.

Speaking of that, here's a neat exploded diagram of everything that I've had completely apart at one time or another (there's probably only 2 of you still reading to this point that might care):

http://www.ronayers.com/fiche/400_0370/fuel_tank/fuel_tank.bmp

While my Dad probably didn't anticipate that the bike would sit for so long, this definitely shows why you need to use a gasoline stabilizer when you overwinter a bike. Sometimes, that winter might last 8 years!

MyHeritage Face Recognition

Something neat to play with. MyHeritage has facial recognition software. You can upload a picture, and it will show you close celebrity matches.

My picture (the one from this blog) matched on these celebs:


(btw--this is funny because my wife has a thing for Matthew McConaughey).

RGVAC: What It's All About

One hobby of mine, which I don't have much time for these days, is restoring coin-op video games. When I realize my first million dollars of disposable income, I'll likely have an arcade in my basement (well, actually, building that house comes first, but it will be constructed with the basement arcade in mind).

This guy's living the dream:

http://www.peterhirschberg.com/arcade/gameroom.htm

Tuesday, May 16, 2006

IE7 Printing

I installed IE7 for the first time today. The most exciting new feature for me: Printing.

Yes, they finally fixed printing from a browser. No more right-edge clipping! Plus, the Print Preview makes it a snap to make sure that the printed results are exactly what you need before wasting any paper.

Monday, May 15, 2006

Mass Producing PocketMods For 200+ People

I first heard of a PocketMod from Scott Hanselman. You know, he's the guy who only has to mention the name of a product or idea in brief passing, and suddenly there's 1000's of people doing it.

But, I saw it really put to use when Jim Holmes used them as handouts for the Dayton-Cincinnati Code Camp. Inside, he included the schedules for the different tracks that they held, and it worked great!

Well, while planning Day of .NET, we decided that we HAD to do the same thing. So, Josh got the template from Jim, along with instructions for using PDF2POCKETMOD to produce the final result. Nothing is ever easy, and producing our PocketMod was no exception.

Long story made short: I gave up trying to get PDF2POCKETMOD working, and decided just to make my own Microsoft Publisher template. For the upside-down pages, just create everything normal, group all of the objects, and then flip them by using the rotate grab handle at the top (the green ball).

In the interest of giving back to the community, I've provided a blank template (except for the individual page numbers) and the actual Publisher file that was used to print our event's PocketMod:

http://www.nwnug.com/public/PocketMod_blank.pub
http://www.nwnug.com/public/PocketMod_DoDN.pub


Now, a tip for folding hundreds of these:

I won't go into the actual instructions--those are available on the PocketMod site. However, being the amateur industrial engineer that I am, I'm always looking at ways to make tedious tasks more efficient.

When folding these things, get yourself a good straightedge. I found my office paper cutter very useful, because it has a flat surface, but a raised straightedge at the top. Also, don't prepare each PocketMod individually. Instead, set up an assembly line and do each step on all of them before proceeding to the next step.

Use the straightedge to help you line up the paper without necessarily spending a lot of time looking at it. Put both edges against the straightedge, hold it there with your fingers, and then use your thumbs to make the crease.

With all of the first folds done, you can then proceed to make the next two folds on the entire set. Repeat the straightedge trick for both sides of the paper (end result is that you'll have a fanfold).

I was able to get the first 3 folds of 200 PocketMods completed all by myself in about 30-40 minutes. After that, it was just a matter of making the cut, and then the final fold (which you can do without the straightedge).

Full Moon Does Not Always Look The Same

This kind of goes along with my SQLCLR presentation:

While demonstrating scalar functions, I create a function to determine whether a given date is during a full moon or not (and then use that function to determine the average sales in the Adventureworks database for full moons versus all other days of the month).

Due to orbital mechanics, we don't see the exact same full moon every month. That is, the moon appears to wobble, and instead of being able to see 50% of the moon, we can actually see 59% over the course of a year.

Sound confusing? Well, just check out this animation:

http://www.photoastronomique.net/geant/0505-0604wb_800.html

Shoutz Out

I've got a few Narcissism feeds on Bloglines. I'm sure that other people do, too. These are simply links to RSS versions of Google searches, etc, for my name or URL. That way, if someone posts something about me, I can find it (usually within hours of their post).

I've created comments before to someone's blog post, and they were like, "Wow, I can't believe that you read my blog!" And I'm like, "Well, I only read it when you write about me...." Sorry!

So, using this fact, a blog could be used as a simple (and public) way to convey a message to someone instead of using email.

For instance, if I want Chuck Boyce to read any post, all that I need to do is include the words "SQL Server" and he'll find it. (Hi Chuck).

I'm sure Bill Wagner (Effective C#) does the same, though I'm pretty sure that he subscribes to my blog anyways.

Rory Blyth, Scott Hanselman, Carl Franklin (Pwop Productions), Robert Scoble, Miguel Castro: How's it going, guys?

Now all I have to do is watch my statcounter to see who finds this post based on their names (Yeah, I certainly lead a fun-filled life)... We now return to our regular programming...

Sunday, May 14, 2006

Connected Systems Developer Competition Winners

Last fall, I was fortunate enough to be a finalist in the Connected Systems Developer Competition. As part of that, I was flown to San Francisco and attended a fancy dinner for the 15 (or was that changed to 17? I forget) finalists, plus I got to attend the Joint Launch Event for VS2005/SQL2005/Biztalk2006, plus I was awarded a MSDN subscription. That's a lot of benefit for just writing some code (that I now show off as part of my SQLCLR talk).

The point of the finalist dinner, though, was to announce the actual winners of the contest. The June 2006 issue of MSDN Magazine has a sponsored insert starting on page 60 that highlights those winners, who walked away with at least $15,000 (the grand-prize winner took home a cool $50,000).

So, where did these people sit in relation to me at the table? John Arnold was across the table to my left. Marc-Donald Gagne was beside me to my left. Hans-Peter Haberlandner was across the table from me. Wolfgang Portugaller was across the table to my right. Michael Voigt was sitting beside me to my right. So, if you're following along at home, everyone on my end of the table who was sitting around me took some cash home (but I did not)! I'm apparently the opposite of The Cooler!

Of interesting note: Wolfgang Portugaller and Hans-Peter Haberlandner, who submitted Persistor.NET (serializes object graphs to SQL Server), were also the MCP category winners, which means that they were awarded a session at TechEd. I'll probably stop by this one:

SQL Server 2005: Storing Complex Managed Objects
Day/Time: Monday, June 12 1:30 PM - 2:45 PM
Room: 259 AB
Speaker(s): Hans-Peter Haberlandner, Wolfgang Portugaller

Object-oriented programming is state-of-the-art in software development today. When it comes to persistence, developers are often confronted with RDBMS lacking some of the rich features of the object-oriented paradigm. This session explains significant characteristics of persistence solutions and compares existing options. A specific category of persistence solutions which fully supports the object-oriented paradigm based on the mandatory features as specified in the "Object Oriented Database Management System Manifesto" is highlighted. To demonstrate these features Persistor.NET (www.persitor.net) is used together with SQL Server 2005.

Track(s): Database Development and Administration
Session Type(s): Breakout Session
Session Level(s): 300

Day of .NET in Ann Arbor 2006 is Over!

The day has come and gone, and now I can resume normal programming (literally, and pun also intended).

Amazingly, we really had little to no hiccups! It went almost exactly as planned (to quote Dustin Campbell: "That's AWESOME!"). We heard from many attendees that the quality of the conference was on par with, if not exceeding, the quality of many conferences that you have to actually pay for (our event was absolutely free to the attendees). That does a lot to justify the amount of time that it took us to organize the day.

I think that one reason for the success was that Josh Holmes, John Hopkins, and myself (the primary organizers) have a lot of strong skills that compliment the abilities of the other two folks. That, when combined with the help of other event planners like Todd Bohlen, David Redding, Bill Wagner, and Darrell Hawley, led to a totally awsome event.

We'll definitely be having a spring event next year, and have already thought of a few things that can be done to make it even better.

Saturday, May 13, 2006

[Day of .NET] It Started!

People are checked in, and the sessions are currently underway!

View my Flickr Set Here:

http://www.flickr.com/photos/81259708@N00/sets/72057594133524394/

Thursday, May 11, 2006

Shrinkster and Spam Firewalls

I made an interesting discovery today. As I was drafting the announcement email that was sent to all of the Day of .NET attendees, I sent a copy to a few of my email addresses, including my work address. To my surprise, our spam firewall (Baraccuda) blocked it!

I did several tests to try to identify why, and finally I found the culprit: Shrinkster URLs.

You see, we were sending a really long link into Windows Live Local (mapping web site). I thought that it looked bad, so I used Shrinkster to shorten it. The resulting URL was:

http://shrinkster.com/er6

Wouldn't you know it? Baraccuda flags this as "Intent" (whatever that means), and denies it by default.

So, unless Barracuda changes their global policy, you will not be able to send an email containing Shrinkster links to someone behind one of their Spam firewalls.

Day of .NET Announcements

A couple of announcements:

----------------------------------------------------
VENUE LOCATION
----------------------------------------------------

Windows Live Local (map) link for WCC:

http://shrinkster.com/er6

Notice the pushpin (number 1) on this map: it has been placed on the Liberal Arts building where the event will now be taking place. Right click on the pushpin, and then you can select "Drive To..." (in order to create custom driving directions).


Good News: So many people have registered for this conference that we had to change buildings! The new building (Liberal Arts) has much larger rooms. The event will take place on the second floor.

Liberal Arts Building 2nd Floor diagram:

http://shrinkster.com/exz


You should park in Parking Lot 7, which is South/Southwest of the Liberal Arts building (it will be the first parking lot when you enter the campus from Clark Rd.)




----------------------------------------------------
SCHEDULE
----------------------------------------------------

8:00 AM
Registration Check-in begins between rooms 275 (Lecture Hall 2) and 276.
Continental Breakfast

9:00 AM to 11:45 AM
Sessions in rooms 261, 274, 275 (Lecture Hall 2), and 276.

11:45 AM to 1:00 PM
Lunch in the adjacent Student Center building
(Pizza supplied by Domino's Pizza)

1:00 PM to 5:15 PM
Sessions in rooms 261, 274, 275 (Lecture Hall 2), and 276.

5:20 PM to 5:45 PM
Wrap-up and prize raffle




----------------------------------------------------
SESSION CHANGES
----------------------------------------------------

The session schedule that has been posted on the Day of .NET homepage (http://dayofdotnet.org) will change. You will receive an updated schedule when you check-in on Saturday. We will also update the Day of .NET homepage periodically before Saturday, so please check there for for up-to-date information and announcements.

One definite session change that we can relay: Due to a family emergency, Alex Lowe's session "Lessons Learned From Community Server" had to be cancelled. In its place, Dustin Campbell from Developer Express will present on using Generics in the 2.0 Framework. This session will go beyond the usual Generic Collections that we're all familiar with by now, and will demonstrate other ways that Generics can be used.

Monday, May 08, 2006

Day of .NET: Name Badges

What's a conference without credentials? When you check in, you will receive a name badge and a lanyard. This will serve as your ticket to lunch, so don't lose it! ;-)

Front of Name Badge Back of Name Badge
(Front and Back of badge)

Sunday, May 07, 2006

Day of .NET T-Shirts

Great news! There was enough money in the budget to print T-Shirts for all of the attendees!


Less Than A Week!

Day of .NET in Ann Arbor is THIS SATURDAY (May 13th)!

We have an outstanding number of partners helping to support this event (both financially, and by means of providing products to be given away to attendees). This event certainly wouldn't be possible without these sponsors, so please check out their product offerings:

http://dayofdotnet.org/#partners

Also, at this time, it appears that we might have outgrown the original venue (Business Education building)! This is certainly exciting! Be sure to check the Day of .NET homepage and this blog throughout the week, but the event will likely be held in the Liberal Arts building now.

We will also be sending an email to all of the registrants sometime around the middle of this week as both a reminder of the event and to provide the latest information about the venue location.

Saturday, May 06, 2006

Gas Tank Repair: Take 1

When I picked up the Concours, we couldn't open the tank's gas cap (is that what you call them on a bike?). The key would turn to the point of engaging the cam, or whatever's inside one of those locks that retracts the arm that hold the cap in place, and then stop.

After transporting the bike back to Ohio, I first stopped at a local locksmith before heading home. They were able to pick the lock for me, and turn it using a screwdriver (i.e., applying so much torque that would normally have snapped the key). It worked, and the cap opened up to reveal what 8-years of gasoline vapors will do to whatever type of metal that is made of (aluminum, I think).

I don't have pictures of immediately after, but it seriously looked like someone had smeared a thick layer of silver Anti-Seize Compound all around the filler hole. In retrospect (after cleaning it up), I don't think that the vapors necessarily consumed the metal, because it doesn't look like it needs replaced now. But, the vapors definitely precipitated into some kind of sludge.

Here's what the filler cap looked like this morning (imagine being covered by so much sludge that you couldn't make out any features, and that's pretty much what it looked like when I brought her home):



Josh had warned me a while ago that the tank would likely be rusted, and will need cleaned/coated. He was right. Last week, I siphoned out all of the remaining gasoline (3.5 gallons) and with it came a bunch of rust. I'm not sure how you properly dispose of old gasoline, but I've been using a 1:3 ratio of that stuff (filtered) and new gasoline in my lawnmower. ;-)



Luckily, the Concours has a vacuum-operated petcock valve, so the tank was not emptying into the carbs over the past 8-years. I did pull the carbs, though, just to make sure. They looked pretty clean (albeit, I did not use a microscope to examine jets or anything). A little carb cleaner will likely be required once the bike is running again.

As for cleaning and restoring the tank: I browsed around the COG forums and found a few suggestions. One that really interested me was a Motorcycle Fuel Tank Repair Kit from POR-15. $40 later, and the UPS man delivered the box to my house.



Inside was a cleaner, a rust remover/metal preparer, and a sealant:



I did the first step of the tank restoration this morning: Cleaning using a hot solution of the Marine Clean product (1 qt Marine Clean to 1 qt hot water).

One little challenge is how to seal the tank off. The Connie has holes for both the petcock valve and a fuel-level sender. The POR-15 instructions say to just use duct tape. I did, but I also re-enforced with some aluminum (from a pop can). The larger of the holes (fuel sender) leaked during the process, so I might need to use some RTV sealant for subsequent steps.



The Marine Clean dissolves varnish and sludge, and is really just a prep for the next step that does the heavy lifting of eliminating rust. I've got to say that I'm impressed. Marine Clean is clear going in, but look at a sample of what came out:



I'm going to let the tank dry out in the sun, and will probably do the next step tomorrow. There might be some flash rusting, but the Metal Ready will take care of it. The other purpose of Metal Ready is to change the pH of the metal from basic, which Marine Clean (being alkaline) left it, to acidic, which the sealer requires in order to adhere.

Thursday, May 04, 2006

ABC Videos

There's been a lot of buzz lately about ABC releasing popular shows after the original airdate for viewing on the internet. Since I missed LOST last night (and didn't record it at home), I'm happy that they offer this service (for free, even!).

There are a couple of commercials that you must watch. They are 30 second spots, and once the 30 seconds have elapsed, then the next segment of the show becomes "unlocked" and you can continue watching. This is actually A LOT less intrusive than normal television (assuming that you're watching a live broadcast, and not timeshifting). Plus, there's pause and seek functionality.

Having said that, though, there are still bugs that ABC has to work out. More than once, the video just stopped, and I ended up closing the browser and restarting (after waiting a few minutes to see if the video would resume on its own).

Is this a glimpse into the future of how "television" might be delivered? Quite possibly (as long as it remains free to the viewer).

Tuesday, May 02, 2006

I've Been Published!

A few weeks ago, Bill Wagner IM's me and asks if I was interested in writing an article on SQLCLR for Fawcette Technical Publishing's online site (http://www.ftponline.com). It sounded fun, and I already had a few presentations on the subject under my belt (and also have one coming up at Day of .NET), so I agreed. Bill introduces me to our editor at Fawcette (Nina), and I was underway!

A few revisions later (using both Bill and Nina as editors), and we had something that I felt comfortable with delivering.

http://www.ftponline.com/special/sqlserver/jfollas

Bill also had an article in the same SQL Server 2005 Special Report on the topic of LINQ:

http://www.ftponline.com/special/sqlserver/bwagner

Wednesday, April 26, 2006

NWNUG Redesign Launches

I spent a good portion of my evenings last week working on a redesign of the website for the Northwest Ohio .NET User Group (NWNUG). It officially launches today! I can't claim credit for everything, though, because there was a committee of members that helped to identify important content and redesign the logo, despite their own incredibly busy schedules.

Over a month ago, I had some ideas of how to take our web presence to the next level. Besides a new look and feel, we also needed a content management platform that would support categorization, permanent links to content, and syndication (i.e., publishing content to RSS).

For the record, our old platform used DotNetNuke. It's not a bad tool, and allows for quick assembly of a portal. But, in some areas, it was too much tool for our needs, while in other areas, it was insufficient.

The new platform is currently a mix between static HTML and newtelligent's DasBlog Community Edition. I modified the "Portal/Compass" theme that was designed by Johnny Hughes, and configured DasBlog to use that theme exclusively. At this time, DasBlog is used for the "Events and Announcements" portion of the site.

One reason behind my choice of using DasBlog is because it is open source. I have some ideas of tapping into DasBlog's template and data model in order to bring some more dynamic functionality to what is currently static HTML. I have also identified some behaviors (macros and otherwise) that I would like changed.

Kudos to Scott and the other DasBlog contributors! It's a fantastic piece of software.

Friday, April 21, 2006

EOLAS is teh sux0rz

Companies should not be able to patent an idea for implementing something in software, especially if they do not produce software themselves. The End.

Wednesday, April 19, 2006

AACS: Day of .NET GrokTalks

Leading up to the Day of .NET in Ann Arbor event, the Ann Arbor Computer Society (AACS) is hosting an evening of GrokTalks as part of their regular meeting on May 3, 2006 featuring a lot of the same speakers that will be presenting at DoDN.

What's a GrokTalk, you ask? It's a short (~10 minute) presentation on a single topic ("All Stuff and No Fluff" is the format). The Regional Directors gave a series of GrokTalks at last year's TechEd (http://www.groktalk.com/).

The May 3 evening will feature 8 or 9 talks in 90 minutes. At this time, speakers include Aydin Akcasu, Jason Follas, Darrell Hawley, Jim Holmes, Josh Holmes, John Hopkins, Martin Shoemaker, Bill Wagner, and a very special disembodied guest presenter: Carl Franklin (.NET Wonk, MVP for Visual Basic, Regional Director, Hunter/Gatherer... oh yeah, and host of a little podcast called .NET Rocks! ).

(The final list of confirmed speakers will be posted to the AACS site prior to the event).

AACS meetings are free and open to the public. Supporting membership is $20 per year.

Time: 6:00 pm
Location: Spark Central. 330 E. Liberty, Ann Arbor MI

Tuesday, April 11, 2006

Concours


Connie Arrives! I initially doubted it, but using a ratchet strap on each side of the handlebar really does hold a bike secure in the bed of a pickup truck. I had some webbing also tied around the rear of the bike, just in case it fell to one side or the other, but it didn't budge.


Know your knots! There's a clove hitch around the hand grip. One end also tied around the handlebar (couple half hitches) just to keep the clove hitch from working loose, and the other end had a bowline. The ratchet strap's hook connected to the bowline. For security, I also tied a rope through the bowline and the webbing of the ratchet strap (in case the hook somehow magically slipped off).


I had to take a 2-step process to get it off of the truck. The first step went from the truck to my front porch. The second step went from the porch to the driveway. (Notice the 2-year old supervisor watching through the window).


Finally got 'er on the ground! One of the front brakes was seized, so I actually removed the caliper, tie-wrapped the pads into place, and pumped the brake to push the pistons out. Then I tie-wrapped the caliper to the front fork. The Connie has 2 calipers for the front wheel, so I still had a front brake (which is good, since I used it exclusively as I rode down the ramps).


I even managed to figure out how the saddle bags are mounted.

Monday, April 10, 2006

Day of .NET in Ann Arbor

 Registration for the Day of .NET in Ann Arbor is now open!

Day of .NET is a one-day conference on all things .NET organized by developers for developers. This event is being offered at no cost to anyone interested in .NET development, and features speakers from across the Heartland Region, as well a special guest speaker: Mark Miller from Developer Express and Mondays.

The Day of .NET in Ann Arbor is a collaborative effort between the following INETA member groups:

This rare event takes place Saturday, May 13, 2006 on the campus of Washtenaw Community College (Business Education Building) in Ann Arbor, Michigan from 9:00 am to 5:15 pm.

Further details and event registration at: http://dayofdotnet.org

Sunday, April 09, 2006

YALAL (Yet Another Look At Linux)

Linux is interesting to play with, I'll give it that. There's something awe inspiring about seeing the console screen scroll through all of that information when it runs for the first time, and starts firing up different device drivers. And the fact that this operating system has been compiled for just about every device in pretty cool.

Even usability has come a long way. KDE has some pretty cool little widgets, yet things seem strangely familiar to the old Sun SPARCs that I used to use back in college. I also like the behavior when you run as a regular user (not root) and you access something that requires administrative access: it simply prompts you for the root password, and then runs that one application as root. Sure, Windows has Runas just like *nix has su, but the autodetection makes this is a step beyond simple user switching.

The trip down Linux Lane this time started with a New World G3 iMac that I happen to have acquired. I don't have a MacOS CD, and there's no way that I'm going to buy one just for this old thing. So, what's the next best thing? Yellow Dog Linux.

I upgraded the iMac to 256MB of RAM, and dropped in a 20GB Hard Drive. Then, I downloaded and burned the YDL 4.1 CDs. Installation was pretty easy with the exception of partitioning the drive.

To make a long story short, in order to have OpenFirmware load yaboot, your drive will need an Apple_Partition_Map partition, and YDL's installer does not seem to be able to create one. Normally, after dropping in a new hard drive, you would use the MacOS CD to create the Mac partitions, including the all-important Partition Map, and then install YDL. Without a MacOS CD, I had to find a PowerPC LiveCD (Gentoo project has one), and then use mac-fdisk to initialize the disk (i), which creates the Partition Map partition. Once that was done, the YDL installer did everything else for me.

So, now that I have Linux running on a PowerPC, is it usable? Yes, as far as everything that comes on the CDs. However, if you want to install something else, you need to look for a source-code distribution and build it yourself. That pretty much rules out commercial software.

You see, it's almost guaranteed that any company that distributes a binary Linux version of their product will only have x86 available (not PPC). That makes it kind of tough to download things that you take for granted in the Windows environment that only runs on x86.

Case in point: almost every web site out there that my daughter would want to visit seems to use Flash, but Macromedia does not have a PPC Linux version of the Flash player (they do have a Linux x86 version, though). So, this means that this new machine, even with it's very standards compliant FireFox 1.5, is almost worthless in the eyes of an 8-year old.

I'll give it another 6-12 months, and then I'll get the urge to see what's new in Linux. Next time, I'll likely install on x86 so that I can get a true representative experience.

Thursday, April 06, 2006

Congratulations Jim!

When you become involved in user groups to the point that you're either helping to lead a group, or actually leading, it becomes inevitable that you'll form acquaintances (if not friendships) with leaders from other groups in your region. As such, I've gotten to know [at some level, at least] John Hopkins, Bill Wagner, James Avery, Dave Donaldson, Brian Prince, Patrick Steele, and the Holmes Brothers (Josh and Jim).

Congratulations to the latter: Jim was awarded the Microsoft MVP Award for Visual C#!

Wednesday, April 05, 2006

CableCards and the DIY HTPC

It's been widely discussed, including on this blog, that because of certification requirements, only the big system builders will be able to put together a HTPC (Home Theater PC, like Media Center) that includes CableCard technology.

As a refresher, a CableCard is an addressable device that you would register with your local cable company, and is essentially a whole digital cable converter box on a little card. The point is that with a CableCard, you don't need the converter box in order to tune in the digital-only channels (including premium channels).

I have always said that this would be a PCI form factor. But, I went over to my friend Mokee's house over the weekend, and he showed me his new HDTV. Among other things, it had CableCard support built into the TV (and they, in fact, are renting a CableCard from Adelphia). To my surprise, a CableCard actually uses the PC Card (PCMCIA) form factor. I didn't get to fully examine it, but I'm assuming/guessing that the tuner itself is built into the TV and the CableCard is just a decryption device.

Given the fact that the cable companies will rent you one of these for your TV, I don't see why you wouldn't be able to just move one from the TV into a PC after the cable guy leaves your house. This is assuming that you'll have drivers for it, and can somehow integrate with your existing ATSC tuner card, but I'm sure that the gray market folks and/or Open Source crowd will ensure that those are available.

Bottom line: At this time, I think that the Do It Yourself'ers will be very likely to build a Media Center PC with CableCard support (renting the card from the cable company).

Ghost Hunters were in Louisville, KY

Last week kicked off Season 3 of Ghost Hunters on SciFi. That episode took place at an old Sanitorium (Waverly Hills) in Louisville, KY, and they captured a couple of neat pieces of evidence.

The Where Clause

I've been listening to some of Chuck Boyce's interviews from DevConnections. Chuck has a podcast called The Where Clause that is hosted on SSWUG Radio, and my blog has been linked to on a couple of his shows.

In particular, the Matt Nunn interview is interesting because it contains some enlightening information about SQL Server Express (I met Matt last year at the CSD Competition dinner. At the time, he was a Program Manager for SQL Server, but now has moved on to a VSTS role).

Carl Franklin interview is next...