Thanks, old hippie lady (seriously)

The other day, I was driving around and I saw a long-white-haired old woman carrying a hub cap and what looked like several small bags of garbage. Around here, this is usually an indication of some kind of pathology, and is accompanied by a shopping cart, inappropriate stocking-cap hat in the middle of summer, a horrendous smell, or all of the above.

Such was not the case this time.

This woman appeared to have been picking up trash on the side of the road for the purposes of actually disposing of it, rather than using it to pad her nest.

She had the very confident air of a woman who burned her bra in the 60s and who has been wearing hemp clothing and eating granola and hydroponic vegetables ever since.

That description is not intended to be disparaging. On the contrary, I wanted to roll down my window and call out to her “you go girl” and thank her for making my community more beautiful by removing some of the unsightly and unsanitary garbage that literally litters the streets around here. Since I was not only moving but actually driving, I wouldn’t have had enough time to actually say all that, and I would have come across like a dick (“thanks a lot“) or like a maniac (“thankyouforpickingupallthattrashtheroadlooksmuchbetterduetoyourefforts”). So, I chose to be silent, and I have to say, I feel bad. I should have said something.

Hopefully, this woman will one day search for “hippie lady” in an effort to locate interesting stories about her online and will come across this post, and she’ll see that at least one person noticed her efforts, and appreciated them.

Thanks, old hippie lady. Seriously.

Finding a decent laptop

I’m tech geek, but I’m a cheap one. I’m willing to pay or quality, but I also am not one of those people who waits overnight in front of stores to get the latest Shiny Thingâ„¢ so I can show all my friends how cool I am. I casually look for things all the time, and get excited by them, but I rarely
actually buy.

Witness the (somewhat) recent release of the Apple iPhone, over which I have lusted since I first read reliable descriptions back in January. As the release date got closer and closer, the inadequacies of the platform became more and more pronounced (crappy EDGE network, only AT&T plans, can’t use your own SIM card, can’t install your own software, phone costs $600, etc.) and Apple failed to get me as a customer. Fortunately for me, I didn’t pay the $200 “aren’t I cool?” tax like a lot of folks did. Oh, well. At least those folks helped Apple beta-test their platform.

Recently, it’s become more and more clear that I need a replacement for my computer(s). My recent canine acquisition has effectively moved my home office from our actual office to my couch, since it offers superior surveillance capabilities. I had always worked nearly exclusively on my desktop computer, a great AMD Athlon XP workhorse that has been reliable and stood by me lo these many years since I bought it for my wife so she could play Diablo II with my brother-in-law and me (at which point I decided to take the new computer for myself because hey, what does my wife need with all that processing power?). When I was out and about, I used my somewhat less-trusty 17-inch HP electric blanket notebook, but it never really felt right, since I’ve always been a desktop kinda guy. Using the laptop more and more (on the couch) has made it clear that both computers need to go: I need a laptop, and this one is falling apart; if I need a laptop, why do I need a desktop at all — as long as I can have a nice, big screen to plug into when I’m actually at my desk.

Thus begins my quest to find a suitable laptop to take over all my computing needs.

Don’t forget: I said I was willing to pay for quality, but I also said I was cheap. I also didn’t say it, but I’m not going to lug around 10 pounds of laptop anymore. No, sir.

My actual needs are few: anything that can outperform my existing 3 GHz hyper-threaded processor without setting my legs on fire is adequate. I also need lots of RAM since I like to run a thousand things at once. The games that I do actually play are old in terms of graphics requirements, so I don’t exactly need a top-of-the-line gaming platform.

Given my requirements, why is it so hard to find a decent laptop these days? Apparently, my requirements are more strict than I had first let on. What I really want is:

  • 800-MHz FSB with matching-speed memory
  • A high-resolution screen (WSXGA+ would be preferred)
  • Discrete graphics memory on a good mobile graphics board
  • Gigabit Ethernet
  • Digital video output
  • Low weight
  • Reasonable price (less than $1500 including 1-yr warranty)

Actually, I’m willing to sacrifice a little weight to meet the other criteria. Ideally, I’d like to make it under 7 pounds including the power brick, but that appears to be difficult to accomplish in the 15-inch screen size.

