Indoor plumbing is not a new thing

Sometimes, I'm in the bathroom at work for more than a fleeting moment (I'll spare you the details of why), long enough to hear a few people (presumably co-workers, and tenants and guests of other offices on our floor) come in to do their business. It never ceases to amaze me how often I'll hear someone come in, relieve himself, and leave — without either washing his hands or so much as flushing.

I wonder what goes through their minds that causes them to not flush. Are they so proud of what they've accomplished, that they want to leave their creation for the next person to appreciate? Do they think they are just so important or in just so much of a hurry that the half-second it takes to push the little flusher handle is too much of a burden? And worse, is this how they behave at home, too? Are their home toilets full of their bodies' waste processes? Do they only flush once a day, or weekly, or at all?

And what of the lack of the washing of the hands? I had hoped that with the whole "swine flu" hype (which I think is probably way overblown anyway), people might be a little more conscious of wanting to stay healthy and keeping clean; and yet, here are people throwing cleanliness to the wind. This is even more annoying, considering that their lack of hand-washing is going to spread germs around, starting with the same door handle I'm going to be using soon to exit the bathroom myself, after I've already gone through the trouble of washing my own hands.

Seriously. Flush toilet, wash hands. These are not new concepts. These are not hard things to do.


Bandwidth for November

In75.58 GB
Out5.70 GB
Total81.27 GB

This was a big month. Netflix had the Star Trek Original Series Season 1 collection available for streaming in HD. At the start of the month, they said it would only be available until around the 24th, so I tried to make sure I watched all of it by then. (It was only after I managed to finish the series that they removed the deadline, of course.) So, November shows the effect of watching twenty-nine 50-minute episodes of streaming high-definition video (in addition to a handful of standard-def videos and movies here and there).

Managed to hit about a third of the cap.


Bandwidth for October

Received:41.31 GB
Sent:5.87 GB
Total:47.18 GB

The first weekend was another General Conference broadcast from our church. We're making more use of Netflix as well. Sundays, since I don't play video games, I usually spend the night catching a couple episodes of old TV shows or movies. The kids like watching episodes of Mythbusters, too; and sometimes my wife will put on a Thomas the Tank Engine movie during the day for the toddler.

Most of it so far has been standard-definition video, though. As it happens, the first season of the original Star Trek is on Netflix streaming in HD video, but I noticed it is not going to be available after a date in late November. (Why the limited time, I wonder?) So I've been trying to watch as much as I can while it's available. We'll see what effect close to 20 hours of HD video has on bandwidth next month, and how close that comes to the ever-looming cap. Stay tuned!


Little of interest

Interest rates are at an all-time low. According to the little dancing ads that surround my Hotmail account, they are so low that President Obama is begging me to refinance my home mortgage. (He's also begging me to get an education loan to go back to school, and to lose weight by OBEYING ONE RULE.)

I actually find this annoying. I've already refinanced my home, so it's about as low as it's going to get for a fixed-rate mortgage. My vehicles are paid off (one, I paid cash for; the other was financed at 0% and was paid off last year). I am currently not in a position where I am borrowing money, but trying to save it. In addition to money withheld from my paycheck for my IRA, I have money automatically transferred each paycheck to savings accounts for myself (short- and long-term), and one for each of my kids.

Each of those savings accounts earn less than 1%.

I do have a brokerage account, but I try not to do too much with it, because any time I fiddle with it, I end up losing more money.

It is extremely frustrating when I'm trying to be financially responsible and saving money, yet the interest rates are so low, it's not worth saving any money. I might as well line my mattress with the cash.

Except, here's the funny part. As I'm going through my mail, I notice letters from my credit card providers, saying that they are raising my interest rates. These rates, that are allegedly tied to the federal prime interest rate, are already over 20%, and they're the only interest rates going up.

I suppose it's a good thing that I don't carry a balance and therefore don't pay interest (except for those rare occasions when they don't let me pay my bill and penalize me for "my" failure).

Maybe what I need to do is start my own credit card. Then I can earn interest that's actually worth something.


Bandwidth for September

Received: 44.60 GB
Transmitted: 6.16 GB
Total: 50.76 GB

Not quite as high as August, but September puts on a decent show. The spike on the 27th — the second-highest day on record so far — comes from keeping two kids with fevers home from church and trying to keep them entertained.

Still, a back-of-the-napkin calculation shows that I'd still be (barely) under my bandwidth cap for the month if that day was every day for a month.


Rocky Mountain Bank - Our Mistake = No Gmail For You

This is just beyond ridiculous and insulting.

Wyoming-based Rocky Mountain Bank made a big error, sending a list of highly personal information (including names, social security numbers, and loan information) to the wrong Gmail account. A rather big whoops, but there it is.

When they discovered their mistake, they sent another message to that account to ask the owner not to view the previous message. Probably not the most correct course of action — could they trust the person to be honest, even if they said they deleted it without reading it? It would've been wiser to consider the information already compromised, and to take steps to protect the compromised accounts and their owners' identities (e.g., one of my lenders paid for credit monitoring for me for a time when they had a security breach).

When they didn't get a reply from the Gmail account owner, they asked Google for the owner's personal information (presumably so they find another way to contact them). Google did the right thing and refused to turn over personal information about one of their customers without a court order.

The bank then filed for that court order to not only disclose the Gmail account holder's information, but to have that user's Gmail account shut downand the court granted it.

This is disgusting on a number of levels.

First of all, it would be as if, if they mailed the wrong document to your house, they got the court to order the USPS to come and destroy your mailbox.

Secondly, it's not unlikely the user in question never saw the email. I get emails allegedly from banks all the time that I never do business with — they're phishing scams looking for me to enter my password. I delete them without a second thought. If I got a random email from some "Rocky Mountain Bank", I'd delete that, too. Assuming these emails even made it past Gmail's spam filters, it's not outside of possibility the account owner deleted them himself.

Third, to deactivate the user's entire email account because of their screw-up goes way beyond their bounds. I use my Gmail for a lot, including business-related correspondence (not to mention it's my credentials other services, including this blog). What right does some third party have to shut off my business activities because they sent me something by mistake and that I probably never even looked at?

They made a mistake. Fine. It happens. Heck, I remember when I used to get emails detailing AOL's plans to expand dialup service in South America (it was entertaining, but not particularly useful — the emails I mean, although the same could be said about AOL). But suing to shut down an innocent person's email for their mistake is, at best, bullying and heavy-handed, and, at worst, a violation of Constitutional rights. Shame on you, Rocky Mountain Bank. If I ever have the opportunity to do business with you, it will only to be to tell you "No way."

I hope this Gmail account is owned by someone who does use it and has a brain, because I really want to see a counter-suit filed on this.


Our home away from home

My wife is back at Children's Hospital, this time with the baby (and toddler in tow; I'll be picking him up later). Although he was fine when we brought him home, he had been spitting up more and more, to the point where he was forcefully spewing not long after every feeding. We had planned on waiting to take our little "fountain of youth" to the doctor at his regularly-scheduled appointment tomorrow, but it had gotten bad enough that we decided to go ahead and make a call today.

My wife can't remember the exact name of the condition, but after a quick google, it looks like pyloric stenosis. They have him hooked up to an IV already, and they are scheduling him for surgery sometime tomorrow. According to the doctors, this is a very safe (and non-emergency) surgery. If he gets a morning appointment, he could even come home as early as tomorrow night.

Although I'd rather not have to go back to the hospital, at least it should be a pretty short and uneventful stay; and after this, my wife may not have to bring several changes of clothes (for the baby and for herself) everywhere she goes.


Can only see black and white

There's been a lot of hubbub made about Representative Joe Wilson's outburst the other day. The short version is, during a speech Obama was giving to the House about healthcare, the Republican representative from South Carolina shouted out "You lie!"

This has, of course, brought all kinds of reactions from all sides. The most moderate have been that it was simply disrespectful and uncalled for, and that it violated a rule about Congressional behavior meant to keep things civil.

Some (on the Right) excuse his behavior, saying he was just voicing what a lot of people were thinking, and wishing more people would speak out.

Some (on the Left) call his outburst completely disruptive, calling out the "sour faces" and "rolling eyes" of other Republicans in attendance for not agreeing 100% with the president (either forgetting, forgiving, or applauding the same lack of respect Congressional Dems gave our previous president, — a very famous eye-rolling from one Hillary Rodham Clinton "from" New York comes to mind).

But then there are those who have to add fuel to the fire. Apparently, they see a more sinister reason for Representative Wilson's outburst. It's not because he disagrees with the legislation, or that he is frustrated with the process. No, the only possible reason he would shout that to President Barack Hussein Obama is because of the color of the man's skin. Period.

Hope n' Change blog

