Sunday, January 23, 2005

Talk to me.

Adam hooked me up with Skype. This is a very cool and useful tool. I describe it as Instant messenger (IM) meets Voice Over Internet Protocol (VOIP). Previous voice messengers I had tried worked similar to the Yahoo! client. These were push to talk or voice activated simplex transmissions. Plus they would drop portions of a conversation.

But Skype is different. Full duplex, works on my low power laptop over my wireless home network, and onto my Verizon DSL connection (the irony there is not lost on me). My laptop's microphone is too close to the speakers, so I get a audio feedback squeal if I am not using headphones.

I use Skype regularly to talk co-workers also using Skype in India and Japan, sometimes for hours, and -- this is the best part -- for FREE! I love the internet. Call me some time, my user id there is Roger.Weber.

The downside of Skype is that they do need revenue, so if I want to call a regular phone, I have to pay.

Considering Adam works for google I found this article quite fascinating. Is this what google Kirkland is working on? And the article implies that google's VOIP will be free.

I love the internet.

Friday, January 21, 2005

More COM violators!

Today's COM violator is JDOM. A customer had indicated that while editing a file in the WLW IDE, much of the file got red-squiggles -- a sign that there are syntax errors of some sort. Those of you that program or use MS Word would recognize them right away. We had the customer send in the app so we could reproduce the trouble.

Turns out the customer was attempting to use a later version of JDOM. We also use JDOM, as is, and the customer's use of the new one caused the IDE to tag legitimate methods as invalid.

I'm thinking of requesting a new enhancement for the server. One that would separate the customer's classpath from the server's class path. A special kind of class loader could do it.

Just a thought.

Sunday, January 16, 2005


For quite awhile now, I have been working on my Commercial Pilot's License. The reasons why are not important. What is important is that today, I passed.

It all started yesterday. I had my usual inability to sleep. My 3 year old, Molly, awoke early so I collected her and brought her up to my bedroom. She snuggled into my side and began to snore. How does something so small make so much noise? I finally just got out of bed since the chance of sleeping had been reduced to zero. Molly snuggled up with Sandra, her small round face still generating the rhythmic low growl of a snore.

By 9:00 AM I was in the office of Colonel Bob, a retired USAF pilot. I cannot improve on Tom's description of Col. Bob, who says "Bob is a trim, older man. His appearance and his office scream efficiency." I have great admiration for Bob, and wanting to gain his approval creates for me much anxiety.

We had the conversation that I expected, and I messed up on a couple of questions. Nothing disqualifying, but yet Bob busted on me for them, he's right of course. For instance a metar that reads -FZRAPL does not mean "subtract freezing apples" but rather "Light Freezing Rain and Pellets." I also should have known that the Cessna 177RG that I was using for the test was made in 1976 before the requirement for an Approved Flight Manual, (March of '78), and thus did non have one.

Around noon we broke for a quick lunch, after which I called the Flight Service Station, which repeated the "-FZRAPL" forecast, but did not seem too concerned about it. In fact the briefer indicated I would most likely be fine. We loaded into the airplane.

Bob asked for a soft-field take off, which went pretty good as we broke ground and headed for the imaginary flight plan. The plan called for a climb to 9,500 feet to cross over mountains on the way to Yakima. Due to the deteriorating conditions, we were unable to get much above 3,000 feet, and never into the winds that would have made the 15 degree wind correction angle necessary. I had backed up my course with a radio navigation aid, so I intercepted the 106 degree radial and headed south-east. Bob asked if we were on course, and I said we were, so he asked how I knew. I pointed to the OBS. He spun the dial, and told me to keep flying. I put the compass on the planned heading and continued to fly.

By that time so much was different from "planned" that I had left the cowl flaps open. And they stayed open far too long afterwards.

A few minutes later Bob asked again if we were on course, and where Duvall was. DUVALL??? Who knows where Duvall is to begin with? I certainly don't. There is plenty I do know, but the location of Duvall is not one of them. After several uncomfortable moments of searching the map, and looking at roads, and looking at the map, and looking at roads, I found that Duvall was to the left of my nose, and that the flight plan showed that it should be to the right of my nose. I found a prominent bend in the road that I could use to reset my course and flew to it putting me back on course.

At that point we decided the cross-country was done and I was to divert to the Monroe airport. We broke off turned north and made tracks for Monroe. When I spotted the airport, we headed out for the upper air work. Without a lot of upper air available, Bob opted for a more specific set of maneuvers. Most went well until we got to the one that is the easiest, the steep-bank turn. This one went horrible. Altitude and airspeed departures on both sides of the turn. Bob covered up the attitude indicator and the compass and made me do it again. This one went much better.

From there we went to Monroe to perform a short field landing, using the threshold as the aim-point. I was a few feet past the threshold but still managed to stick the plane on the on the first half of the numbers. Maybe 20 feet past. I was pleased.

At the other end of the runway, I turned around for the short field takeoff, back into the sky the plane went.