So, what are the problems?

  • Many companies will allow you to select the new 800MHz FSB processors, but they won’t give you matching-speed memory. So much for a faster FSB.
  • I have been able to find WSXGA+ on only a few laptops. I realize this is pretty expensive, so most vendors don’t even give you the option. I can give this up if necessary, especially since I’ll mostly be using higher-resolutions on my external monitor, anyway.
  • Mobile graphics cards just suck in comparison to their desktop-based brethren: it’s a fact. It still shouldn’t stop me from getting something nice in the graphics department. Every single laptop in these price ranges should have the option of discrete graphics memory (with reasonable on-board memory sizes: 128MB is not enough these days, guys!).
  • Virtually nobody has gigabit Ethernet. Why? I can’t even imagine. You can get a desktop gigabit card for five bucks. I should be able to get a mobile one for fifty. It’s sad that the wired options for laptops are faster than the wired ones these days.
  • Many companies (Dell, I’m looking at you) don’t support HDMI or even DVI video output yet. Why? Especially Dell: they sell these big, fat displays that all have DVI and HDMI inputs on them, and their laptops need special adapters to utilize the superior-quality digital signals.
  • Weight is always a problem: sturdy construction plus lots of components equals many pounds. I get it. Why can I get the same components in 3 different systems and have the weights all be wildly different? Sigh.

I can get various combinations of the above on different units from different manufacturers (except gigabit Ethernet), but I can’t find the one unit that has all of them. It’s always a trade-off: do I want proper speed-matched memory and CPU or do I want a decent graphics card? Do I want a slick hi-def screen or do I want HDMI output? It’s maddening.

I have given up the laptop search for this month. Maybe around Thanksgiving, when hardware manufacturers completely lose their minds just so they can move inventory regardless of the cost, I’ll be able to get something whose flaws I don’t mind accepting because I’m getting such an insane deal on the price.

I Got a Dog, B

Paddy

This week, Katie and I got a new dog. He and his littermates (8 brothers!) were born on Saint Patrick’s day, so we decided to give him an Irish namd: Paddy. His mother was a rather large Puggle, which is a mix of a Pug and a Beagle, and his father’s breed is unknown. He looks much more like a Beagle than a Pug, but he’s got a slightly smaller muzzle than a regular Beagle would normally have.

We got Paddy from Homeward Trails Animal Rescue, which is a small-animal rescue organization which gets many of its dogs and cats from other rescue organizations in areas which are more rural and maybe don’t have as many potential adopters around. If Paddy looks cute to you, maybe you want to adopt one of his brothers (this link may no work after a while).

Paddy Loving

We’re expecting him to grow maybe 10 lbs heavier (he’s about 20 lbs right now), so he’s the perfect size for our apartment and lifestyle: not so small he’s a fashion accessory, and not so large that he needs a lot of space.

He is very friendly, and has a long tongue that will find your neck and face quicker than you can say “good boy!” He’s kind of a scardy-cat right now; we’ve had him for fewer than 72 hours, so he’s still getting used to his new surroundings, the new schedule, etc. I’m hoping that he’ll become more outgoing as time goes on, but right right now he’s a complete angel.

Interesting new WWW attack vector

While I suppose that using javascript for evil purposes isn’t exactly a new idea, Bruce Schneier has written a piece (also covered on Slashdot and, I’m sure, other places) about three guys who have developed an attack that royally screw most users’ ability to use their Internet connection again.

AJAX, the magic pixie dust used heavily on sites like Google Mail, is really just javascript with the ability to make HTTP requests and parse the results of those requests. Javascript has been available in browsers for years and is recently enjoying some interest by web developers because of that last (somewhat) new capability. The use of this technology for evil is nearly indistinguishable from legitimate use, so it’s hard for any software to detect it and prevent it.

Basically, the attacker sets up a web site with some javascript code (see below) and tricks you into visiting that site. It’s not all that hard to get people to look at a rogue site: you can either spam the entire world and expect that a certain percentage of email readers are suckers who will click on the links in those messages, or you can hack a major site (such as Dolphin Stadium) and insert the exploit into it.

Now, the fun begins. This piece of javascript code (which, as I mentioned earlier, is pretty much impossible to identify as evil) attempts to make a connection to your router. If you are like most home users, your router is still sitting there with it’s default, factory-set password (probably something stupid like “admin”). That means that this piece of javascript code can login to your router and start playing around. This particular attack is designed to change your DNS settings such that all requests for named Internet addresses go to malicious servers. Those requests will be answered with fraudulent IP addresses which can be used to either emulate your favorite website or simply serve nothing but pop-up ads and porn. This little hack could even change your router’s password, locking you out of your own hardware.