I am completely baffled as to where the racism is in the words "You lie." Liberals are more than happy to add words to his outburst to make it racist. (Hey, that looks like fun; can I try? What Obama meant to say before he was interrupted was, "And you honkeys are going to pay for it and like it!" Wow, that was easy.)

Democratic Representative David Scott asks (according to The Washington Post), "Would he have done that if the president were white?" In my daily commute, I pass cars that still haven't removed their "BUSH LIES" bumper stickers. Are they racist? That same Washington Post article mentions concerns about the depictions of Obama as Hitler. Was it racist to see "BusHitler" in online forums for eight years?

I guess it wasn't altogether unexpected. I've seen warnings for a long time that any dissent against the president could be labeled as racism.

Seems to me, though, that the so-called "elephant in the room" isn't the unsaid racism that people are inserting into other people's speech and actions, but the fact that people actually disagree with what the president and his Democratic congress are trying to push through, and are frustrated and want to be heard.

But I suppose talking about that is much more difficult than just saying "racist" and dismissing dissent.


How I brought down Duke campus ethernet

This is a fun story I like to recall from time to time. This story is absolutely true.

Between my sophomore and junior years at Duke, they wired the entire campus for ethernet. (That's right, before then, it was all dial-up, baby. 14.4 blazing kilobits per second.) Every dorm room on campus was installed with its own personal 10Mbps CAT-5 jack, along with an individual coaxial cable outlet (now they could sell cable to each student directly, instead of just to the common rooms from which students would splice and run their own coax to their dorms for free — not that I would know anything about that, of course…). Duke was entering the digital age.

In a marvel of civil engineering, they managed to install this new jack in the most inaccessible location of every dorm room. So amazing was their work, that in my junior year room, which couldn't have been more than 20' wide, it required more than fifty feet of cable to go from the jack, around the edge of the room, to the desk on the opposite wall. The exact length of cable isn't that important, so long as it's noted that the maximum length of cable sold at the campus computer store was, in fact, 50'.

Now, in the mid-1990s, you didn't have a wide selection of networking equipment available at every local computer store. "Home networking" didn't even exist — it still took some work to get Windows 3.1 to even talk on a network. Today, you'd probably just go to Best Buy or even Wal-Mart and pick up a CAT-5 coupler for 50¢ and join two shorter cables. Back then, though, that wasn't feasible.

So, I bought a copy of Computer Shopper and found a deal on network cable, buying 100' at something a student could afford. When it arrived, however, I found I made a slight miscalculation — I bought bulk cable that did not, in fact, include any ends. I therefore bought the shortest, cheapest network cable available at the campus computer store (who could possibly have use for a three foot cable anyway?) and snipped off the ends with about a half foot of wire. I then proceeded to strip each of the eight individual wires from either end of my 100' cable (cut down to whatever length I actually needed for my room, probably something closer to 60'), twist them with the wires from my purchased cable ends, and wrap each connection with electrical tape. A quick test with a hallmate's multimeter confirmed that I wired each connection correctly, such that each contact passed straight through from one end to the other with no crosstalk to other lines. Everything seemed good.

I plugged in my cable and attempted to configure my network card. Unfortunately, every attempt I made seemed to get me nowhere. After about an hour of fiddling with settings, I decided to give up and head downstairs for a break.

On my way down, I heard a friend cussing up a blue streak, so I popped my head in to see what was going on.

"I'm trying to get my project done, but the @$%!?! network is down!"

"Really? How long has it been out?" I asked.

"About an hour now."

That's… quite a coincidence, I thought. Just to satisfy my own curiosity, I headed upstairs, where I left my network cable plugged in.

I pulled the cable out of the wall, and I heard from downstairs, "AAHHHH! FINALLY!"

I thought about this for a moment, then I plugged my network cable back in.

Came the cry from downstairs, "OH, F$*#! NOT AGAIN!"

I pulled the cable out.

"Geez, THANK you."

I pondered this for a few moments, debating the philosophical ramifications of great power and great responsibility. I then spent the next few minutes doing my best Homer Simpson impersonation, plugging and unplugging the cable as I chanted, "Net go up, net go down. Net go up, net go down." I then left the cable unplugged before my friend burst a blood vessel.

A short time later that evening, I began to wonder how widespread this effect was. I decided to call a friend of mine who happened to work at the campus computing help desk. The conversation went something like this:

Me: Hey, have you guys been having any problems with the network tonight?

Her (sounding very suspicious): Why?

Me: Because I think I can bring the network down.

Her: That was you?!

I told her about my cable and how my plugging it in seemed to be tied to my dormmate's inability to use the network. She exhorted me not to plug the cable in again, and said she'd call me back.

Later, I got a call from someone in the networking department.

"Not that I believe this is possible, but could you plug your network cable in for me?" he said.

"Sure." *click*

"Huh. And could you unplug it for me?"

"Yep." *click*

"You know, if I couldn't hear the click of the cable going in and out, I wouldn't believe it."

He then asked me about the cable, why I made it, etc. I told him that I just needed a longer cable to get around my room. He also asked me not to plug in the cable again and promised to be in touch.

I didn't plug the cable in again. I didn't want to bring down the network, honestly. I wanted to be able to use the network. The facts were, this cable didn't let me use the network, and it only prevented anyone else from using it. My goal was not satisfied. I had no problem not plugging it in again.

The next day, a couple people from the networking department came by and offered to trade me a pre-made retail 100' network cable for my homebrew cable of death. I was happy to do so.

I got a call within a day or two. Apparently, they tested my cable, and as far as they could tell, it was fine — it was wired correctly, nothing funny was going on with it. Near as they could figure, there must've been just enough resistance in my ghetto twist-and-tape connections to put just enough extra stress on their network to push it over a breaking point.

This theory proved to be true a couple months later, when I was called again from the networking department and asked if I had made another cable. It wasn't me this time; enough people had connected to the network that the tipping point had been hit again. Unfortunately for them, this time it wasn't a single extra-resistive cable, but the mass of normal cables that did it.

But I have to wonder if that cable isn't lying around in the Duke network lab somewhere, perhaps with a sign that says "evil network cable of death, do not use", as some kind of reminder about the importance of network infrastructure. Or if it's not so labeled, and if it might actually get used again.


A nullable DataGridView CalendarColumn

A while back, I managed to fix a couple bugs with the sample DataGridView CalendarColumn control that made it much more usable. Today, I came across one more issue. It's pretty well known that the DateTimePicker, despite having support for a checkbox that lets you turn a date on or off, does not directly support "null" as a valid value. There are a bunch of ways to get around this, but what I came across was a need to support this inside of a DataGridView.

I started with the task of making the CalendarColumn configurable in such a way as to be able to turn the checkbox on or off at will (well, at least, at the moment of construction). That part's easy; I added a new constructor to CalendarColumn to take an "isNullable" flag:

public CalendarColumn() : base(new CalendarCell()) { }
public CalendarColumn(bool isNullable) : base(new CalendarCell(bool isNullable)) { }

Then, I added a class-level variable to my CalendarCell class, and initialized it in the constructor:

public class CalendarCell {
    private bool isNullable = false;

    public CalendarCell() : base() { 
        this.Style.Format = "d"; 

    public CalendarCell(bool isNullable) : this() {
        this.isNullable = isNullable;

The next modification comes in InitializeEditingControl. Immediately after getting the reference to CalendarEditingControl ctl is set:

    ctl.ShowCheckBox = this.isNullable;
    if (this.Value != null && this.Value != DBNull.Value) {
        if (this.Value is DateTime) {
            ctl.Value = (DateTime)this.Value;
        } else {
            DateTime dtVal;
            if (DateTime.TryParse(Convert.ToString(this.Value), out dtVal)) ctl.Value = dtVal;
        if (this.isNullable) ctl.Checked = true;
    } else if (this.isNullable) {
        ctl.Checked = false;

(Note that I added a little checking around the value setting area, because I'm paranoid like that.)

Next, DefaultNewRowValue:

public override object DefaultNewRowValue { get { if (this.isNullable) return null; else return DateTime.Now; } }

Here's what I found out you don't change. The ValueType property always returns typeof(DateTime). If you change this to typeof(DateTime?), what ends up happening is, if you bind to a DataTable, it attempts to insert an actual null into the table. Because (for reasons I have yet to believe necessary) null and DBNull are two completely separate and incompatible things, this fails. Apparently, by leaving the value type as non-nullable, a null value will get translated appropriately in the binding.

We're not quite done yet. In the CalendarEditingControl class, the EditingControlFormattedValue property needs to be updated:

public object EditingControlFormattedValue {
    get {
        if (this.ShowCheckBox && !this.Checked) {
            return String.Empty;
        } else {
            if (this.Format == DateTimePickerFormat.Custom) {
                return this.Value.ToString();
            } else {
                return this.Value.ToShortDateString();
    set {
        string newValue = value as string;
        if (!String.IsNullOrEmpty(newValue)) {
            this.Value = DateTime.Parse(newValue);
        } else if (this.ShowCheckBox) {
            this.Checked = false;

And presto, a checkable, nullable DateTimePicker column that works in a DataGridView bound to a DataTable.


Bandwidth for August

Totals are 55.07GB in, 6.50GB out, total 61.57GB.

This month, numbers went way up, thanks to biting the bullet and activating my Netflix subscription and streaming movies to my Xbox 360. On the 1st, we watched about four hours of video (one feature-length movie, a shorter cartoon movie, and a kid's video), and on the 2nd, we watched close to eight hours (four movies and two TV episodes), all standard-definition. I don't recall all of what we watched on the 8th, but it resulted in even more bandwidth used.

Just taking the numbers for the highest usage day, it does show an interesting point. If I were to stream eight hours plus of standard-def video every day (resulting in 6.25GB of use, including random web surfing and other internet activity that day) for the entire month (31 days max), that still leaves me with 56GB before I hit the 250GB cap. Up to this point, my highest usage month was under 38GB, and the average was 26.85GB.


ServiceMagic.com, or SpamMagic?

This summer, we had a problem with water in the basement. With our son in the hospital, it didn't exactly take a high priority, but eventually we had to get it taken care of, as it was bringing in a lot of sediment and mildew (and mold is one of my biggest allergy-triggers). I realized, though, that for a problem like this, where I had what appeared to be water seeping into the basement from an unknown source (was it coming in from underground, a broken pipe, or a leaky vent to the outside?), I had no idea who to call. That's when someone directed me to the web site, ServiceMagic.com. "Get Matched to Top-Rated Service Professionals", their site proclaims.

So, I created an account and described my problem. I thought this would be a good opportunity to use my brand new Google Voice phone number, too (720-23-YAKKO :D ), as I wouldn't have to provide my cell or home telephone number, just in case. As you will see, this turned out to be quite a blessing.

I got a call from a company to come out and take a look. Unfortunately (or fortunately), they had one time available that week that didn't work for me, and the next available time was several weeks away. I went ahead and scheduled that other time. I then called my insurance agent, and from them I got a list of contractors they used. (I also checked to see if my homeowner's policy would cover this water damage, which, alas, it didn't.) I called one of their "preferred contractors", and they were able to schedule a time in the much more immediate future.

In the meantime, I got another call from the contractor that ServiceMagic referred to me, asking again if I wanted the time that wouldn't work for me. (Note that these calls were going to my Google Voice number, so they would leave a message and I would call them back.) The contact number was very different, leading me to believe that I first was contacted by a scheduling service before and the local contractor later. Whether the scheduler was a part of ServiceMagic, the contractor, or some third-party go-between, I'm not sure. But in any case, I again verified my appointment for several weeks out.

The contractor I contacted through my insurance agent came out and diagnosed the problem as a leaky drainage pan with the air conditioner. We then scheduled an appointment with the HVAC company to come out and fix that (and reconsidered an annual maintenance contract with them), and the leak was taken care of. (It actually cost us twice as much more for the contractor to diagnose the problem, than it did for the HVAC guys to fix it.) Problem solved, I then called the other contractor — the one referred to me by ServiceMagic — and canceled my appointment.

The contractor has since contacted me a couple more times (once by phone and once in a letter), and ServiceMagic once (e-mail), about that appointment directly. Basically, the nature of the messages have been "if you reconsider, we can still help you". Nothing outrageous, and nothing to get too upset about.

What has been extremely annoying have been the completely unsolicited calls I've received, totally unrelated to this project. I had three calls attempting to schedule a time to install carbon monoxide detectors in my basement (one claiming it was required to meet compliance for rental properties — my home is not a rental; and anyway, I already have a CO alarm in my basement), and one was a plumber that was, as his message said, "calling to verify our appointment in a half an hour" (I of course had made no such appointment).

Again, fortunately, this is all going to my Google Voice phone number, so I'm not bothered at work or at home by these phone calls for random services I did not order or do not want. However, it still bothers me that ServiceMagic.com seems to be giving out my personal information to contractors that have nothing to do with me, without my authorization (I did actually click an OK before the first contractor called me). So far, I only have to listen to and ignore their messages; heaven help them if someone comes to my doorstep claiming they have an appointment.

And how do I know this is coming from ServiceMagic? Well, not only are these contractor-type phone calls that came in after I requested some kind of home service, but they are coming to a phone number that I had never before used or published. Could Google Voice (or, its former name, "Grand Central") have obtained this phone number from a pool of "recycled" numbers from someone who just happened to be a rental property owner who hired a plumber this month? Maybe, but that's an awfully large coincidence. Could my information have leaked out not from ServiceMagic, but from the contractor they worked with or some third party in between (such as the "scheduling agent" who first contacted me, whom I am not certain about)? Again, possibly; but that would reveal a potential danger in the whole process of obtaining a contractor through ServiceMagic.com anyway.

I have since changed my personal information on my ServiceMagic.com account to something more or less random. I most certainly will not be using them again, and I would encourage everyone else to avoid them as well.


Yakko, Party of Six...

Last week, we welcomed our fourth child into this world. I certainly don't mean to belittle his arrival or how happy we are to have another healthy boy in our family, but compared to our last experience, this one was rather uneventful.

My wife, who had been having a lot of Braxton Hicks contractions this pregnancy, had just sat down to rest, and I had just sent the kids upstairs to get ready for bed while I finished up a couple rounds of a videogame I was playing. After a bit, though, she said, "I think I'm in labor." The contractions didn't go away with sitting down, and they were coming regularly.

She made the required phone calls, and I turned the game off and went upstairs to hurry the kids into their sleepwear and grab the sleeping bags — their overnight bags were already packed. We loaded them up, dropped them off at a friend's for the night, and went to the hospital.

Just as we were pulling into the parking lot, we finally got a call from the obstetrician. He hadn't called yet, as he was in the middle of another baby delivery at the time at a hospital about 10 minutes away, and he had another delivery coming. Knowing how fast my wife tends to deliver, he wasn't confident he could call another doctor and get them to our hospital in time, so he asked if we could come there. The contractions hadn't gotten any faster or harder yet, so we turned the car around and drove down the highway to the next hospital.

We got there and had to fill out paperwork (because we had preregistered only at the other hospital), then got checked into the room as her contractions finally started to get hard enough to hurt. The doctor came in, broke her water, the contractions really started, and before long, we had another healthy baby boy, just about two hours from the time my wife told me "I think I'm in labor."

Yeah, my wife tends to make a lot of women jealous in that respect. Strangely, though, they're not too jealous of her having a baby on the couch. Go figure.


Arrow of Light Ceremony Box

I was called as the Cubmaster for the Cub Scout pack sponsored by our Church, and last month, I had the opportunity to award the Arrow of Light to one of our boys. I looked up some various ceremony ideas online, and I remembered seeing a couple where the Cubmaster would identify seven virtues with the seven rays coming from the sun on the award. I figured that would be a decent idea to go with, and I found a ceremony that had those seven virtues. But I needed something visual to go with it, something that would make it special and memorable for the Cub instead of just some old guy standing in front of him reading a speech.

I had seen the ceremony before where there was a model of the Arrow of Light, and seven lightbulbs or some other electrical contraption wired up so that each of the rays could light up with each of the seven virtues. The only problem was, I never saw one actually working. Seems like there was always something wrong — a loose wire, a lack of lightbulbs, no access to a power outlet — that it ended up just being some old guy standing in front of the model reading a speech anyway.

I decided to do the same concept, but simplify it quite a bit. I have zero electrical engineering talent anyway, so I doubted I'd be able to wire anything up, but I figured something that wasn't wired at all would stand a greater chance of actually working when called for. My concept was simple: create a box large enough to hold a battery-powered lantern inside, cut out the Arrow of Light in one face, and cover the rays of the sun with something that could be revealed one at a time as the virtues are announced.

I decided to start with a cardboard box, and a Pampers diaper box fit the bill nicely. It was sturdy, had a nice rectangular shape, and was just tall enough to accommodate the Coleman battery-powered lantern I had handy. I removed the top flaps completely, and pried open one of the bottom flaps as an access panel to inside the box. I then covered most of the outside surfaces with black construction paper, using black electrical tape to attach it. (I considered lining the inside of the box with aluminum foil to enhance the lighting effect, but I didn't think about that until the end and decided it wasn't worth the effort.)

Making the Arrow of Light front panel was, naturally, the hard part. I originally thought I would make it out of scrap wood, but my wife, who is far more craft-wise, suggested sheets of ¼" foam core instead. We found an outline picture of the Arrow of Light badge, enlarged it, and printed it out for a guide. The proportions weren't exactly right, but it worked out with only minor adjustments. The rays on the top of the sun obviously don't hit the border of the panel, either; rather, we made them all approximately the same size and shape.

Foam core cuts fairly easily with an exacto-knife, although by the end of the cutting, my arm was good and tired. I cut out the arrow and the sun, and the ray pieces I cut and kept, numbering them so I would know exactly which one went back where for a "perfect fit". I also cut thin strips to create the border.

Next came painting. It took two or three coats of blue craft paint to turn the whole panel blue, but the hard part was painting the ¼" seam inside the cuts (so as not to have a really ugly white border around every opening). Foam core doesn't make a clean cut on the inside, and it involved a lot of jabbing the paint brush into bits of styrofoam to turn it all blue. The border sticks, on the other hand, just took a quick brushing of yellow.

To turn the inside yellow, I used yellow tissue paper and covered the interior side of the panel. My wife suggested using a layer of clear vinyl first, to protect the tissue paper from being destroyed by curious fingers, but I was afraid it would be too shiny and would distract from the effect. I thought it was a good idea, though, so I thought I'd mention it here.

I then put the panel on the box. It actually fit quite snugly on its own, but I secured it from the inside with duct tape. (I don't know how well the tape will hold, though; because I lined the inside side with tissue paper, the duct tape is only holding on to tissue paper glued to the foam core, not the foam core itself.)

I took the ray pieces and tried putting them in and taking them out, using the exacto-knife to shave around the edges until I could take them out easily. I then took staples, stuck them into the top of the rays, and bent them out to create handles for removal. (This turned out to be futile, however, as the staples came out of the ray before the ray came out of the sun. Fortunately, the bottom of the ray is accessible to fingers and very easy to remove.)

I don't know if the kids were really in "awe" of it or not. It didn't light up too much in the light of the gymnasium — although I did leave it on for the rest of the evening. Later, we had a "crossing over" ceremony for a Cub (the same scout, as it happens) who was graduating to the Boy Scouts, and part of that ceremony included turning off the lights; and the Arrow of Light was glowing very nicely during that time. :)

I posted some more pictures of the box from various angles over on Flickr; click either of the thumbnails or this link.


Netflix Streaming - so *that's* the big deal

As I mentioned in my last bandwidth post, I finally subscribed to Netflix so I could play with the instant streaming option. I've only had it for a week, but I've already collected a few thoughts.

I'll save my bandwidth comments for the end of the month in my traditional bandwidth post (although the numbers so far are encouraging).

I have already noticed that, as far as instant streaming is concerned, the selection is average. If you search the entire Netflix database and start paging through selections (which, unfortunately, you can't do until you subscribe), you can find yourself flipping through pages of items where only 1 or 2 at best (and often 0) are available for instant streaming. (My completely uneducated guess is about 4-5% are available for instant streaming.)

However, even if the selection is limited, there's still some interesting movies worth watching. And the nice thing is, they're available to watch at any time. I've found movies I had been curious about seeing for a while, but just haven't wanted to invest the time in renting from the video store.

There are also a few kids' videos. Again, not everything is available, but it's nice to have a couple Thomas the Tank Engine videos available on demand when the toddler needs some down-time.

There are still some disadvantages to the service. For instance, although having the aforementioned Thomas videos on demand are nice, they're only available when my internet connection is stable, and they're only available on the Xbox 360 in the family room, not, say, on the DVD player upstairs or in the minivan.

Also, Netflix Streaming does not support captions. We've been in the habit of having closed-captioning turned on and the TV not so loud. But when watching a movie on Netflix, we have to crank the volume higher than normal to make sure we don't miss anything.

Another down side, the Netflix Streaming movies include only the movie. There have been no (as far as I've seen) options for director's commentary tracks or any other bonus extras.

My kids have watched Who Framed Roger Rabbit? twice so far, but the second time they tried to watch it, it quit very near the ending as our internet connection hiccupped and knocked the 360 temporarily offline. Every time we watch a movie, even if it's the same one over and over, it must be streamed across the internet anew, consuming bandwidth.

We watched National Treasure 2 over the weekend, and although we enjoyed it, it's probably something we would only watch the one time. The lack of bonus features was missed, but something we could live without. (In fact, when we rented National Treasure on DVD a while back, we almost felt obligated to watch all the extras before returning it; so being reduced to just the movie was almost a relief.)

In summary, I think Netflix Streaming is no replacement for actual DVDs. (In fact, replacing all physical media for all-digital downloads and/or streaming is, I think, a recipe for disaster for consumers; which is something I've ranted about on my gaming blog at length.) But for a quick, no-commitment, no-frills, impulse rental (not to mention for no additional cost once you have a subscription to the service), it does the job well.


Bandwidth for July

As I continue to monitor my own usage for my Comcast internet service, I note that, at some point, I was intending to compare my numbers to the numbers that Comcast itself reports that I am using. However, it appears, after having implemented this cap 10 months ago, Comcast still has not released a bandwidth meter to their customers. How it is they can get away with limiting your usage without telling you your usage is beyond me, but there it is.

And, as for the July totals, here it is:

Totals are 16.95GB down, 4.97GB up, for 21.92GB total. There's a huge spike on the 31st, which might have to do with watching a lot of YouTube videos of "Literal Videos".

Stay tuned, though; next month is about to get interesting. Microsoft has released an update to the Xbox dashboard that allows you to watch Netflix movies in a virtual theater with friends. Virtual MST3k, here we come! :D

I activated my Netflix free trial today, and seeing all the movies and shows available for my kids, I can already tell it's going to get a lot of use and be well worth it.


This is not the SelectedValue you're looking for

Oh, here's a fun one.

I have a list of locations that I'm retrieving from a web service, and I want to display them in a ComboBox. I also want to have a blank entry at the top of the list, so "nothing" can be selected. While I'm sure there are ways to do this with less code, creating binding objects and such (especially since the retrieved object list is already pre-sorted in the order I want), I've resorted to just creating a DataTable with an ID and display column and copying the values I want into it. It does make things easier when I have one combo box filter another, as DataTables already have code written for searching and filtering.

Anyway, after I get my data, I have a DataTable that looks like this:

7Colorado Springs
3Ft. Collins

Now, I bind it to my ComboBox like this:

combo1.DataSource = dataTable;
combo1.DisplayMember = "Location";
combo1.ValueMember = "LocationId";

Note that you have to set the DataSource first and the DisplayMember & ValueMember properties second, otherwise you get a ComboBox full of "System.Data.DataRow". Nice.

Now, on this form, when a value is selected, the selected value is used to filter another list; and, when the form is submitted, the selected value is passed off to a web service. How do you find out when a value is selected, and what that value is? Simple; bind to the SelectedValueChanged event, and query the SelectedValue property, right? In theory.

In practice, no. To make a long story short, I dropped a label onto the form so I could see what was going on in "real time". First, the code:

private void combo1_SelectedValueChanged(object sender, EventArgs e) {
     label1.Text = Convert.ToString(combo1.SelectedValue) + " - " + Convert.ToString(((System.Data.DataRowView)(combo1.SelectedItem))["LocationId"]);

And the results:

ComboBox selectionLabel1.Text
empty - 
Aurora1 - 2
Colorado Springs2 - 7
Denver3 - 1
Ft. Collins4 - 3
Longmont6 - 4
Parker7 - 6

Incidentally, the SelectedText property was always blank.

On the up-side, as you can see, I found a way to get the real value (using the SelectedItem and casting appropriately). On the down-side, it means I have to use that construction to get the selected value on this and every other similar ComboBox (there are actually four on this form alone), since SelectedValue, apparently, doesn't.


You have... zero... messages.

As I was attempting to pay my T-Mobile bill this past weekend (a futile endeavor, as their billing system was unavailable — an unfortunately very common occurrence), I decided to look at their offered services. It was mostly just morbid curiosity rather than actual interest, as I find cell phone rates for services obnoxious.

I've ranted about the ridiculousness of text messaging prices before. (As a side note, I have noticed that it does seem that I am not charged for a text message receipt when one is sent to me, but only when I choose to read it. It's still not terribly comforting, considering my phone has a tendency to double-tap the "OK" key, so my attempt to view my message list often inadvertently results in my reading a message, whether I wanted it or not.)

One thing that annoyed me was the fact that text messaging plans were specific to phone lines, not to plans. My wife and I have a phone plan where we share minutes; but we cannot get a plan that allows us to share messages. Well, T-Mobile has added a family messaging plan that — lo and behold — allows you to pay once for messaging on all lines on your account! Unfortunately, the only plan available for an entire family is the "unlimited" plan, which is $25/month. It's still way above and beyond expensive for our usage (which is more like 10 messages per month), but I'll bet for some families, this would be quite a deal.

Another major annoyance I had was that there was no way to block text messages. You couldn't stop someone from sending you messages to potentially run up your phone bill. Well, that, too, is no longer a problem. There are now options for blocking messages, either per-phone or for the entire plan. There are various options for blocking, too, limiting outbound messages only, or limiting inbound messages to those from other phones (i.e. no automated spammers), or blocking all inbound and outbound messages completely. And best of all, all of the options are free!

Needless to say, I turned on all message blocking. As long as they insist on charging per text-only, length-limited email message, I won't be using it.

And while this may come as a disappointment to the two people who actually send me text messages from time to time (which I don't read, and either keep forgetting I don't read them or keep forgetting to remove me from whatever distribution lists they have that I'm in), I can only say: just send me an email. Or call. That's what a phone is for. :P


The $2 Electric Razor

I've used an electric razor ever since I first started shaving. They're quick, they're easy, and they're safe, especially compared to the standard blade. But where I did use a rechargeable before, I've since gone to just using a plug-in. The problem I had with rechargeables was, whether I left them plugged in all the time or ran them down and "deep cycled" them, it seemed like the batteries would consistently stop holding a charge before the blades would get dull.

The interesting thing about replacing blades, though, is that I never actually do it. I've found that the price for new blades is so expensive, and the price for a simple, plug-in electric razor is so cheap (because only the cheapest models are plug-in; the first feature that gets added as the price goes up is cordlessness), that it's just as cheap and twice as easy to buy a whole new razor than it is to find a set of blades that's compatible with the razor I already own.

Case in point: my last Norelco razor stopped cutting as well as it should. I went down to Wal-Mart to look at razors. Razor blade heads were $29 (and since I didn't know the model number of my razor off the top of my head, I wouldn't know which one to get, if a compatible set was there at all), and a new Panasonic razor was $31. Which leads to the inescapable conclusion that the razor itself — the housing, the motor, and even the flip-up trimmer and the blades contained therein — are worth a grand total of two dollars.

Which sounds about right, considering the flip-up trimmer on my old Norelco had also broken, being driven by a cheap piece of plastic. Buying new heads wouldn't fix that.


Bandwidth for June

June was also a fairly light month. Total downloaded was 18.49GB, total up was 6.28GB, for a grand total of 24.77GB.

I got the Xbox 360 game Ghostbusters for Father's Day, and I was very close to activating a Netflix trial so I could stream the original movie — which would have been very educational as far as bandwidth consumption is concerned. However, that very next day, my Xbox died and had to be sent in for repairs, so that killed those plans.


The importance of keeping good records

I'm a bit of a pack rat. Ok, I'm very much a pack rat. I don't like to throw anything away on the off chance that someday, I might have a need for it. It's especially bad when it comes to financial information. I have receipts dating back to the 1900s — which used to sound much more pathetic than it is, but considering they were 9½ years ago, I think we can safely upgrade that statement from "sounding pathetic" to "actually pathetic" now.

Regardless, I finally am able to reap the rewards of not throwing papers relating to money away. I got a letter from the IRS a couple weeks ago that I had been selected for an audit (What, I didn't mention that in my "pity party" post? Hmm, probably should've; it definitely qualifies) and that I needed to gather information about my charitable donations for 2007 (what fellow Geezer Gamer "SlapShotSal", who does taxes for a living, tells me is a "substantiation audit").

I knew the bulk of my donations for the year would be to my Church, so I got the statement I received from the Church for 2007, which had a list of all donation dates and amounts for the year. Then I pulled a report in Quicken for that year and found the check numbers that corresponded to those dates and amounts. With that list, I went to all my bank statements for the year and found the statements they appeared on and the dates they cleared. I figured these dates would be important to get the images of the canceled checks from my bank, since to see old checks, I usually have to select the statement they were on. This could've been a tedious process of having to download each statement from my bank, but I keep copies of my statements on my home network for easy reference. (It worked, too; it was very easy to reference all those old statements.) Yes, the pack rat trait applies to digital files as well — probably even more so.

Now that I had a list of check numbers and dates, I logged on to my bank for what I dreaded would be the most tedious part of this whole process — having to find each check on the old statements and get the images, one by one. Maybe I would take them into Paint.Net (my favorite free image editing program du jour) and stack three or four of them on a page to save paper.

I found the link to prior statements, but much to my disappointment, they only went back 18 months, the earliest one available being January 2008. So that wouldn't work. But there was another link for searching for transactions that indicated check images were available as far back as 2005. (Glad I didn't get audited for any years prior.) I entered a date range of the whole year, a check number range from the lowest to highest number I had, and selected "Check" for transaction type.

I couldn't believe what I saw. There was a list of all the checks, with a checkbox by each one. At the bottom of the list were two options, one to select Large or Small images, and one to select Front only or Front and Back, and a button marked View Images.

Actually, the search results were limited to 100, so I had to do the first half of the year and then the second half, but big whoop. There it was, exactly what I needed. Select the checks I needed to see, and hit View Images to see just those checks.

When I viewed the images, it showed me two checks at a time, with front and back images — so four images total — with some simple navigation at the bottom to move to the next pair of checks. Since the site's not in a frameset, I couldn't tell my browser to just print a single frame (i.e. the one with the images), and I didn't want to print the navigation links (or the rest of the webpage for that matter), so I figured I'd still be copying images from the screen. Just for kicks, though, I called up the Print Preview to see what would happen if I tried to print.

They thought of that, too. Apparently there's a printing stylesheet in place that turns off everything but the content, because in the Print Preview, the only thing visible were the check images. No navigation, no links, no tabs or corporate logos or anything extra.

Here I thought I'd be at this for days, or at least hours, gathering images and printing them out one by one, and all I had to do was click "Next, Print, Next, Print, Next…"

I'd love to publicly praise this bank for their extremely useful website, but at the same time I don't necessarily want to advertise to the rest of the internet where I keep my money. I did make a point of sending a message of thanks to their customer service inbox, though.

So, with that out of the way, now I can go back to playing my Xbox. Except that is currently on its way to a repair center in Texas and probably won't be back for a couple weeks.

Yeah, I guess I forgot to mention that, too.


The hits just keep on coming

It's a pity party, and you're all invited.

When I picked up my son's medication as we got him out of the hospital, the total bill was close to $500 for a month's worth. I figured they were just having issues with insurance and I'd just need to resubmit the claim later. In any case, it wasn't something I could worry about or negotiate at that time — the treatment required keeping the level of medication in his blood stable, and we needed the pills then. Well, I finally got around to calling my insurance carrier to see what was up.

Here's what's up: that medication isn't covered. The price, unfortunately, is what it is.


A couple weeks ago, a tornado passed really close to our house. We didn't have any damage from the twister, thankfully (in fact, it did surprisingly little damage for touching down in the middle of a shopping mall, causing no injuries). However, there was golfball-sized hail. We have an insurance adjuster coming to look at our roof to inspect for hail damage on Monday. If repair work needs to be done, it's covered, just with a $1000 deductible. Which could be a lot worse, but it's an expense when I don't need any more expenses.

And, my glasses broke this morning. I got these frames that were supposed to be made of this indestructible flexible alloy, and the frames have in fact held up well. The problem is, the screw on the hinge is held in place by this flimsy piece of wire that's barely soldered on to the indestructible frame. This same hinge actually broke twice on me. The first time, it happened so quickly as to still be under warranty that I could have the frames replaced. Not so, this time.

Fortunately, my older pair is still in great shape, and my previous prescription isn't that much different, so getting a new pair is something that doesn't need to happen immediately.

And, I just got a call from my wife, who is right now taking my son (the one with the $500/month medication) to the doctor's office with sharp, stabbing pains in his stomach.


Wait, what about The Social?

A year and a half ago, I looked at this "Zune Social" thing, and I wondered if it would be possible to "jump in" with just my desktop PC. Having a Zune Card that was just like my Xbox Live gamercard, with a running history of the music I listened to, sounded kind of cool. Gimmicky, sure, but cool. And the fact that I already had a Zune Card simply by virtue of having a gamercard meant the cost of entry was eliminated. (I suppose this is also related to me being a sucker for features, as I had access to this feature that I wasn't using.) But in order to use it, you had to use the Zune Media Player, which, compared to Windows Media Player, was pretty lacking.

I posted a comment in the Zune forums, suggesting it might be nice just to have a WMP plug-in that updated my Zune Card with my stats from WMP. The responses I got back were rather disparaging, saying they couldn't do everything the Zune Media Player did in a mere plug-in. It was also the prevailing opinion that the Zune Social was for Zunes, and it didn't really matter what I played on my PC. (Ok, never mind the fact that I could play things in the ZMP and have it update my Zune Card.)

Back in September, they released a software update, and I decided to give it another look. In short, nothing had changed. I came to the conclusion that the Zune Social was a Zune-only club, and I would just be anti-social until I somehow acquired a Zune of my own.

Two weeks ago was E3, and Microsoft announced that Last.fm would be coming to the Xbox 360. I hadn't really looked at Last.fm before, so I signed up. Not only does it offer streaming music, but it (to quote its home page) "recommends music, videos and concerts based on what you listen to." And how does it know what you listen to? Well, obviously it can track the songs it streams to you and the ones you flag as tracks "loved" or "blocked". But it can also track songs played in Windows Media Player using a plug-in.

So here you have this third-party service that is doing exactly what I was asking for from the Zune Card. And Microsoft is integrating that service into the Xbox 360.

Oh yeah, they did also say that the Video Marketplace on the Xbox 360 would become the Zune Marketplace. But so far, they've only announced that for videos. Not music.

I don't get it.


I'll handle any key you want... except that one

Here's one of those that makes a little more sense when you think about it, but it still leaves you scratching your head until you figure out what's going on. And then you think about it some more and realize, no, it doesn't make sense at all.

When you want to capture keypresses in a control on a Windows form, the "best" place to do that is the KeyDown event. It gives you the ability to capture keys, the state of the modifier keys (Control, Alt, Shift), and to mark that keypress as being "handled" so the key does not continue on as actually being typed. It also provides access to capturing unprintable keys (like Escape or Insert).

However, one thing it does not do is let you capture the Tab key. This is because the control doesn't even get a KeyDown event when the Tab key is pressed. (Indeed, Microsoft considers it a bug when it does trigger a KeyDown.)

You can sort of rationalize this behavior when you realize that the Tab key is "special". The form uses that key to determine when to move from one control to the next. So, in that way, it would make sense for the Tab key to not even get to the control. However, you can easily debunk that rationalization with two controls: a DataGridView and a TextBox. A DataGridView, with its StandardTab property set to the default of False, will, when a Tab key is pressed, take it upon itself first to move the active cell through the grid, and only when the last cell is reached then let the form move focus to the next control. Likewise, a TextBox that has both Multiline and AcceptsTab properties set to True will take any Tab keypresses and add a tab character to the input, never passing that keypress to the form.

In any case, it seems that, for whatever reason, the Tab key is handled by the form sometime after these possible control overrides, but before the KeyDown event could get fired.

Solution? Well, it turns out, there are two.

The first one I found is to override the form's ProcessCmdKey method. Start by calling the base ProcessCmdKey method, which returns a boolean that indicates whether the key was handled. Then, check to see if this.ActiveControl is the control for which you want to trap the Tab key, and if the keyData parameter passed in to ProcessCmdKey contains the Tab key ((keyData & Keys.Tab) == Keys.Tab). If so, do whatever it is you wanted to do, and set the boolean return value to true, indicating you've processed the key yourself. At the end of the method, return the boolean. (I found a simple example here.)

The annoying part is, if you were trapping for more than just the Tab key in the control's KeyDown event, you now have your logic split in two different methods (control_KeyDown and form override ProcessCmdKey). Also, if you are doing this for multiple controls (as I was for, coincidentally, a DataGridView and a [single-line] TextBox), you have to copy and combine the logic from the other controls' separate KeyDown events into the ProcessCmdKey method, testing the ActiveControl to make sure you know which control you're in.

The advantage, however, is that you only have to test the cases you're interested in. If, for instance, you want to catch a Tab, but still allow a Shift+Tab to default to the standard form's handling, you just test for an un-shifted Tab and do your work, and let the Shift+Tab condition "fall through".

The second solution is to bind to the controls' PreviewKeyDown event. This one fires in that sweet spot before the form claims it as a "command key". The event gets the parameter PreviewKeyDownEventArgs e. If you want to handle the Tab key in the KeyDown event, just check to see if e.KeyCode == Keys.Tab, and if so, set e.IsInputKey = true.

The disadvantage to this method, however, is that now you are responsible for moving the focus as appropriate — you can't just let the handling "fall through" to the form, because it won't handle it anymore. Depending on how confident you are on the structure of your form, you can either call another control's Focus method or the form's SelectNextControl method (and don't forget to set the Handled property in KeyDown, otherwise the new control might receive the same Tab keypress as well, or it might try to type the Tab as input into the old control — either way, the results might not be pleasant).

Personally, I like the second solution better. Although there is more logic required to do what should be standard Tab handling, it means the logic for my non-standard Tab handling is in one place per control, not split across two different events.


Bandwidth for May

Whoops, forgot to grab the data for the beginning of May. Daily numbers are missing, but the monthly totals are accurate.

Total for May: 19.98GB down, 4.54GB up, 24.52GB total. Not quite a tenth of the cap. This month has the second lowest total since the cap, coming in just ahead of March.

If it weren't for the impending medical bills, I'd sign up for Netflix, if only to see what it would do.


A sucker for features

Yeah, so a few people have noticed that, despite my general disdain for "social networking" services as a whole, I finally got suckered in and signed up for both Twitter and Facebook.

I was a long-time user of Microsoft's MSN Messenger service. (I even had a "charter membership" to the Microsoft Network, for whatever that's worth. Remember when we didn't have "internet service providers", but signed on explicitly to companies' dial-up networks?) Anyway, eventually I got a job where their "standard" messenger client was AIM. I didn't want to have to run two distinct messenger clients because of the combined resource usage, so I looked for a client that would connect to both services in a single client. The one I selected was Trillian, which I installed and started to use.

When I got it up and running, I noticed there were little icons that lit up with each service to which it connected, and only two of its four lights were lit. I felt like I was missing something, because I was using a program but not all of its features. So I entered my credentials for my almost-forgotten ICQ account, and on came another light. What was the fourth one? Yahoo Messenger? I didn't know they had a client, and I certainly didn't know anyone on it. But I wanted that last light to light up. So I signed up for a Yahoo account, and finally my program was complete.

Now you might understand a bit what feelings went through my head when I heard about Microsoft's E3 press conference this week. Felicia Day (who has a very cute face, but dang that girl needs to eat before she blows away) announced that the Xbox 360 would be integrating with Facebook, Twitter, and Last.fm this year.

New features? On my 360? And I don't have access to use them? Well, I'd better sign up, then!

Of course, I had to be a touch creative with my account names since I waited so long, but fortunately I was able to get away with just adding a "1" to my alias and calling it good. (Except for Facebook, which demands a real name. What do you mean, "Yakko" isn't a valid first name?)

I don't know if my Facebook page will see much action (we all know how infrequently I update my own blog as it is), but I've already found that Twitter is fairly useful for those really quick thoughts I think might be nice to jot down but don't think are worth a whole blog post. (So far, I've resisted the temptation to reply to the tweets of celebrities who will never know I exist, but we'll see if I can maintain that resolve.)

And after listening to the '80s Tag station on Last.fm most of the day yesterday, I already can't wait for this to be turned on in the 360.

They hyped up Netflix again, and I started to feel tempted again. That one, though, costs money, and signing up for another entertainment service right before medical bills start rolling in sounds like a really bad plan.…


The fundamental interconnectedness of all things

It seems when my son is admitted to the hospital, my laptop reveals a new problem.

Now, my HP Pavilion tx1420us is failing to power on after any kind of software shutdown state. This includes: failing to resume from sleep, failing to power on after hibernate, and failing to power on after shutting down from the menu.

Fortunately, I'm able to get around this by shutting it down with the hardware switch. When I power up the computer and notice it's not starting (the audio and wireless lights both remain orange instead of turning blue, there is no disk activity, and the screen remains dark), I can press and hold the power switch in the "off" position for a few seconds until the system shuts off, and then power it back on. Sometimes, though, I have to do this twice.

Also fortunately, I'm using the Windows 7 RC, and Windows 7 includes a feature called "hybrid sleep". The short of this is, when the system goes to sleep, it also writes the hibernation file; so even though I can't wake it up and have to force the power off and wipe out the sleep state in memory, when I power it up it is able to resume from hibernation.

This could indicate that the wireless failure was not directly a fault between the system and the Wi-Fi card, but just a symptom of a general failure.

More so, though, I see this as a failure on my part for trusting HP to produce a laptop that would last beyond its warranty period.


Haven't we been here before?

I got a call while I was in a meeting today, from my wife. She's the only person I'll accept calls from when I'm in that situation, and I answer the phone in the same way, with a whispered, "Hi, I'm in a meeting, is everything ok?" Almost always, she'll say everything's fine, and just call her back when I get out.

Not today.

My son was having a really bad day today, having emotional outbursts and not fully processing what was going on or where he was. Since he's on a high-dose steroid, he's been fairly moody and irritable lately, but never to this extreme. Still, it didn't seem like anything more than just a really bad case of frustration and mood swings. My wife finally got him calmed down enough to take a nap, figuring that would do him some good (he has typically been taking a long nap in the afternoon anyway), but after maybe a half hour or so, she happened to look over at him and notice that he wasn't exactly napping — his eyes were open and twitching. She called the doctor, who then advised her to call 911. When he was on the ambulance en route to the local hospital's ER, she called me.

I excused myself from the meeting, grabbed my coat and backpack, and met her there. He was having a mild seizure. They gave him some medication to stop the seizure, and then they did a CAT scan to rule out the possibility of a stroke. The scan came up normal. Of course, I predicted as much — the entire 5-week stay in the hospital, every lab test they could think of came up negative; he just wasn't well, had ferritin levels higher than they'd ever seen, daily fevers over 104°F…

Anyway, with the seizure under control, they transferred him back up to Children's Hospital. I parked in the same parking lot and went to the front desk. I couldn't just flash my wristband and walk in this time, though; I actually had to stop and find where they brought him in. The desk clerk found that he was brought to the ER and offered to walk me there. I was about to object, since I knew the way there, but then I remembered that there is a card-access lock door from the main hospital leading to the ER, and I'd need someone to let me in anyway.

It's sad that I know this.

The primary doctor here in charge of his case was aware of this possibility. The medications he's on, the cyclosporine in combination with the steroid, can raise blood pressure, and the increase in blood pressure can trigger a seizure like this. In fact, he noted this at my son's visit last week. The day after he saw my son, my son had an appointment with the cardiologist, and the doctor said he saw today the blood pressure taken at that appointment and was very disappointed that the cardiologist didn't call him. Although the blood pressure taken wasn't extremely high, it was high enough that he could have prescribed some blood pressure medication to keep it down and prevent this seizure from being a possibility.

It's the doctor's initial opinion that, once we get his blood pressure back to normal and he recovers from the seizure, that he'll be good to go home again, just with some blood pressure meds as well this time. Unfortunately, he's also running a fever now (his first in over two weeks), so they're checking for infection (dollars to donuts they don't find one, again), and hopefully this fever is just a temporary thing that doesn't keep us from going back home tomorrow.

It's really depressing to be back here. On Sunday, we actually started to get close to normal. The whole family was finally able to attend church together. He slept through our sacrament meeting, but he attended his Sunday School classes and was smiling and laughing with his friends. He's even started to get himself up and down the stairs at home. And now… here we are again.


Why didn't you do what we wouldn't let you?

So while I was in the hospital watching over my son, I signed on to CitiCards.com to pay my Master Card bill. Imagine my surprise when I see a message, saying my account information has been compromised, and for my security web access to my account has been disabled, and a new card is being sent to me.

In the meantime, fortunately, my card still worked for purchases (even online), so I wasn't completely without access to my credit. I just couldn't sign on to my account online.

Now, this did concern me a bit. After all, the reason I was signing on was because I needed to pay my bill. And this was how I paid my bill. Since I signed up for "paperless billing" — a service they provide and encourage — it was also the only way I had to pay my bill. And here they were, disabling access to my account and the means for paying my bill. But surely they wouldn't hold me responsible for not being able to do something they were keeping me from doing, right?

I finally got my replacement card. I lost count, but it was a few weeks later. So I was finally able to register my new card for online access, check my account… and see that finance charges and a late fee had already been assessed to it.

I guess CitiBank got tired of waiting for their bailout and decided to take it out on their customers.


It's good to be home

After five weeks and a day, we finally took my son home from the hospital yesterday. The doctors with all their tests were able to rule out enough of the major diseases to decide it was safe for him to be at home, and all the medications and treatment he was on could be safely given at home.

Now, granted, he's still not 100% well. He's on a few different medications, and his immune system is still recovering from being sick (and some of the treatments he was on). And he still has a PICC line in his arm, since we'll be making repeated trips back to the hospital for blood tests and checkups. But just the fact that we're all home is a huge relief to all of us.

He is definitely getting better, though. As it so happens, for about the last week, he was no longer getting his daily fever spikes, and without the fevers to drag him down, his appetite and strength has been coming back. If I had to make a guess, I'd say there was an infection (secondary to the Kawasaki disease they did manage to diagnose) they couldn't find, but when they happened to give him a final dose of antibiotics as a precautionary measure while they switched medications that affected his immune system, it probably finally wiped it out and let everything else fall into place.

We did get our first taste of the medical bills, though, when we had to pick up the prescriptions. We're hoping that insurance just didn't get billed properly, but three prescriptions ended up costing us close to $500 (and we had to make a trip back to the pharmacy in the hospital, as the drugs aren't carried at any branch close to home). The cashier actually apologized as she rang it up.

One thing at a time, though. At least we're home, all under one roof, sleeping in our own beds.


Name them one by one

So with all the crap hitting the fan over the past 4½ weeks, maybe it's time to stop and count my blessings.

  • My son is alive, and is getting his symptoms cared for (even if they can't cure the disease).
  • We live in the suburbs of the city that has one of the best children's hospitals available. (We've met people from as far away as Hawaii, who are staying in the Ronald McDonald house while their child gets treatment here. While we may not be spending much time at home, we can at least go home every day to get clothes, supplies, check on the pets, …)
  • I am employed full-time (not on hourly contract), at a small technology company that has been more than accommodating to my very unpredictable schedule, including my rather reduced hours (although I intend on working some this weekend to catch up on some work, they've accepted my 6- and 7-hour days without complaint). (I'm sure it helps that I'm still meeting deadlines and getting work done.)
  • My job is only a few blocks from where my kids go to school, and so it is very easy for me to pick my older son up and bring him here, where he can do his homework and play his Nintendo DSi until it's time to go. Additionally:
    • my workplace is ok with this arrangement
    • I have an office, so I have space for him to be in
  • My church has been there to provide meals for us, and to take our toddler off the hands of my wife for the day, so he's not confined to the hospital room every single day.
  • GeezerGamers.com — I've been a part of this community for a little over four years now, and the outpouring of support and prayers from these people have given me a huge morale boost I didn't realize I needed. And on top of that, they've also sent me and my son some Amazon gift cards and a care package that included a new Xbox memory card (to replace the one that "mysteriously" disappeared from the hospital room this past weekend). They've been an awesome group of friends, more than I ever expected or ever thought (or hoped, at least in this way) I'd need.

Hopefully the hospital stay is coming to an end. Although the doctors still haven't figured out The Problem for which they can prescribe The Cure, they have at least eliminated enough major issues that they're considering sending us home. He'll still be on medication (they've started switching his IV-based medicines to pill form), and as long as he shows he can eat and drink enough to sustain himself without IV supplements, if his white blood cell count recovers from one of the medicines he was on, and if nothing else major comes up, we may be taking him home next week (a "mere" 5 weeks after he was admitted).

Sure, we'd still need to bring him in for some tests rather regularly (and they may leave his PICC line in while he is coming back for tests), but even if we had to spend, say, 4 hours a day every day going back and forth to the hospital for tests, that's still 20 more hours a day he'd have at home than he has now. And that's another blessing worth counting.


April in Review

April sucked.

  • Middle son ends up in the hospital for an extended stay. (Resolution: none yet, still there.)
  • Friend and client busted by SEC for running a Ponzi scheme. (Resolution: none. Have had little time to process this myself, let alone follow the case; see above.)
  • Youngest son splits head open at hospital. (Resolution: glued shut, healed fine.)
  • Snow storm kept us at home away from hospital. (Resolution: worked out; my mother had flown in for the weekend and was already there with my son.)
  • Master bathroom toilet seat split. (Resolution: none, haven't been home long enough to fix.)
  • My wife was rear-ended on the way to the hospital one morning. (Resolution: n/a, occurred at such a low speed the only "damage" done was dust in the shape of the offender's license plate that wiped away clean.)
  • My laptop's wireless card died, due to an extremely common problem with this model of HP laptop. HP wants $100 just to look at it before they'll decide what to charge me to fix it, even though they repaired the identical problem on the identical laptop (my wife's) a few months ago. (Resolution: bought a $30 USB Wi-Fi adapter.)

Yes, I know, everything worked out, and some of these are really minor things. It just seemed like everything came crashing down all at once, and especially when you're dealing with something major like having a kid in the hospital and are spending better than 12 hours a day there, it all seems like a lot.

Even when this is all over, it won't be; I have a feeling we'll be paying for this for months, if not years to come. My hospital stay for my appendix cost thousands, and that was only for a couple days.

But that's something to worry about later. Right now, the most important thing I want resolved on the list is still there. My son is still in the hospital, still not getting better to the point where he can come home. My wife and I have spent the night in the same bed precisely three nights in the past 24 (when my mother showed up for the one weekend and sent us home). And what sleep I do get during the week is definitely not quality, considering the inch and a half of foam on a sheet of flat plywood that qualifies as a fold-out bed here.

I know, things could be worse. I just want to know when they're going to get better.

Bandwidth for April

You can see the spike on the first weekend where, again, I watched the streaming video of my church's general conference broadcasts. There are two 2-hour sessions, with two hours between them, during which church news is broadcast. Although we didn't watch for six hours straight, I did let it keep streaming the video, partially because I didn't want to have to restart the stream (I put my laptop up on a high shelf when I connected it to the TV for output and didn't want to climb back up to get it), and partially to see what would happen to my bandwidth numbers. (Sunday, I actually did stop and restart the stream when I found my bluetooth mouse worked as a suitable remote control.)

Although I haven't been home to do a lot of Xbox gaming this month (spending most nights in the hospital with my son), I still use my home network connection quite a bit as my own personal proxy server. I've used this from work for over a year now, mainly to prevent any misunderstandings that might occur if I were to happen to hit the wrong website at the wrong time. I'm also using it from the hospital, since they have an unsecured wireless connection that is also a tad overzealous in filtering out websites that "might" be "unsafe".

Anyway, the total numbers: 27.06GB down, 5.32GB up, 32.38GB total. This month is the second highest, ranking behind the last general conference month (October).


You uncultured flu bug!

Well, this is highly inconvenient.

I show up at the hospital with my oldest son, to trade places with my wife for the night. I go to enter the hospital, and a security guard stops me. "He can't go in," he says, indicating my son. "The hospital is on lockdown. Parents only, no siblings."

"When did this start?"

"About an hour ago."

Apparently, because of the swine flu, they are closing down access to the hospital to necessary personnel only, and that means only parents, no siblings or other visitors.

I call my wife, who is up there with my middle son (the patient) and our youngest son (the terror that flaps in the night). She hadn't heard about the lockdown yet. I told her she needs to meet us downstairs to do the swap.

As I'm waiting, I realize just how inconvenient this is going to be. When my wife comes to relieve me in the morning, she will be unable to bring the toddler with her. And because I have to work, that means he'll need somewhere to stay pretty much all day. So I talk to the security guard to ask about the nature of the lockdown and how long it'll last. The security guard, after assuring me that there is no instance of flu at this hospital, says they don't know how long. Could be a couple of days, could be a week, could be a month.

My wife calls me soon after. She of course had the same thought, and she was talking with the charge nurse to discuss our options. (The security guard also suggested I could try talking to the charge nurse for the same reason.) Apparently, in talking with the nurses inside the hospital, she learned there was a case of swine flu detected in the hospital. It wouldn't surprise me if the security guards at the entrance were told (or instructed to tell people) there wasn't, but it also wouldn't surprise me if the "fact" that there was wasn't just a rumor that was going around the nurses' stations.

My son (the patient) had just been coming down with a cough and congestion. Wouldn't it be just our luck if it was him who had come down with the swine flu, on top of whatever else had brought him there in the first place? My mother had, after all, just come back from a trip to Mexico before she came to spend a weekend in the hospital with my son.


WordPad: "Picture" = "End of File"?

There's this annoying bug in WordPad in XP that I'm surprised I couldn't find very much about. But it's hit me on more than one machine (and I never seem to remember it until after it happens, of course).

Whenever I create a document and I paste a picture into it from the clipboard (usually copied out of Paint, as that's a convenient way for me to get an image on the clipboard in a hurry), the picture and any text after it is not saved with the document.

This time, naturally, it happened to be on my set of release notes for a product release, where I happened to add a picture to the beginning of the document. Entire document, gone.

It seems to be a function of WordPad itself adding the picture to the document. If I open a document that already has a picture (e.g. by creating a document with a picture in Word and saving it as RTF), I can do just about anything to the document, including cutting and pasting the picture to other locations. It's just the act of initially adding that picture to the document that makes WordPad stop processing.

Why use RTF at all? Well, RTF is a very convenient format for creating simple text files that have a little bit of formatting. They're also extremely portable — whereas Word documents (or documents saved in "Word-compatible" formats) can sometimes display oddly in different versions of whatever you're using to view them, there's so little in an RTF that you're almost always guaranteed you'll see the text and its formatting as it was intended, without any attempt to dictate margins or other unimportant stuff. It makes it very handy for distributing a simple document to clients that look decent, don't require any extra software to display (they will at least have WordPad, if not something bigger; I can't guarantee they'll even have a PDF viewer, or a DOC viewer for that matter), yet has just enough formatting to be "professional" (as opposed to plain text). It can also be embedded in a Windows Installer, which is part of my goal here.

Why use WordPad when I have Word installed? Well, my goal is to have a very simple file, without extra garbage or formatting codes. Creating a particular file in Word, which includes a single 24x24 picture, and saving it as RTF resulted in a 53kB document, which, if you look at in a plain text editor, you can see over 7k of format codes defining (among other things) fonts that aren't even used in the document, before the first line of actual text. Merely opening that file in WordPad and saving it (which has the effect of stripping out all the garbage, taking it down to the bare necessities) results in an identically-formatted file that is 15kB. (Unfortunately, it doesn't replace Word's "smart quotes" with standard ones.)

I remember taking a Word 2.0 document, opening it up in Word 6.0, and saving it, with no changes, and noticing the file size balloon to four times its original. So the inefficiency in Word's file formatting comes as no surprise.

Workaround: I played with this a bit before publishing this post, and I figured out the solution. If you go to the Edit menu and select "Paste Special…", you can paste the image as a Bitmap, a Picture (Metafile), or a Device Independent Bitmap. It seems the default, Bitmap, is the one that causes the problem, as selecting either other option works fine. Of course, the Edit menu is the only place this "Paste Special…" option is available, as right-click only shows "Paste" and Ctrl-V/Shift-Ins use the default option.

I tested this in Vista and the public beta of Windows 7. Copying a picture out of Paint in Vista, the default Paste in WordPad worked just fine. Paste Special showed "Unidentified", "Picture (Metafile)", and "Device Independent Bitmap", and all of these worked. I was able to get "Bitmap" as an option in Paste Special by taking a screenshot, but that, too, worked without a problem. Windows 7 had almost the exact same results, except that Paste Special with what was copied from Paint actually listed "Paint Picture" as the first option. Everything else worked pretty much the same (except for having to deal with that annoying "ribbon" toolbar in both Paint and WordPad).

So, I guess, the fix for being able to paste bitmaps in WordPad without losing the rest of the document, is to upgrade to the latest version of Windows.


Fixing the DataGridView's CalendarColumn sample

In a DataGridView, it is sometimes convenient to have a column that is a DateTime that allows a user to use the standard DateTimePicker control for choosing dates. Microsoft has a code sample for a CalendarColumn class that does this, and it's more or less the standard.

Except if you actually try to use it in a WinForms application, you'll find it has two rather glaring flaws:

  1. If you try to type in a date, and you don't type in a full two digits for the month or date or four digits for the year and then tab out of the control, your change won't be committed.
  2. If you type in a date or part of a date and tab through to the same column in the next row, and you start typing, the first field highlighted (month, date, year) will be the last field highlighted when you left the last row. (Example: you type in "04/04/2009", tab until the next row's date column, and start typing "04", you'll find you're editing that date's year.)

I found this forum thread that addresses the first concern. ALight's answer involves adding an event handler to the DataGridView's CellValidating event. Because we use grids all over the application, it would've been very inconvenient to alter every grid and add this code. Instead, since our grids are built dynamically, I did it by adding this code to the CalendarColumn class (that inherits DataGridViewColumn):

protected override void OnDataGridViewChanged() {
    if (this.DataGridView != null) {
        this.DataGridView.CellValidating += new DataGridViewCellValidatingEventHandler(CalendarDataGridView_CellValidating);

protected void CalendarDataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) {
    if (sender is DataGridView) {
        DataGridView dgv = (DataGridView)sender;
        if (e.ColumnIndex >= 0 && e.ColumnIndex < dgv.Columns.Count
            && e.RowIndex >= 0 && e.RowIndex < dgv.Rows.Count) {
            if (dgv.Columns[e.ColumnIndex] is CalendarColumn && dgv.Columns[e.ColumnIndex] == this) {
                if (dgv.EditingPanel != null) dgv.EditingPanel.Select();

When the CalendarColumn is added to the grid's Columns collection, its DataGridView property is updated, and this routine fires to bind the method to the grid's CellValidating event. Multiple columns will cause multiple event handlers to be bound, but the dgv.Columns[e.ColumnIndex] == this part of the if statement should ensure that only one instance will run the code for any given column. (Note that I have not tested this in cases where columns may be removed from the grid. It should probably work fine, as the event will still be bound and still fire, but the column will never match.)

To solve the second problem, I did some experimentation with the existing control methods. In Microsoft's sample, there is a comment in the CalendarEditingControl's method PrepareEditingControlForEdit that reads "No preparation needs to be done." I found this to be not quite correct. The following change resets the control so, when you start typing, you start editing on the month, like you'd expect:

public void PrepareEditingControlForEdit(bool selectAll) {
    if (selectAll) base.RecreateHandle();

Seems to work so far, anyway.