August 2006 Blog Posts

Maybe Subtext Is The Answer

I've been wanting to move to a .NET based blog package for a while now. I'm currently on pMachine, an old, PHP-based freeware product that isn't architected super well and is hard to customize or extend. I'm a .NET guy now and it'd be nice to be able to do some cool .NET things on my site, so I'd like a .NET blog.

I started looking at dasBlog, but I don't think that's the way for me. It's got some nice features, but the code on the back end was inherited, patched, fixed, updated, added to, and jimmied together to make it what it is today. It's not terribly well documented, and looking at how it works from a code perspective is less than clear. Even just trying to install it locally to see if I liked it wasn't too straightforward and ended with me talking to a couple of other dasBlog users who had this odd proprietary knowledge that they got from still other dasBlog users. I can't be dealing with that.

Stu and I thought we might just start writing our own blog engine. We went so far as to get a domain name and a project space on SourceForge, but the time required to get the thing going is a little more than we've had to allocate to it.

Now I'm really thinking about Subtext, though. With the 1.9 release, they've updated to .NET 2.0, they're getting their unit test coverage up, and from what I can tell, the templates use user controls (like master pages) so I wouldn't have to deal with the odd template/macro language that most blog engines make use of. I'm all about that.

Granted, I haven't actually downloaded it and looked at it yet to see if it's any better than dasBlog behind the scenes. But I like what I've seen so far.

You MUST RSVP For My Wedding

Wedding invitations were sent out Monday and people are already starting to get them. Thus far it seems that as soon as they're received, we get a phone call from the recipient to tell us whether they liked the invitation and start talking about whether they're going to be there.

I'm glad to get phone calls and hear what people think, but let me make one thing very, very, super, extra clear:

YOU MUST SEND IN THE RSVP CARD IF YOU ARE COMING TO THE WEDDING.

Let me say that again for the folks in the cheap seats:

YOU MUST SEND IN THE RSVP CARD IF YOU ARE COMING TO THE WEDDING.

I don't care if you are family. My mom had best return that damn card. I don't care if you're in the wedding party. Stu, you'd best return that card. I don't care if you mention it to me on the phone. I don't care if you email me. I don't care if you instant message me. I don't care if you send me an SMS text on my cell phone.

YOU MUST SEND IN THE RSVP CARD IF YOU ARE COMING TO THE WEDDING.

I cannot stress this enough, and it may sound like a crazy rant or a ridiculous diatribe, but let me assure you how very serious I am about this. If you don't send in the card, I can't get an accurate head count for all the various crap we need head counts for. If we don't have an accurate head count, we don't have enough chairs, we don't have enough food, etc. The only way we can make sure everyone is counted is to have a single point of entry for registration for this thing, and that single point of entry is the RSVP card that comes with your invitation.

So here are the rules. They are very simple:

If you don't send in the RSVP card, don't show up to the wedding.

If you send in the RSVP card and say you're not going to be there, don't show up to the wedding.

If you send in the RSVP card and say you're going to be there and then you don't show up, I will hunt you down.