Imagine if you were to fall victim to this exploit… the next time you tried to access, say, http://www.bankofamerica.com, the rogue DNS server sends you to what really is http://www.evilbankofamerica.com. The site looks like Bank of America’s real site, and you fall for the bait. You enter your username and password for online banking, and bang! – the bad guys have your online banking credentials.

SSL certificates might save you, since VeriSign (and others) are unlikely to issue an SSL cert for “www.bankofamerica.com” to an entity that is not Bank of America. But what do you think most people do when they get a security warning these days? My guess is that most people do whatever they have to do in order to get the security warning to go away and let them look at their website. That is a recipe for disaster.

Since we’re talking about folks who have never changed their router’s password, they probably wouldn’t know how to recover from this problem, either. If the attack included changing your router’s password, you’ll have to reset it to factory defaults in order to get back up and running again.

I’m guessing most home users will ask friends what to do if every site they visit is just porn and popups. The advice they are going to get is to reinstall their operating system (statistically it will be Microsoft Windows, which has a bad reputation for becoming easily infested). Many users aren’t willing to do that, and will pay someone else to do it. Re-installing the OS won’t work, so those users are likely to do the next best thing: go out and buy a new computer. That won’t work either.

What a pain in the ass.

What a great exploit.

Blog moved to virtual host

The whine of my rack server has finally gotten to me.

So, in spite of the home heating advantages, after more than 2 years of hosting my own website, blog, and mail server in my home, it’s time to get it out of here.

I found a relatively low-cost virtual hosting plan where I have free reign of my own virtual machine. Sadly, I couldn’t use Gentoo – my preferred Linux distribution – so I had to settle for Debian, whose package manager is absolutely maddening to me.

At any rate, we’ll see how things go. So far, the MySQL upgrade (Debian’s latest stable version of 4.0? WTF?) and WordPress installation (no stable version available through Debian?!) have been relatively painless. Let’s just hope that everything else goes well.

Attempting AJAX

So, AJAX is one of the more recent causes of excitement in the web-based application delivery world. The first major site to feature AJAX (as far as I know) was Google’s gmail. Assuming that you are okay with writing tons of Javascript, it’s quite a nice way to spice up your application enough to make your users feel a little less like they’re using a web-based app.

I have to admit that I generally like to use the minimum of Javascript on my sites that can possibly work, because it usually doesn’t. Javascript is notorious for failing on various browsers and platforms with no specific rhyme or reason. Most often, it is because the application developer did not take the time to test and debug the Javascript on various browsers, or failed to use standards-compliant code and chose a single target browser (this more often happens when an application is targeted towards Microsoft Internet Explorer).

My rule of thumb is that Javascript should not be used unless there is some non-Javascript backup for the same functionality. Basically, Javascript may only be used to enhance the user interface; it cannot be used to drive the user interface.

We have a page that allows users to tick items off of a list. The list is pagenated, to it can be quite long. They can either tick them or un-tick them, and the page reflects the current status of each item. There is one big problem with this type of interface: the user expects to interact with a standard widget (the checkbox), but the page itself does not respond to checking or unchecking the checkbox: you have to submit a form. This basically won’t work because users are not going to tolerate having to check these items and then click a button, especially when moving from one page to another. They might also tick an item and then leave the page entirely. There is no way to stop them, and the only way to capture the event of ticking the checkbox is to use Javascript.

I am unhappy with the Javascript-only solution because it breaks down when the user’s browser does not have Javascript available. The user might not have Javascript available because of the browser (think lynx), or because they have turned off Javascript for security reasons, or because their Javascript implementation is buggy and isn’t going to work for some reason. Another approach is required.

My solution in the past was to make the checkbox into an image that looks like a checkbox, but it actually a link. That link points to the URL that selects (or de-selects) the item in question, which then re-displays the page with the proper status update. This works very well, except for the fact that the page view often re-sets itself back to the top of the page. That is inconvenient when you want to select multiple items from the same page, and you have to scroll down the page to see them.

This is a perfect example of when I have a non-Javascript solution working that could be significantly improved through the use of Javascript.

Enter AJAX.

