Friday, September 23, 2005

NTFS, Windows Explorer, .NET, and Deep Paths

The NTFS folder tree is just a linked-list type of structure. Each node (folder) has a parent. To move a folder, all you need to do is change the pointer to the parent folder.

That's all well and good, but it seems that you can have really deep folder structures with little consequence to NTFS. Again, that's all well and good, but our friend Windows Explorer seems to have a problem representing, or rather accessing, deep folder structures due to a limit on how long a string path can be.

So, we came upon a problem today where a directory sync program was incorrectly configured, and as a result, created a really deep folder chain. For instance, it synchronized the folders from another machine (B -> A), but the next pass, it copied subfolders not into the same parent as previously, but into one of the subfolders that was previously created (B -> B). Let this run for 1000 passes, or so, and you get 1000 subdirectories. Blah!

How do you go about deleting these? Windows Explorer and the CMD shell was no help--the string path to the end of the chain was simply too long.

I found a manual method that worked, and surprisingly, did not require that much time.

Given:

Dir
--Dir2
----Dir3
------Dir4
--------Dir5
----------Dir6
------------Dir7
--------------Dir8
----------------...

Navigate as far into the tree as possible using Windows Explorer (i.e., maybe only to Dir6) and move that folder into the parent (Dir). This is just a parent pointer change to NTFS.

New directory tree might resemble:

Dir
--Dir2
----Dir3
------Dir4
--------Dir5
--Dir6
----Dir7
------Dir8
--------…

Keep repeating with the longest chain that remains (i.e., navigate into the new Dir 6 chain until you hit the path limit in Explorer, then copy that folder into the root).

When you have nothing but a bunch of smaller chains, you can then delete them all at the same time (i.e., delete everything inside of “Dir”).

BTW: It seems that the .NET Framework classes (System.IO namespace) simply use Windows Explorer, because they seemed to be subject to the very same limitations.

Indigo Roadshow

I attended one of the Indigo Roadshow events last night in Columbus, OH. I needed to see Indigo (Windows Communication Foundation) first hand, because I've been way too busy over the past year or so to explore the technology by myself. Even though my one-way drive time was longer than the presentation itself, I still got a lot of value out of it.

I particularly enjoy Microsoft Live Events like this because I find myself starting to think about how I could have used the technology in the creation of my previous projects, and how much easier the development would have been (because that's what software evolution is all about, right? Making it easier to build complex systems with less code).

So, what is WCF ("Indigo")? It's what you'll use starting in 2006 to have applications talk to each other (the communication layer in that whole "SOA" thing). But, most importantly, it works with very little additional coding involved--almost everything in last night's demos were done using attributes and config file entries (i.e., something, like reliability, that would [supposedly] take 100 lines of coding to implement using WSE was performed by simply adding one XML element to the application's config file). It's remoting, socket communications, and web services all rolled into one.

I like the new trend that I'm starting to see in MS products in that you no longer need a web server to host web services. Like SQL Server 2005, WCF offers the ability for your application to create a HTTP endpoint (using http.sys, so be careful if you're using IIS 5.1 on the same machine, because you won't be able to share port 80). This means that your app can host a web service without needing a web server.

The show was presented by Ami Vora and Payam Shodjai, both of Microsoft. A copy of David Pallmann's book Programming "INDIGO" Beta Edition (Microsoft Press) was handed out to each attendee, which appeared to be about 200 - 300 people (rough guess).

I also finally met Drew Robbins, the MS Developer Evangelist for my area. Great guy, but I'm envious of his job. I mean, besides going around talking up MS developer tools all day long, he actually gets paid to attend events like TechEd and PDC (where, I guess there was some dancing involved?)

Thursday, September 22, 2005

Evacuating a City: Do it Right!

I walked past CNN today where they were showing people evacuating Houston, TX. The Interstate highways leading out of town was packed, bumper to bumper for a reported 100 miles. People were running out of gas sitting in traffic.

But, then you look to the other side of the Interstate--the highway leading into Houston. You would see 1 or 2 cars every minute pass by the camera.

Am I the only one in America who thinks that when a major city evacuates, then all major roads out of town are to be opened up for outbound traffic? Make both sides of the Interstate into one way traffic leading away from the city. Don't force everyone to use the same roadway when there's an empty road only 50 feet away!

When evacuating a city, mandate that inbound traffic must use backroads, and keep the major infrastructure reserved for outbound traffic.

Hopefully, someone will realize this before it's too late.

Useful Device: Capo

I purchased a Capo last night for my guitar. I wasn't quite sure before the purchase exactly how it would change my playing, but I kept seeing that some tabs stated "Capo 1st fret", etc.

It became very apparent after using it for the first time exactly what it does, and the effect is awesome! I can change keys without changing the voicing of the chords and without barring (which I have problems with for whatever reason).

That is, if I place the Capo on the 3rd fret, and then play the Em chord relative to that Capo, then I'm actually playing Gm without needing to bar the 3rd fret with my finger.

It's only useful for wholesale key changes, so it doesn't solve all of my barring needs. But, I think it was an excellent investment of $15.

Wednesday, September 21, 2005

Dino Esposito on WWF

Using my blog as a personal bookmark for this post, which I intend to read later....

WinFX Funny

I read something amusing just now.

Steve Eichert states on his blog:

WCF [Windows Communications Foundation] is pronounced "Indigo".... The WCF is silent.


Which, I guess was a takeoff of something that Chris Anderson stated:

... and for clarification, yes, "WPF" [Windows Presentation Foundation] is pronounced "Avalon".... The WPF is silent.

Sunday, September 18, 2005

GEOS

My first introduction to the Graphical User Interface was "GEOS 2" for the Commodore 64 by Berkely Softworks. It's amazing to think about how much functionality they were able to push onto a 1MHz processor with 64Kb of RAM.

http://www.guidebookgallery.org/screenshots/geosc64

I mean, it's hard to get "Hello World" to compile in less than 64Kb with today's personal computing environments and programming languages.

Anyways, after "graduating" from the C-64 to the IBM/Intel platform, I stayed with GeoWorks as my preferred OS:

http://www.guidebookgallery.org/screenshots/gwe2

Back in those days, though, it was common to multi-boot into different operating systems. Or, rather, you usually had MS-DOS installed, and then started up different graphical shells (Windows 3.x included).

I found a way to put GeoWorks onto a bootable floppy so that I could take it to the computer lab at school. I was doing desktop publishing at that time for extra money, and couldn't stand anything MacIntosh-related (I still can't figure out the one-button mouse). So, I'd head to the PC lab that was in the Computer Center, go back to a corner machine right next to a laser printer (had to pay per sheet). If anyone came over (like a lab assistant), I simply hit the reset button.

Ah, good times. GeoWorks was actually a better OS (IMHO) than Windows 3.1. I'm sure that a lot of people would say that just about anything is better than Windows, but I'm not part of that FUD machine.

I love my Windows today, but I wonder how the world would have been different if there were follow-up OS's like GeosWarp, Geos98, GeosXP, Geos2003 Server, and finally Geos Vista.

My guess is this: A bunch of Linux people would say that monopolistic Berkeley Softworks is Evil, that Windows NT is such a better operating system (but too bad that the small company Microsoft went bankrupt), and why can't they install Geos without GeoMedia or GeoWebBrowser?

Saturday, September 17, 2005

Windows Workflow Foundation

Channel 9 has an introduction video to a new piece of WinFX that was announced at the PDC: Windows Workflow Foundation.

Finally! A general purpose workflow engine from Microsoft with an awesome graphical designer as well.