This isn't a difficult concept. Either you'll be there or you won't. If you say you're going to be there, be a person of your word and be there. If you don't say you're going to be there (or if you say you're not going to be there), don't show up and wonder why you used to be my best friend but now I won't speak to you again for the rest of your life. Seriously, we just need folks to return the cards and follow through on it. I don't want to be a Bridezilla (Groomzilla?), and on the rest of the stuff with this wedding I'm cool as a cucumber.

But don't you dare fuck with me on this RSVP thing. This is the one thing I'm going to be a stickler on.

(Oh, and to the folks who weren't invited, I'm sorry. There are a lot of people we wanted to invite, and when we had the 100% complete list, it turned out the wedding might have required the Rose Garden to be the venue since I don't think the Empress Palace can hold like 50,000 people. Instead, we had to make some decisions, and it ended up being a far, far smaller affair with many fewer friends and coworkers than we originally planned for. It's not that we don't like you or didn't find you worthy, we just had to make some hard choices. Sorry.)

Ghost Recon: Advanced Bridal Shower

I finished Ghost Recon: Advanced Warfighter on the "Normal" difficulty a couple of days ago, so I'm thinking I might try it out on the "Hard" difficulty just to see. I haven't yet jumped online with it, either, and I'm tempted to, but somehow the idea of getting into a game with a bunch of 12-year-olds yelling arbitrary profanity at me doesn't sound too enticing. That said, maybe I'll give it a run anyway.

Jenn's bridal shower was on Saturday and while that was going on I headed over to Stu's new place to put in a few units* on Oblivion. Jenn ended up getting several very nice things from folks and it sounds like she had a great time, which is good, since you don't get a bridal shower every week.

I, of course, felt pretty good about the units put in and look forward to the next set of units.


* A "unit" is roughly defined as a "large block of time dedicated to a single task." The original definition derives from when Stu and I were playing Soul Calibur III and had to fight the last character so many times before we finally beat him that it became a running joke.

Full-Text Feeds Enabled

I put a little time in hacking the ol' pMachine and I have full-text RSS enabled now instead of the partial-text feed I was running. I've been wanting to do that for a while, I just hadn't had the real inclination to get it done.

I still really want to change blog software, but I haven't yet found what I would call a "great" blog package. I started down the road to dasBlog, but from a developer extension standpoint... eh. I might consider moving to Subtext, but I haven't really looked at it yet from a source level.

Of course, technically both of those totally beat out what I'm on right now, but if I'm going to put in the effort to move, it's gotta be worth my while.

Fed Up With Painting

I'm pretty much done with this whole painting situation. And I don't mean "done" as in "the job is complete and correct to my satisfaction," I mean "done" as in "I've had it up to my eyeballs with the ridiculous nature of how this has gone."

I had a meeting on Monday with the crew chief and the paint crew. I pointed out the three remaining problem areas. The support that runs above my railing on the porch outside was spotty and not uniformly covered. The trim around my front door was never prepped correctly so you could see the layers of old paint under the new paint. The soffits were painted too thick and looked "drippy."

The crew chief acknowledged these items in turn. The support did, in fact, get re-painted, and it looks fine now. Awesome. The soffits, as it turns out, weren't actually their fault - they showed me that if you sand down the drips, the old paint shows up underneath, so I accepted that - next time I'll know. But my door trim...

First they argued that the job wasn't quoted for "that sort of sanding and prep work." Odd, since that was the whole reason I called them out there and I specifically pointed that out when I got the estimate done. Regardless, they sanded the thing down and it looks almost reasonable, but then they slapped the paint on so fast you can see ridiculous brush strokes all through it.

They didn't tell me when they were leaving, either, they just sort of left. I haven't heard from them since. They did leave a can of the paint behind, so the new plan is to just fix the damn trim around the door myself and call it a day. I'm tired of fighting them to get the job done right.

For all you Oregon homeowners out there - avoid WILLCO Painting and Construction. It occurs to me that what they probably do best is more industrial work - stuff like apartment complexes and so forth - where the person having the work done isn't going to scrutinize the job.

That said, I still think I just got a bum crew. The crew chief I dealt with was cool all the way to the end, but I really got the impression the crew wanted to do as little as possible and get the hell out of there.

Ah, my first poor experience with contractors. I'm sure there are many more to come.

Met Stu's Parents

Saturday was reasonably uneventful - we picked up our dining room set and it looks great (aside from a flaw in one of the chair cushions, which is going to get replaced). My dad helped me cart that home from the furniture warehouse and get that all set up, Jenn polished everything up, and my Tiny Cat promptly hopped up on the table and left little cat prints all over. All went well.

Sunday was pretty cool, though. At 11:00a Jenn and I met up with my parents, Stu, and Stu's parents for lunch at Hometown Buffet. Stu's parents were in for a couple of weeks visiting from England and it was really great to finally meet them. Unfortunately, while his sister and brother-in-law were also here visiting, they were both feeling ill so they stayed at the hotel and we didn't get to meet them.

After a pretty decent lunch (they were still serving breakfast food until about 11:30, so we got a taste of both breakfast and lunch), my parents headed out and the rest of us went back to my place to play some Alhambra. Of course, following the unfortunate luck of Stu's sister and brother-in-law, just as we got the game set up, they got a phone call saying they had headed in to an urgent care facility to get some assistance and Stu's parents left to go meet them. (Everything turned out okay, it sounds like they had just gotten dehydrated or something the day before.)

Stu stayed behind and we put in some units on Oblivion as it'd been a couple of weeks since we last did so. We finished a few quests and after probably four or five hours we called it a night so Stu could go see everyone one last time that evening. Their flight was scheduled to leave this morning; I think they're on it right now.

Anyway, it was really cool to finally put faces to the stories we hear about Stu's childhood and next time they visit (or if we end up over there) it'd be great to spend more time with them. Maybe we'll also get to meet his sister and brother-in-law as well!

In other news, I have a meeting with the painters today at 4:00p to discuss what needs to be done to rectify the trim painting situation. I'm going to do my best to keep my cool about it because I just want it dealt with, but I think it's crap that they just can't do their own QA on this stuff. It's paint, people, not rocket science.

Painting Has Become A Fiasco

The minor issues with the painting we had done have gone from "no problem, it'll be fixed" status to "mediocre fiasco."

I'm hesitant to say it's the company, as the crew chief that I always talk to is nice and realizes things need to get done. I think I got a bad crew.

What I expect when I delegate a task to someone (be it at work, someone I contract to do a job, etc.), is that I can describe the task well enough that certain minor detail points can be inferred by a worker's intuition.

For example, with the paint thing... When the guy came out to give me the estimate, I pointed out the trim around my front door as being a particular trouble spot. It was flaking and looked kind of shabby. That was one of the primary reasons I wanted the paint redone. They came and pressure washed to get the flaking paint off. Then the paint crew showed up and... just painted right over the top without sanding or anything, so now you can see the outline of where the old paint was and where it flaked off. It's not smooth or anything.

I pointed out that there were some issues on the trim and a couple of spots in particular. Those particular issues were fixed, but all of the other issues weren't even touched. Like it wasn't about doing the job right so much as getting done quickly and getting out of there. "Oh, he just said this tiny patch was a problem - maybe he won't see the rest of the patches surrounding it never got fixed!"

Maybe it comes down to a work ethic issue. When I do something, I do my best to get it complete and correct the first time. If a review of the work needs to happen, I don't want people to find glaring issues. I take pride in what I do. That doesn't seem to be the case for a lot of people nowadays. A minimum amount of effort goes in - just enough to call the task "done" - and then off to the next task. If someone reviews it, only the exact, specific points that got noticed will be fixed - no further review on the part of the worker to see if there are any other issues will be done.

This absolutely, positively never happened with the sprinkler system. Those guys had things totally under control. It was a premium price for a premium job and I consider it money well spent. I'm having a problem saying the same about the paint right now.

I think what irritates me the most is the coordination of things. Having to call and follow up on everything, make notes, take pictures, leave voicemails, send emails, and pursue the job until it's done.

This actually extends beyond the painting. I'm tired of coordinating wedding stuff. Try to get two groomsmen - just two! - to a tux rental place for a 10 minute fitting at the same time. Try it! I love these guys, but the back and forth of "I have a doctor's appointment" and "I can't make it Tuesday, Thursday, or Friday because I have to be at this other place" and "Maybe next Wednesday if we go between 4:52p and 5:17p" crap was beyond frustrating. (In the end, everyone gets to go get fitted on their own time. I'm not coordinating it.)

