October 2004 Blog Posts

Thank Heaven (or Microsoft) for System Restore

Just like everyone has that "I forgot to back up and now my ass is in a sling" story, lots of folks who have learned from those experiences have at least one "My ass was in a sling but I had backups that saved the day" story.

That just happened to me.

I was working on a product demo that required the installation and use of the Loopback Network Adapter to ensure the demo wouldn't come up on the local network, only my machine.

So I installed it, did the demo work, and went home for the day. Everything was peachy.

Got in this morning, booted up, and none of my networking connections worked - only the Loopback Adapter. I tried to disable it, but it wouldn't disable. Everything was hosed. I tried several things, including attempting to disable/re-enable all of my network connections and removing the Loopback Adapter completely. Rebooted several times over the course of that with no luck. And then...

...System Restore saved the day. There was a system checkpoint saved from yesterday morning and once I restored to that point, everything was back up and running, minus the stupid Loopback Adapter.

Thank you, Microsoft, for bailing my ass out.

Shopping Spree

I went after work yesterday and picked up the strategy guide for Grand Theft Auto: San Andreas.

This thing is a monster. 272 pages. About an inch thick. By way of comparison, the strategy guide for the previous GTA game is only 176 pages.

I've refrained from playing the game, though, saving it for next week. Or at least this weekend. I know that if I start now, I'll never stop. Like an addict falling off the wagon. (Where did the phrase "falling off the wagon" come from? Was there some wagon that addicts got on at some point?)

