Wednesday, January 31, 2007

Walking Normally Again

Sue and I went cross-country skiing last Saturday with friends in Osceola, a small village on the Tug Hill Plateau. Bands of lake effect snow blanket the plateau every year and usually provide for some kick-butt skiing conditions.

I hate cross-country skiing. Er, well, I *used to* hate it. Years ago, without knowing anything about the sport, I purchased a pair of skis from a local shop. They judged the length of ski I needed by my height rather than by my weight. Like many cyclists, I'm light for my height and with the 215cm, highly arched skis I was sold, I never was able to get much kick at all. Add that to the fact that I don't know how to glide, and I was guaranteed a horrible experience every time I tried it.

I spent an hour on the old skis on Saturday, lagging behind my friends and being pretty miserable. We stopped back at the lodge and I borrowed a new pair of skis from the shop. The owner suggested a pair of Solomon skis, 180cm in length, and wider than my old ones. Shorter and wider (easier but slower) seems to be the trend nowadays.

What a difference! I still had trouble gliding without falling over, but that's because I never learned how to ski or skate as a kid. I was able to get lots of kick and the stability of the wider skis relieved the soreness in my knees I'd been experiencing. After a few more hours of skiing, we headed back to the shop where I forked over the cash for the new skis.

We came home and I spent the next three days walking funny. My hip extensors, shoulder carriage, and all those little balancing muscles in my hips and legs were tighter than guitar strings and quite sore. It felt good to be sore and to know I'd worked myself a bit.

Tomorrow, February 1st, is the first day of my next training period. Forget build, base, etc. I'm finishing up the "sit around watching TV and getting fat" period and moving into the "lose weight and start pretending to be an athlete again" phase. Since I put up the bike in late August, I've added 9.5 pounds and subtracted lots of aerobic fitness. It's going to be a miserable year on the bike if I don't start something now.

It's time to get back in the Attic.

Tuesday, January 30, 2007

What I Do

I've always maintained that what I do for a living is not who I am. I do not define myself by my job. The past few days at work have been a good example of the annoying stuff I wrestle with daily.

I am a Unix system administrator. Hear me weep.

Our database administrator informed me that he and the application developers wanted a server that was a copy of our new data warehouse, not yet in production, for testing purposes. Great idea.

I had set up the data warehouse as a non-global zone (virtual server) on a Solaris 10 server. I put the root of the zone is on a ZFS (Zettabyte File System) so I could do snapshots of the entire server when necessary. I looked for an easy way to clone the zone to create a duplicate test zone. Sure enough, Solaris has a command to clone a zone. However, my current operating system version is Solaris 10 6/06 and the clone feature is brand new in the 11/06 version.

I downloaded five CD-format upgrade images from sun.com and burned them onto discs. That took a good chunk of time. I scanned through 266 pages of release notes to plan for a couple "gotchas". I then went to the computer room to do the upgrade.

About half an hour into the upgrade, the system informed me that since I had a non-global zone installed, I would need to use the upgrade image in DVD format. So back to the office I went, and spent several more hours downloading the DVD images, concatenating them, and burning it to a DVD. Throwing a 4GB+ file around on the network takes some time.

It then occurred to me that one of the servers I wanted to upgrade is old enough not to even have a DVD drive. The only option left would be to set up a Solaris Jumpstart installation server and install the upgrades over the network.

I picked a third server of mine, mounted the DVD iso image with a "dolofi" utility I'd downloaded, and ran the commands to set up an installation server. I set up the client parameters on the server, then booted the client (the server I wanted to upgrade) with the "boot net - nowin" command. It was unable to mount the installation image, and kept stopping with a disturbing "panic" message.

After some googling, I found that there is a bug in the Solaris network installations that causes it to not work on supernetted networks. Sun doesn't call it a bug, but those who have run into the problem do. Short story is that Sun doesn't plan on fixing it.

