Tuesday, September 30, 2008

Squeezebox Boom

After visiting a friend in New York a couple of weeks ago and playing with his Slim Devices (nee Logitech) Squeezebox Classic, I just had to have one. I just wished they had one with speakers- the place I want to put it doesn't have a stereo handy. A quick visit to their website shows the new Squeezebox Boom- perfect! Clickety-click to Amazon, and it's on the way...

Fast-forward to last night, when I "To My Desk"'d it from my EarthClassMail account and ripped the box open in the office to set it up for a late-night coding session. Right out of the box, I was enamored with the build quality- it's got a beautiful black enamel finish with really clean lines, and it feels quite dense for such a small device. Lots of little niceties like the magnetic remote "dent" in the top of the unit and the sleep/snooze button on top in case you want to use it as a hella-spendy clock radio. Plugged it in and had my SqueezeCentral account created and the device on the network within a couple of minutes. I went for the wired connection at the office- didn't even try the wireless, since our office wireless network security doesn't play well with a lot of devices. I didn't set the local server up (that's for home), so I was just playing with the built-in internet services. There's quite a bit of content available for free- even more if you're willing to create accounts and link them up. I was pleased to see the "local radio" option- it shows you all the internet streams of the local radio stations (all my favorites were on there), as well as allowing you to browse around the world right on the device.