In the meantime, I've gone on a minor Amazon spending spree, cashing in on the Yahoo! Visa points I've acquired over the past year. To satisfy my cravings, I bought: the seventh season (and final) of Buffy the Vampire Slayer, indicating the end to a lot of money spent until the next killer show rolls around; a Star Wars Millennium Falcon (for the 3.75" figures - I never had one when I was a kid and now I really want one); and, on strong recommendation from a friend of mine, the Sony RM-VL900 learning remote, since I'm sick and tired of having to juggle - seriously - six different remotes because I can't find a damn remote that just does everything.

I tried for the "Super Saver Shipping" deal on Amazon, where you get free shipping with your order over $50, but it would only end up saving me like $3. Somehow I bought a load of stuff that doesn't qualify for the free shipping. (Granted, the Falcon comes from Toys R Us and the remote comes from DynaDirect, but come on.)

Thus, I am looking forward to cool things showing up in my mailbox very soon.

In other news, we watched Lost last night, and after having missed two or three weeks' worth of shows, I don't feel like I'm behind. Strange, but maybe the little "previously on Lost" segment at the beginning of the show summed things up. Then again, from the hour-long show I watched, I didn't see a whole lot of plot progression. It was mostly some background and development on the characters themselves, giving insight as to why the people are the way they are. Interesting stuff, but you could sum up in a couple of short clips the development that occurred relating to the island itself. Intriguing, nonetheless.

$110 Lunch

I found last night that I had my driver's side low-beam headlight out, so I figured I'd head over to Oil Can Henry's to get that replaced during lunch today. Figure you gotta remove half the engine to get to the damn headlight socket, it's worth the $20 parts and labor to replace the lamp.

I called 'em up this morning to make sure they did that service (they do) and to verify they had the kind of bulb my car takes (they did).

Got there at lunch and they do replace headlights, but they didn't have the right kind of bulb.

Made a quick trip to the auto parts store and got a pair (you're supposed to replace headlights in pairs) of the only kind they carried that would fit my car. Of course, they only had the top of the line $25/bulb kind, so that's $50 I'll never see again.

On the way back, stopped at GameCrazy and got my fix for next week. $50 more, but better spent.

Took the bulbs back to Oil Can Henry's and it took four guys to install them. The part where they had me turn on my lights to check the installation, asked me to "make sure my lights were on," then started laughing when I confirmed the lights were all the way on... that didn't raise my confidence. But when all was said and done, it only cost me $10 to get both changed, so I can't complain much about that.

All told, that's $110 I blew at lunch. Damn. And people tell me that my house is a money sink.

San Andreas In The House

I have, in my grubby little hands...

Grand Theft Auto: San Andreas

Next week is going to ROCK.

The Thanksgiving Debate

This weekend started the annual Thanksgiving Debate.

A little background: If tuna is "Chicken of the Sea," then turkey is "Chicken of the Devil." I hate turkey. I hate everything about it. Even further, I hate the whole concept of the "traditional dinner" - stuffing and cranberry sauce and greens and turkey and mashed potatoes and rolls and all that crap. Hate it. Hate it.

Not to mention I'm not altogether keen on the "large family gathering" thing. I can deal with immediate family members, I can deal with my grandparents, etc., etc., but I can't deal with them all simultaneously. As Mom says, "it drives me bug-ass crazy."

So. Thanksgiving every year involves me carting ass to two different houses - Jenn's family dinner and my family dinner - just to get there and go through the whole "you don't like turkey?" discussion. It goes like this:
Relative: You don't like turkey?

Travis: No. I don't. I haven't liked turkey for years.

Relative: (Incredulous) How can you not like turkey?

Travis: Is there a food you don't like?

Relative: Sure. I don't like [insert food here].

Travis: How can you not like [insert food here]?

Relative: Because it's gross. But turkey? Everyone likes turkey.

Travis: Well, obviously not everyone likes turkey.

Relative: Whatever. I guess you can just eat mashed potatoes and rolls for dinner.

Travis: Hey, that sounds great. That way not only can I continue sitting at the "kid table" and be kept from any decent dinner conversation, but I can also sit alienated at that table because I don't want to eat what everyone else is eating. Fucking brilliant. While you're at it, why don't you just give me a paper cut and pour lemon juice on it?

And that pretty much sums up how the entirety of Thanksgiving Day goes for me. I have that same conversation with every single relative, over and over, until after dinner (which is at something like 4:00p... who's hungry at 4:00p?!?!), at which point I'm ready to go into a coma from carb overload and that's when people decide it's time to play games.

Bah.

I've declared a moratorium on Thanksgiving this year. I'm not going anywhere. I'll be at my own home. If people want to eat with me, they can come over.

But no turkey.

Nope. None. I'll go get some Chinese the night before and whoever's eating at my house can have Chinese with me. I'm a big fan of the General Tso chicken.

Jenn's told me that she doesn't want to be there if I'm not having turkey. You'd think that'd make me cave, but in reality, I don't care. If she wants turkey, she can haul over to the other side of town where they're eating turkey.

An additional issue has been raised this year, beyond the turkey issue: We don't have much furniture. We don't have a full dining room set or a load of extra chairs or anything. We have a couch, a bistro set, a coffee table, and that's about it. I admit there's nowhere for people to sit, barring the floor, which is a perfectly acceptable solution to me and people in many, many other countries. I figure if people want chairs, they should bring 'em.

Does that make me unhospitable, or a "bad host?" Maybe. But I don't care. I'm tired of having the holidays turn into a rampant waste of my paid time off. I'm on vacation, but it's a huge chore and only leaves me pissed off when it's over.

Now I've gotta figure out how to tell Mom "no turkey." We'll see how that goes.

Fusion Log Viewer Settings Changer

The Fusion Log Viewer (in pre-.NET-2.0) is a great tool but is a pain to work with if you're working with ASP.NET apps. The built-in ASP.NET log setting is useless, which means if you're going to debug ASP.NET, you need to use the Custom setting. MSDN talks about how to do this, but I find I do one of two things, always:

  1. Enable logging in a custom folder (sometimes logging everything, sometimes logging only failures
  2. Disable logging to the custom folder (and, in most, if not all cases, logging of binding in general, including failures)


To that end, I wrote a little script to handle that. From the command line (available by running the script with a "/?" parameter):
FusLogVwSet
This script "enables" and "disables" custom settings for the Fusion Log Viewer tool.

Enabling settings will:
  • Create a log folder (default: C:\fusionlogs)
  • Add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion\LogPath and set it to the log folder
  • Set HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion\LogFailures to 1
  • Optionally set HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion\ForceLog to 1
  • Optionally set HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion\LogResourceBinds to 1

Disabling settings will:
  • Delete the log folder and its contents
  • Delete HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion\LogPath
  • Set HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion\LogFailures to 0
  • Set HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion\ForceLog to 0
  • Set HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion\LogResourceBinds to 0

Usage: FusLogVwSet.wsf [/enable] [/all] [/disable] [/logpath:value]

Options:

enable : Enable custom fuslogvw.exe settings.
all : When used with /enable, logs both failures and successes. Only valid with /enable.
disable : Disable custom fuslogvw.exe settings.
logpath : Sets the log path (default is C:\fusionlogs). Only valid with /enable.

If you use the Fusion Log Viewer to debug your .NET assembly bindings, this is pretty handy stuff.

Note that since it writes to your registry, you need rights to do that. It'll fail if it can't write the appropriate keys.

[Download FusLogVwSet.wsf] (right-click, save-as... then rename the txt file to ".wsf")

(Of course, no warranty, expressed nor implied... use at your own risk, etc.)

Less Angry Today

Okay, so, like, I was a little harsh yesterday, maybe. Not that I'm recanting my opinion of general incompetence, but I do have to give props to one of the guys in the namespace meeting yesterday who finally came around and saw the importance of this and arrived at a solution equitable for all parties (you know who you are).

Anyway, I cranked up the tunes, stewed about it for several hours, slept on it, woke up still pissed, and now I'm back at work, still feeling a little feisty but not nearly as belligerent as yesterday.

Not that it's really an excuse, but I just don't take to being set up for failure too well. I continue to maintain that anyone can code; if you want it done right, in a quality fashion, that's when you call me in. I won't sacrifice quality, folks. It's against every fiber of my being. We will get into it if the removal of quality from the project is a goal (even if it's not explicitly stated - by providing conflicting requirements and continually accelerating the development process to an arbitrary, too-soon date, that's what you're asking for: low quality). Not an option. Not on my watch.

Sheer Incompetence

I was trying to keep this bottled in, but after today I'm realizing that I'm attempting to internalize a frustration beyond my abilities to control, so it's time to release it upon you.

I am sick and fucking tired of the level of sheer incompetence in the world.

I went to the fabric store the other day to buy some stuff to work on my Halloween costume. Just a spool of thread and some elastic. The ridiculous incompetence when I reached the cash register was dumbfounding - and I'm not even talking about the staff! It's the customers! Do you really have to count - twice - all $0.97 you got back in change... while standing at the register and holding up the only open checkstand? Making small talk while you're doing it doesn't make it better, it makes you stupid. Get out of the way so the other 15 of us standing in line can get through.

That was the part I was going to bottle inside. I was going to let it go. Then I got into a set of meetings today regarding the project I'm working on. A mysterious and arbitrary requirement showed up that the new product we're working on - a standalone API - should be somehow "backwards compatible" with a nearly unrelated product. Not only that, but the idea reared up that the taxonomy of classes in the API was nigh unto irrelevant.

I won't lie to you, folks. I'm anal about stuff like naming conventions, standards, and taxonomy when coding, especially when it's lower-level API stuff that other people will be using as the foundation for their applications. I believe stuff should be elegant, well made, and simple to pick up and use. Familiarity is key for the developer - if it's named in a familiar and conventional fashion, it will be easier to learn and use.

So when it comes out that people think a class like "TopLevelNamespace.MyReallyCoolClassThatDoesNeatStuff" is a better idea than organizing the class hierarchy by namespace to group similar classes, like "TopLevelNamespace.Stuff.Neat.ReallyCool.MyClass," I reach a state of insurmountable cognitive dissonance. The idea that people want "standards" but won't even take the time to name things properly is... I don't even know what it is. It's not even comprehensible to me. Like "new math."

Anyway, we got into it for quite some time, and even after I ended up basically coming out ahead (and maybe enforcing a little structure on the chaos), I didn't feel good about any of it. Having to even have that debate... it should never have happened. If people did things right the first time rather than jamming stuff together over a couple of days and calling it 'done,' we wouldn't have this going on. Instead, I have to fight people to make robust, extensible, easily debuggable code. Astounding. Do people not think ahead?

Then you still have the idea of "backwards compatibility" with this unrelated product. I ended up coming out on top there, too, but you have to dumb down the argument in order to get it to sink in. "We're making a square peg factory and you want it to output things that will fit in round holes. Somehow that's not going to work." Then you get stuff like, "Well, can't you make a square-peg-to-round-hole-adapter?" No! It's a new thing! We're basing our whole framework on the idea that holes and pegs are square!

Argh! I've got my angry music on, and I may just have to wear my combat boots tomorrow.

Weekend Movies Quickie

Watched the Aladdin DVD this weekend. Good stuff. Thought it was interesting that the version of the opening song on the soundtrack is different than the version on VHS and DVD. Good to see it again, though.

Saw a preview for a movie, National Treasure. I think it could be cool. Of course, I've seen a lot of trailers for movies I want to see but haven't gotten to. Maybe I'll make this one.

Random Blast

No one particular thing driving this post, more just a random blast of thoughts and items.

The Winter Hawks canned the best (in my opinion) player on the team, Robin Big Snake, apparently because he was being a little mouthy. Apparently he's now playing for the Owen Sound Attack (whoever that is). I'm still trying to piece it all together, but it's sounding like scandal. Heh.

I was a big fan of Schoolhouse Rock, and while this isn't real Schoolhouse Rock, it's a pretty funny take on it. Check it out - Pirates and Emperors.

We watched the Star Wars movies last week and now I'm really itching for a Millennium Falcon. Anyone love me enough to pony up? No? Darth Vader's Tie Fighter maybe? Guess I'll have to save up a bit (after the tires last week, I'm running a little low on funds).

Class Descriptions According To Cajun Man

I'm not sure how my mind works or why it thinks of these things. Maybe I'm thinking of work too much. Thing is, I've had to explain this "Navigation Service" class that we're working on more times than I care to count. (The Navigation Service is a class that helps in providing navigational menus, breadcrumb trails, and other navigational artifacts by maintaining an object hierarchy representing the site... basically.)

So I was on the way home last night and decided it might be described best by Adam Sandler's "Cajun Man" character:
Presenter: The Navigation Service provides an object-oriented view of the site map, related links, and quick links for a site. You can use it to display, for example, a tree-view of the available pages for a site.

Cajun Man: Hierarchical presenta-shawn.

Presenter: The Navigation Service is accessed through a property available in the base page class. You could cache an instance of the Navigation Service class and then access that cached instance through the property on the page.

Cajun Man: Singletawn.

Presenter: When getting a reference to the Navigation Service, you don't actually create the instance directly. Instead, call the static "GetNavigationService" method and it will get an instance for you.

Cajun Man: Factory crea-shawn.

Presenter: What the Navigation Service does is it takes the navigation.config file and reads it into an object model based on the file schema.

Cajun Man: XML deserializa-shawn.

Presenter: Then it does some manual processing to make the objects just a little bit "smarter" than that, filling in calculated values and such.

Cajun Man: Initializa-shawn.

Presenter: If you have a bunch of, for example, "Item" elements in the "Site," those will come out in the Navigation Service as a…

Cajun Man: Strongly-typed collec-shawn.

Presenter: Right. And if there are no elements in a collection, you end up with…

Cajun Man: Empty collec-shawn.

Presenter: Well, no... actually you get a null value, though the Navigation Service could be updated to make any null collections be empty collections. That way you could just iterate over the collection rather than having to check for null all the time.

Cajun Man: No NullReferenceExcep-shawn.


...that's as far as I got before I made it home and my train of thought was lost, but I think you see how it goes. While I'm nowhere near as funny as Adam Sandler, maybe I can use this to explain (in a memorable fashion) how this thing works. Heh.

Of Tiny Cats and Camera Phones

Tiny cat mugs for the camera - Click to enlarge

New Tires

I was headed to the hockey game last night and noticed I had a flat tire before I pulled out of the garage. On further inspection, all four tires were totally bald. Time to get new tires.

Went to Les Schwab this morning and picked up some new tires. $681 later, I was on my way to work. (Admittedly, I bought some pretty decent 65,000 mile performance tires, not your stock generic tire.)

Damn, tires are expensive.

24 In Less Than 20

Saturday morning at 8:00 my dad showed up, and by 8:30 we were starting the first episode of the second season of 24.

Over the course of the rest of the day, we watched, back to back, the entire season.

We took breaks, of course, to go get food, sit and talk, and so on. We lost a little time on those, but considering there are almost 20 minutes of commercials in every episode when it airs, it only takes about 16 hours to see all 24 episodes.

Dad left a little after midnight, skipping out on the final four episodes of the season (those were the ones he had originally seen when they aired; he hadn't seen the rest), but I watched them, finishing up a little after 3:00a the next day.

It was a blast. I love hanging out with my dad, and getting a chance to watch a great story over the course of a day with him gave me the same feeling that you have when you're a kid having a sleep-over with friends: sort of giddy... and a little sad when it's time to go home.

We ate junk food (donuts, candy bars, pizza, pop... you name it) and did nothing but watch the show. It ruled. No responsibility, no jobs, no problem solving. True decompression.

I noticed an interesting thing after finishing the show. After spending basically a day with the characters in the show, you get to know them and like them. You see how they interact with each other, you see how they live their [fictional] lives. After that day with them, it's hard to believe they don't exist, and it's hard to see the story end because they've become your friends.

That happens to me after reading a good book, too, and it makes me realize how people can get attached (and even lose touch with reality) after watching soap operas and other long-running serials for years on end.

Then again, I don't know it would have happened had I watched on a week-by-week basis the way it's broadcast. As it was, I had a hard time keeping track of all of the subplot threads going on and occasionally had to watch the "last time on 24" summary at the beginning of the show to keep it all straight.

It also makes me wonder what would happen if I watched some other show back to back like that. Alias, maybe. I already know those characters; would it have the same effect, or would it anything change at all?

PTO Scheduled for GTA

I just scheduled - and got approved - my week of luxurious paid time off duing the first week of November for...

Wait for it...

Grand Theft Auto: San Andreas!

That's right! The entire first week of November, my vacation in San Andreas begins. I will be sitting on the couch, eating junk food, sitting next to my 16-pound fat cat (who likes to lay around next to people playing video games - it's my Tubby Game Cat), doing drive-by shootings and robberies. Living the life of Grand Theft Auto.

I seriously can't wait.

NAnt and HintPath

I'm working on a Visual Studio .NET add-in project where we need to be able to build the project both through the Visual Studio IDE and through NAnt.

So I've got NAnt 0.84, which builds all the other projects (using the <solution> task) I've got just fine, but gives me this error:
System.NullReferenceException: Object reference not set to an instance of an object.
at NAnt.VSNet.Reference..ctor(Solution solution, ProjectSettings ps, XmlElement elemReference, SolutionTask solutionTask, String outputDir)...


And so on, tracing down the whole call stack. What's the deal?

As you (probably) know, references in a .csproj file look like this:

<VisualStudioProject>
 <CSHARP>
  <Build>
   <References>
    <Reference
     Name = "EnvDTE"
     AssemblyName = "EnvDTE"
     HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.1.4322\EnvDTE.dll"
    />
   </References>
  </Build>
 </CSHARP>
</VisualStudioProject>


Of course, the "HintPath" attribute is optional.

Apparently it's not an option for NAnt. The add-in wizard doesn't put HintPath in for your references, and regardless of what you do, NAnt won't build without it. (Yes, I added <assemblyfolders> attributes to the <solution> task - you need those, too, but it doesn't fix it.) So manually edit your .csproj, add the HintPath, and you're in.

The Psychedelic Jew's Harp

Check this out - it's a guy who makes sort of ambient techno using a Jew's Harp and a signal processor. It's actually pretty cool.

Hockey Season Has Begun

Hockey season, at least as far as the Winter Hawks are concerned, has begun. This means 36 home games between this past weekend and next March, which is quite a lot if you think about it.

We went to two hockey games this weekend - one Saturday night (which we lost) and one Sunday night (which we won) - and we've got another coming up on Wednesday. I love hockey season - it's a social event, similar to folks meeting up at the local pub or whatever - but it sure does take a lot out of me.

At last night's game, during the first intermission, two altogether too avid hockey fans got married at center ice, the team mascot acting as "best man" (or "best bird," in this case). I'm not sure I'm into that. I think it's cool to be a fan and all, but married at center ice at the second game in the season for a junior league team? That's a little much. (The "best bird" dropped the ring in the middle of the ceremony and wasn't able to pick it up off the ice with the mascot gloves on. They had to stop the ceremony and pick it up for him. Too funny.)

An idea came to me while watching the Zamboni ice resurfacer run its course around the rink at the game: They need to make a riding lawnmower that looks/works like a Zamboni. A Zamboni lawn resurfacer, if you will. The collection tank could catch the grass... it'd be brilliant. Maybe I'll have to submit that idea to them.

Side note: Last month my dad was driving home from work and the motorhome behind him was driving a little erratically (according to witnesses). It then attempted to pass (or something) in a no-pass zone. For those who think they can pass in the no-pass zone, here's the accident that happened right behind my dad:

Don't pass in the no-pass zone

Pieces of motorhome landed on the back of Dad's truck. Apparently they had to use the Jaws of Life to get the motorhome driver out. Crazy stuff.