We climbed out looking west for the impending -FZRAPL but it was still looking ok. I selected a railroad track to perform an eights on pylons and entered my first turn to the right. As the nose of the plane rotated through to the west, I saw that the visibility had dropped. Bob said we should think about heading back. I swung the plane around the next pylon to look up at the visibility rapidly going from bad to "we should not be up here." Bob pointed out that the water on the wings and windshield had stopped moving. It had froze. I hit the pitot tube heat and had Bob turn the defroster on full.

I broke off, Bob tuned the radio to he Automated Terminal Information System, and I called up Paine Tower to ask about the current conditions. Forward visibility continued to drop, and the tower reported freezing rain and ice pellets. It was 2:00 P.M. Exactly as forecast.

I told the Paine Tower we were diverting to Harvey, which I could still see just behind me. Now ice was accumulating on the wings. I dropped to pattern altitude and held on to my airspeed. On final I was still at 10 kts above normal approach speed and high to compensate for the accumulating ice.

The landing was smooth, and on roll out I hit the brakes to no avail. And Bob tells me I am left of centerline. D'oh! I know this is one of his pet peeves, but dang, I'm just glad to be on the ground. With all the power off and marginal breaking I roll the plane to the end of the runway, and taxi back to parking. There was about an eighth to a quarter inch of clear ice on the leading edge of the wing when we got out. The day's flying ended there

We met back at Paine today at 9:00 AM. One of the Regal's flight instructors drove us out to Harvey to retrieve the plane. The forecast was for improving conditions and the ceilings at Paine had gone up to 1,000 feet. A normal take off at Harvey with intent to fly back to Paine for the power-off 180's and to be done.

With the plane in the air, we found the ceilings at Paine were back down below 1,000 feet. I requested a special VFR to get back. Since someone else had beat me to it, the tower instructed me to remain out side of their airspace and I would be given clearance in about seven minutes. I could tell that I was not going to be able to make repeated touch and goes at Paine, so I canceled the Special VFR request and decided to do the power off 180's a Harvey instead. My first came up short, and I had to run up the engine to hold the plane above the power-lines that border the north end of the field, and turn the landing into a soft-field instead.

The next time around, the other plane in the pattern was flying a very WIDE down-wind and base leg, necessitating me to make two 360 degree turns to assure adequate spacing. I headed for the power off, and ended up high on final, with full flaps and an aggressive slip, I flared and floated. I thought too far.

It was then we headed back again for Paine. We got the special right away. Staying clear of the clouds required me to fly at 600 feet above the ground as I lined the plane up for the runway. Bob asked for soft-field further down the runway. I was glad to be back over the runway with the end of the ride in sight.

After an uneventful landing we taxied back to Regal where I shut down the plane. Bob turned to me, put out his hand and said "Well, I think you earned it."

I think I'll wait a while before tempting fate any further. To this I'd like to add a special note of thanks to Terry and Jerry who drove us between airports, Chuck who did the most of my training, Patty who finished it off while Chuck was recovering from surgery, and most of all Sandra who has supported me FAR to long.

Monday, January 10, 2005

Don't violate COM

I remember back in the good ol' days when I was an application developer and I was learning to write in VB. Since most of my time was spent in RPG and COBOL, I didn't do all that much object oriented (OO) programming, but one day my co-worker, Margo, admonished me "Don't violate COM!" Since I did not know what COM was, I was fairly certain that I had not violated it.

Later I learned that COM had something to do with an Object, and to violate it meant to change how it was interacted with, like adding or removing public methods. Since I was still on my first OO project, and had never released the object before I remained certain that I had not violated it.

So now that I am responsible for every thing that happens to WebLogic Workshop (WLW) after it goes to GA, I REALLY get what "Don't violate COM" means. You see, WLW uses a couple (or so) open source products. The two I hear about the most are log4j and XmlBeans.

I hear about our use of log4j with great regularity. And the reason it that log4j violates COM. Here's what happens. Lets say that we ship log4j version A, but our customer wants to deploy a packaged J2EE application that uses log4j version B. If all of version B's interfaces worked like version A's interfaces (plus what ever improvements), life would be good. But since it does not, replacing version A with B results in failures a plenty in the server. Attempting to use version A with the packaged product causes failures in the application.


So what is an open source consumer to do?

David Bau spent a bunch of time writing about this in his "Theory of Compatibility" series, parts one, two, and three. Now I'm a big fan of David's, but I think this representation-vs-interface debate won't fix a lot of things. It won't fix C++, or Java. Both of these are interface level compatibility issues. And it does not fix all the software out there. The best fix really is to "Don't violate COM." Yet we all know it is harder to get the cat back in the bag than it is to let it out. In log4j's case, the cat is already out.

Best Practices

If you are writing and contributing to an open source project, DON'T VIOLATE COM! Add a test to your test suite that is a static .jar, and from it run tests against the .jar you just created. If the tests fail, try again. You are probably about to make your consumers have a very bad day.

If you are a consumer, consider repackaging. Here's what we do with XmlBeans (not sure why we did not do this with log4j). We take the XmlBeans source, and scan all of the "org.apache.blah" and replace it with something like "com.bea.blah. This allows a customer to use what ever version of XmlBeans with out interfering with the one we use.