If all the planets are aligned (i.e. the user has Javascript available and enabled, and it supports AJAX, and nothing else goes wrong), we can use some AJAX magic to improve the user experience.

AJAX is little more than a single (at least, from an AJAX developer’s point of view) very useful Javascript object called XMLHttpRequest. It’s job is to make an asynchronous HTTP request to some URL and provide the response either as text or as an XML document. If you elect to use the response as an XML document, then you can use the standard DOM methods to traverse everything.

I started out by consulting Mozilla’s AJAX:Getting Started page. It gives a fairly straightforward example of, well, getting started with AJAX. Using the information presented on that page, I was able to get something up and working relatively quickly. They had even listed the changes I would have to make in order to use the code under Microsoft Internet Explorer, so I figured I was covered when I went to test on MSIE.

Unfortunately, there’s a relatively large caveat when using MSIE up through version 6 when working with XML: the document.getElementsByTagName function is not namespace-aware. That means that those of us who came out from under the non-namespace-using rock several years ago have to deal with some pretty stupid code in order to work around it.

At this point, AJAX pros are saying to themselves “why doesn’t this guy just use one of the dozen or so cross-platform AJAX libraries that are out there — then he won’t have this problem”. Well, I’ll tell you: because I wanted to solve the problem myself in order to understand what was going wrong. It did take quite a while, and I ended up using information presented on Apple’s Dynamic HTML and XML: The XMLHttpRequest object. This was the only place where I saw any mention of MSIE’s failure to support namespaces.

Working around non-namespace-aware Javascript is pretty ugly. Under normal circumstances, one would simply call document.getElementsByTagName and pass the “local name” of the element to that function. You’d get an array of nodes back and everything would be fine. But, since MSIE sees “foo:bar” as the local name (instead of just “bar”), you’d have to change your code to look for “foo:bar”. But, that wouldn’t work in browsers that are namespace-aware, and it’s difficult, if not impossible, to tell at runtime which way a browser will behave.

So, I was forced to implement my own function that loops through the children of a particular node and looks for matching elements. 😦

It occured to me just now that I could probably get away with making two calls: one that uses the preferred method, and then, if the call returns no nodes, another that calls the same method with the namespace attached. The only problem with this option is that you have to know the text of the namespace that is being used. Typically, you only have to deal with the namespace URI instead of the actual value being used (such as “foo” in the example above). In this case, I’ll have to hard-code the namespace into the Javascript, which is non-ideal. My existing solution has no such restrictions, so I’ll probably keep it for the time being.

A special thanks to the MSIE team for once again stepping outside of the standard (which, in all fairness, may or may not have existed at the time of implementation) and spicing up my day.

Now, time to test on MSIE 7. And Opera. And Safari….

An Hour in Montepulciano

I’ve arrived in town an hour too early for the Internet joint to open. I came alone, so I have some time to kill. I’ve come to the top of Montepulciano to look west over some of the most pictuesque scenes in Tuscany. Wait a minute: I take that back. Pretty much everything in Tuscany is picturesque.

Still, many tourists and locals alike come to this spot to take a look and take a breather — the hike to this spot definitely gets ones heart pumping. As with Florence, the town itself is something to do; there’s no need to have a specific activity. I don’t shop unless there is something I need (note to self: don’t forget to get brown leather shoes). I don’t eat unless I am hungry, although since every third shop sells pasta, cheese and salami, it’s hard to avoid persistent hunger even when the stomach is left out of the conversation.

No, the city itself is a destination in itself. I could spend all day simply wandering its vicoli, smiling at whomever happens to look my way. Unfortunately, there are only two kinds of people that respond: shop keepers and old women. The shop keepers are, of course, trying to get you to come in. They usually speak in broken English because they can spot you by the look in your eye: il touristo americano. The old ladies smile the most, accompanied by the occational buona sera.

A group of four Germans has arrived and they are taking turns with the camera. My heart starts to beat faster as I consider asking them if they want a photo together. I get nervous when communicating with people that aren’t expecting it. I’m pretty comfortable at brutalizing the Italian language in front of shop keepers. Though it makes their hearts ache, I’m sure they are used to tourists speaking to them loudly in their native tongue, finally settling on poor English as the lingua franca.