I told Jenn today that I'm done coordinating things. Done. Between now and the end of the year, I'm not coordinating anything. No more wedding stuff, no holiday stuff, no family gatherings - I'm done. I'm all coordinated out. I get enough cat-herding in at work and I don't need to be dealing with the sixteen different places all the different families feel we need to be on Christmas Day to have breakfast or lunch or open gifts or stop by and visit or whatever. I'm tired of trying to figure out where we're all getting together to eat Thanksgiving dinner at and how we can make it around to see everyone on that one single day. (As though our families don't all live locally and get seen almost weekly anyway.) Parents and grandparents and cousins and aunts and uncles and cats and rats and elephants - I'm done.

Anyway, I'm meeting with the crew chief and the crew on Monday. The crew chief will call me that morning to figure out a time. Then I can physically walk them around and point at all of these things that I figure professional painters should see anyway, but maybe I have bionic vision or something. Regardless, I think I see a light at the end of the tunnel.

Safari 2.0.4 Fails on Unicode Escape Sequences in Regular Expressions

Fought with this one for quite some time today. We use a lot of client-side validation for input fields in the products I work on. While we repeat that validation on the server (as is the way with ASP.NET validation), the client-side validation is important to give the customer earlier feedback about invalid input.

Our products are written to work in a multilingual capacity so the validation expressions need to support characters above and beyond ASCII. That's great, but it also means we have some work to do to get the regular expressions to work the same on the client as they do on the server. I've blogged about this issue before.