I'm still trying to grok what exactly the WWF entails, but my initial impression is that it's going to save me a lot of time by not having to code my own workflow logic (or at least not to the level that I'm currently having to do whenever I need workflow functionality in my apps).

Tuesday, September 13, 2005

New Orleans Funny

Perhaps my timing is a little off in blogging about this right now, but I was just reading an article on CNN.com where Jeff Koinange was reporting from the streets of New Orleans. In his report, he writes:

"Right now, the street is dry and resembles a disaster zone. There's garbage everywhere and it smells."

Umm, from what everyone who has been to New Orleans tells me, isn't this actually a sign of normalcy returning to the area. ;-)

Different Version of Vista

I was part of a discussion today where we discussed the rumored 7 different packaged versions of Windows Vista, like this is a scary monopolistic thing, or something else Evil®.

The way that I see the different versions of the OS is kind of like shopping for a car. Imagine if people bitched about how many model/trim combos there are!

Honda Accord
....Coupe
........LX
........EX
........LX V-6
........EX V-6 6MT
........EX-V6
....Sedan
........Value Package
........LX
........LX Special Edition
........EX
........LX V-6
........EX V-6 6MT
........EX V-6
....Hybrid

I see this as a way for MS to offer varying levels of the same OS, but offering different functionality for those who need (or want) it. For instance, if you don’t need (want) the packaged media player (for the commies Socialists in the EU), then buy a version that doesn’t offer it.

However, maybe they will only package a feature that you want (need) with media player, in which case, you’re stuck with it.

I ran into a similar situation when I bought my Windstar. We wanted the factory video, but it wasn’t offered in any of the lower trim packages, so we were stuck either getting the SEL or the Limited packages. Sure, we could have gotten a stripped down Windstar trim and then installed an aftermarket video solution, but we decided to go with the package from the factory.

Even though the video system is what we wanted, we also had to get things like adjustable pedals, self-sealing tires, flat-tire indicator, digital information center, and backup sensors (which I love, btw). There's really no way to easily uninstall these features simply because I didn't want them.

No one calls this anti-competitive in the automotive industry.

Friday, September 09, 2005

Active Sun WARNING

My favorite time of year is approaching: Autumn.

Why? Because of the increased likelihood to see Auroras (Northern Lights) in my location.

This week, sunspot number 798 has rotated into view, and is currently extremely active. On 9/7/2005, it belched out an X17-class flare (as I type this, we're experiencing elevated spaceweather conditions due to a glancing blow from the resulting CME). Over the course of the past day, there have been two separate X-Class flares, and a whole bunch of M-Class flares.

X-Class, M-Class... How big are these?

Well, think of fishing. An inactive sun is like catching a tiny fish (minnow or maybe a small bluegill). These are class A and B flares.

Class C flares are like catching a fish that's big enough to eat. Nothing that you would necessarily put on your wall, though.

Class M flares are significant, and can kick up auroras. These are like catching something like a Walleye to a Salmon, and you have to struggle to reel it in.

Class X flares are the big ones. These are powerful, and if Earth-directed, will almost always kick up auroras. For these fish, you're on a boat in the open sea. You have to be strapped in or else the fish might take you off of the boat with it.

The big Class X flares (X10 and bigger) are more like whaling than fishing. The one the other day is a like a dolphin or small orca Shamu at Sea World (Note: I was initially wrong about how big X17 is--this flare actually made the record books as the 4th largest since 1976). The biggest one that I've "witnessed" was like the size of that Sperm Whale that exploded last year in Taiwan.

There's always the possibility of a huge Blue Whale being ejected from the Sun. That would cause some damage here, though.

Suddenly, this is sounding more like a Douglas Adams novel than a blog post....

Thursday, September 08, 2005

Scobelizer Must Retire Now

Catchy title, eh?

But, seriously. Where does he go from here:

http://channel9.msdn.com/showpost.aspx?postid=111598

I think that interview could have just been Robert's career climax! Maybe it's time to change focus... Leave on a high note... Pull a Seinfeld.... (any more euphemisms that would apply here?)

Development Web Server Included with VS.NET 2005

At last week's MSDN demonstration in Detroit, Bill Steele showed off how Visual Studio.NET 2005 will provide a web server for FileSystem-based web sites, which means that you can develop and test ASP.NET applications without the need for IIS! Very cool!

I started exploring to see if this could be invoked outside of VS.NET 2005, and indeed it can! My machine running VS.NET 2005 includes a program in the v2.0 Framework directory called WebDev.WebServer.exe. Another machine with an older version of the v2.0 Framework (but without VS.NET 2005) did not have this file, so I'm not sure if it will be included as part of the framework going forward, or if it's only included as part of Visual Studio.

An excerpt from a separate writeup that I'm working on:

Visual Studio.NET 2005 provides a small stand-alone web server that can be used by developers to test ASP.NET web applications without requiring IIS. Right-click on a FileSystem-based Web Site project, then choose "View in Browser" in the context menu, and the web server will launch and listen on a random port number.

To start this web server manually, use the following command entered on a single line (from START Run, or from a command prompt):

%windir%\Microsoft.NET\Framework\v2.0.50215\WebDev.WebServer /port:1337 /path:"c:\src\AspnetWebapp"

The /port parameter is used to set the port number that the server listens on. In this example, it is set to 1337, but if that port is already in use, then you can set it to anything other port that is open.

The /path parameter is used to tell the web server where the webroot directory is. This would be the equivilent to being c:\inetpub\wwwroot for IIS.

A third parameter (not shown) is /vpath, and is used to set the virtual directory that will be mapped to that physical path.

Tuesday, September 06, 2005

New Orleans Idea

I haven't seen this idea posted anywhere (but really haven't looked): Why not embrace the fact that the city of New Orleans is lower than the sea level around it instead of trying to constantly combat nature by keeping the water out of the city (eventually, nature always wins).

I'm talking about flooding the city permanently, sort of like Venice, Italy. Or at least have a flooded section and build up other parts of the city so that they're actually higher in elevation than the sea level. Life in the flooded section would exist above the waterline, and water taxis and gondoliers would shuttle people around.

Yeah, you'll lose a lot of historical buildings by embracing this approach, but compared to the alternative of constantly rebuilding after flooding (and paying insurance premiums in the interim), this just seems more logical to me.

Aircraft Carrier Role in Hurricane Relief

I heard the other day that an aircraft carrier was making its way from Norfolk, VA to the Gulf of Mexico. My initial thoughts were, "How is an aircraft carrier going to help?"

There's actually a brilliant reason for why this was done, and shows off how a massively destructive wartime weapon, like the aircraft carrier, can become a great vehicle of humanitarian aid when required.

First off, the ship is nuclear powered, so there's no massive Diesel fuel consumption in moving it around. I find this important because that equivilent amount of fuel would be better used for land-based vehicles, like trucks.

Secondly, these things are fully self-contained floating cities, complete with fresh-water generation capabilities. They estimate that the one ship can output 400,000 gallons of fresh water per day, which is just amazing to me.

http://www.news.navy.mil/search/display.asp?story_id=19910

Friday, September 02, 2005

Ungrateful Evacuees

As I sit in the comfort of my dry northern 'Merica location, I'm constantly scanning the news reports for any sign of good news coming from the south. Then I come across this on MSNBC talking about a convoy of supplies finally reaching into the Convention Center (which is good news, so I would have thought):

“Hell no, I’m not glad to see them. They should have been here days ago. I ain’t glad to see ’em, I’ll be glad when 100 buses show up,” said Michael Levy, whose words were echoed by those around him yelling, “Hell, yeah! Hell, yeah!”

“We’ve been sleeping on the ... ground like rats,” Levy said. “I say burn this whole ... city down.”

My thought: F*** Michael Levy and those around him. What have they been doing for the past 3 days? What could they have been doing to make the situation better? Are they prisoners being held at the Convention Center? Now that they are refugees evacuees, is it all that they can do to hold the ground and await their Entitlements?

I feel sorry for people that have lost everything. I really do. But, these same people need to take matters into their own hands and not wait to be told to do something or wait for handouts to come to them. They need to either assist in the recovery effort by volunteering manual labor, or get the hell out of the area. They need to be grateful that America is coming to their aid, not staring at a running stopwatch and complaining about how long it takes for that aid to arrive.


And now back to our regular programming.... I'm going to have my empathy circuitry serviced soon...

Looters: Can We Blame [All of] Them?

I've heard a lot of people talking around me about how looting is such a problem in New Orleans right now. I'm quick to think of looters as being these profit-oriented thieves who are breaking into Best Buy and grabbing all of the HDTVs that they can (because, what, they're going to sell them out of the back of a rowboat down some dark alley? And to whom?).

But, then I start to think about people who might be looting for the "right" reasons. I'm talking about people breaking into a grocery store to get food or bottled water. Will these people, too, be shot on sight? What about people who have lost everything, and break into a clothing store in order to get some fresh clothes to wear, or sturdy footwear? Are we supposed to hold these people in the same category as the opportunistic looter who might be stealing air conditioning units at this time?

Granted, there has been an evacuation order, so there aren't supposed to be any residents still in the vicinity. But, we're also hearing on the news about how there's a real lack of coordination going on. Some people were interviewed on CNN about how one police officer ordered the crowd towards one location, but when they got there, the police at that site started firing their guns into the air to keep the crowd from advancing.

We're really no better prepared for a loss of normalcy today than we were four years ago. And the authorities in the south had time to formulate a plan (unlike during 9/11 when there was no advanced warning). To me, that's scary.

Thursday, September 01, 2005

This is awesome, but....

CNN lists contributions that big greedy companies are making toward the hurricane relief effort:

http://money.cnn.com/2005/08/31/
news/fortune500/firms_hurricane/index.htm


This is awesome, but why is it only during times of disaster that such big contributions are made? What about those people who are homeless all of the time, who are in need of medical care now and will continue to be after New Orleans is re-inhabited, and who dig through trash dumpsters to find food?

I wonder how long the "regular" urban refugees could have been fed in this country with the same level of donations given to clean up Katrina...

Bill Steele... You Sir, Are Smarter than Me!

I just got back from attending a MSDN Event in Detroit where Bill Steele presented on ASP.NET 2.0, and a lot of the "drag/drop/configure and IJW" technologies being included in the next version of .NET (though, several of his demos did not Just Work). My conclusion: I really need to come up to speed on ASP.NET.

I mean, I've been on 3-4 ASP.NET projects since 1.0, with a couple of those being million dollar projects. But, whenever I stare at a blank project, I have no idea where to start (OSASPADO sites, on the other hand: I can crank those out without thinking).

Anyways, Bill is the "local" MSDN Evangelist (I believe that Developer Community Champion is his real title) for this region of the country. He actually lives 3 hours from me, and at least 4 hours from Detroit, so "local" is kind of used lightly. I've seen him present on 4-5 different occasions now.

He caught my interest recently when he started blogging on a flying car idea, or rather, a flying 3-wheeled motorcycle, which should have less stringent highway safety requirements than a car would. I think Rory Blyth put it best when he described Bill as being "freakishly smart", or something to that effect.

I introduced myself to Bill after the session, mainly so that he could put a face to the name of that annoying person who keeps leaving blog comments. We got to talking about the flying car (because frankly, there's little more that we really have in common at this point, so it was an obvious topic). To my surprise, he has this thing modeled out in X-Plane, and has already worked on some redesigns because he discovered that it has some stability problems when it flies! (X-Plane is able to take all of the aerodynamics of the model into consideration to provide a pretty accurate representation of how a real aircraft would perform)

He then proceeds to fire up X-Plane while I'm standing next to him, and takes off from an airport in his flying car, achieves straight and level flight (to show the instability issue), and returns back to the airport (and like a true pilot, he calls out his transitions while entering crosswind and downwind, as well as turning base and turning final--he probably didn't notice that, though).

To that, I say: Bill Steele, you flying car designing, X-Plane model building, ASP.NET teaching MSDN Presenter...You Sir, are Smarter than Me!

[Mark Miller/Mondays reference, should anyone not get it]

On a related note, Bill is taking time off of work between now and the PDC to fly his own plane down to Louisiana in order to help shuttle MREs into distribution points to help feed people in this time of disaster. As he described it to everyone in the session, the first trip will gross out his plane, and in the end, he hopes to deliver something like 20,000 meals total. Bravo, Bill.

UPDATE 9/9/2005: I see that William has just blogged about the experience:

http://blogs.msdn.com/wsteele/archive/2005/09/08/462752.aspx

Wednesday, August 31, 2005

The Ghosthunters (TAPS) Were In New London, CT

Ghost Hunters (Sci-Fi Channel, Wednesdays at 8PM and 9PM) is one of my favorite television shows. I've always been fascinated by the paranormal, and these guys do a pretty good job of trying to capture proof while at the same time, not being afraid to throw out evidence if it's the least bit ambiguous or questionable.

I do take issue with the show's need of some additional technical review before being aired, because I catch inaccuracies in some of the things they say. (Example from tonight: EMF stands for Electromagnetic Field, not Frequency. The casual observer would not have caught that, but I'm just anal about little things like that). So, Sci-Fi Channel: Call me--I'd be glad to help. ;-)

Getting back on topic...

Tonight, they visited Ledge Light, a lighthouse in the harbor of New London, CT (3 white, 1 red flash every 30 seconds for anyone near the harbor). No ghosts were found (seems to be a trend with this show). But, New London, CT.... Hmm, that's interesting.

The Godfather of podcasting himself, Carl "Buzz" Franklin, records .NET Rocks and Mondays from his studio in New London. (I became a big fan of Carl's due to trying to catch up on 100 episodes of DNR over the span of 10 weeks).

So, like mixing peanut butter with chocolate, here were two different elements of my life coming together for a brief moment in time, and it was all good for me!


Update 10/06/2005: How cool to discover that on MSN search, this post became a #2 result for the show, right behind the official TAPS homepage. Well, it's #2 if you spell Ghost Hunters as one word instead of how Sci-Fi spells it, which is two words. (I only found out because I started seeing a lot of hits in my stats from people using search terms "ghosthunters taps).

Like I said above, I'm a huge fan of the show (shoutz out to Jay and Grant and team), and next week's episode even takes place about 2 hours drive from my home (at the Mansfield Reformatory in Ohio--the same place where Shawshank Redemption was filmed, as well as a scene from Air Force One).

Lightbulb Just Burned Out

Our range hood (above the stove) has a light in addition to the exhaust fan. That location serves as a convenient night light, so we tended to just leave it on all of the time (at first by accident, and then because we were used to always having a light there).

The problem was that we were only getting a couple weeks worth of life out of regular light bulbs, and only days worth out of discount light bulbs.

Three years ago, we bought one of those long-life florescent-tube-bent-into-same-size-as-incandescent-bulb light bulbs, and have left it burning 24/7 (it only uses like 5-watts, and provides same light output as a regular 60-watt bulb). Well, tonight, it finally died.

Three years, and 1/12 of the power consumption. Not a bad investment of what was $9 at the time (now they're like $3-5).

My Guitar Skillz

I've had a couple conversations with people where we've discussed guitars, and the fact that I'm teaching myself how to play. I hope I haven't misled anyone, because I actually kind of stink at playing right now. I mean, I only learned what a "G" chord was at the beginning of this year.

Someone asked me last night what style do I play. I didn't have a definitive answer at that time, but now I can say:

I basically play anything that uses combinations of G-D-Em-C.

And that's not saying much..... Though, it does let me strum through the chords of a lot of rock songs!

The one song that I do know, and can actually play pretty well, is "Be Like That" by Three Doors Down. Pretty easy song with one-string-at-a-time finger picking, and then G-D-Em-C chords (in that order) for the chorus, and some Am-Asus-C-Cmaj7 type things thrown in to make it interesting.

NWNUG Presentation

I gave the presentation last night on SQL Server 2005 to my local .NET user group. There was a great turn out, with I think 30 people total. The reviews that were collected at the end were all positive.

In retrospect, there was really too much content. But, it's hard to pick what should and should not be included because you just don't know when something is going to be of particular interest to an audience member.

I could have easily trimmed down the second half (SQLCLR), though, to make it a little less awkward. I was constantly jumping between PowerPoint and a VirtualPC to demonstrate code, and at times, the VirtualPC had swapped out some of my running programs to virtual memory, so there were awkward pauses while programs resumed, or previously-JIT'ed programs were re-JIT'ed.

If I were to give the same presentation again, I would take out the part about CLR Triggers and would even consider taking out User-Defined Types. Less is more, and in this case, it would have given the audience an even more enjoyable experience because I wouldn't have had to rush the end of the presentation.

In other news, I now have a presentation on "SQL Server 2005 T-SQL and SQLCLR" if anyone needs a speaker... ;-)


And, thanks go out to Scott Hanselman for pointing out ZoomIn on his Presentation Tips page. It turned out to be a really useful tool for allowing audience members to see small text. When I started using it, one person asked if it was something new in SQL Management Studio!

Tuesday, August 30, 2005

Fiddler Is AWESOME!

Hanselman should add this to his Ultimate Tools list: Fiddler by Eric Lawrence of Microsoft (this thing rocks!)

Why would you need something like this? To view raw HTTP Requests and Responses, for one. It integrates right into Internet Explorer, and will take care of proxy configurations on the fly (so all you do is click a toolbar button, the app launches, and then captures all requests/responses going forward for you to inspect).

When developing web applications and web services, you often need to review what is being sent to the server (including headers) and what is being received. IE doesn't really let you do this by itself, so that is where HTTP Debugging Proxies come in handy.

(Firefox users: Don't bother commenting. I can care less what's built into your browser. ;-)

Blog Comment Spam

I've turned on "Word Verification" for comments because I woke up to a pile of spam comments for the most recent post in my blog (which have been removed).

Looks like a SpamBot network is going wild at the moment, since this is the first time that my blog has been "attacked". I just wish that they were smart enough to click the Google's Adsense ads on this page!

Here's a list of offenders (if you happen to be one, then clean your machine!):


user-0cceqkl.cable.mindspring.com (24.199.106.149)
c-24-16-199-239.hsd1.wa.comcast.net (24.16.199.239)
pool-70-17-15-162.balt.east.verizon.net (70.17.15.162)
66-214-87-99.dhcp.malb.ca.charter.com (66.214.87.99)
pool-4577e1d4.dyn.optonline.net (69.119.225.212)
151.95.33.65.cfl.res.rr.com (65.33.95.151)
66-215-26-223.dhcp.whtr.ca.charter.com (66.215.26.223)
adsl-71-133-14-134.dsl.pltn13.pacbell.net (71.133.14.134)
c-24-22-102-46.hsd1.or.comcast.net (24.22.102.46)
151.95.33.65.cfl.res.rr.com (65.33.95.151)
A057132.N1.Vanderbilt.Edu (129.59.57.132)
c-67-182-160-214.hsd1.ca.comcast.net (67.182.160.214)
cpe-70-115-171-45.rgv.res.rr.com (70.115.171.45)
ip68-111-184-60.sd.sd.cox.net (68.111.184.60)

Monday, August 29, 2005

SQL Server 2005 NWNUG Presentation

Tomorrow evening (August 30, 2005 6PM), I will be presenting to the local .NET user group (NWNUG) on new features in SQL Server 2005.

It will be crammed with content, so beware! There won't be enough time to fully explore everything (which could easily be a week's worth of training), but the goal is to provide a taste of a lot of the new things that developers are interested in.

Agenda:

  • T-SQL Enhancements (Large Value Types, Row Overflow Handling, XML Data Type, TOP/TABLESAMPLE, PIVOT/UNPIVOT, Ranking Functions, and Common Table Expressions)
  • SQLCLR (Stored Procedures, User-Defined Functions, Triggers, User-Defined Aggregates, and User-Defined Types)
  • ZMachine Demonstration (ZMachine engine running in SQLCLR, exposed through CLR Stored Procedures and HTTP SOAP Endpoints)

The presentation is geared towards a technical audience, but don't let that stop you from attending! Greg has some good door prizes, and I got my company to provide some swag from their marketing closet (tchotchkes with our logo on them).

Laptop with 19" Display?

Do we really need a portable device with a 19" display? That's bigger than the monitor I use at home for my desktop!

Link: Gizmodo

Slashdot: Ice-Free Summers Coming to Arctic

I'm not sure what to think of this. The article talks about the inevitability that in coming years, the Arctic icecap will melt due to global warming.

My only contention is that the Earth has always had cyclical warming patterns. Remember back when a mile-high glacier sat on top of where I am typing right now? It was pretty cold then. And before that, this area was almost tropical. Talk about extremes...

Something happened to cool the Earth so much that we entered an ice age, and then something happened to warm the Earth so much that the ice age ended. I don't think that we can blame the Bush administration for those events millions of years ago (though, I'm sure that some Leftists would try).