I casually interrupt in my best German, which is ignored at first. After the next picture, the gentleman holding the camera looks deliberately in my direction, as if to say “yeah, what?” I freeze, forgetting the nouns for the sentence I had constructed in my head during my earlier internal monologue. I ask if they speak English. He indicates that they do, and I ask if they want me to take their picture all together. He declines immediately, apolgetically indicating that his camera is out of film. I know it is a lie, but I might not give my camera away as easily to some stranger typing on a huge laptop at the top of a hill, either. Oh, well. At least I offered.

Time to move to another location.

The main square in town is oddly calm. Most people are still eating or relazing after their meals. The square itself has undergone some construction over the last few days in preparation for an amateur dramatic production that will be hald this evening. Today’s additions include freshly cut tree limbs to act as trees for the set. There is still a pile of branches on the steps, awaiting their final placement. Nobody seems to be tending to them at the moment.

Throughout the streets today, I noticed flags that weren’t there before. There are at least 4 different flags, obviously demarking the various neighborhoods. Oddly, only two are visible from the piazza grande. I would have expected to see all of them converge on this central square. Perhaps neighborhood warfare has resulted in several takeovers over the years leading to the current situation. Perhaps not.

Piazza Grande in Montepulciano is dominated by two structures: the town hall, complete with clock, and the obligatory cathedral, complete with bell tower. Actually, both the tower and the clock have bells. In 20 minutes, I’ll find out if they are on the same schedule. The cathedral is similar to many Catholic cathedrals in Italy, except that it is one of the unfortunates that does not have a marble facade. Yesterday’s trip to Arezzo gave me the opportunity to see a very attractive cathedral that was not intended to have a marble facade. Instead, it had light brown, slightly reddish bricks, smooth all around (aside from the few that had cracked and had their street-facing portions fall off). The tower here was built as a masonry structure, and looks like it is finished. The naked cathedral — one that was intended to have a facade, but never got one (or sometimes had it reposessed for a more important church) — is unfortunately very ugly. The bricks are left intentionally ragged, a smattering of mortar on the outside to hold it all together. It almost looks forgotton, except for the obvious significance it has at the center of town.

A group of Americans was trying to figure out how to get up higher for a better view. My heart doesn’t beat so fast when considering whether or not to help Americans; I can judge their interest much more successfully given my relative mastery of the language. I tell them that it’s a pretty good view to walk up the clock tower, although they won’t let you go up to the top of the clock (it’s pretty small). You get a pretty good view from up there. (I’m waiting to go to the Internet place to download the software to create panoramas from my individual shots.) They thank me and head into the town hall. I leave to get online.

My Wife and I Went to Portland and All I Got Was This Poison Ivy

My sister-in-law had a conference to attend in Portland, Oregon, and she happened to have two companion fare-rate tickets available. What the heck, we said. We’ve never been to Oregon, before.

First of all, let me say that the travel gods were smiling on us for this trip. Not a drop of rain fell the entire time, and the tmperature was in the high 70s and low 80s the entire time. We were definitely spoiled. Portland is an interesting town. Yes, town. Portland is, by the numbers, about the same as Washington, DC: they are within a few percent of each other in terms of population and land area. However, the city seemed small — that is, easy to explore on foot — and empty. We spent two days inside the city, including most of the area covered by the MAX – Portland’s mass transit system, and hardly met any people. I kept waiting for businesses to close and people to come streaming into the streets during lunch, or even at the end of the business day. Such events never came.

Walking around in downtown DC, the sidewalks are teeming with people. Sure, everyone is on a cell phone talking way louder than absolutely necessary, but they are there nonetheless. Being in Portland felt like being in a city that had been partly evacuated.

I mentioned to someone on the MAX that there were plenty of seats in the middle of the day, and that it was nice. She glanced around the train car and said, “well, around five o’clock, it’ll be pretty full”. We were on the train again around that time, and this time I had to stand, along with a reasonable number of people (I’m used to the Orange Line, which is pretty full most of the time, and totally crazy during rush hour). Another train came while we were still standing near the station, and it was practically empty. Very odd. Maybe we were there on some kind of city-wide vacation week.

Many stores didn’t seem to be open no matter when we went by. We wandered around most of the time we were in the city — no specific destinations or schedules. One evening, we were suprised to see that a gelato shop (mmm… gelato) was closed at maybe eight in the evening. The next day, we came by the same block at nine in the morning and it was also closed. Maybe they were only open for the lunch rush.