ECMAScript standards indicate you use Unicode escape sequences to put these extended characters into regular expressions. So rather than literally putting é right in the expression, you put the equivalent Unicode escape sequence: \u00e9.

Safari 2.0.4 doesn't seem to handle Unicode escape sequences in its regular expression engine. It understands that code \u00e9 is equivalent to the literal character é, but if you ask in a regular expression if they match, they don't.

From what I can tell, there is no workaround. It just doesn't get Unicode escape sequences in JavaScript regular expressions.

I've put together some tests to illustrate the point (click for test page). Browsers that handle the issue correctly will read "true" for all cases; Safari 2.0.4 fails on the Regex tests.

Painting Mostly Successful

Yesterday my trim got repainted because it was looking sort of nasty and flaking off a bit. Taking a little pride in ownership, I decided it was about time to spruce the place up.

I had to stay home all day because part of the repaint included the front door, which hung open almost all day so the painters had access to it and so it would dry nicely around the edges. At the end, I did a walkthrough and looked at the job. Looked nice and clean. Awesome.

Jenn was out with some friends last night so she didn't get to see the paint. She went out this morning to check it out.

Oh boy.

Under the soffits where they painted, all the paint looked like it was bubbling or dripping. You can see near the garage where it actually did drip and got on my vinyl trim. That definitely wasn't there during the walkthrough.

I called the painters up and let them know what I'm seeing. They're coming back out today to see about fixing it up. Why does this stuff always have to be a pain? I guess I should be happy; at least they're not leaving me in the lurch. We'll have to see how this goes.

Other minor news - I think the house has settled in the last couple of years and the door to the cats' room (which remains open all the time, and which I had to close yesterday so the beasts didn't escape through the open front door) really won't close anymore. The top of the door rubs on the door frame. It was a little snug before, but now it's just crazy. Looks like I've got something else to fix.

Bikes, Doors, Painting, and Ghost Recon

This weekend was a nice relaxing one, which is a good thing, since we've got our weekends pretty much booked solid between now and the wedding. It's amazing the number of things that you really can't do in the evening when you get home from work.

Saturday Jenn and I picked up a fairly difficult puzzle from the store and spent some time together watching movies and doing the puzzle. It was nice to not have to run around and do things, and we enjoyed spending some time together working on the puzzle. It's been a while since we just sat and worked on something like that.

Sunday Jenn got bored, which is pretty normal for Jenn. Jenn, bless her heart, is a very binary sort of person. She's either hungry or full, but never in between. She's either entertained or bored, but never in between. Sunday was a "bored" day, so we started talking about different things to do. We ended up going to Bike N' Hike and Bike Gallery to look at different bikes (since we don't actually own any).

Bikes are damn expensive.

Granted, I haven't had a bike since I was a kid, so I really had no concept of how much bikes cost, but I was thinking maybe a couple hundred bucks, tops. Turns out you can get a super low-end bike for that, but if you want to ride it in any reasonable capacity, you're probably looking at the $300 mark. Plus helmets. Plus a bike rack for the car so you can take the bikes out to a place to ride. I don't see us starting this one up for less than $750, which is far more than I anticipated. Needless to say, while the trip was educational, it ended in disappointment for Jenn as we did not get bikes. Perhaps later in the year, or early next year. The wedding and the sprinkler system and the house repainting and all that... too much drain on the budget for bikes right now.

After we got home from the bike hunt, I finally sat down to play some Ghost Recon: Advanced Warfighter, which I got for my birthday but hadn't cracked it out of the plastic wrap yet because of the whole broken Xbox 360 debacle.