I had pretty low expectations for sound quality. The device was kinda spendy ($279), but not enough of a premium over the speaker-less Classic model's $199 price tag to set my expectations very high. Right from the start, I was blown away. This thing sounds great! It has great mid-bass response from a pair of 4" speakers- the low end is "as expected" (eg, not going to rattle the windows out with sub bass-y goodness), but they do provide a sub-out if you're worried about it (I'm not).

I've seen the device UI described as "fiddly", and I'd have to agree- it takes a bit of getting used to, and the navigation isn't terribly friendly unless you know the whole sequence (as well as whatever nagivation the radio service you're using provides too, since they're all different). Things also work a little differently via the remote than using the wheel. It is more or less consistent, though, once you get used to it. My wife had it figured out within a couple of minutes and was having a blast with the "artist search" stations on the Slacker service.

We're both musicians, and yet there's not a lot of music around the house most of the time. Hopefully this thing will make it easier for us to have music around the house wherever and whenever we want.


Monday, September 15, 2008

Trying TrueCrypt full-disk encryption

I've been looking for a way to secure the data and IP on my laptop without a significant sacrifice of performance, reliability, or convenience. I looked into a few different directions:

  • BitLocker - This actually became an option once I upgraded from Vista Business to Ultimate (had to rebuild my dev laptop after an unfortunate Windows Update problem that MS couldn't solve). However, my laptop doesn't have a TPM, so I'd have to use an external USB key to boot. External key = high on the security scale, low on convenience. Next!

  • Windows EFS - Convenient, and allows the flexibility to encrypt at the folder level, but is difficult for multi-user access (something I do more of than I'd like). There's also a major performance hit for SQL Server operations. FAIL.

  • SQL 2008 Transparent Data Encryption - This one was intriguing, but it ultimately sounds like it wouldn't work well for my needs. I'd have to have the same keys used to create the backups, or encrypt AFTER restore of an unencrypted backup. Also, obviously limited to SQL Server, which doesn't cover everything I need. Either way, not going to fly.

  • TrueCrypt - Free, supports both file-based volume encryption, as well as bare-metal volume encryption. I'd used TrueCrypt before for the former, as well as for non-performance-sensitive stuff where we needed to move large volumes of sensitive data around on removable drives. I couldn't find anyone talking about the real-world performance hit, though. Windows boot volume encryption support is also fairly recent, so that made me a little nervous.

  • A few weeks ago, I decided to try the TrueCrypt route. To start, I created a file-based volume and did some testing in there. My benchmark was far from scientific, but I tested with things I do every day. I did a full SVN checkout of a code branch, opened and built it in Visual Studio, restored a SQL Server DB there, etc. Performance wasn't horrid, but it wasn't anywhere close to my bare-metal performance either- especially the SQL Server DB restore (took about 5x as long as on bare-metal). Most of the other operations I timed took anywhere from 1.5x-2x as long. There also doesn't appear to be a way to auto-mount file-based volumes, which means on every boot, I have to manually mount the volume (by entering the password), then restart the SQL Server. Gets old fast.

    A file-based volume just wasn't going to cut it. Two weeks ago, I finally bit the bullet and decided to try hitting "Encrypt System Partition/Drive" (AFTER a full backup, thankyouverymuch). Making the leap easier to take was the fact that the process claims to be fully reversible. The experience was quite good- after choosing a password and generating keys, I burned a recovery CD (I'm glad the UI makes such an issue of this!). After the CD had burned and verified, it proceeded to background-encrypt the disk. I could theoretically use the system during this time, but decided not to try- just left it to crank overnight. When I came back the next morning, all was well. I rebooted and held my breath. I was presented with the TrueCrypt password prompt, followed by the normal Vista bootup process. Cool!

    I went and retried my real world benchmarks, and much to my surprise, most of them were indistinguishable from their non-encrypted counterparts! The only one that was notably slower was a SQL DB restore- and that was only when the backup had a large log file. In case you didn't know: SQL Server won't allow you to resize the logfile on restore, so it allocates and zeroes an "empty" logfile matching whatever the server's logfile size was. We pre-allocate production server logfiles fairly large so they don't have to autogrow during large transactions. The side-effect is that restores to a clean DB are painfully slow. If I re-created the backup after truncating down to a reasonably-sized logfile, the restore performance was almost exactly the same as on a bare-metal, unencrypted drive.

    Two weeks in, I'm really impressed with what the folks at TrueCrypt have done. 6.0a is as-advertised, and the performance hit is pretty minimal for just about everything I've tried. Looks like this problem is solved!

    Yay Chase- security is good!

    At some point in the not-too-distant past, I noticed that Chase switched their main home page to use HTTPS. In general, it's a marketing site, so who cares? However, the thing that's great about this is that Chase provides a web banking login right on their marketing site's homepage. Even though the old HTTP page posted back to an HTTPS endpoint on submit, it was a major security hole- subject to phishing, DNS poisoning, man-in-the-middle, and who-knows-what-else attacks. They're also using secure cookies, but not httpOnly. Decent, anyway...

    As a side note, we've resisted marketing and user requests for this functionality since day one. Marketing has not (to date) been willing to switch their site to HTTPS-only, and we're unwilling to make the security compromise. I think a number of users were taken aback by our response to "but my bank does it, it must be secure!"

    Bravo, Chase- hopefully your competition will follow in your footsteps, leading to a slightly more secure financial web for us all.

    Saturday, September 13, 2008

    Chicago hotel fun

    Boy, this is starting to smack of last year's vacation from hell (right down to Jenny still being on United's "see agent, you must be a terrorist" check-in watch list). Didn't make it to the game, so we were sulkily watching the Purdue/Oregon game from our hotel room on a brand new LG flat-panel that looked and sounded like a bad 70's TV with rabbit-ears. I don't understand why hotels spend hundreds of thousands of dollars to upgrade to flat-panel HDTVs in every room, then leave 1980's analog cable infrastructure to drive them. Anyway, right at the end of halftime, the fire alarm went off. Great. At least I thought to grab the car keys and my wallet, so we didn't have to sit in the lobby for an hour. We went and grabbed some munchies at Walgreen's (the only place we can drive to- everything around O'Hare is hotels and industrial areas, and we're still pretty much flooded in). When we got back, the fire alarms had finally stopped, so we went back to the room. We were greeted with a smell about like wet dog- the "balcony" door was leaking onto the carpet from all the rain. To boot, Purdue's butt-kickin' lead from the first half had evaporated, now tied at 20-20. Grr.

    Hope we can just cut our losses and get out of here on time tomorrow.

    Stuck in Chicago

    So we flew into Chicago for a quick trip down to West Lafayette to watch the Purdue/Oregon football game (on our way to the east coast). Unfortunately, Chicago's been hit with a lot of rain and flooding. We're staying in a hotel about 100 yards from the freeway, which is open and running fine, but we can't get out of the little hole we're in because all the roads are closed. Argh! The game starts in three hours- I don't think we're going to make it. So the main purpopse of the first leg of our trip (visit Purdue, watch football) was pretty much a bust. We did have a nice visit with Jenny's cousin Adam and had great sushi at Sushi Samba last night, though.

    Off to Philadelphia tomorrow (I hope). O'Hare's experiencing lots of delays due to the local weather issues as well as downstream effects from Ike. Ah, joy. At least we don't have a terribly fixed schedule beyond the football game and flight to Philadelphia- everything else is fairly flexible.

    More to come...

    Tuesday, September 2, 2008

    Google Chrome Browser: First Impressions

    Just installed the beta of Google Chrome on Vista this morning. Generally, it's pretty slick! Installation was painless, only took a couple of minutes to download. Rendering is first-rate (no surprise- they're leveraging WebKit). I tried our site - all the basic smoke tests seemed to work fine. The JS engine didn't seem terribly snappy- though with all the JIT stuff they're doing, I'm sure they've got plenty of work left for cold startup perf.

    The "Incognito Mode" is pretty nifty (non-persistent browsing sessions)- wonder who stole what between Chrome and IE8's InPrivate mode.

    Really like the integrated JS console and debugging stuff- hopefully that stays in the finished product rather than being a separate download/install. Having customers with Firebug on their machines is invaluable for debugging weird one-off issues- it'd be even better if something similar was built in!

    My coworker was able to crash it on YouTube, and was also able to get the "Sad Tab" (it says "Aw Snap!"- sweet). The process isolation stuff is fantastic- kinda back to the way IE3 used to do frames in their own processes... Funny how we always end up repeating ourselves, for better or for worse.

    UI looks very similar to IE7 in most respects (layout, etc), except for the position of the tab bar where each tab has its own address bar. Very comfy and familiar. Looks pretty on Vista.

    Anyway, a very polished first beta from first impressions- kudos to the Chrome team! My interest is piqued- I'll be watching carefully and will continue to play with it.

    PDC 2008

    Got my confirmation for PDC 2008 last week- this will be PDC #3 for me. Looks to be good stuff on the sessions they've posted so far. I was dreading staying out by the airport- all the conference-rate hotels near the convention center were booked up by the time I got the OK to go, but they added one more at the last minute. Score!

    Most of the people I've met up with in the past aren't able to attend this year- crummy economy, employer politics, whatever. In addition to all the tech content, PDC's a valuable developer networking event- I've met great folks with whom I both learned and shared useful information. Drop me a line if you're going!

    Through various working relationships at Microsoft, I've been playing early with some of the bits that'll be unveiled at PDC this year. I can't talk about much yet, but I'm looking forward to the day when I can. We're hoping to have some code ready by PDC that shows off integration with the new mystery technology. Some of these things really are game-changers, and I wish I could ship with them right now!

    Monday, September 1, 2008

    Bachelor weekend redux...

    Jenny took off to Phoenix to visit a friend for the long weekend, so I figured that'd be a good time to do some kitchen experimentation and work on some house projects. OK, so I spent more time lazing than laboring, but I got a few things done that've been hanging over my head for awhile.

    First the food stuff- I got a new food processor for my birthday, and it's been sitting in the cupboard calling to me. I tried out a Good Eats hummous recipe- the food processor worked great, but the recipe had a little too much garlic (didn't know that was possible!). I also tried out a shrimp scampi recipe- didn't quite make it to the peach cobbler I'd been planning on making- maybe next week.

    On the house: job one was to rid ourselves of the stinky makeshift shower curtain that's graced our shower for far too long. The folks we bought the house from had made the shower curtains out of some kind of industrial plastic and a corded curtain rod (making it fairly inconvenient to get out of the shower). The curtains were endlessly slimy and smelled like wet dog on a good day. This is actually the first house where I've put up with a shower curtain at all- everyplace else, I've installed tub enclosures. Unfortunately, our master bath is set in the floor, so a normal tub enclosure won't work- we'd have to get an 8-footer custom built, and given that we're going to redo the master bath sometime soon, that'd just be a waste. I picked up a cool hotel-style curved shower curtain rod (keeps the curtain off you) and two normal fabric shower curtains. Rather than test my 7th grade home-ec sewing skills, a friend of my mom's hacked them up and made an 8 foot tall franken-curtain. Worked great- thanks, Jane!

    Next up: fix the master bath toilet. This one ended up being quite a chore. We've been using the commode down the hall for awhile now. I leaned on the toilet while switching it over to a new valve, and it popped off the floor. One of the old flange bolts had corroded right through, so gravity was all that was holding it down. Not good, but no problem (and happy to find it before we had a ... messier problem)- just get some new flange bolts and all is well, right? Hmph. When I pulled it up, it had an old iron closet flange that the bolts screw down into, instead of the modern kind where they key into the flange and stick up. OK, fine- just use my handy-dandy screw extractor to pull the broken one out and replace. Err, no. The screw extractor broke off in the bolt. Crap- now it's either tear up the floor and replace the flange (a lotta work for a temporary setup) or tap in a new bolt near the old one and try to get everything slopped into place. Turns out, there's a third option: a "super ring". It's a flat metal ring that sits over the existing flange and attaches directly to the floor, and it has slots for modern keyed flange bolts. Cool- now I just have to grind out some space on the surface of the old one for the bolts to slide on, seal it up, and we're good to go. Well, almost. A couple of the screw ears on the new ring prevented the toilet from seating properly, so I had to cut them off with the grinder (mmm, burning metal smell). What's left seems to hold everything together just fine, though. Did I mention that our master bath is carpeted? I hate carpet in bathrooms, especially around the shower and toilet. While it's nice to do your morning bidness with cushy carpet under your feet, it's just gross to think about what lurks in there. Anyway, I was very careful to have a piece of plastic sheeting under the toilet for all the dry-fitting I was doing while working this out. The last time I removed the toilet, though, the back edge of the old wax ring scraped on the carpet, leaving a nasty brown stain (rust and wax, not poo). Still- ew! Wax is not easy to get out of carpet, especially when it's intermixed with rust (and in front of the toilet, it so LOOKS like poo). Anyway, toilet is seated, working, and apparently leak-free.

    Next, I decided to replace the toilet's fill valve while "the patient was open"- the original one had a lot of galvanized pipe chunks in it and took forever to fill (the overflow fill tube was completely clogged with rust). I already had one out in the garage- should be nice and easy, but true to the rest of the day, it wasn't. The new package was missing the overflow tube, so I had to resurrect the old rust-clogged one with lots of bending and tapping and poking. Then, the fill stalk hole on the toilet tank was slightly misshapen, so the tank leaked a bit after I got the new one mounted. Argh! I was able to take care of the leak with some caulk between the stalk and the retention washer (again, just temporary- we'll be replacing this toilet soon anyway).

    Next up was the fancy "leak sentry" thing that came with my new fill valve. It's a clever device that I'd never seen before- basically a metal blade that sits below the float and is hooked to a second chain on the tank lever. When you flush normally, the chain retracts the blade away from the fill stalk and the float moves as normal. If the tank is leaking, the blade engages against the fill stalk, preventing the float from dropping, so you have to "double click" the tank lever to refill, alerting you that there's a problem. Don't know if it wasn't designed for the ancient mondo-gallons-flush toilet I'm using or what, but I just couldn't get it to work right. I futzed with it for about 20 minutes (I even R'dTFM!), but finally gave up and removed it.

    Last was trying to clean up the nasty wax mess on the carpet in front of the toilet. I tried using an iron on a paper towel over the wax to melt and soak it up (Google sez this works well for candle wax), but it didn't really work too well for my mess. Next up: the SpotBot. I'd heard and read good things about this little automated stain remover, so I figured I'd throw a tough job at it. Picked one up at Fred Meyer, dropped it on top of the stain and hit a button. I was amazed: it worked quite well! The carpet's never probably going to look quite the same (it was pretty luxurious carpet), but it did get almost all the wax and rust stains up, even just on the "quick" mode. I'll see how it dries, and maybe give it a go on the "deep" mode if there's any remaining rust color. My only complaint: it really burns through the cleaning solution, though the manual mode gives you full control over that part if you're willing to trade some elbow grease. Some very clever engineering on the device- I was most impressed by the "burp" valve design on the dirty cup that breaks the vacuum when you dump the cup out.

    A fairly productive weekend, anyway, and now I have a new toy for cleaning up the inevitable future messes I'll make on the carpet.

    Friday, July 25, 2008

    OCZ 128G SSD on the way!

    UPDATE: canceled the order after reading a number of reviews suggesting that, while the sustained read and sustained write speeds are awesome on this drive, the interleaved read/write performance sucks rocks (eg, doing a zip operation, restoring a DB, whatever)- 1/2-1/3 the performance of a crummy 5400rpm drive! Crap. Waiting for reviews on the Ridata and Samsung 128G MLC drives.

    I've been trolling Newegg daily for the new OCZ Core 128G SSD to show up for sale. They finally put up the pre-order link today- current expected availability is 7/28. I can't wait- the performance on my laptop's 7200rpm drive has been less than great lately. The disk is well defragged, and works fine for day-to-day stuff, but our production databases are getting ever larger, and restoring was getting to be a major pain. Frustrating to watch my desktop-owning brethren restoring in a couple of minutes while I wait for 20+ minutes... I'm hoping the SSD will at least bring me up to par. :) Pre-ordered! I'll post an update when I have something to share.

    Monday, June 30, 2008

    Verizon- ARGH!

    As I type this, I'm sitting on hold with Verizon's "Financial Services" department trying to get them to correct a billing screwup. The agent went to "check something"- that was 55 minutes ago. I think I'm long lost in that system, but I'm just morbidly curious how long it'll let me sit in there while I pursue other avenues of contact.

    A little recap of the whole mess:

    - Bought new house, hooked up FIOS (TV/phone/internet) before we moved in. They assigned us some random phone number.
    - Later in March, when we were getting ready to move in, requested that Verizon move our current Comcast-owned phone number. They tell me it'll take about a week. The hilarity ensues.
    - A few days later, calls to our old number just black-holed. OK, fine, I figure maybe it'll take them a day or two.
    - After another week, called and asked how much longer it'd be (after navigating through the usual phone tree hell)? They said, "oh, it's done- if it's not working, you need to call repair".
    - Call repair, they say it's a billing issue.
    - Call billing, after the explanation, they get a supervisor on. He says the whole thing was done wrong- they took over the number from Comcast correctly, but did the wrong thing after that. He'll take care of it- they'll have to bring the new number in as a "second line" then shut off the old one. They'll have to send a tech out... Um, OK- my ONT has two ports- all they have to do is light it up at the CO, but whatever.
    - Tech shows up a week later, asks "what am I doing here again"? My wife explains what's happening, tech says, "your second line's already live on the ONT- I didn't need to come out" and leaves.
    - Second line is in fact live for incoming calls. However, it can't make calls out, and has no line features (caller ID, call waiting, etc).
    - Call back to repair. They say, "it's a billing issue".
    - Call back to billing. They say, "Oh, now that we own the number, we just have to do a phone number change. Then everything will work right. That'll take a few days."
    - Meanwhile, my old phone# is again ringing to nowhere, and we have no phone service.
    - A couple days later, I call to ask what's happening. They say the "hook up the second line" order isn't showing as completed, and they can't do anything until it does. It's showing as completing that day, though, so everything should go for tomorrow.
    - A few days later, I call again. They say the "second line" order is still showing incomplete, but it'll complete that day. Hmm, this sounds familiar. I get another supervisor- they say the whole thing was done incorrectly, and that he'll get it all fixed up. This also sounds familiar.
    - A few days later, I actually have phone service again, and my old number works for incoming and outgoing. Great! But now I have no voicemail- it rings four times, then goes into a black hole.
    - Call repair. They say it wasn't set up correctly, but they'll take care of it.
    - Two days later, still broken, call repair again. The guy resets it while I'm on the line- I try it from the office, and it works.
    - Go home to set up new voicemail. They've wired in the "basic" voicemail instead of the multi-mailbox one that was there before. They've also lost a few of my calling features (call-waiting caller ID, etc). At this point, I'm too exasperated to mess with it any more, so I leave well enough alone.

    Flash forward to the end of June. I get a collections notice that says I owe Verizon $37.54. News to me- I pay my bill every month, and my balance shows zero.

    - Call collections agency, speak to Jan. Jan is very unpleasant- says I need to pay her now. I told her I wanted to check it out with Verizon first, since I don't know where the charge is coming from. She says "go ahead and try, but their phone number will automatically send you back here". I doubt that, Jan- I think your nose is growing.
    - Call Verizon billing at 8:30am. "Oh, you need Financial Services." Transfer, hold music. Get grumpy financial services agent "Lena", explain the situation very calmly, she's muttering while looking things up. Tells me that during the hassle back in April, they'd closed my original account and opened a new one, but only transfered part of the balance to the new account. She mutters something else, and says "I need to look something up" and puts me on hold. After about 20 minutes, I start thinking something's wrong. I don't have the number for financial services.
    - Try to look up number for financial services online. Nope. Figure I'll try their "online chat" (still leaving the other call on hold, though, just in case).
    - Online chat says "you are #7 in the queue, expected wait 2m 11s".
    - 13 minutes later, "Lynette" comes on. I give a two sentence description of the original problem. She says, "sorry, can't help you with that" and closes the connection before I get a chance to ask for financial services phone number. ARGH!
    - Call Verizon customer support on cell phone (other call is still on hold: time, 55 minutes), navigate deep automated tree. Get phone# for Financial Services.
    - Call Financial Services back, get "LaVigna". She says to just pay the bill to Verizon. My primary concern is having a collection show up on my credit report- she gives me number for Verizon credit reporting services. She also gives me the account# for the "dead" account.
    - Call Credit Reporting Services. Get a message that "This service is not available".
    - Call Financial Services again. Get "Brad". I explain again, and give Brad the "dead" account#. He says it hasn't actually been reported, and to just pay the bill online, and everything will be OK.

    Hope you're right, Brad. Hope you're right.

    Sunday, April 27, 2008

    House project updates

    Old house has been on the market for about three weeks now- a couple of offers and lots of positive feedback, but nothing we want to jump on yet (contingent or low offers, meh).

    We've had all our crap at the new place for a few weeks- it's starting to feel like home, though nothing's in it's final place yet. We only moved into the upstairs so we could completely tear the bottom floor apart without worrying about messing up furniture with the carnage.

    Picked up a new dishwasher and microwave within the first week- the old ones were ancient and nearly useless. Dishwasher install should've been a slam dunk, but, as has been the case with 100% of the multi-turn valves that I've dealt with in this house and the last, the gasket had failed. OK, fine- I'm used to replacing those valves (with 1/4 turn ball valves, thank you very much), and should be even easier with galvanized pipe, since it's just a threaded connection, right? Riiiight. First, we weren't able to locate the house water shutoff (previous homeowner had pointed me at a hose-bib valve). OK, fine, we'll shut it off at the meter. Nope- can't get any leverage, and the concrete meter cover is impeding the valve action. Hmm... OK, it's hot water- I'll just shut off the hot water at the tank. Nope- another partially failed gate valve gasket. ARGH! I ended up using that anyway, and just opening up a hot water tap downstairs to keep the water out of the dishwasher valve area upstairs. Next fun, the pipe nipple just crumbled when I tried to remove the valve. Luckily, the upstream coupling was OK, so I just replaced the nipple. All was well after that- new fancy stainless dishwasher looks a bit out of place int the old kitchen, but we'll build around it once we get the old place sold. :)

    All the old 70's paneling and popcorn ceiling have been taken down on the bottom floor. Major Swiss cheese going on in the ceiling for running wiring and replacing the old-style square recessed lighting fixtures with normal 6" cans. Found all sorts of interesting issues in the process, which we're going to fix while the ceilings are open. First, while replacing lighting fixtures, I noticed warm, moist air coming from one of the holes. Turns out the dryer vent runs about 35' along the depth of the house in an ABS pipe. The pipe was broken, and was venting air and lint into the joist cavity. Not good. I'm working on a way to vent more directly through the front wall of the house, but have to figure out a way to get the vent through the main floor and the stone facade on the front of the house. Also found a gigantic (thankfully abandoned) wasp nest in the wall where the A/C compressor pipe was punched through. Haven't removed it yet, but got the hole all sealed up. Last, after seeing the condition of the galvanized plumbing first-hand and dealing with the rust and nasty for a few weeks, we've decided to ditch it all and replumb with PEX. I got a taste of working with PEX on the bathroom at the last place, and I'll never go copper again. After seeing and working with a few different styles, I'm personally a fan of the Wirsbo/Uponor ProPEX style (expander/ring based instead of crimp-rings).

    Dude's coming to retexture the ceilings on May 9, so I don't have a lot of time to get the wiring, light fixture replacement, and plumbing done. Further hampering my efforts was the nasty bug I picked up last week- laid me out flat for a couple of days. Today's the first day I haven't been dizzy or lightheaded. Managed to get the lawn mowed (quite a production here, compared to the ~5min job it was at the old place). Also got a couple of light fixtures replaced tonight- not nearly the progress I'd hoped for, but any progress is good at this point.

    Anyway, lots going on at work and on the home front. Still loving it, just gotta keep everything moving and not let my own health fail in the process.

    Sunday, March 2, 2008

    FIOS install

    Got FIOS everything (TV, internet, phone) installed at the new place on Friday. I've had some friends do "custom" installs, so I figured it wouldn't be a problem. The Verizon pre-install guy called me a week before, and asked if I had any special requests for the location of the box. I really want my ONT in the furnace room in my basement- it's the best place for central wiring, and doesn't require stapling a bunch of crap to the outside of the house. Unfortunately, the furnace room is basically under the garage, and the fiber was on the wrong side of the driveway to get there. I didn't really want them tunneling under the driveway, nor did I want the fiber entry on the front of the house. So, I had the fiber crew leave about 60' of extra fiber on the side of the house to accomodate my special placement (which they did- great!). Then I'd just need to bust a few small holes in the basement ceiling to help get the fiber fished over to the soon-to-be network closet.

    Fast-forward to Friday morning- installer dude shows up and is kinda grumbly ("What the hell did they leave all this extra fiber for? That's not gonna fit in my box!"). Side note- he was also a Verizon contractor. All my other friends that have gotten FIOS have had genuine Verizon installers. Cue "uneasy feeling in pit of stomach". I told him this would probably be the easiest job he'd done in awhile- all we had to do was fish the fiber, hook up and test the ONT, and we're done. I would handle all interior wiring from there. His response: "I'm not allowed to fish, and I have to hook up to the existing wiring and test all the outlets. Besides, you'd probably break the fiber trying to fish it through there." Further sinking feeling ensues- all the other service demarcs are on the other end of the house by the garage. That means a lot of cables stapled to the side of the house- NOOO!

    Luckily, he couldn't find a suitable place to stick the ONT and power connections anyway (the garage is best, but the fiber's not handy there), so he started to warm to my ideas. Next, he said he'd have to run all the fiber through conduit, and that I'd have to bust up the entire 50' section of ceiling from the side of the house to the furnace room. Uhh, not happening. Couple more minutes of arguing, and I get him to concede that it doesn't need to be in conduit if it's in the ceiling. So I started busting little holes, and we started stringing fiber with some Fish Stix that he had in his truck. Side note #2: if you're not allowed to fish fiber, why do you have Fish Stix?

    Once we started getting the fiber running in the right direction, installer dude's attitude improved dramatically. We started chatting more casually, and had some high-fives when the fiber hit it's destination. He had the ONT on the wall in a matter of minutes, and all was looking good until ... "I think we broke it". Aww, crap.

    Apparently fiber installers have something similar to the tone generator used by wired network installers to locate a particular node. It's basically just a light they attach to the end of the fiber, then go look for the light over at the hub. If there's no light, there's a break in the fiber somewhere, and a splice has to be made by a Verizon tech before the break (which would likely be in my ceiling somewhere, since it worked before going in). Not good, since we're doing a forbidden install here- don't want the installer to get in trouble, and also don't want crap on the side of my house!

    Installer dude came back and said, "It's broken- tear it all out". Double crap. Then, "Just kidding- they gave me the wrong port number at the hub. It's all working fine". Yes! He had everything hooked up and working in a few minutes.

    I was told at order time that there were no HD DVRs available, and would have to live a few months with SD DVR service (all the while polling customer service for boxes- there was no "I want HD, call me when available" procedure). Installer dude just happened to have an HD DVR box on the truck. Did I want it? Heh. Is a bear Catholic? This dude's getting a good tip.

    So, everything's installed exactly as I want, and bonus, I got HD DVR service months before I expected it. I haven't spent much time playing with it (and what little I have was on a 20" TV- I haven't moved the beast over yet), but the FIOS TV UI kicks the ever-loving crap out Comcast's. It's cool to see, because FIOS TV uses pretty much exactly the same hardware as the Comcast DVR boxes- that really mean's there's no excuse for Comcast's lame ad-ridden UI beyond corporate greed. Time to get back on the ball Comcast- Verizon's gonna eat your lunch with FIOS TV just like you ate theirs when cable modem squashed DSL.

    Ahh, fiber-y goodness. Can't wait to enjoy it on a daily basis- we'll see how much I miss running my own webserver. Cheers, installer guy Steve- enjoy the tip, and cut the next guy some slack when he's got a plan.

    Personal update

    Well, my Bell's Palsy took several weeks to subside, but it finally did. One day I noticed that I could flare both nostrils again (very important, for someone who makes as many faces as I do). Right up there with being able to make symmetric faces- I can make non-pathetic razberry noises, which means I can play again!

    Work progresses well on the home fronts (both of them). We're ticking projects off the list left and right at the old place- probably within a couple of weeks of being ready to put it on the market. It's looking GOOD- why didn't I do this stuff years ago??? Meanwhile, we closed on the new house and took possession on 2/29. FIOS TV/internet/phone was immediately installed, and we're hatching plans to de-popcorn ceilings, rip down paneling and strategically place our sparse furniture into this monster of a house. Stories and pictures to follow, I'm sure.

    Windows services as console apps

    During my PADNUG talk, I mentioned that we do self-hosted WCF services, and that our service host can be run either as a console app or a Windows Service. Since then, I've had several questions about how that works.

    I've been using this pattern since .NET 1.0- it makes debugging service startup failures in production a snap, since you can just stop the Windows service and run it as a console app. When we're developing, we run in console mode almost exclusively.

    I'll write a description of the process- if I get time (ha!) I'll try to post a basic sample.

    The most important thing that many people don't understand is that there is no magical voodoo behind Windows services; they're just console apps that use RPC APIs and callbacks to talk/listen to the global service control manager. The ServiceBase class wraps up those API calls and callbacks into a nice little base class where you can wire up event handlers for start/stop/whatever, but there's no special behavior provided by the runtime or the OS for running in a service. This means that your Main method can behave just like any normal console app.

    The trick to making this work is to dissociate your startup and shutdown behavior into methods that don't care whether you're running in service or console mode. Then you just add a "/console" command line parser to the beginning of Main. If someone passed /console to you on the command-line, you skip all the ServiceBase.Run stuff, call your startup methods directly, and do the "Press any key to exit" behavior. If you don't see /console, call ServiceBase.Run and pass an instance of your service class. The service class' OnStart event handler should call your startup methods. The service installer behaves exactly the same, so what gets generated is fine. As an aside- you could go the other way (require "/service" to run as a service), but command-line args aren't a first-class entity for the managed Windows service installer, so you'd have to hack the registry afterward to stuff the command-line args into the image path. Much easier to go the other way, IMHO, but whatever.

    To debug in VS, just go to the "Debug" tab in your project properties and add "/console" to your command-line args- you should be off to the races.

    I've taken this pattern much further on various projects. We currently use a generic WCF ServiceHost "host" (oy, overloaded terms galore!) that implements this pattern and knows how to load multiple WCF ServiceHosts based on the "service" entries in an app.config's system.serviceModel section. All of our different service setups on different machines use this same generic "host" binary- what WCF service impls get loaded depends on the services defined in the WCF config section. If we have one service entry, one ServiceHost- if we have ten, ten ServiceHosts.

    A couple of other little tips:

    - Long-running service startup/shutdown is generally a Bad Thing- the SCM will give up on you if you take more than 30s to respond to a startup/shutdown request. This isn't fatal, but it makes for a bad administrative experience. In the past, I'd end up doing long-running stuff on another thread to avoid that. That's equally sucky if you have a fatal error during startup, though, since you can't report the error through the Services panel- the service process appears to start successfully, then silently dies. However, .NET 2.0 added the ability to request more time from the SCM (ServiceBase.RequestAdditionalTime)- makes it much nicer on both fronts.

    - Tag your service and installer class definitions with [System.ComponentModel.DesignerCategory("Code")] to disable design view on double-click in the solution explorer. I find Design View pretty much useless with Windows services- it's maddening to remember to right-click->View Code when opening. This tip works for any other code with designer support as well (including Service Installers, where designer mode is nearly as useless). You have to leave the attribute fully qualified, or it won't work- that parser's apparently built for speed, not intelligence.

    Hope this helps. Don't hold your breath for sample code, but if I get enough requests, I might whip something up.

    Tuesday, February 5, 2008

    PADNUG LINQ/WCF code, presentation notes

    PADNUG presentation went pretty well tonight- there were some great questions asked about LINQ and WCF. I hope I answered them to everyone's satisfaction. I only got through about half my content in two hours with all the discussion that was going on, so I guess that alone qualifies as success.

    By popular demand, the code for the FoodStorage sample app is available from http://nitzmahone.googlepages.com/foodstorage.zip. Unfortunately, the fully loaded UPC DB backup was still 20MB compressed (too big to upload to GooglePages), so I had to delete all the UPC rows that weren't being used. Still, the structure's intact and the items I've scanned are still all there. My slides (not that exciting- most of the content was the code and my arm-waving) are at http://nitzmahone.googlepages.com/WCFandLINQInWild.pptx.

    The app will probably only run "as is" on Server 2003 or Vista (running the web app under IIS, not the VS Webserver), since IIS 5.1 and the VS Webserver can't share HTTP ports across processes. It could be reconfigured to run on XP- only the AJAX samples would fail. This is an exercise for the reader. :)

    Thanks to everyone that attended and for the great questions! I really enjoyed it.

    Sunday, January 27, 2008

    God's speed, Gordon B. Hinckley...

    Got word that Gordon B. Hinckley, the president of our church, passed away tonight at 97 years old. He's been the president since I joined the church in 1996, so it'll be interesting to see what new leadership brings. This is somewhat akin to a pope passing away for Mormons. It's not a time for sadness, though- he led a full life, did great work, and influenced the lives of countless people, Mormon and not. Now his work is done, and he's been called home. He was a wonderful example of how to live, from his kind words and impish sense of humor to his relationships with his wife and family; his quiet but firm leadership and the way hearing him speak just made you want to "do better".

    God's speed, President Hinckley. Hope to meet you one day.

    Startup Junkies is on the air!

    Well, on the wire, anyway. The documentary/reality show that's following Earth Class Mail went live on January 24th, and will have a new episode available for the next eight Thursdays at 10pm. Pretty cool of them to make the episodes available online, since the Mojo channel doesn't exactly have the saturation of a Discovery Channel (and isn't even available on satellite). They're available for online viewing at
    http://www.mojohd.com/mojoseries/startupjunkies/. I've seen rough cuts of the first five episodes- so far engineering's only factored heavily in episode 5 (where I make a few fun cameos). Don't know what's happening from there- the camera crews were unfortunately not around for the .NET go-live weekend back in November, so they missed the 26 hour workday, developers catnapping on the floor, billing panics ("pull the plug! pull the plug!"), etc. The cameras will be at the office tomorrow to catch more engineering fun, though, so I'm expecting that we'll show up more in some of the later episodes. It's hard to make typing and whiteboarding interesting, and the cameras aren't there enough to catch the somewhat rarer engineering drama, poo-flinging design meetings, etc. Interesting watching thus far though, anyway (ignore my personal bias, please).

    Diagnosis confirmed...

    I guess my poor-man's Google diagnosis was spot on. After a quick trip to the doctor, the numbness and weakness on the left side of my face has been confirmed as Bell's Palsy. It's stabilized over the past few days as mostly a minor annoyance- I've figured out how to keep my eye moist, and it seems to stay shut pretty well while I'm sleeping. The doctor says that most mild cases of Bell's go away within a matter of weeks, so I'm hoping for the best there.

    The real bummer is that I can't play my horn in this condition, so I had to bow out of OSB for this concert series. Gives me a rare excuse to go listen from the audience, though. Saturday Feb 2, 7:30pm at Jackson Middle School in Portland.

    Wednesday, January 23, 2008

    Weird numbness...

    A strange thing has been happening to me over the last few days. Last Friday while eating lunch, I noticed that part of my tongue felt like it had been recently burned. Not pain, but a not-quite-complete numbness and low taste sensitivity (like there was a piece of tape covering half my tongue). I didn't really think anything of it, other than perhaps I'd burned my tongue the night before without noticing. The problem lingered through the weekend, with the added joy of often experiencing a weird metal taste on the affected part of my tongue. Fast-forward to Tuesday night, and I'm starting to get a little concerned. The numbness is fast spreading to my lip and face (both limited to the left side). Most recently, I've noticed that my left eye doesn't close all the way with a normal blink any more- I have to work it extra hard. The whole left side of my face feels "weak" compared to the right. Poking around on the intarwebs suggests one of a few diagnoses for these symptoms:

    - Thrush: Not completely out of the question, since my grandmother was afflicted with it awhile back. No visible symptoms though, and the facial weakness doesn't really jive.
    - Multiple sclerosis: Let's hope not- 'nuff said.
    - Bell's Palsy: This one seems the most likely fit. It's the result of an inflammation of the facial nerve that causes a loss of muscle control on half of the face and the tongue. Usually, said inflammation is caused by a virus or chronic illness, which I've not (knowingly) suffered from recently. Symptoms progress quickly, usually starting with a numbness or metal taste on the tongue, followed by radiating numbness eventually covering the entire side of the face.

    Regardless, the symptoms are beyond ignorable at this point. I'm right in the middle of rehearsals for OSB's winter concert season, and as of tonight, I can't get a clean buzz on my mouthpiece. Not good. My left eye is also drying out from not being appropriately "blunk". Oy.

    Guess it's time to let a pro figure it out. More to come...

    Thursday, January 10, 2008

    Personal update

    Band season's started again- we're playing some fun stuff, but not too taxing this time around.

    Biggest current news and suck-hole for available time is that we're moving! We found a much bigger house (4080sf, yow!) very near where we live now. We close mid-February, and will move in sometime after the 1st of March. It's vintage 1972 throughout, so we'll have lots of work once we get in to make it our own. Meantime, we've got lots of work to get our current place ready for sale- it's amazing how you gloss over all the little unfinished projects and dusty corners when it's "home", but when you look with a critical eye, they just go on forever! Anybody want to buy a house?

    Holiday break's over- back to the full grind, and hard at work on digital check deposit (among other things). Actually got to take 5 days in a row off, which I haven't done in over two years. The documentary/reality show that focuses on what we're doing at Earth Class Mail begins airing January 24 on the MOJO channel. I've gotten a preview of the first four episodes- it's pretty interesting. Engineering doesn't really start to appear in the storyline much until episode 4, but it's fun to see what goes on behind closed doors on the business side.

    I'm giving a presentation at PADNUG next month, covering some of the newest MS technologies we're using at work. I think I've got a fun app to build during the presentation that hits all the major new technologies we're using and allows me to share what I've learned without giving up my employer's secret sauce. :) Just gotta find time to build up all the content before Feb 5.

    Going laptop [update]

    It's been about two months since I officially cut over to a Dell M1330 laptop running Vista as my primary machine. Things are generally going quite well, both with the laptop itself, and with Vista. Our IT manager likes to come in and hate on Vista every few days, and I'll admit that I have a couple of gripes (hoping for SP1 to solve them), but it's not been nearly as painful as I expected.

    Size/portability: I really like this laptop's form factor, though I wish it had a docking station available. When I'm plugged in at the office, I have every port on the machine occupied (power, USB1, VGA, ethernet, HDMI, 1394, audio, USB2). That's a lot of crap to plug/unplug when I want to walk away with the box. The 13.3" screen is workable when I'm going mobile, though I'm glad I don't have to live with it every day. I was very grateful for the small size during a recent datacenter move, where five of us were jammed in an 8x8 cage (along with 25 roasting-hot servers). The portability factor is greatly increased by my access with a Sprint EV-DO mobile broadband card. Really nice to be able to connect up anywhere without relying on slow old GPRS or finding an open wireless AP.

    Stability/reliability: It's generally pretty solid. I'm using both the HDMI and VGA outs for the dual-monitor experience when working at the office, and the NVIDIA dual-display software is slightly maddening at times with several flashes when I lock/unlock the machine. I'm also using a KVM switch to control my old (much less frequently used) WinXP desktop at the office, and occasionally, the keyboard connection gets lost. I'm inclined to blame the KVM, though, as I had to try a couple before I found one that worked at all reliably.

    Battery life: I originally requested both a 6 and 9-cell battery, but I got two 9's instead. Battery life on the 9 is insane- 6+ hours with wireless shut off, 4+ with it on. I later obtained a 6 cell (mainly to lower the profile, since the 6 cell is flush with the bottom, where the 9 hangs down about an inch). Unfortunately, battery life with the 6 seems to be about 2.5 hours with my limited sample size.

    Performance: Can't complain here. 4G of memory (well, 3.5 since I still haven't taken the 64-bit plunge) makes all the difference in the world. As is my usual m.o., I can have several large solutions open in VS2008, ten or so browser windows up, SQL Server's caches fully loaded, and Outlook cranking away, and it doesn't even flinch. Build times are quite acceptable, though since I'm not a major space hog, I'll probably be exploring a solid state disk once 128G versions are available for less than a mint. I have noticed the busted file copy behavior in Vista- I really hope SP1 makes that better. When combined with our less-than-stellar network connection at the office, remote file copies to the datacenter are painful or just plain broken, depending on what else is happening.

    Build quality: Thankfully, I haven't experienced many of the problems I've seen others on the intarwebs complain of. I did have to glue a screw into one of the trapdoors on the bottom- an overzealous mobile broadband card installer stripped the screwhole. A couple of trim pieces don't seem terribly well connected, and I recently took some sandpaper to the HD cover to get it to fit flush, but I haven't had any real problems beyond these nits. I do have the dreaded CPU whine (Intel's problem, not Dell's), but RMClock is able to squelch it when I'm running on AC by disabling popup/popdown mode. The documented "Disable C4" mode that's supposed to do it compromises stability- the machine locks up every few hours with that.

    Vista app interop issues: The latest OpenVPN build fixed my one major problem with route propagation. I did find some interesting behaviors when using the loopback adapter- specifically that the IPv6 address is the default for "localhost" in Vista. Thus, if you talk to yourself via http://localhost, and the server code asks for the client's IP, it will come back as ::1 instead of I had some parsing code that barfed all over that one.

    Anyway, thus far, this switchover's not nearly the tragedy I'd steeled myself for. It's really nice to work from home without the delay imposed by remote desktop and our crummy internet connection at the office.