Maybe not. That same day, we went to the northwest corner of the city for two things: lunch and liquor. We stepped into one of the McMenamins pubs (one of the most prolific pub owners in the city) to get a pint and a sandwhich, and experienced a continuation of our Twilight Zonesque trip in this cavernous pub: there was one guy at a billiard table, one guy at the bar, and a group of 4 people in a booth. Those guys in the booth looked familiar: they were the kind of business-type folks that I’m used to seeing packed heel-to-toe in joints like this in DC.

The place was large enough to seat maybe 100 people, and it looked like there were more rooms if you kept walking into the establishment. We sat next to the foursome at a booth, next to the windows in the front — prime real estate for lunch as far as I was concerned. Where were these people? I think maybe Portland was experiencing a rash of body-snatchings or something.

Okay, enough about the emptiness of portland. There were lots of interesting things to be found in Portland, including an electric car charging station and a distillery. I had never been to a distillery, and since we could take the train to one, we did. We went to the Clear Creek Distillery, who distills their own spirits right in the place we visited (meaning that we didn’t just go to a storefront or anything… we were in the place where they do everything).

Unbelievably, we found a whiskey that ought to be a whisky. A Scotch Whisky, that is. McCarthy’s Oregon Single Malt is a 3-year-old whiskey that is so smooth and peaty, I find it superior to many single-malt Scotches that I’ve had. Amazing.

Also amazing were the waterfalls — as well as the canyon walls producing them — along the Columbia River Gorge. We took many pictures while we were there, including some nice ones of the falls and some videos (like this one). I have yet to assemble some of the panoramic sets that I took, which I just remembered that I have to do. We toured the Bonneville Lock and Dam, which includes a fish ladder to allow fish to swim upstream, around the dam. The fish ladder features a narrow route where fish are counted by folks who live to count fish. Our visit occurred on a slow day (otherwise known as “not September”) and so she told us all about identifying and counting fish. We even saw a couple of Chinook Salmon going by the window (pic and video). Mmmm… salmon. We ended up at a restaurant half way up mount hood, where there was still snow on the ground. So much for 85-degree weather in Portland.

The Pacific Coast is also gorgeous (no pun intended). Again, we have some pictures of that outing as well. Unfortunately, I hadn’t charged my camera battery before we left so it crapped-out around four o’clock in the afternoon. We switched to my sister-in-law’s camera, but we had left it in the car since I had mine, so we didn’t get some really nice pictures that I would like to have gotten. Oh, well. At least I got this one of a tree eating me. At some point during these two hiking trips, I got poison ivy.

When I was a kid, I got poison ivy all the time. I was starting to become convinced that doctors just didn’t understand how poison ivy worked, and that I had actually been permemently infected with it, and that heat simply triggered it in my body. It didn’t help that I had no idea what it looked like. Despite my father’s repeated descriptions and demonstrations (with me at a distance, naturally), I simply couldn’t identify the plant. Even as recently as last summer, I went to the edge of a forested plot of land near my parents’ home and said “hey, that’s poison ivy, right? I’ll take care to avoid that.” He pointed out that what I had identified as poison ivy was actually just a harmless fern or whatever, but that several feet away lie the beast. For whatever reason, I simply cannot identify it properly. I can identify things that look like poison ivy, but I don’t think I have a single successful identification under my belt. What I do have under my belt is an itchy rash. Wow, does that sound bad: t’s on my hip, okay!?

On our last day there, Katie and I walked to the Portland Rose Garden, but due to severe scale management issues on the tourist’s map we were carrying, we thought it really sucked. We finally found it, but sadly May isn’t a good time for roses. So, we toured the Portland Rose Bush Garden, sans most of the flowers. After that, Katie used her superior orienteering skills to get us lost in Forest Park. Fortunately, the park is bounded on all sides by roads, so eventually we would have been rescued. When we stumbled across the Visitors’ Center (closed, of course), we were happy to find that trail maps were provided on the outside of the building, meaning we could take one and find our way back to the train.

Finally, we got down to business and started visiting wineries. Unless you’re there, stories about them are dreadfully boring, so I’ll spare the details. Suffice it to say that we toured several wineries, tasted lots of wine, got industry discounts on everything (thanks to Katie’s job at Lost Creek Winery here in Virginia), came home with nearly 40 bottles of wine, and ate lunch at a joint called Nacho Mama’s. Fortunately, we opted to ship 2 cases, so we lugged fewer than half of those home with us on the plane.

