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.