GRAW rocks. It really does. It's just hard. Super hard. See, I'm used to the first-person shooter like Halo where you just bust in with your machine gun and start blasting away. GRAW requires you to peek around the corner and scout stuff out. If you just run in, you're going to get killed. That's not a bad thing, it's just a different way to play and it takes a little getting used to. On the other hand, it forces you to get more into the game and pay more attention to what's going on. You can't barrel around the corner, you actually have to stop and plan your route to the destination because you don't want to walk through ambush points or anything. Totally sweet.

Anyway, I played that for a couple of hours while Jenn entertained herself putting together the flower girl basket for the wedding. Fine and dandy.

Had some dinner, watched V for Vendetta (decent, but somehow... lacking... maybe I just wasn't into it at the time), and went to bed a half hour early.

The house painters are here this morning, doing their thing. Technically they're just painting the trim since I have vinyl siding. Of course, I have to be here, since the front door needs to be painted and I'm not just going to leave the house unlocked all day. Sooooo... working from home.

Homemade Coke Blak

If you open a can of Coke and decide it's a good idea to pump some coffee in it to try to make "homemade Coke Blak," don't stir it. Coffee + Coke + stir = volcano of Coke foam.

Yeah, I'm a dumbass.

Xbox Live Arcade Got DRM All Wrong

I love the Xbox Live Arcade. Being able to get five-to-ten-dollar games that are fun to play is a great idea. I dig it, Jenn digs it, everyone has fun.

The way it works is you sign in to Xbox Live on your Xbox 360. Once you've done that, you can navigate over to the Xbox Live Arcade section and you can buy cheap, fun games using "Microsoft Credits." The game downloads to your console, and you play. Simple enough. I buy games, Jenn buys games, we play, it's great.

That's the key, though - we both buy games, and we both play. There's no point in me buying a copy of Frogger, storing it on our Xbox 360 hard drive, and her not being able to turn the thing on and play. When I buy the game, I'm buying it so we can play. And that's how it works by default - if I buy the game, anyone who signs onto my system can play the full version of that game. Sweet.

My Xbox DVD drive stopped recognizing discs recently and I had to send it in. I got it back yesterday, and the first thing I did was pop in a disc to something, just to make sure it all worked. It did, and that was cool. Then I switched over to the Arcade. That's when the problems started.

Somehow all the games I bought were no longer available for Jenn to play. All the games she bought were no longer available for me to play. I mean, they physically showed up in the menu, but they all appeared as "trial versions" even though we had paid for them.

After much screwing around, I figured out that if her profile was signed in at the same time I was trying to play using my profile, everything was unlocked; sign her back out and the games she bought instantly become trial versions for me again. That's patently unacceptable - I can't keep signing her on just so I can play. It's not just inconvenient, it's dumb.

I looked at the "Usage Restrictions" you see when you download any game from the Arcade. It kind of explains what I was seeing, but until you experience it, it doesn't fully make sense.

I called Xbox Live support to find out what to do. After spending literally an hour on the phone (about 45 minutes of that on hold while they were sorting things out trying to figure out how to address the situation), it turns out that the DRM they use on Xbox Live Arcade is all sorts of messed up.

When you buy a game, it's associated with your user profile. It also automatically authorizes the console you purchased the game from such that anyone who plays that game on that console is unrestricted. (Don't buy games at your friend's house and stick them on a memory card to bring home, you'll get nailed by this.) If you transfer the game from one storage unit (the hard drive) to another (a memory card), the DRM is changed so only the person whose profile purchased the game is authorized to play - they need to be signed in to Xbox Live for the game to be unlocked.

I'm not sure if this happens if you do something like originally download the game to your Xbox hard drive, take the hard drive to your friend's house, then bring it back home. Does it recognize that you removed the media? Do you lose the machine-wide authorization? I don't know, but I'd be interested in finding out.

Anyway, what the Xbox repair people did is send me a new console, not just replace the broken DVD drive. So the console itself was "new" according to the DRM, so it was like I bought a game somewhere else and brought it home.

How is this getting resolved? You're going to love this.

First, you have to create a new gamer profile and make it an Xbox Live "Silver" membership. It's free to create that new profile since the "Silver" membership is free, but there is a heck of a lot of data entry for contact information, not to mention the fact you need to give it an email address and password so it can sign on - just like a real profile. The representatives on the phone will tell you it doesn't matter what email address you give it, but from experience I know they send account notices and such to that email address, so it should probably be legitimate. Of course, that means if you don't have your own domain and/or can't figure out how to set up email address forwarding then you'll need to create a new, dummy Hotmail account or something. Super convenient.