Maybe industrial activity today is accelerating whatever natural warming trend was already in place, but my personal belief is that the Earth has its own agenda, and it's rather unlikely that mankind could have too much effect in changing it.

Keep in mind, also, that one major volcanic eruption that sends a lot of ash into the atmosphere will cool things down considerably (if only for a year). We'd be facing famine at that point, so I think I'd rather have things a little warm compared to being a little cool.

http://en.wikipedia.org/wiki/Year_Without_a_Summer

Saturday, August 27, 2005

Scobleizer Goes to Google

A couple of good chuckles in this comic here: Channel9

Friday, August 26, 2005

UPDATE TOP(x) Behavior Figured Out

Just tested UPDATE TOP(x) to see if I could better understand how it works:

The first (x) records will always get updated as stored on disk (i.e., by the clustered index). Subsequent updates, unless including a field that affects the clustered index, will continue to update the same records.

You can see this behavior by looking at the Execution Plan in Management Studio. Heap tables do a simple table scan, while tables with a Clustered Index will to a clustered index scan to find the x'th record.


Steps to reproduce:

1. Create a new table

USE [AdventureWorks]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[test](
[id] [int] IDENTITY(1,1) NOT NULL,
[LastUpdated] [datetime] NULL
) ON [PRIMARY]
GO
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF

2. Insert 100 records into the table. Then, set the LastUpdated field to the same value:
UPDATE test SET LastUpdated='1/1/2000'

At this point, there's no clustered index or primary key (which would create a clustered index by default), so we're dealing with a heap table.

3. Execute the following:

update top(5) test set lastupdated='3/1/2005'

No matter how many times you execute, the first 5 rows will always be '3/1/2005'

4. Now add a clustered index (non-unique) on the LastUpdated field. This will sort the records by that field's value on the disk itself. The first five rows, which were previously updated, will now move to the bottom of the table when you SELECT * FROM test

5. Now execute:

update top(5) test set lastupdated='3/1/2005'

Because the new date is greater than the original date, these 5 records move to the end of the list as well. The next time you execute this command, then next 5 records will move to the bottom.

So, the notion of breaking up a transaction into smaller chunks using TOP does not seem to be a viable solution. Most clustered indexes will probably be set to the primary key for the table, which is unlikely to be updated by your query (so subsequent UPDATE TOP(x) will continue to update the same rows).

UPDATE: The same behavior was observed for DELETE TOP(x) as well. So, I think the MS Technical Writer needs to update the SQL Server 2005 Books Online to get rid of the comment that indicates that using TOP(x) with DML is "random". So far, it looks very predictable.

Thursday, August 25, 2005

VB.NET and C# Direct Comparisons

This is awesome! A Rosetta Stone for VB/C# translation.

http://www.harding.edu/USER/
fmccown/WWW/vbnet_csharp_comparison.html

Oil Prices: Collusion?

Somebody who is more familiar with the Futures market and the oil industry explain to me how it all works. What exactly does it mean when the price per barrel is $68?

I know that the Petroleum industry is divided into two parts: Upstream and Downstream. Upstream operations are the ones surveying for new oil, drilling, and extracting oil from the ground. Downstream operations take the crude oil and refine it into various products (gasoline, toluene, plastic resin, etc).

So, we know that supply is limited. So, what prevents an oil company from using collusional tactics on the trading floor to artificially inflate prices? I'm talking about stacking up the people who are yelling out prices all day long, so instead of 1 person bidding for you, you have 10 people (though they would appear to be different companies), and each person is bidding up the price established by the person before them. In the end, the price per barrel is higher, yet the crude that was purchased ends up at the same place for refining. The Upstream operation makes a huge profit, while the Downstream operation passes the difference on to the consumer.

Are there safeguards to prevent this type of behavior? Or am I just totally clueless about how the Futures market in correlation to crude oil delivery works?

Wednesday, August 24, 2005

Multiple (Temporary) Passwords Per User ID

To the Microsoft Security Team: Here's a freebie for you.

Why not allow multiple passwords to be assigned to a single user id?

Now, I know what you're going to say: That just makes it easier to hack a password. Maybe so, but to the same degree that playing 2 numbers in the lottery makes it that much more likely that you'll win.

But, how many times have you needed to give someone a username/password to log into a system, but didn't intend for them to continue to use those credentials forever? I'm talking about throw-away passwords that would be time limited.

Here's how it would work: Consultant A needs to access your SharePoint machine as a user with administrative rights. You really don't want to do more work than you need to, so you add a temporary password to the SharePoint administrator's account that expires in 8 hours. This lets Consultant A do his work for that day, but you never revealed the actual password to them, so you're able to continue logging in tomorrow with the regular password, but they are not with the temporary password.

Monday, August 22, 2005

Family Resemblance?



Is Buzz Franklin related to Buzz Lightyear? I think I see a family resemblance...

Bigfoot in Ohio?

As covered on Boing Boing, this news story comes from the Middletown, Ohio area:

http://www.channelcincinnati.com/news/4874944/detail.html
http://www.channelcincinnati.com/video/4875005/detail.html
(updated: need to check those links before I post)

When I heard the audio, I immediately thought of a show that I saw on TLC or Discovery or something where they has recordings of similar howls that were attributed to Bigfoot.

Some samples can be found on this page:
http://www.bfro.net/avevid/SierraSounds/911.asp


Supposedly, an "animal expert" didn't recognize the howl. Me, I thought of coyotes myself, but maybe there's just a cat in heat nearby.

Playing Ignorant out of Politeness

How often do you play ignorant out of politeness to the person that you are speaking to?

Case in point:

The other day, the water meter reader was at my house. You should know that when I moved into my house 5 years ago, the city installed a remote reader (known in the water meter reading industry as a Touchpad, I guess) so that they wouldn't need access to my basement every month. This is basically some RFID-like sensor mounted outside of my house with cabling that runs to the real water meter that is inside my house. I believe that the "touchpad" serves as the antenna to the actual transponder located on the meter itself.

There was a knock at my door, and when I answered, this middle-aged bearded man explained to me that my remote sensor was not working, and that he might need to get to my meter in the basement. We've got all kinds of crap piled up in the basement (ever see the TV show called "Clean Sweep"?), so I was really hoping that he would be able to resolve the issue externally.

After 15-20 minutes of him messing around outside my front door, he finally was able to get a reading (I think he replaced the external sensor thingy-majig). He knocked on the door again, and said that we were all set. Out of curiosity, I asked him what he had to do to fix it.

He went into a semi-technical lay explanation about how RFID works and that there's a cable running between the sensor outside and the meter inside. I patiently waited for his explanation to finish, while, meanwhile, my Raviolis inside were getting colder and colder. I think I threw some polite signs of interest, like "Oh, Really" and "No kidding?", but what I really was thinking was "Dude, I've written software for microcontrollers in assembly, and have also written simulators for those microcontrollers to run my software that I wrote in assembly. I think I can grasp the concept of a RFID-like water meter reader."

It then dawned on me that other people might do the same to me. I usually have no idea whether or not the person that I might be explaining something to has any domain knowledge, and depending on their reactions, I might tend to "dumb down" the conversation. What if this person is screaming inside their head "SHUT UP! I KNOW! SHUT UP!" ??? The last thing I want to do is waste their time or mine.

How often do you find yourself personally playing ignorant just to satisfy the ego of someone who is explaining something to you?

Sunday, August 21, 2005

My First Google Weirdo

I read my referrer log this morning, and saw this search query that led to my blog:

"what can cause that your parts inside of your head string?"

Umm, I dunno. Maybe because you store "parts" inside of your head in the first place? You probably should have that looked at. X-Ray, CT, MRI, Terrahertz imaging.... Something.

Friday, August 19, 2005

Intelligent Design Debate

WARNING: Incoherent Babbling follows. I wanted to record some thoughts, so this post may or may not make sense....


How do you prove evolution or intelligent design in order to know which is correct and therefore, should be taught in schools? Why can't these two concepts simply co-exist?

Any lawyer will tell you that you can't prove a negative, and that's what creates the atmosphere for debate. Trying to prove a negative, like that ID is wrong, is like trying to prove that a species of fish is extinct: just because you can't find one today doesn't mean that they're all dead--just means that you haven't found one yet, but someone off of the coast of Australia might catch one twenty years from now.

So, you must prove the affirmative. Instead of trying to prove that Bigfoot does not exist, you must prove that it does exist. That's going to mean capturing a specimen (dead or alive) or obtaining some other form of empirical evidence.

Likewise, you can't prove intelligent design until you capture the creator....Or become a creator.

Let's say that you have hundreds of beakers full of different primitive protein structures. If you, as an intelligent being, can create a living organism from these proteins and maybe some 110VAC from the nearest wall outlet, then you have in essence proved intelligent design from that organism's perspective at least (and millions of microbes will worship your existence).

If you design that organism to be able to reproduce, and as part of that, you can observe mutations, and survival-of-the-fittest behavior, then you've also demonstrated Darwin-like evolution. AND, let's say that you're also able to create a virus that would attack your organism and drastically change its genetic makeup (i.e., adding chunks of new genetic data) so that the next reproduction cycle results in a totally separate organism that could not have otherwise "naturally" come from the previous genetic sequence. Well, now you've demonstrated another part of evolution's theory that explains extreme mutations and new taxonomy changes (Kingdom, Phylum, Class, Order, Family, Genus, Species).

