We'll miss Bob...
Recently I've been annoyed by feeling like my car was performing poorly, despite the fact that it had only been about 2000 miles since my last oil change (it doesn't get driven that much).
This morning I decided to check the oil. Maybe if my car was somehow leaking oil, and I was now low on oil, that would explain the problems.
Nope.
It has too MUCH oil.
Remember when I wrote about how much I hated my experience at Jiffy Lube? Yup, it was the fine folk at the local Jiffy Lube that overfilled my car with oil. When you overfill your engine with oil, it starts building up too much pressure against the seals, it can cause the oil to foam and cause engine damage -- all kinds of bad things.
Thanks, Jiffy Lube!
But, after eight years, I wanted something new -- something to make it fun again. So, while it was a bit more expensive than we might have liked for a car, we are now the proud owners of a 2003 Audi A4 1.8T Cabriolet (the convertible).
Well, almost.
After protracted (and sometimes infuriating) negotiations with a couple of different local Audi dealers, I purchased the car from Carlsen Audi on Embarcadero in Palo Alto. The car was there on the lot, newly delivered to them -- they just had to take the wrapper off and clean it up. Only when they did that, they discovered a very small crack in the windshield. The first plan was that they would be able to replace the windshield by Friday evening. Then they discovered that they didn't have a windshield for the Cabriolet in stock, so they had to order one up from LA. So, it would be Monday before it was done.
Only then, on Monday, they called to explain that the glass company, when they came out to install the new windshield, balked at having to remove the trim all around the windshield, saying that they didn't know how. So now it's going to be further delayed while the dealer gets the parts to remove the windshield trim, then gets the glass company to replace the windshield, then they'll put it all back together.
In fairness to the dealer, when I explained yesterday that this was all fine and well, except for the fact that I had sold my car on Friday and thus no longer had a car at all, they came and picked me up at work and put me into a demo car that's almost identical to the car I'm going to buy. So, I have an Audi convertible, but it's not really mine. Soon, though ...
More pictures to come when my car is really here.
After picking up my new car (yay!), Meredith and I walked down the street to eat. Half way through the meal, I bit down on something really, really hard. I took it out of my mouth and didn't pay much attention to it. Then, a few minutes later, I realized that it was, in fact, half of one of my back molars. Damnit.
So, off to see the dentist tomorrow...
I saw my dentist yesterday. My dentist has, presumably, been practicing for many years. He probably sees several patients a day, four or five days a week. This is a LOT of patients that he's seen. So you know it's bad when even the dentist is surprised by the condition of my teeth. "Wow, you lost all the filling and part of the tooth -- half your tooth is just gone. What did you DO?" Sigh.
The office was closed (as it evidently is every other Friday), so, since he didn't have any one to assist, he couldn't do the entire procedure of fitting me with a crown (that's Monday), but he did grind the sharp edges off my broken tooth so that it didn't keep scratching the inside of my mouth (for which I am very grateful). After that, at least, it felt mostly normal (except for the sudden sensitivity to cold that I have).
At work, we've been trying to use XML for our configuration files. Writing the XML files, and even the XML schema, has been pretty easy. Writing the pages of code to call MSXML from C++ to parse the files has been relatively simple, but still tedious. It is, after all, still pages of code to get all the properties you want out of a reasonably complex XML document.
Then I found out how to do it with C# and .NET. It's incredibly easy. Visual Studio .NET includes a command-line tool (xsd.exe) to convert an XML schema file to a C# data structure. The data structure is tagged with all sorts of attributes so that .NET can later know how to map the XML into that structure. So, from a schema file foo.xsd, you run:
xsd /c foo.xsd
which creates foo.cs, containing the data structures defined by your schema.
Then, to fill in the data structure, you call the XMLSerializer to 'deserialize' the XML into your data structure:
TextReader myStreamReader = new StreamReader(@"c:\dev\foo.xml");
XmlSerializer serializer = new XmlSerializer(typeof(ConfigType));
ConfigType config;
try
{
config = (ConfigType)serializer.Deserialize(myStreamReader);
}
catch(XmlException xe)
{
MessageBox.Show (xe.Message, "XML Parse Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch(InvalidOperationException ioe)
{
MessageBox.Show (ioe.InnerException.Message, "XML Serialization Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
And that's it. The exception handling is just so that you can figure out what the problem is should the XML file not parse. Assuming you didn't get an exception, your data structure (config) is completely filled in. To see what was set in the XML file, you just look at the fields in the data structure.
My last entry horrified one reader of my blog with its (and I am paraphrasing here, but only a bit) 'mind-numbing boringness' -- so much so, that he felt the need to call me and berate me personally. Ah, ya gotta love marketing ;)
At any rate, lest I lose one of my handful of readers, I'll try to write about something less geeky. So I'll tell the tale of buying a car. It has villains (don't all car purchase stories?), dragons, and, in an unusual twist, that rare find for such tales: a hero in the form of a car salesman. (Well, OK, there aren't actually any dragons in the story. Unless you count Meredith wanting to breathe fire on some of the salesman we encountered.)
As I mentioned last week, I am now the proud owner of a brand-new Audi. I really do have it now -- we took delivery on Thursday. I have been enjoying riding around in it a great deal so far -- so much so, that I have the sunburn to prove it. Time to start keeping sunscreen lotion in the car.
The car buying experience was, shall we say, interesting. (A side note: can it really be described as 'interesting', with the obvious implications that this experience was somehow unique within the set of car buying experiences when, really, all car buying experiences are terrible? Or perhaps the comparison is not to other car purchases, but, rather, purchases in general. In that case, buying a car could honestly be described as a more 'interesting' process than, say, a copy of the latest X-Box game from Fry's. Well, maybe Fry's is a bad example. But I digress.)
After looking at and test-driving various cars, I decided on the Audi A4 cabriolet. After test-driving the 3.0L engine version of the A4 at Stephens Creek Audi, and the 1.8L version at Carlsen Audi (on Embarcadero Rd in Palo Alto), I decided on the 1.8L version. The 3.0L was definitely nicer, but not, I decided, $5000 nicer.
So, one Sunday, I went to the web site for Carlsen Audi and submitted a quote request for the car I wanted. I tried to do the same thing at Stephens Creek Audi, only their web site wasn't really working -- everytime I hit the 'submit' button on the web form, it reset. Not a good sign. Eventually I did it through edmunds.com.
The next day, Carlsen Audi called me and said they'd sell me one of the three cars they had on their lot for "$500 over invoice". I went by the day after that to look at the cars and ask how much, exactly, invoice was. Well, he couldn't really tell me the exact number, he explained -- he couldn't get to the invoice until I decided to buy the car. It's hard to decide whether or not to buy a car when you don't really know how much you're agreeing to. He finally gave me a 'pretty close estimate'.
Still no word from Stephens Creek Audi, either. I finally called, talked to the salesman I had met there before, and asked if they could match the price Carlsen was offering. "No problem!"
Meredith and I went down there, where we discovered that, well, it might actually be a little problem. But after much discussion (and several breaks for him to 'consult with' his manager), the salesman offered us a price. He explained that he was giving us a deal because it was just his second day on the job, so he was trying extra hard to get the sale. This statement seemed contradicted by the sign in his office with his name and the notation 'certified dealer since 2000'. Two days, three years, what's the difference? It's not a good sign when the lies are this bizarre and this transparent.
The next morning, I went back again to Carlsen Audi, where I was suddenly dealing with a new salesman -- Desmond Lovas. I explained that I needed to know the price they were really offering. "No problem," he says. Yeah, right, I think -- I've heard that before. But, ten minutes later, I'm holding a piece of paper in my hand with not only the price they are offering the car at, but also showing the DMV fees, random other CA fees, taxes -- everything. To the penny. This was a surprising twist. (Remember the promise of a hero in the story?)
If I had been smart, I would have just stopped here and gone with the guy giving me a straight answer on the price. But no. Stephens Creek called me 'to see what was going on'. The one thing they had going for them is that they were offerering a car with one feature that I wanted that the car at Carlsen didn't have -- the Bose audio system. After talking to him some more on the phone, he agreed to lower the price some more, to something that, while a little higher than I was hoping for, was something that I could live with, especially to get the Bose system. Finally, I was done. I called him back later to say I'd buy the car.
Can this be the end? Can the hero of our story have come and gone so quickly? Does the salesman from Stephens Creek on his second day (or is that third year?) get the sale?
Of course not.
The next day, I called to see where my car was. "Well, we found a dealer that's got it, and we're waiting to hear back from them, so we should have it soon. Oh, and it turns out I made a small mistake -- I didn't realize that you wanted the Bose system. So the price is actually going to be --" and named a price not only higher than we had agreed on the day before, but even higher than the first price offered when we were sitting in his office. I guess when he said, "this car has every option -- there's nothing it doesn't have", I must have missed the "except for the Bose system."
Back to Carlsen. I decided the Bose system certainly isn't worth the now almost $2000 difference between the two dealers. I went back in, signed the initial paperwork -- with a price identical, to the penny, to what he had stated before -- and arranged a time later that I could come in with Meredith and pick up the car. In the end, the car wasn't ready when expected, but Desmond arranged for an almost identical loaner car and came to my work personally to pick me up so I could get the loaner. Given the ease with which he could have just arranged for some crappy rental car -- or done nothing at all -- this got him major points.
When we did finally pick up the car, Desmond got even more points by giving Meredith with the same respect and attention he was giving me. Most car dealers, in our experience, have had a hard time acknowledging Meredith as an actual person, much less someone who might actually be influencing the decision. This was true even when we were shopping for her car, and telling all the salesmen that it was going to be her car. Most of them still talked mostly to me, as if they expected that the decision was solely mine to make. After all, why would the woman have anything to do with this? Not a smart attitude.
Now, finally, I have the car, and I couldn't be happier. If you're looking for an Audi in the South Bay, I highly recommend calling Desmond Lovas at Carlsen Audi. This is the fourth car I've purchased, and he's been by far the best salesman I've ever dealt with.
Recently, I had to write some C# code to call a specialized device driver. The driver manufacturer had supplied a COM object that support dual interfaces, complete with Typelib. So calling it from C# was easy -- add a reference to the COM object from your C# project file in Visual Studio .NET, and start using it. C# does a really good job with interoperability with COM. The typelib importer even converts COM 'connection points' (which never completely made sense to me) into .NET events (which make perfect sense to me).
The problem I was having had to do with releasing the COM object. Normally, in C#, you don't ever worry about releasing anything -- eventually, the garbage collector will run, and things will magically disappear. Microsoft has done a lot of work on the performance of .NET and the garbage collector in particular, so I've never really noticed the performance hit from this. However, one of the COM objects I received from the driver represented a scarce resource. For a driver, this is fairly common -- drivers have to hand out pointers to hardware resources all the time (for example, video card memory, which is often pretty limited). I couldn't wait for the garbage collector to run; by the time it did, the driver would have completely run out of the scarce resource.
Someone else at Microsoft on the .NET team finally pointed me to the obvious answer -- Marshal.ReleaseComObject does the trick. Despite the name, this isn't quite the same as just calling IUnknown->Release() on an object, because of the way the CLR handles ref counting of COM objects. For (lots) more information, check out this blog entry from a .NET engineer.
Wired News reports on the fact that Orrin Hatch, who this week advocated "destroying" computers of persons engaged in copyright violations, is, in fact, a software pirate.
Hmm...
I am pretty sure that I won't get to read the book until Meredith is done ;)
I had to run some errands today at Home Depot. After I found what I was looking for, I tried to check out using the new self-service check out registers. The first time I used self-service check out was two years ago, in Tennessee, but this was the first time I had used such a thing here in Silicon Valley, where we are slow to get such new-fangled technology. Ah, irony.
You could tell it was the first time for most of the people in Home Depot. I waited for six people in front of me; not one of them got through without needing help from the harried-looking employee. Each appeared to be having a different problem. Finally, when it was my turn, I finished the transaction without any trouble at all. Congratulating myself on actually getting through without needing help, I headed for the door -- only to be intercepted by the aforementioned employee. It turned out that my purchase needed to be taken over to a regular cash register so that the anti-theft tag could be deactivated before I walked out the door.
Oh well...
By far the most disturbing comment I've seen about the Supreme Court case on affirmative action came from US Congressman and Democratic Presidential hopeful Richard Gephardt.
At a candidate forum sponsored by the Rainbow/PUSH Coalition, Gephardt is quoted as saying, "When I'm president, we'll do executive orders to overcome any wrong thing the Supreme Court does tomorrow or any other day."
Excuse me?
The whole point of separation of power is to prevent one branch of government from having absolute power. Gephardt would seem to be in need of Civics 101, where he would hopefully learn that even the President of the United States does NOT get to 'overcome' ANYTHING the Supreme Court does. It's not about whether it's right or wrong, or who you think holds the moral high ground. It's about not giving absolute power to one branch of government -- or, in this case, to one man.
Imagine the President saying, "The Supreme Court is wrong to uphold the 4th Amendment. I've issued an executive orders to overcome this wrong decision and give our police the power to seize the houses and other property of anyone who has protested our foreign policy." I would imagine that Gephardt would be one of the first to attack such a notion -- except that, fundamentally, it's not any different than what he himself promised.
When a candidate assures us that he will undo our entire system of government, he can be assured of not getting my vote.
Scary...
About a year ago, I wrote about developing an allergy to my wedding ring. The allergy continued to get worse over time, and eventually reached the point where I could not wear the ring for even a couple of hours without my finger breaking out into a rash and swelling up.
For my birthday this year, Meredith gave me a card that promised a new wedding band. It took us a long time to get around to getting it, but we finally did, and picked it up earlier this week. The new ring is platinum, which shouldn't trigger any allergic reactions.
So this morning, in church, Pastor Maggie gave a blessing for the new ring. Maggie said that was a first for her ;)
It's good to be able to wear a wedding ring again.
The funniest commentary I've seen on the recent news about a group of X-Box hackers trying to blackmail Microsoft into releasing a signed Linux loader for X-Box is here.