Once you have the dummy gamer profile set up, Microsoft will credit that account with enough credits to go in and re-purchase all of the games you previously had unlocked. Getting that credit to come through takes eight-to-ten business days.

I asked why you can't just credit one of the existing gamer profiles so you can re-purchase without going through that hassle. Apparently there's something in the system that knows if you've played the game or not before and the account you re-purchase the games through can't have played the games you're re-purchasing. I'm not sure if that's a technical misunderstanding on the part of the technicians or if that's actually a legitimate issue. Regardless, the dummy profile thing was the set of instructions given to me by more than one technician during the call, so that's how it's going.

I'm not a big fan of Apple's iTunes DRM, but the notion of authorizing/de-authorizing a machine might have come in handy here. Like I said, I dig the Arcade, but now I'm reluctant to buy anything. What happens if I want to get a second Xbox 360 for a different room? I can't take the game up there because it won't be authorized. Even if I wanted to accept that as a limitation, Jenn couldn't take the game to the other room because I'd need my profile signed in so she could play.

Argh! You'd think that not having to fuss with a game disc would be easier, not harder, but it's exactly the opposite. I can take the game disc to my friend's house without having to fight DRM. I can get a second console and play the game disc on either one without having to screw around signing in profiles or setting up dummy accounts.

The only exception I've found to this odd DRM rule is the Hexic HD game that comes standard on Xbox 360 hard drives. It was unlocked for both of us from the get-go, even after we hooked up the new console, so I'm guessing there's just no DRM attached to it.

Come on, Microsoft, I thought you were smarter than this. We just want to play the games we bought. Let us play.

*UPDATE * (Minor clarification) - The Xbox that the repair facility sent me back was a different one than I sent in; they didn't actually replace the drive in my broken Xbox, they just sent me a new/refurbished one. Had they sent me my original Xbox, I may not have run into these issues.

Looking at Support for Sandcastle in CR_Documentor

I'm looking at ways I can update CR_Documentor to add Sandcastle support. I think it can be done, but it's not going to be cheap. I think there's actually quite a bit of refactoring to do since the thing has evolved in a way that the rendering engine is pretty ingrained into how things work. That'll have to get isolated so I can determine how to write a rendering engine as a more pluggable entity. I started doing some of that in the last version of CR_Documentor and it looks like it's time to finish that job.

I think the hardest thing is going to be figuring out how Sandcastle ends up rendering the various entities in documentation. What does a list look like? How do all the different members of a class render in the preview window? That was the hardest part of getting NDoc emulation up to speed, too - reverse engineering the XSL transformation that NDoc does in order to stream HTML. Keep in mind that when NDoc or Sandcastle renders the HTML, they have complete, ready-to-run XML they can just transform via XSLT; when I render the doc in CR_Documentor, I have to query the code and do a lot of processing to get the information the compiler gives those other products for free. (I wish it was as simple as an XSLT transformation!)

I tried at one point to create the XML the way the compiler does - by querying the code and creating all of the various elements and such - then doing a straight transformation, but it's really slow. The true source of performance trouble is the fact that every time DXCore reparses the current document, CR_Documentor updates the preview (that's the beauty, right? real-time previews?)... but if I have to do a lot of re-generation of XML and re-transformation every time that happens, there's a lot of slowdown and a significant delay in the preview update occurring.

No, it gets generated by code, since that's the fastest way to go, which means a lot more work. I do want to get Sandcastle support in, it's just not going to happen overnight. We'll get there.

Sprinkler System Installed

Ever since we moved into our place we've thought about getting an irrigation system. The yard is oddly shaped in front (we're on a corner lot) and there are some pretty inconveniently located parking strips that need to be tended to. That nets out to a lot of frustration running around moving sprinklers and a spotty lawn - green in the parts that it's convenient to water, dead in the parts you "just can't reach."

I'm not sure what financial genius decided that the year we're getting married is also the year we should get a sprinkler system (probably me), but that's exactly what we did. We contracted with Dennis' Seven Dees to get this done, after getting several quotes. We weren't disappointed.