The point being, that the scientific community does not support intelligent design because of the Supreme Being aspect (does not exist until you have empiricle evidence), and because Creationism basically says that all living animals were created as they exist today (and we know that mutations are very common). The religious community does not support evolution because it basically says that life spontaneously formed out of a bunch of naturally occurring non-living proteins, which evolved over millions of years to the world today (they tend to stick to the "God created Man in His image" teachings).

Me, I think I'm somewhere in the middle and actually support a little of both theories (ID is not exclusive of evolution).

Side note: It disturbs me, though, that Atheism is becoming our national state-sponsored religion. (Is the anti-religion in fact a religion in of itself? That's a totally different topic, and I'm not about to go there...).

UPDATE: I just read Slashdot, hours after writing this, and the top story is entitled: Scientist Creating Life from Scratch. Strange coincidence?

http://science.slashdot.org/article.pl?sid=05/08/19/1849212&from=rss

Tuesday, August 16, 2005

Another widespread worm/virus

ZOTOB is wreaking havoc at this moment. Sigh. I haven't been to Slashdot, but I can almost guarantee that theres 2^16 (+/- 3) posts saying "See, if you used Linux, then this wouldn't happen to you. Na-na-na-na-boo-boo."

Not that I have anything [serious] against Linux. I mean, I came from a *NIX background while in school (Solaris, actually), but then I discovered that developing on Windows (using VB3 at the time) was somewhere in the neighborhood of being 800 to 1900% easier [than doing anything with X]. And furthermore, I have written my share of sh scripts, even after discovering VB. But, I'd just rather automate using WSH and VBScript, if you want to know.

Oh, I got off the topic. I do fire up Linux every now and then to see what's new. For the most part, it's the same old type of system that I played around with in the early-to-mid 90's. I don't see many improvements to the UI, and that is what's stopping adoption by people like my parents and grandparents (a.k.a., Mainstream Adoption). Yeah, there's different Window Managers that are closer to Windows, but all seem to "feel" the same as other X environments.

So, let's say that Linux gets a kick-ass GUI that is easy enough for my grandmother to use, and it goes mainstream. Do you really think that it will remain as "secure" as it currently is? Do you think that the haX0rz will continue to attack only Windows?

Die-hard Linux folks should just be glad that they don't have the virus problems that we have. They should definitely not gloat about it, because karma is a bitch. It's only time before there will be an army of Linux bots waiting to take over the world, turning people into energy factories to satisfy their demand for more power.

What's so wrong about Microsoft.VisualBasic functions?

Sorry, I don't necessarily agree with everything said in third comment of this post. Don't get me wrong: I strongly encourage using the BCL whenever possible.

But, as for there being performance problems, that's the same logic that people are using when they say that VB.NET is slower than C#. The VB.NET team (and Carl Franklin) would take exception to that.

The reason is because this is just a .NET class library, which is really no different than if you wrote these helper classes yourself in C# and included it within your class library. I mean, do you really think that the VB.NET team would not optimize their code before releasing it to millions? Because they program in VB, they don't know how to make small code?

Also, this is the Microsoft.VisualBasic assembly, not the Microsoft.VisualBasic.Compatibility assembly that the post is discussing.

For example, let's disassemble the Right() function as C# to see what's going on:


public static string Right(string str, int Length)
{
if (Length < 0)
{
throw new ArgumentException(
Utils.GetResourceString("Argument_GEZero1", "Length"));
}
if ((Length == 0) || (str == null))
{
return "";
}
int num1 = str.Length;
if (Length >= num1)
{
return str;
}
return str.Substring(num1 - Length, Length);
}


Ok, sure, it's more efficient to just use Substring() directly. I'll give you that. But, this is an all-purpose function that every VB'er already knows. The flexibility adds a little bloat, but you can use it anywhere. Is it so wrong to link to a class library to use this function just because that class library has "Visual Basic" in it's name?

Monday, August 15, 2005

Stating the Obvious

A was reading about the tragic plane crash in Greece on CNN.com:

http://shrinkster.com/7ed

There's actually a quote in there that reads:

"'We have performed autopsies on six people. Our conclusion is they had circulation and were breathing at the time of death,' Koutsaftis said."

Ummm, duh? Because technically, you do have circulation and are breathing right up to the point of death, right? Anyone reading this still have a heartbeat and breathing despite being dead already?

Am I missing something here, or is there something profound in that Greek coroner's statement?

My Daughter the Aspiring Lawyer?

A lot of parents look for genius traits in their offspring, myself included. My 7-year old is intelligent, but probably not a genius (darn), unless she's one of those rare highly functional geniuses who have perfectly normal childhoods but still love to watch the Powerpuff Girls ad nauseum.

I mean, she reads at a higher level than her peers, yet seems to struggle with math for the time being. I was the same way at her age, except that I couldn't read nearly as well, so I'm not too worried about her subtraction skills as she enters the Second Grade.

But, it's questions like what she asked the other day that gives me some insight that she'll probably end up smarter than me, so I'd better watch out:

So, we were watching television, because that's what we do. On the screen came a commercial for CLR (the Calcium/Lime Remover product, not to be confused with Microsoft advertising the Common Language Runtime on television). They showed a "real time" side-by-side comparison of their product competing against Lime Away's product, and of course, CLR removed the calcium deposits faster than the competition.

My daughter then asks, "Does CLR have to ask the owner of Lime Away before they can show their product on a commercial?"

I was floored! I don't think I ever considered the ramifications of such an issue until I was at least in high school, and here she is coming up with that on her own.

That makes me feel a little better about my retirement plans if she turns out to be an intellectual property lawyer. ;-)

Friday, August 12, 2005

Parking Problem at Tony Packos

Toledoans: Don't you hate it when you go to the Front Street (Original) Tony Packos Cafe for lunch, and can't find any nearby parking? I mean, the designated parking lot is like a whole 100 feet from the restaurant, but it's such a pain to walk from the parking lot to the door. Perhaps you've just been overlooking the obvious.

This guy had no trouble finding door-side parking:



(that's 468 on the plate, in case you can't see it).

MaggieMoo's

We stopped by MaggieMoo's Ice Cream (at Levis Commons) last night, and, uh, what can I say..... Yummy! Freshly made ice cream, all kinds of flavors, and they'll smash in your favorite "toppings" to make a unique combination of flavors just for you.

We were in Bowling Green last night, and I got the idea to stop off there on our way home from Aaron.

My wife tells me that it's a lot like Cold Stone Creamery (479 West Dussel, same plaza as Panera Bread in Maumee), but I wouldn't know. I'm primarily a "whippy-dip" milkshake person, so hand-scooped ice cream is sort of exotic to me.

Meteors, Clouds, Mars, and Snopes

First off, I've got to say that living in NW Ohio kind of sucks. I mean, whenever there's something cool going on in the sky, you can almost bet that we're clouded over.

