$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.
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.
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:
- Enable logging in a custom folder (sometimes logging everything, sometimes logging only failures
- 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\SOFTWAR\\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.
(Of course, no warranty, expressed nor implied… use at your own risk, etc.)
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.