From the second they got there, you could tell they knew exactly what they were doing. It took them about a week from start to finish, and aside from the spots where they re-seeded and mulched to replace the grass from the trenches (it's too hot to lay down sod - it'd die), you can't even tell they were here.

Here's a backyard panorama of the trenches in place (click for a larger version):
Backyard with trenches dug in - click for a larger version.

Pretty crazy. Then here's the finished backyard (click for a larger version):
Backyard finished - click for a larger version

Not too shabby, eh?

I've also got to compliment them on their service. At every step, they had everything totally under control. Permits with the city, getting utilities marked, scheduling when things had to be done... everything was totally taken care of, and that gave me a lot of confidence in them.

Anyway, I'm stoked. No more manual lawn watering, so hopefully this thing will green up a bit. I'm glad I went with these guys and would totally recommend them to anyone looking for landscape work. We'll be using them for winterization of the system and probably for any future yard-related stuff we need done.

Check one more thing off the home improvement list!

Installers Still Haven't Figured Out The Start Menu

I just re-imaged my work machine and for the last couple of days I've been bringing it back to life, installing the various thousands of millions of applications that I use on a regular basis to do that thing I do. This time around, though, I'm doing a little experiment.

Before I re-imaged, I was very careful about organizing my Start menu so I could find things. I created a group called "Programming" to keep the various IDEs and development tools I use in, and subgroups for various functions therein. Same thing with programs that work with multimedia stuff (Flash, Photoshop, etc.) - I had a group in the Start menu for that.

The problem is that installers don't always let you select where to put the icons in the Start menu. Most times, they just create their own company-centric Start menu group, then create a product-centric group under that, then create their one program shortcut inside that. That means I end up installing the program, then manually opening up the Start menu and rearranging things to fit my usage. You know what happens then?

I upgrade.

I take the latest stupid version of whatever stupid project, I run the upgrade installer, and the damn company-centric Start menu group comes back. And the product-centric group inside it comes back. And the same single damn program shortcut comes back. And I, once again, have to go through the rearrangement of icons to be more sensible. This time, though, it's a manual diff-and-merge process, trying to determine if the old icons still work or how to replace them properly with the new icons.

You know what's worse? Nothing could be worse, right? No, there is something.

Uninstalling.

Now I've got icons in my personally organized Start menu that don't point to anything. I have to manually keep track of these things or find a program that will run through my Start menu and remove shortcuts that don't point to anything. Argh!

Why haven't we figured this out yet? The Start menu's over ten years old! Installers should let me specify where to put shortcuts if I opt to even create them. If the developer feels the desire to suggest a default location, perfect - users who don't care can make that extra click on the "Next" button and there's no skin off their noses. But if I want to override that, and have everything organized, I can. And maybe I don't even want to create icons - let me uncheck the little "Create a program group for this program" option and carry on my merry way.

I mean, tell me it's not just a company's big brass balls thinking that they need a whole program group just to themselves and that, should I deign to buy more of their products, I will inherently want to group the products in my Start menu by manufacturer and not by functionality.

I don't actually think this will change, not in my lifetime, but this is the sort of thing that irks me. As far as my experiment is concerned... I've installed maybe 15 things thus far and my Start menu already wraps into a second column. Unreal.

Xbox 360 Coming Home

Just got notification via email:

Your Xbox Video Game system has been shipped! You can expect to receive it in 2-5 days. Thank you for your patience and get ready to get back into the action!

Why Motorcyclists Get Killed

We haven't done a Traffic Asshole in a while, so I figured it'd be a good time.

Jenn and I took a trip up to the Empress Palace last week to do some wedding preparations. Traffic was pretty heavy and Jenn was driving, so I hung out with the camera on the lookout for traffic assholes (as is my wont).

It really didn't take long.

Check this guy out:

This is why motorcyclists get killed.

How many thousands of motorcycle deaths do you hear about each year? Normally I feel bad, thinking that cars should pay more mind to the other lesser-wheeled vehicle companions.