The Perseid Meteor Shower is currently underway (it peaked overnight, if I'm not mistaken), and we've got overcast skies. Again! (last year, same thing, and if I'm not mistaken, the year before that too).


Secondly, I hope that by now everyone has done their homework to determine if the email being sent around it true or not. What email? This one:

The Red Planet Mars is about to be spectacular! On August 27, Earth will catch up with Mars. The next time Mars may come this close is in 2287....Mars will look as large as the full moon to the naked eye...etc... NO ONE ALIVE TODAY WILL EVER SEE THIS AGAIN.... Blah, Blah....

http://www.snopes.com/science/mars.asp

It's an idea virus. Throw enough true-sounding facts into an email, send it off to your favorite email-forwarding-friend-or-relative, and suddenly the whole world starts to believe it as fact. And without checking for themselves, people forward the same email to others who they thing would be interested....

Thankfully, there is snopes.com--I use them for fact checking almost everything that comes to me via email.

They even maintain a list of the top 25 Urban Legend emails that are currently circulating: http://www.snopes.com/info/top25uls.asp

Thursday, August 11, 2005

TOP for INSERT, UPDATE, DELETE Queries?

From the June CTP SQL Server 2005 Books Online:

The rows referenced in the TOP expression used with INSERT, UPDATE, or DELETE are not arranged in any order. TOP n returns n random rows.

Random Rows: WTF does that mean?

So if I do this:

DELETE TOP (5) FROM Table

The rows deleted are any 5 arbitrary rows that it finds? They aren't necessarily the same 5 rows that I can check using this:

SELECT TOP (5) * FROM Table

I'm awaiting some clarification from anyone who replies (to this blog or my email): What good does it do to have TOP for I/U/D queries if the behavior is considered random???


UPDATE:

Drew Robbins (Microsoft DE for Ohio) replied with this:

"John Miller and Luis Gonzalez from MS gave me some great feedback. Here are two scenarios where TOP would make sense:

  • batching: one in which you don’t care about which rows qualify, you just want to break one long transaction into smaller ones
  • The extension is particularly useful when combined with the OUTPUT clause for queuing scenarios"

Pretty much what Aaron and KT came up with (see comments), so nothing new.


UPDATE 2: Click Here to see this blog post for results of my exploring the behavior of UPDATE TOP(x).

Tuesday, August 09, 2005

SQL Server 2005 Presentation at next NWNUG meeting

Only a couple weeks left before the next Northwest Ohio .NET Users Group meeting (August 30, 2005).

http://www.nwnug.com/dotnetnuke/Default.aspx?tabid=31
(unsure if this is a permalink or not)

Should be a good session. A relatively unknown local speaker will be presenting on SQLCLR and TSQL enhancements in SQL Server 2005.

Monday, August 08, 2005

Weekend Over

We spent a good part of Saturday at the actual Twins Day Festival (previous post). Friday night was just a registration check-in, weiner roast, and party. Saturday was the festival itself, which was a lot like a street fair, only with better concessions than what we see around Toledo.

Weird story about Friday, though: We arrived and parked, and then a minivan with another couple (and their twin boys) parked beside us. We walked to the registration line with them following behind us, made some small talk with the wife, and then we disappeared into the weiner roast/party.

I later went back to the van to drop some things off and grab some juice, or something. This other couple arrived back to their van, and saw that I had a Toledo Zoo membership sticker in my window. They asked where I lived, and then stated that his brother lives in the Toledo area also. We introduced ourselves (he was Bob, she was some name that I forget). In an unprecedented moment, I asked what his brother's name was, just in case I knew him. Turned out to be John. Bob and John.... Boy, this guy standing in front of me sure looks familiar....

Then it dawned on me: I worked with Bob at a Boy Scout summer camp in 1992! John was his twin brother (so putting the names together is what activated the neurons storing that fact in my long-term memory banks). Both he and his brother knew my wife, too, and when she arrived back at the van a short while later, we all talked for a bit.

Just a strange coincidence that he arrived the same time as us, and was going to leave at the same time that I happened to be back at the van. Also, it's really out of character for me to ask what his brother's name was, which without that fact, I would have never made the connection.

Sunday was spent at the Cleveland Zoo (exhibits were about the same quality as Toledo Zoo, but the property is larger with some serious terrain/elevation changes) before heading home.

Saturday, August 06, 2005

Twinsburg Festival

We travelled out to the Cleveland area last night for the start of the 30th Annual Twins Day Festival in Twinsburg, OH. While neither my wife nor I are twins ourselves, we do have 16-month old boy-girl twins.

It's kind of a surreal experience, and you're constantly thinking that the matrix has just reconfigured yourself because there's deja vu everywhere you look. And this was just the night before the festivities--today, once we finally make it there, we will be seeing A LOT more people than last night!

Wednesday, August 03, 2005

Cool Flyover Captured

There's a whole subculture of astronomy that is interested in observing man-made objects that are part of the satellite constellation swarming in orbit around earth. When a satellite (or space junk or spacecraft) is illuminated by the sun while you are in the dark, it will appear to be a bright star slowly moving across the sky.

A great site to help you locate objects is Heavens-Above.

Part of the allure of satellite observation is the challenge of being able to accurately calculate the position of the satellite, as well as the orientation of the reflective surfaces in relation to your location (does no good if the solar arrays reflect the sunlight away from you, but if they reflect sunlight TOWARDS you, then the object will appear to be very bright, and will be easy to observe). The Heavens-Above website takes care of that for you.

Another part of the allure is to accurately be able to synchronize time between disparate systems (you, Heavens-Above, NASA, and Strategic Command all need to be synchronized). The window of opportunity is sometimes only seconds long, so you need to know where to look in the sky and exactly when to look in order to find the object. If you miss the window, then you may not get another opportunity (i.e., observing Space Shuttle flyovers).

Well, some people take this whole "sport" to a much higher degree. They actually are able to predict Solar Transits of objects (when the object crosses in front of the Sun as seen by the observer), and then photograph the silhouettes of the object against the Sun (using telescopes and solar filters). That requires incredible timing, because the window of opportunity to capture a transit is extremely small.

The Space Shuttle returned to flight within the past week for the first time since the Columbia incident. Before docking with the ISS, it did a "back flip" maneuver so that the astronauts on-board ISS could examine the Shuttle for damage. Well, it so happened that an astronomy group in Germany captured the back flip maneuver during a Solar Transit! Talk about being lucky!

http://shrinkster.com/75c

DNR Roadtrip

C4rL 4nd H1z p33pZ r 74k1n' 4 R04D7R1p 7H1Z F4lL.

http://www.dotnetrocks.com/roadtrip/

Looks like the closest location to me is Nashville (4-5 hours to Louisville, and another 3 hours to Nashville... Well, looks like I'm waiting for the Northern trip!)


(L33t translator available: http://www.jayssite.com/stuff/l33t/l33t_translator.html)

Tuesday, August 02, 2005

Winforms Datagrid Scrollbars

I don't get much chance to work with the DataGrid control in Winforms (.NET 1.1 Framework), but, damn does it seem buggy!

Like, today I had some code that was databinding against a DataTable within a DataSet. The first Databind() would result in scrollbars showing, but not being "live". That is, they did not appear to have their Min/Max and Values set per the data that was loaded in the grid (so, as a result, you couldn't use them to scroll the grid to see other rows or columns to the right, etc).

The second and subsequent Databind() operations would cause the scrollbars to work normally.

My solution (or workaround, depending on how you look at it) was to make sure that the DataGrid was enabled, and to SuspendLayout() prior to the Databind(). After the Databind() and any column resizing, I just did a ResumeLayout(), and voila! Working scrollbars every time.

Chalk this one up under the "I hope they fixed it in 2.0" category.

Sunday, July 31, 2005

IE7 Printing

Yay! They are actually providing the much needed improved printing abilities in IE7! Things like scale-to-fit, etc.

http://blogs.msdn.com/ie/archive/2005/07/31/445778.aspx

Now, the CSS zealots will still not be satisfied, stating that you should just use a separate CSS to layout your page when printed. I say that's crap--having the browser be able to scale down like Excel does is preferred by this developer, simply because I don't have time to fart around with separate stylesheets for every possible form of rendering... Let me layout for screen (keeping my horizontal scrolling to an absolute minimum), and have the printer follow suit.

Thursday, July 28, 2005

Casinos

My wife and I stole a night away from the kids for ourselves. She's always wanted to go to Las Vegas (me too, for that matter), but there wasn't enough time. So, we did the next best thing: A Riverboat Casino in Southern Indiana.

Neither of us had ever gambled before. I can't say that I'm a big fan of it, having left $70 at the casino, and never being "ahead" at any time. We didn't approach it as a way to make money, but rather as a form of entertainment ("let's see what this game is like", etc). Still, it would have been nicer to walk away with even $75 in my wallet (i.e., +$5) instead of nothing...

Casinos have been lobbying Ohio for some time now to allow operations in the state. After my experience, I would actually be in favor of it. I mean, there's always going to be problem gamblers, but right now, they travel to Detroit, Windsor (Ontario, Canada), Indiana, or Las Vegas to get their fix. If we had a casino or two in Ohio, then that money would at least stay in our state. And, depending on Ohio's (or the local municipality's) cut of the take, it could go a long way to help better education, roads, or whatever that money gets spent on. Maybe it could even lead to no state sales tax!??!

Also, Hotel-Casinos hire A LOT of people. I was surprised at just how many staffers we saw, and that doesn't count the behind-the-scenes staff. That is a lot of jobs that could be created in our state.

Some observations about this casino:

1. It's the amusement park for disabled people. Think about it: Cedar Point doesn't make sense for Great-Grandma or cousin Jim who got in a wreck and is now paralyzed from the waist down. But, sitting in front of a slot machine is actually enjoyable to a lot of people. There were wheelchairs EVERYWHERE!

2. $10 blackjack sucks when you only want to spent $20 total playing blackjack and you're not that good in the first place. It doesn't help that the dealer was pressuring me to make decisions. I would have played $5 blackjack, but the only $5 table was full.

3. Cheapskates like me should plan on gambling in the morning--the minimum bets are lower until noon. The $5 roulette that we played the night before was only $2 in the morning.

4. Roulette is probably what I consider "my game" since there is only a slight advantage to the house (the 0 and 00), but other than that, it's completely random, requiring no skill. But, lots of money would certainly help. We saw one guy come in, get $150 in chips, put it all on black, and walked away with nothing. One spin, and he was out. Another lady came in, got $200 in chips, and played numbers, (i.e., put $100 worth on various numbers or inside splits) and tripled her chips in only a couple of spins.

5. Dedicated gamblers who require oxygen around the clock don't care about being in a smoky casino.

6. Craps must be a complicated game, because it requires 3-4 staffers to run it, even if only 1 player is using the table. (We watched a little, but never played).

8. There are actually people out there who will play $100 slot machines (that's $100 per pull...yeah, I couldn't believe it either). There's even people who win doing this (pictures litter the entrance of $16,000 winners, etc).

9. Speaking of slots, that's what casinos are. Huge rooms full of slot machines. You can't escape the noise (it's like being in an arcade!). Slots, more slots, video poker, and then more slots. 1-cent, 5-cent, 25-cent, 50-cent, $1, $5, $10, $25, $50, and $100 slots. And not just simple "spin and see what lines up", but more like "Pick 1-5 lines, place a wager per line, and then spin". Takes about 20 spins or so before the "1-5" lines start to make sense. Start with penny slots if you want to understand this phenomenon.

10. Soft drinks are free (self serve at either end of the casino). Alcohol might be too, if you're sitting at a table game, but we didn't take the chance (already gave enough to "the house"). Waitresses wore very skimpy outfits, but probably appropriate for the environment.


Seems like everywhere we went, I was staring at Chick McGee or Drew Hasting's face. There's a Friends of the Bob and Tom Show (more) on August 13th, and the promo poster was posted in multiple places.

Monday, July 25, 2005

Vacation

Ah! For the first time in, well, a few years, I get to enjoy the ritual that we 'Mericans call "Vacation", which is sort of like Holiday for the rest of the English-speaking world, except there's generally less time involved because we 'Mericans are brainwashed into believing that we must work every possible hour of every possible day in order to get ahead.

It's the South Park 3-Phase plan to riches:

Phase I: Work your ass off and never take time off unless you're going to die, which would prevent you working, so better take care of that, but come right back when you're better.

Phase II: ???

Phase III: Profit.

Though, I'm finding that I don't know what to do with myself. I've been doing the same things that I normally do (surf the web, listen to DNR, read blogs, etc). There is more beer involved during the normal working hours than usual, so I've got that going for me... But, other than that, it's been uneventful so far.

I'm currently about 6-hours from where I live, so I won't be able to attend the local .NET users group tomorrow (Tuesday) in Toledo. Drew Robbins, the Microsoft Developer Evangelist for the Great Lakes Region, is presenting on VSTS. That's one demo that I would have liked to attend. Oh, well, ce la vie.

Thursday, July 21, 2005

Optimizers

I've worked on a lot of software in my 10+ year career. The vast majority has been the typical pull-data-out-of-a-database-and-show-it-on-the-web type of system. Extremely boring, and far from my roots in engineering and mathematics.

Thinking back to all of the systems that I had some kind of internal visibility to, the most exciting for me have been those involving creating optimal solutions to a problem. I mean, this is exactly why computers exist--not just composing a memo to tell your co-workers that there's going to be a potluck next week, or finding out how much tax you owe at the end of the year. I'm talking real problems that save companies money.

Like geocoding all of the stops that a delivery company needs to make within a city, figuring out the minimum number of trucks that are required for that day's manifest of freight, and exactly which routes the trucks should take through the city's streets in order to minimize delivery time and maximize fuel savings.

Or determining where to put freight on an aircraft in order to first ensure that the C/G is within the envelope (so the thing will fly), and then to optimize the fuel burn.

Or determining the cheapest blend of metal that results in an alloy with a specific set of properties.

These kinds of things are why I stay in this field (besides the fact that I could never cut it as a musician). The downside is that the resulting system no longer requires a knowledgeable person to operate it (downside for the Operator, that is). I mean, all of these things were done by somebody manually before using the same type of iterative processing. With an optimizer, immensely more possible solutions can be explored before determining the truly optimal solution, and as a result, you tend to get a better solution, which equates into bigger $avings.

Monday, July 18, 2005

CodeSmith to MyGeneration converter

This is interesting: The guys at MyGeneration Software (the 2-man collaborative effort with the great FREE code generator, O/R mapping tool, and architecture product) have a CodeSmith-to-MyGeneration Converter available (CodeSmith is a well-known code generation tool by Eric J. Smith et al, that sports an ASP-like syntax for its templates).

SQLCLR and Serialization

I was playing around with SQLCLR and found a scenario that confused me for a long time:

I created a small class library that contained two classes. One class instantiates the other class, which is marked as Serializable. A public method of the parent class serializes the child class using a BinaryFormatter, and returns the resulting byte array. Simple, right?

Well, I imported this class library as an assembly into my SQL Server, and was able to use the Safe permission set without a problem.

I then proceded to create a CLR Stored Procedure using Visual Studio.NET 2005 that would instantiate the parent class from my previous library, and invoke the method that would serialize the child class. I built the project, had VS deploy it to my SQL Server, and then I tested the stored proc in Management Studio.

It blew up with an error resembling the following (some names were changed to protect the innocent):

Msg 6522, Level 16, State 1, Procedure Z_Start, Line 0A .NET Framework error occurred during execution of user defined routine or aggregate 'Z_Start':

System.Security.SecurityException: Request for the permission of type 'System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.System.Security.SecurityException:

at System.Security.CodeAccessSecurityEngine.Check(PermissionToken permToken, CodeAccessPermission demand, StackCrawlMark& stackMark, Int32 checkFrames, Int32 unrestrictedOverride)

at System.Security.CodeAccessSecurityEngine.Check(CodeAccessPermission cap, StackCrawlMark& stackMark, PermissionType permType)

at System.Security.CodeAccessPermission.DemandInternal(PermissionType permissionType)

at System.Runtime.Serialization.Formatters.Binary.ObjectWriter..Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck)

at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck)

at Namespace.ParentObject.Serialize()

I played with everything that I could think of, changing the permission set of my first class library from SAFE to EXTERNAL_ACCESS to UNSAFE. Nothing worked. To me, it seemed like a bug (and I even filed a bug report).

Turns out to be a problem with this developer. Though I played around with the permission set of the one class library, I was totally forgetting that the stored procedure's assembly has its own permission set too. I was using VS to deploy the assembly, so I wasn't concerning myself, per se, with what VS was doing with it. Come to find out, that by default, VS marks SQLCLR projects as SAFE. In order to use Reflection (which the BinaryFormatter uses when serializing objects), you need at least EXTERNAL_ACCESS permissions on ALL assemblies in the call stack, not just one or the other.

A quick trip into the project's property page allowed me to change the stored procedure assembly to EXTERNAL_ACCESS, and then my test worked as expected. Credit to Erland Sommarskog (who reviewed my bug report and posted that EXTERNAL_ACCESS worked for him).

Now onto more playing around....

Sunday, July 17, 2005

My Impulse Buy

I stopped in at the local Guitar Center this evening, and walked out with a Yamaha FG730S. I normally don't buy something without reviewing it in depth beforehand, but, this was different. This was impulsive. And, dammit, this sounds NICE! Especially compared to the no-name that I was previously plucking.

I see that it's a highly rated guitar, but I couldn't tell you anything about it for sure. All that I really know is that I walked out with a Yamaha. But, that's kind of like saying that I went to a car dealership and drove away in a Ford. Was it a Focus, Freestar, F-150, Mustang, or Crown Victoria? No clue, but it sure does drive nice!

My only real requirement that I told the sales guy was that I needed something easy to fret. He gave me this, and I loved it.... Though, I probably would have loved anything that he put into my hands at that moment. We'll see. It was only $300. I'll just eat PB&J for lunch this month.

Thursday, July 14, 2005

SQLCLR and Events

I'm still trying to figure out all of the ramifications of creating Assemblies in SQL 2005 that are marked Unsafe. Seems like the easiest way to get things done, but that's probably not the best way to think of the "Unsafe" permission set.

One of my libraries that I attempted to import today had some events in the object model, and SQL Server didn't like that (I was trying to mark it as a Safe Assembly) because the add_xxx method that the compiler tacks on for events is attributed as Synchronized, and apparently, explicit synchronization is bad, or otherwise unsafe, as far as SQL Server is concerned.

In my case, the events were simply part of an Observer pattern, and I was looking for a callback mechanism to alert the parent when something particular occurred in the child. I managed to get the code working using straight delegates (i.e., only 1 "event" handler would be allowed), and then SQL Server let me create the Assembly and mark it as Safe.

I'm probably making this more complicated than it needs to be, but I can't tell what's my fault and what is the fault of the beta software.

Playing around with SQLCLR

I had a lull in my assignments yesterday, which gave me a great opportunity to familiarize myself with SQLCLR (creating stored procedures, functions, triggers, and other SQL Server objects using .NET).

From the outside, the concept seems very cool (i.e., you can write everything in .NET code). But, a closer look shows that this is more similar to being a layer that just happens to run on the database to augment native database code instead of a full-fledged replacement for the database code.

Creating a CLR Stored Procedure is definitely a trick that you want to save for times when T-SQL just won't work, or would be overly complex. SQLCLR probably would not be appropriate for your everyday CRUD (Create, Read, Update, Delete) stored procs which are easily created using traditional methods. But, if you have some semi-complex processing, for example, where you need to do some looping (i.e., a for-loop or a while-loop), then a CLR Stored Procedure would definitely be appropriate.

Think about this:

The .NET code does not have native access to the database, like T-SQL does. As a result, the .NET code must still use ADO.NET to execute T-SQL in order to access data. So, since you never actually get away from T-SQL, you should probably plan to still create T-SQL stored procedures to access from your CLR stored procedures whenever possible (i.e., CRUD procs that your .NET code requires instead of building SQL in strings inside your code).

I also discovered a bug yesterday while trying to access CLR stored procedures from OSASPADO ("oh-SAS-pah-doh", or Old-School ASP/ADO), which was confirmed by Bob Beauchemin.

Don't misinterpret this post as thinking that SQLCLR is lackluster. It's an awesome addition to the SQL Server platform. But, it's very important to understand its limitations and design your systems around them.

Tuesday, July 12, 2005

Internet Explorer Printing without Clipping Tool

Scott Hanselman posted today about FinePrint, which is an abstraction layer between the application and the printer driver. Your application renders the output to FinePrint's virtual printer driver, and then you can manipulate the results before they get sent to the actual printer (i.e., so that you can print multiple pages on one sheet of paper, play with margins, capture the printed output to the clipboard as a graphic, and other neat stuff).

I raised the question in the comments about whether or not a tool existed that would print web pages without the dreaded right-side clipping of text/graphics. Sure enough, there is!

Kent Chen posted this link, and he also has a blog entry describing it (which in turn, points to a blog entry, etc). Thanks for the heads-up, Kent!

IE Fitted-Width Printing: http://www.visiontech.ltd.uk/software/#IEPrint

But, the best news is that it appears that the IE7 team is working on adding this type of functionality right into Internet Explorer. AWESOME!

VirtualPC Problem/Tip

Every now and then, I'll launch a Virtual Machine using VirtualPC, and the screen will not change (does not refresh). I can move my mouse, but the VPC's pointer remains frozen. If I minimize the VPC window, and then restore it, the picture updates, but still remains static (so I know that the VPC is working, and it's just the screen that is not updating).

This problem seems to be related to power saving modes of my laptop. I almost never shut my laptop down, but rather just use the sleep function that kicks off when I close the display. If I leave a VPC running when the laptop sleeps, then I can almost guarantee that the screen problem will occur. However, sometimes, it occurs even when VPC (or the VPC console) is not running.

I found that when this occurs, that I can "fix" the problem by shutting down all VPC sessions (saving state, if appropriate) and then closing the VirtualPC Console. Next, start the VirtualPC Console again, and then start the VPC, and voila! Should be fixed.

This is a lot better than my old fix, which was a total system reboot.

Monday, July 11, 2005

Real World Endianess Example

With gasoline being a commodity, my brand loyalty is non-existent. Whichever station has the lowest price gets my dollar (or actually, as of this morning, my $2.34 per gallon). Oh, and the gas station MUST have pay-at-the-pump, else I don't patronize them.

One itsy-bitsy problem with bouncing between different gas stations and using pay-at-the-pump is that you have to figure out which direction to swipe your credit card in order for the pump to read it.

Sometimes, the stripe has to go to the left, sometimes to the right, and some pumps have cool readers that can read the card in either direction. I find that I always have to look at the little picture on the pump, turn my body (mentally) while holding the credit card so that my name is facing me, and then insert the card into the machine as indicated in the diagram.

Doing so this morning, I realized that this is very similar to the Endiness issue that exists with today's microprocessors. The credit card has one side that is the most significant (the side with the magnetic stripe). Inserting a card into the reader the wrong direction results in the card not being read.

Likewise, when a computer reads a value from its I/O, it expects the bits of the value to be arranged in a certain order. If the order is reversed, then a wrong value will be read in, which can have some pretty bad consequences. Some processors are "Big Endian" (i.e., Motorola), some are "Little Endian" (i.e., Intel), and some can be switched to handle either type of Endianess (i.e., ARM, PowerPC, etc). This is where I draw the parallel to the card readers at the gasoline pumps.

Saturday, July 09, 2005

Self heating coffee

As covered on Slashdot, here's a guy who took apart a self-heating coffee product to see how it works.

Interestingly, the source of heat comes from Calcium Oxide, which is also known as Quicklime. Basically, if you take some calcite limestone (Calcium Carbonate, that's the bedrock where I live) and heat it for a long time, it turns into Quicklime (and in the process, releases Carbon Dioxide). Add water to Quicklime, and I *think* that it turns into hydrated lime (Calcium Hydroxide?), but in the process, gets very hot.

The self heating coffee apparently has about 8oz of Quicklime powder packed into a chamber of the cup itself, and when activated, water is introduced into the Calcium Oxide, creating the chemical reaction.

In high school Chemistry class, we made Quicklime, and our teacher then instructed us to hold a small piece on our hand and add one drop of water. We learned "first hand" what an exothermic reaction was!

Friday, July 08, 2005

My Name was beside Rockford Lhotka's

I pulled out a book today that I served as one of the Technical Reviewers for (Professional Visual Basic 6 - The 2003 Programmer's Resource published by Wrox Press ISBN 1-86100-818-X), and looked again at the credits page (just to see my name in print, if you have to know), there was Rocky's name under the category "Original Material" and also "Additional Material", whatever that means. He also wrote the book's Forward.

Now if only I knew who Rocky was back in 2002/2003...

Wednesday, July 06, 2005

Word Wrap Version 2

I played around with the word wrap algorithm for a little bit, and came up with the following. I think it's better than my previous code, and simply inserts breaks into a string builder that already contains the text that needs to be split.

One challenge for my scenario is that my text might already have some line breaks in it, and I need to preserve those. Also, the text might have some indenting at the beginning of the line (i.e., spaces after the new line character), and it would be wrong to trim those out.

StringBuilder sb = new StringBuilder(text);

int lastBreak = -1;
int newBreaks = 0;
int lineStart = 0;

for (int i = 0; i < text.Length; i++)
{
if (text[i] == ' ')
{
lastBreak = i;
}
else if (text[i] == '\n')
{
lastBreak = i;
lineStart = i + 1;
}
if (i - lineStart + newBreaks >= m_width)
{
newBreaks++;
sb.Insert(newBreaks + lastBreak, "\n");
lineStart = newBreaks + lastBreak + 1;
}
}

Console.Write(sb.ToString());

Line Break/Word Wrap Algorithm

Anyone know of a good Line Break/Word Wrap algorithm? Word Wrapping is something that I take for granted, since most Windows UI elements take care of it for me (i.e., textbox, web browser, etc).

I wanted my console application to wrap at 80 characters, but my 5 minutes of searching didn't return anything especially useful or simple.

I wrote the following, but I'm sure it can be done better somehow:


string[] blocks = text.Split("\n".ToCharArray());

for (int i = 0; i < blocks.Length - 1; i++)
{
if (blocks[i].Length < m_width)
{
Console.WriteLine(blocks[i]);
}
else
{
int j = 0;
while (j < blocks[i].Length)
{
string tmp = blocks[i].Substring(j).TrimStart();

if (tmp.Length > m_width)
tmp = tmp.Substring(0, m_width);

int k = tmp.LastIndexOfAny(",.?!- ".ToCharArray()) + 1;

if (k == 0)
{
k = tmp.Length;
}

Console.WriteLine(tmp.Substring(0, k));

j += k;

}
}
}


By the way, there's an improved version at:

http://jasonf-blog.blogspot.com/2005/07/word-wrap-version-2.html

MyGeneration

A peer of mine (Justin) from another branch of my company has written a kick-ass code generator along with another ex-employee of my company (and old MS employee, if I remember correctly).

MyGeneration continues to receive accolades and favorable reviews. The best part, is that it's Free!

Check it out!

Excel Database

Once again, I was given a "database" implemented using Excel that I now have to use as a regular import data source. Sigh.... And inevitably, users will start to insert columns into the already established spreadsheet layout, and I'll get the call when the import fails.

Rory has already covered this corporate-world trend in just about the funniest (and relevant) comic that I've ever read:

http://neopoleon.com/blog/posts/434.aspx

or all of his blog's comics:

http://neopoleon.com/blog/category/16.aspx

Tuesday, July 05, 2005

ZMachine Continued

My little project of writing the ZMachine interpreter class in C# continues. Let's just say that I'm able to play story files now! One step closer to my goal (why am I doing this labor of love? I'll explain at a later time, but let's just say that it should be a cool demo of something).

THE HITCHHIKER'S GUIDE TO THE GALAXY
Infocom interactive fiction - a science fiction story
Copyright (c) 1984 by Infocom, Inc. All rights reserved.
Release 59 / Serial number 851108

You wake up. The room is spinning very gently round your head. Or at least it would be if you could see it which you can't.

It is pitch black.

>turn on light
Good start to the day. Pity it's going to be the worst one of your life. The light is now on.

Bedroom, in the bed
The bedroom is a mess.
It is a small bedroom with a faded carpet and old wallpaper. There is a washbasin, a chair with a tatty dressing gown slung over it, and a window with the curtains drawn. Near the exit leading south is a phone.
There is a flathead screwdriver here. (outside the bed)
There is a toothbrush here. (outside the bed)

>get up
Very difficult, but you manage it. The room is still spinning. It dips and sways a little.

>take gown
Luckily, this is large enough for you to get hold of. You notice something in the pocket.

>wear gown
You are now wearing your gown.

>open pocket
Opening your gown reveals a thing your aunt gave you which you don't know what it is, a buffered analgesic, and pocket fluff.

>eat aspirin
You swallow the tablet. After a few seconds the room begins to calm down and behave in an orderly manner. Your terrible headache goes.

>get all
telephone: You pick up the receiver. A moment later, the dialing tone is suddenly cut off. Glancing through the window you can't help but notice the large old oak tree of which you are particularly fond crashing down through the phone cable.
flathead screwdriver: Taken.
toothbrush: As you pick up the toothbrush a tree outside the window collapses. There is no causal relationship between these two events. Shouldn't you be taking more interest in events in the world around you? While you've got it...?

WAHOO!

I just found a bug in my ZMachine interpreter that I've been trying to track down for the last 5 days or so. Not that it will mean anything to the casual reader here, but I coded the STOREW opcode to use address ARRAY + byte_index, when really it was ARRAY + (2 * byte_index). My LOADW was correctly coded.

So, as I ran HHGG.Z3, I would get to the first prompt just fine, but my "TURN ON LIGHT" would always result in "I don't understand that".

Now I can finish implementing the opcodes.....

Monotony

I'm a consultant. I travel from client to client, gig to gig, solving their problems and writing software for them to use internally.

And you know what 80+% of that work turns out to be? Pulling data out of a database and displaying it on a web site. EVERYBODY needs this, and this is what every interactive system does.

At an abstract level, every client gets the same system that I previously wrote for a different client. It's their DSL (Domain Specific Language) and other nuances that makes templating the previous system somewhat of a challenge, and is what guarantees my continuing revenue.

I can't tell you how many times I've sat in elaborations where the client thinks this is some kind of novel approach to business, and they're so excited about getting started. But, to me, it's busy work. It's boring. It's been done before. It's old school.

Wanna know a secret? I have to invent new ways of doing things just to keep my mind from imploding on itself. Sometimes, they work, sometimes they don't. Luckily, in the latter category, I have previous successful implementations to recall when I'm in a time crunch.

So, the end result is that my customers are actually paying for innovation for my own selfish reasons, but think they're just getting a vanilla pull-data-from-a-database-and-display-on-a-website system.