The deal is that our network is a series of sequential class C networks. Our subnets are ranges within those numbers. For example, our main subnet is x.x.8.x through x.x.11.x. The installation server and the client are both 9.x numbers, but the default router is an 8.x. The default mask of a Sun client booting for a network installation is 255.255.255.0 (and annoyingly can't be changed by any boot arguments), so a 9.x number can't see an 8.x number even though they're on the same subnet. The easiest workaround is to install a DHCP (Dynamic Host Configuration Protocol) server that would assign a mask of 255.255.252.0 along with other network parameters to a client when it boots. That assignment would allow the client to see the installation server and the default router.

So, I ramped up the learning curve a little more and dug into the DHCP manuals. It actually didn't take too long before I had one set up, but there are several "vendor options" that need to be entered and configured, and the platform type of each of the servers you want to install have to be entered for each option. I set up options for a workstation on my desk I use for testing.

After an afternoon of wrestling over parameters to get them just right (the manuals conveniently left out a couple I needed), I was able to get my workstation to boot from the installation server with the "boot net:dhcp" command. Sweet. I proceeded to upgrade my workstation to the latest and greatest Solaris 10 11/06 release.

Back to the original server I wanted to upgrade, after checking the release notes, I knew I had to temporarily remove the lofs (loopback mounted file systems) of /usr/local and /usr/openv on the non-global zone with the zonecfg utility. I also had to detach one of the slices in the Solaris Volume Manager mirror that made up the boot partition and use "metaroot" to assign the boot device back to the device name c0t0d0s0 instead of the metadevice d0.

With those short tasks behind me, I requested more server downtime from the developers, and shutdown the data warehouse server in preparation for the upgrade. I added it as a registered client on the installation server, and added an entry for it, keyed by ethernet address, on the DHCP server. I just duplicated the entry that worked for my workstation.

Hmmm. When I went to boot it, it panicked and said it could mount the installation images.

ok boot net:dhcp - nowin
Boot device: /pci@1f,0/pci@1,1/network@0,1:dhcp File and args: - nowin
panic - boot: Could not mount filesystem.

I issued a snoop dhcp command on the installation server and saw that it was talking to the server correctly, but for some reason was unable to mount the Solaris miniroot. The location of the miniroot should have been provided as a DHCP option.

Back to google, I finally located someone who'd had a similar problem. I used these commands to debug the DHCP conversation between the two computers:

$ snoop -vv ether 0:14:4f:3b:21:15 | grep DHCP

DHCP: Message type = DHCPDISCOVER
DHCP: Client Class Identifier = "SUNW.Sun-Fire-V490"
DHCP: Requested Options:
DHCP: 1 (Subnet Mask)
DHCP: 3 (Router)
DHCP: 12 (Client Hostname)
DHCP: 43 (Vendor Specific Options)
DHCP: Maximum DHCP Message Size = 1472 bytes

[ ..... ]

DHCP: Message type = DHCPOFFER
DHCP: DHCP Server Identifier = x.x.9.172
DHCP: IP Address Lease Time = -1 seconds
DHCP: Subnet Mask = 255.255.252.0
DHCP: Boot File Name = SUNW.sun4u

The "Client Class Identifier" reminded me about those platform types I had to enter as part of the vendor options for the macros on the DHCP server. I checked - sure enough! I had missed entering "SUNW.Sun-Fire-V490" on two of the options. I put it in, restarted the DHCP server, and rebooted the client.

Fantastic! It booted right up and started the installation program. I walked through the steps to identify the system parameters. A few minutes later, the process stopped and reported that the upgrade had failed because of the non-global zones, and that I'd have to restore them from backup. Yikes. Fortunately, I'd read in the release notes that this was a lie. However, it was supposed to have been fixed by removing the lofs file systems like I'd done.

Back to more googling. After an hour or so of reading manuals from sun.com and other Solaris forums, I found a note that reported that the installation utility for Solaris 10 11/06 had a bug in it that caused it to be unable to upgrade non-global zones when their root was on a ZFS. The developers are planning to fix it in the next release sometime in 2007.

Sigh.

All in all, I've spent about a week working on this along with some other projects, but I'm back to where I'd started. I did upgrade my workstation, so that's nice, and I learned how to set up a network installation server and a DHCP server in the process, and that's nice too, but in the end I have two large servers that I wanted to upgrade but cannot.

My desire to have that handy little "clone" command that had prompted this whole process will have to wait for the next OS release "sometime" this year.

In short, I worked for about a week and really didn't accomplish anything tangible. So what else is new?

Monday, January 22, 2007

Musical Mattresses

Oh, my aching back. We've been on quite the saga recently trying to find a mattress that works for us. Only two years ago, we bought a high-end Simmons mattress to replace one I'd had for years. On the old one, my back would ache after about seven hours, and if I dared to sleep in on a weekend for more than eight, I'd wake up with back spasms. Sue also thought it was really lumpy, so we plunked down something like $1100 for a Simmons spring mattress with some latex foam or something like that. Oooo, it felt good. For about a month.

After a month, the backaches returned. It's now two years later and my back hurts and Sue's hips kill her on the mattress. Her side is all lumpy and my side has a huge hole where my hips go. I'm not a heavy guy by any means, but I apparently have a knack for breaking down a mattress.

A few months ago, we got a poly-fill pillowtop for the Simmons mattress. It was nice and puffy for about a week. After that, the areas where we lie became all matted down and flat, and with the rest of it still puffy, each night we were sleeping in a deep valley. The middle of the bed between us became known as "the ridge".

A couple weeks ago, we'd had enough and decided to look seriously at a Tempurpedic visco-elastic "memory foam" bed. I'd heard great things about these beds. A cyclist I know swears by his. Money be damned, we headed to our local contemporary furniture store and flopped down for half an hour on a "Deluxe" Tempurpedic. It was very nice, comfortable, and supportive. We put $2200 plus on plastic and put the huge queen-sized box containing the huge queen-size mattress in the back of the pickup. These things are not light. A queen-size, dense memory foam mattress runs about 200 pounds. We called a neighbor friend over that evening to help get it upstairs. In the process, I fell backwards out through the latched screen door, snapping off the latch bracket. What fun it all was.

We made up the bed and flopped down. Clunk. Clunk? It was probably an imagined sound, but the mattress was so firm, clunk describes the feeling of my shoulders hitting the bed. Everyone talks about how you're supposed to sink into these mattresses and be so comfortable that you don't move at all during the night. Instead, I was aware of Sue flopping around like a fish yanked up onto a dock, and I also woke a few times and flipped sides. We're both side sleepers, and we clearly didn't weigh enough to sink into the mattress at all. It was far firmer than the one in the showroom.

I awoke in the morning with sore ribs, and although the change in support was favorable to Sue's hips, she could barely open her jaw and had a stiff neck from her shoulder being jammed up into her neck area.

We put our old pillowtop on the new mattress and spent a night that way. Not enough. It was so compressed from a few months on it, there was no longer enough cushioning.

After work the next day, I ran over to Bed, Bath, and Beyond (nice folks and very pleasant with returns as you will read) and picked up their best poly-fill pillow top. A couple nights passed with the same results. My shoulders were sore and Sue had trouble chewing breakfast.

I went back to BB&B and exchanged the $120 poly pillowtop for a $300 four-inch thick memory foam topper. This foam was much softer than the Tempurpedic, so the theory here was that the soft foam on the hard foam would be, in the words of Goldielocks, just right.

The "queen size" topper comes rolled up in a fairly small box. They must pack the thing in with a steamroller and vacuum packer to get it in the box. It was a bit like a novelty can of snakes the way the topper expanded after unwrapping it. I flopped it down on top of our mattress. Odd, it didn't reach the edges. The measurements of the topper were 54x76. Standard U.S. queen-size is 60x80. What's up with that? Strike one.

We slept on that for a couple nights. It smelled really bad. It was the kind of unnatural smell that made you wonder if you were destined to get some sort of cancer from inhaling chemical and plastic fumes every night for a few years. Strike two.

We were back where we started. It was soft enough for our shoulders, but now the back and hip aches had returned from lack of support. Strike three.

I tried to get the topper squashed back into the box. My best try involved an upside-down coffee table stacked with 45-pound weight plates (and me) on top of the thing, but it was no use. I wrapped it in packing plastic, and we headed back to Bed, Bath, and Beyond with it and the empty box. They were great and gave us a full refund, no questions asked except for the rhetorical the cashier asked as she carried the incompressible topper away, "Now, what am I going to do with this thing?" I hope she had more coffee tables and weights to stack on that thing than I did.

I spent an evening boxing the Tempurpedic mattress back up. We were done with it and it was going back, regardless of the $200 "restocking" fee it would incur. We'd kept the original packing materials to return it as they'd suggested. It took me about an hour to get the 200-pound mattress spun around, slid into the box, and taped shut with enough packing tape to keep it from breaking through. That was when I realized I hadn't put the plastic bag around the mattress. I spent another hour unpacking it, wrapping it in plastic, and then putting it back in the box. I might have skipped it, but I didn't want any excuses from the store during the return.

We borrowed my brother-in-law yesterday to help get the 200-pound box back downstairs and back into the truck. Then it was off to the furniture store.

The two women there were very nice, but started off by telling us we'd need to come back the next day when the manager was on duty to arrange the return. We started arguing that point when they brought up having to arrange for pick-up. "Oh, we brought it in our truck. It's in the parking lot." Their faces quickly turned to an expression of, "Oh, shit. What do we do now?" and they hustled off to get the manager on the phone. They still wanted us to come back the next day, but there was no way we were going to cart that thing back home and then back to the store again. They finally relented and opened their back door so I could slide the thing off the truck and back into their warehouse, in the exact spot it had come from.

I returned the next day, credit card and receipt in hand, to finish the paperwork with the store manager. I was ready for them to try and get a higher fee than the $200 return they'd quoted us. The manager said, "I spoke with the owner and he remembered when you picked it up. He said he'd quoted you $200. The return fee is actually $300, but we're sticking with his word and we'll only charge $200." Good thing. He ran the credit card through and gave us a refund of $2050.92. We'd paid a total of $2267.00, so I was surprised to find that $2267 minus $200 is $2050.92, but it was close enough not to dicker with the guy. I just wanted out.

So, we're now sleeping on our full-size Aerobed inflatable bed with the old, flat pillowtop on it. It's a little funny having a full mattress on a queen platform, but what the heck. It's not super-comfortable, but it's better for now than the old bumpy and hole-ful Simmons. We're looking into pursuing a warranty claim with Simmons, since the thing had a 10 or 15-year guarantee. I'm guessing that'll either go nowhere or else we'll decide it costs too much to ship a mattress back to the manufacturer.

So the search for the perfect mattress continues. We paid $216.08 to find out that we don't like Tempurpedic. We don't know what to try next. Air? Spring? Different foam? We want something that's not too firm, not too soft, and stays that way more than a month. Is that too much to ask? When buying a mattress, it might just be.

Tuesday, January 09, 2007

The Steak Connoisseur

It's been a long time since my last blog entry, so I thought I'd start bringing things back up to speed with a little story of how my holidays went. It was a good holiday season, but there never seems to be enough time to fit in all the family visits, cooking and eating, gift-wrapping and unwrapping, and some time to recharge.

The Christmas season kicked off for us officially on Saturday, December 23. Although we had houseguests heading in from New York City that day, we were on the road to head to my mom's place for Christmas with her and my dad. We had put together a nice little gift bundle for each of them, but I wanted to get my dad one more item, a little something he'd enjoy but never buy for himself. Before heading out, I went to our local Wegman's grocery and to their fantastic butcher section. I had the butcher wrap up the reddest, juiciest looking sirloin steak in the display case. It was a thick one, and big, weighing in at 1.6 pounds of delicious Angus beef. This is the kind of tender steak that you just quickly sear on the sides to hold in the juices. A little kosher salt and coarsely ground pepper is all you need. It has enough flavor all on its own to make sauces unnecessary. At $14.99 a pound, it came to about $24.00 for just one slab of meat. But hey, my dad would definitely never spring for a taste treat this good, so I was pretty sure it'd be a nice gift.

I took the wrapped steak home and prepared it for the trip. I wrote the internal temperatures for rare, medium, and well-done on the wrapping. With a steak like this, cooking it more than medium is a crime, but I knew that my dad always liked his steaks well-done, so I steeled myself in anticipation of hearing him say something about that. Still though, I thought maybe if I wrote those temps on the package, it might encourage him to try it a little less done so he could enjoy more flavor.

I put the steak into a disposable styrofoam container we had lying around from when we received some frozen items in the mail. I added a couple reusable but disposable freezer packs that came in it as well, and a little red bow on the top. It would stay nice and chilled on the road.

So, fast-forward to evening at my mom's, and the four of us are sitting around her two-foot tall sparkling fiber-optic tree enjoying snacks and exchanging gifts. As my dad was opening his other packages, I brought out the styrofoam container and set it next to his chair.

My dad reached down and pulled off the top of the container. Sue and I sat in anticipation. He pulled out one of the freezer packs.

"Wow. Is this reusable?"

"Um, yeah, Dad."

"These are great. So, you can just put them back in the freezer and use them again later?!"

"Yeah, Dad. You know, the freezer pack isn't the gift. They're just keeping the gift cold."

"Oh." [pulls out wrapped steak] "Oh. Steak. Yeah, thanks. That should be good."

"Dad, I wrote the cooking temperatures on the package for you..."

"Oh, yeah, I see that." [smiling appreciatively] "I always do them well-done."

No problem. I was ready for that. "Well, enjoy!"

Now fast-forward a couple days to Christmas day. We've already returned home to our houseguests, had a big Christmas eve dinner with Sue's family (I think about 89 people were there, give or take 70), and now it's finally Christmas day and Sue and I are enjoying a quiet, lazy, late morning breakfast after sleeping in. I called my dad to wish him a merry Christmas on the actual day.

"Hi Dad. Merry Christmas!"

[some chatting about weather and the DVD player I got him omitted here...]

"Hey, I cooked up that steak! I broiled it in the oven."

"Oh yeah? Great! How was it?"

"Oh, I haven't eaten it yet."

I'm sure that spot above the bridge of my nose furrowed mightily at this point, because I couldn't figure out for the life of me what he meant.

"Er... what?"

"I got some good vegetables and cut up the steak to make a stew."

"Uh huh."

I hung up later and burst out laughing. I told Sue and she said, "Okay, that's it. Next year: McDonald's gift certificates!"

So, we all had a great Christmas. We enjoyed ours, and my dad enjoyed the world's most expensive stew. I love my dad, partly because he's exactly who he is. Paraphrasing Popeye, "He is who he is." He was also incredibly and overly generous with his Christmas gifts to us. When I was little, he gave me food, shelter, and all the flyballs and grounders I wanted out in the front yard, and now he still gives me too much. And by golly, the man likes his steak over-cooked and under water, and that's just the way it is.