Not so with this guy. This right here is why motorcyclists get killed. It has nothing to do with a car's ability to see you and everything to do with obeying the fucking traffic laws. Look, stud, you are a vehicle on the road just like the rest of us. You have to ride in the lane, just like the rest of us. If traffic is at a standstill or is moving slowly, you're fucked just like the rest of us. You don't get to skinny between cars regardless of your size. You, too, must sit and cook in the heat.

If someone had knocked this guy down, I wouldn't have stopped. In fact, I'd have laughed. It sounds hard, but you get what you deserve. Obey the law, dumbass, and maybe you'll live to ride your motorcycle tomorrow.

Personal Subversion

Lifehacker has a nice article on setting up a personal home Subversion server. You can store your repository locally or on a server - the article addresses both.

I use CVS in a local repository to store my project code, but at work we use Subversion and I'm enjoying the flexibility. I may have to switch over to a local Subversion.

Design By Jamming

How many times have you seen this:

A new software project starts, and a lot of design is done up front so the actual code and organization of the project is fairly clean. As time goes on and requirements change, the project mostly stays clean. Then someone will be working all on their own and think, "Hey, I've got this job I'm trying to do that doesn't really fit the way the current design and architecture is, so I'll just jam this little helper/object/whatever right over... here... yeah. There we go."

A little time goes by and someone else gets a similar requirement, can't find the little helper/object/whatever that the other developer put in (because it isn't where you'd expect it to be), so re-invents it and jams it somewhere else.

After not too long, you step back from the project and it's not so clean anymore and no one can figure out why.

Jeff Atwood wrote about this a little while ago. The concept of "working clean" in code. I think there are three problems to overcome when trying to maintain a clean project.

First, education. I'm finding that not too many people in software development actually have a formal computer science education. Not that that's a requirement to be a developer by any means, but even if you're not writing compilers for a living, understanding why you might not just put every single method or property you might ever need in the base class of your object model is handy. That sort of education - or maybe it's intuition? - is sorely lacking in a lot of developers.

Second, communication. People don't communicate what they're doing, or they assume everyone knows what they're doing already. A task called "Create Data Provider" doesn't necessarily imply to the team that you're going to be modifying the UI classes so folks aren't going to expect things to change there. If people were to do a little bit of design up front and say "here's all the stuff that has to change," it'd be easier for the rest of the team to add input and correct design decisions prior to a lot of work being done. (Admission: this is probably more of an issue on a smaller team with a less formal process.)

Third, work ethic. I find that many times people just don't care. "Oh, yeah, I guess I did sort of hack that in there without any thought to how it fits in the big picture. We'll fix it later." But you know you'll never get to it later - there's no time! They know at the time they're doing it that it's the wrong choice, but they just don't seem to care. I'm not really sure how to address that.

We need to quit designing by jamming, folks. Stop jamming code in there. Take a second, breathe a little, and step back - look at what you're actually doing and do it the right way.

(I know I'm going to get a lot of folks with the "in the real world..." sort of thoughts. If your company/process allows you to provide your own task estimates, you need to factor the design into your task. Don't say it's going to take you three hours when it's a six hour project. On the other hand, if you don't get to provide your own estimates... well, maybe you've got other issues to deal with.)

Feynman Interviews

Richard Feynman was, by any measure, The Man. Full stop. This video of several interviews with him just proves it. No one can entertain and educate quite the way he did. If you haven't read the book, get it.

Programming Is Hard

Programming Is Hard is a site for sharing common code snippets and links. Sort of like Flickr for code.

Is this really a time saver, or is it a bad idea? I mean, sure, grabbing some common functionality from somewhere might get you going a little quicker, but remember Scott's Rule of Programming #0x3eA - "Just because code is on the Internet doesn't mean you should cut and paste it into your production system." It occurs to me that something like this is asking for all nature of trouble. You know that the entry-level developer sitting two cubes down from you just grabbed some code off this thing and pasted it, entirely unchecked, into a block of code that barely compiles.

On the other hand, folks have experimented with putting incorrect data into Wikipedia and found the incorrect data doesn't stay there very long before someone corrects it. Will that same level of policing go on with these code snippets?

I think maybe there should be some nature of moderation - like you submit a snippet and then it has to be reviewed before going on the site. Or maybe that's asking too much, and a free-for-all really is the way to go, with the implicit "buyer beware" disclaimer.