So, I’m going to go assemble those panoramas. I have only one decision to make: shall I have wine, or scotch?

Update: 2006-05-28 17:03 – Panoramas are available for the Columbia River Gorge, some random mountain, and Mt. Hood. I had scotch.

(Yet Another) Microsoft Internet Explorer Rendering Bug

For years, standard operating procedure for developing a web application would be to design and implement it with Microsoft’s Internet Explorer as the test bed. You’d pick a version and tell everyone that they needed to use it and that was that. I have to admit that even I committed such sins.

These days, I want my pages to be usable on as wide a variety of web browsers as possible, so I use Mozilla Firefox for development, and then just check MSIE at the end to see if anything is amiss. Yet, with MSIE, something is almost always amiss…

I’ve had trouble with good-looking logos and mastheads for a long time. Back in the day, tables were the way to go. More recently, CSS is the preferred (and really the only) way to do layouts. The trouble is that MSIE has some schizophrenia when it comes to CSS. The folks that wrote MSIE implement only part of the CSS specifications, and often took shortcuts whenever they wanted.

A few days ago, I noticed that MSIE was acting strangely when viewing one of my current projects. It appeared that the text in my masthead wasn’t being displayed. Perhaps I had some conflicting CSS styles that were giving my text the same background and foreground colors. I checked, and everything was okay. Reload after reload, application server restart after application server restart didn’t solve the problem. Mozilla Firefox never blinked an eye and rendered the (quite simple) page without a problem.

Then, I noticed that scrolling the page past the fold and back again would mysteriously reveal the text. That’s not something that can be done using CSS.

Check out this movie that demonstrates the problem:

Screenshot of MSIE Rendering Bug

It’s definitely a bug. The markup is validated correct strict XHTML 1.0 and the CSS is also spick-and-span clean.

The markup is fairly straightforward; there’s a div surrounding the entire masthead (both the topmost blue bar and the bar containing the tri-colored regions), and then a divcontaining everything within the topmost blue bar. The blue bar contains a form containing the login form. All the other text elements are plain-old h1 and h2 h2elements. The tri-colored regions live in their own divand are made up of the surrounding div(black background) and two nested divelements with appropriate background colors.

The styles are also straightforward; colors, margins, borders, etc. I didn’t even have to use the ‘line-height’ trick to get MSIE to display an empty div(for the tri-colored regions).

It turns out that the problem can be solved by adding a simple non-breaking space between the blue-bar and tri-colored-bar divelements. MSIE interprets this change by finally giving me what I wanted in the first place. Unfortunately, it adds a small vertical space before the tri-colored-bar which I would prefer not to have… it looks like unnecessary padding in the blue div.

I have a virtual machine running Microsoft Windows XP with MSIE 7 beta running on it, so I decided to comfort myself with the fact that MSIE 7 had probably fixed this bug. It hasn’t, at least not yet. I hope the MSIE engineers really try to get CSS right this time.

Terre Haute Tribune-Star Snubs Hometown School

The Terre Haute Tribune-Star, a puplication I rarely think of since I graduated from college, is running a story about how Indiana State University (in the ‘Haute) will be the “first public university in the state to require all students to have notebook computers“.

After mentioning ISU’s new plan, the article goes on to say that ISU is only “one of a handful of institutions nationally, including the University of North Carolina-Chapel Hill and Clemson University, to institute similar mobile computing initiatives“.

Apparently, the author of this article did not do their homework, at least not very well. The article seems to come directly from the Tribune-Star; it’s not an AP report or reprinted from another publication, so they should have known about this: Rose-Hulman Institute of Technology, a well-known university in town, has had a mandatory laptop program since the class of 1999 began as freshmen in 1995, making that program over 10 years old.

UNC-Chapel Hill appears to have discussed this back in 2004 and has probably implemented it since then. Clemson University started requiring laptops in 2003, and University of Denver (mentioned in the comments) implemented their program back in 1999.

The author not only completely misses the fact that Rose-Hulman has a laptop program, and that it is over 10 years old, but also that there is actually a rather long list of universities that implement laptop programs such as these. The statement that ISU is one of “a handful of institutions nationally” to implement laptop programs is preposterous.

Oddly enough, there is no attribution for the Tribune-Star piece.
I wouldn’t want my name on it, either.