Broken Contact Form

Feb 5, 2012

I am aware that the contact form at this site is broken (though I'm not sure why). Until I get some time to fix it, if you have a bug report or question, simply send me an email at: removed

My apologies for the inconvenience.

In my last post, I complained about my initial experience with Stack Overflow. I decided to give myself 30 days with the service, to see whether or not I warmed up to it. Now that those 30 days are over, I will be posting several of my thoughts and observations. This first post won't be about the site itself; instead, it will cover some of the things I learned during my 30 days. A second upcoming post will cover some problems I think exist with the Stack Overflow model, and my final post will provide a few suggestions for how I think things can be improved.

Let me first say that I learned a lot simply by browsing the site. Reading existing questions and their answers was fascinating, at least for the programming topics I care about. Some of what I learned came through mistakes I made attempting to answer open questions. Other bits of information just came through searching the web for the solution to someone's problem (something that a lot of people at Stack Overflow are apparently too lazy to do). Without further ado, here's a list of stuff I learned, in no particular order (each item lists the corresponding language):

C (with GNU Extension), PHP (5.3+)
The true clause in a ternary compare operation can be omitted. In this case, the first operand (the test) will be returned if true. This is a bizarre shortcut, and one I would never personally use. Here's a PHP example (note that there's no space between the question mark and the colon; in C, a space is necessary):
$a = $b ?: $c; // No true clause (too lazy to type it, I guess)
$a = $b ? $b : $c; // The above is equivalent to this
Regular Expressions (Perl, PHP, possibly others)
The $ in a regular expression doesn't literally match the absolute end of the string; it can also match a new-line character that is the last character in the string. Pattern modifiers are usually available to modify this behavior. This fact was a surprise to me; I've had it wrong all these years!
Bash
I found a terrific article that details the differences between test, [, and [[.
Firefox Extensions (XUL, JS)
You can use the addTab method in the global browser object to inject POST data to a newly opened tab.
Perl
The way I learned to open files for output in Perl (over a decade ago) is now not advised. It's going to take a lot of effort on my part to change to the new style; old habits, and all that.
# Old way of doing it (how I learned)
open OUT, "> myfile.txt" or die "Failed to open: $!";

# The newer, recommended way (as of Perl 5.6)
open my $out, '>', "myfile.txt" or die "Failed to open: $!";

Update (Sep. 26, 2016): See my updated post on how I think new user's should approach Stack Overflow.

Stack Overflow has always been a better-than-average resource for finding answers to programming questions. In particular, I have found a number of helpful answers to really obscure questions on the site, many of which helped me get past a road block either at work or in my hobby programming. As such, I decided I'd join the site to see if I could help out. Never before has a website given me a worse first impression.

In an effort to keep the community as clean and orderly as possible, new users have very little rights from the get-go. On paper, this is a pretty nice idea. In practice, it makes it difficult for new users to gain any traction. I read through a number of questions today and had several comments for the original poster. Unfortunately, I couldn't make my comments, since new users cannot post comments on articles they themselves didn't write (you have to gain "reputation" in order to gain that privilege). Posting my comment as an "answer" to the original question seemed like bad form, so I didn't do that.

Looking elsewhere around the site, I found a few questions I felt I could answer. As soon as I went to answer said questions, someone else (in some cases, a number of other people) had jumped in and beaten me to the punch. I never had a chance to provide a helpful answer. Not only do you have to be very knowledgeable about a subject, you've also got to be very fast in providing said answer. I eventually did provide an answer for a question, then realized that my approach wouldn't work. Before I could take action and modify the answer, my submission had already been modded down by several people, several of whom left snarky remarks. What a warm welcome for a new user! I subsequently deleted my answer.

I later searched the Meta Stack Overflow site, looking for advice for new users. It turns out I'm not the only one who thinks that it's very easy for new users to get dumped on. Take a look at the questions revolving around new users on the site, and note how a number of them revolve around how hard it is for new users to improve. Documentation for how best to contribute as a new user is sorely needed.

The folks who manage these websites need to examine the barrier of entry for new users. I fully understand the need for keeping spammers and trolls out, but someone needs to develop a tutorial (or better yet, a set of tutorials) for how to properly use the website. New users do occasionally need hand holding, especially with websites as complicated as Stack Overflow. I think the community as a whole would benefit, and it would certainly help people like me who have been quickly overwhelmed by what the site offers.

Skyrim Review

Nov 21, 2011

For those who live under a rock, The Elder Scrolls V: Skyrim was released ten days ago. I'm already nearly 70 hours into this game, and there's still a ton of stuff I haven't done. That said, I figured I'd post a few quick thoughts about this game. In short, this is easily one of the best games I've ever played.

There is simply too much to do in this game. You could spend all day making potions, crafting items, enchanting items, or simply exploring the world, all without ever starting a single quest. I found myself completing many of the "miscellaneous" quests long before I joined any particular faction, or started along the main quest line. There are still giant chunks of the map that I have yet to visit, which is incredible given that I'm so far in.

The game's graphics are outstanding; head and shoulders above Oblivion's engine. I'm really impressed with the draw distance, and every dungeon, cave, and mine has a unique feel (fixing one of Oblivion's few failings). It's also silky smooth on my system, running on the "High" detail level. Story lines have been interesting so far (though the Thieves' Guild seemed a little weak), and I'm loving the Dragon Shout abilities. Blasting an enemy off the top of a mountain is so incredibly fun.

I do have a few complaints. The user interface on the PC is pretty terrible, though I'm hopeful that a mod will come along soon to fix that. Voice acting is good, but some of the voices are reused way too much for my liking. Perk points (a new way of leveling your character) are too rare. Give me 2 or 3 points per level, not just 1! Finally, as is usual with this type of game, there are still quite a few bugs. Another patch is coming after Thanksgiving, which should hopefully smooth out some of the rough spots.

If you like role playing games, and you enjoyed the previous Elder Scrolls titles, you'll like this title. It's an instant classic in my opinion, and has taken its rightful place in my "best games of all time" list. 5 stars

A couple of years ago, I blogged about two helper functions I wrote to get HTML form data in PHP: getGet and getPost. These functions do a pretty good job, but I have since replaced them with a single function: getData. Seeing as I haven't discussed it yet, I thought I would do so today. First, here's the function in its entirety:

/**
 * Obtains the specified field from either the $_GET or $_POST arrays
 * ($_GET always has higher priority using this function). If the value
 * is a simple scalar, HTML tags are stripped and whitespace is trimmed.
 * Otherwise, nothing is done, and the array reference is passed back.
 * 
 * @return The value from the superglobal array, or null if it's not present
 * 
 * @param $key (Required) The associative array key to query in either
 * the $_GET or $_POST superglobal
 */
function getData($key)
{
    if(isset($_GET[$key]))
    {
        if(is_array($_GET[$key]))
            return $_GET[$key];
        else
            return (strip_tags(trim($_GET[$key])));
    }
    else if(isset($_POST[$key]))
    {
        if(is_array($_POST[$key]))
            return $_POST[$key];
        else
            return (strip_tags(trim($_POST[$key])));
    }
    else
        return null;
}

Using this function prevents me from having to do two checks for data, one in $_GET and one in $_POST, and so reduces my code's footprint. I made the decision to make $_GET the tightest binding search location, but feel free to change that if you like.

As you can see, I first test to see if the given key points to an array in each location. If it is an array, I do nothing but pass the reference along. This is very important to note. I've thought about building in functionality to trim and strip tags on the array's values, but I figure it should be left up to the user of this function to do that work. Be sure to sanitize any arrays that this function passes back (I've been bitten before by forgetting to do this).

If the given key isn't found in either the $_GET or $_POST superglobals, I return null. Thus, a simple if(empty()) test can determine whether or not a value has been provided, which is generally all you care about with form submissions. An is_null() test could also be performed if you so desire. This function has made handling form submissions way easier in my various work with PHP, and it's one tool that's worth having in your toolbox.

As I mentioned in my previous post, I learned two photography lessons on my recent trip to the mountains of North Carolina. Today, I will be covering the second lesson I learned. In short, never fully trust your camera's automatic white balance setting. While shooting under cloudy conditions, I found that the automatic setting resulted in photos that were way too cool in color, resulting in inaccurate representations of what my eye saw. Here's a great example from my visit to Mount Mitchell State Park (a wonderful place, I might add):

Photograph taken with automatic white balance

Compare the automatic white balance photo with the following one, which was taken with manual white balance (on the "Cloudy" setting):

Photograph taken with manual (Cloudy) white balance

Note how this second image is warmer in color, with richer greens and reds. This second image is much closer to what I really saw, and the color difference was enough to be apparent in the little LCD display on my camera. The morning I visited the park, weather conditions were definitely cloudy. It's interesting then that the automatic white balance didn't pick up on those conditions better than it did.

One obvious solution to this problem is to shoot in RAW mode (assuming your camera supports it). My camera does not support RAW, and I'm not entirely sure that the additional post-processing work necessary with RAW photos is worth it (though I'm sure plenty of pros would disagree). As I have learned, you're probably better off manually setting your white balance for a given scene. Just don't forget to change it each time you go on a shoot. You wouldn't want to shoot in "Cloudy" mode on a bright, sunny day.

I learned two very important photography lessons during my recent vacation to the southwestern mountains of North Carolina. Today I will cover one of those lessons, and I'll get to the other one in a future post. As you might have guessed from this post's title, the first lesson involves a tripod.

In my previous outings to the various state parks here in North Carolina, I've never carried a tripod with me. On a bright sunny day, it's typically a tool I feel that I don't need; lots of light, a steady hand, and my camera's image stabilization feature help me out. On cloudy days, however, I inevitably end up with a load of blurred shots, especially when in a heavily forested area. On this particular trip to the mountains, I knew I would be shooting a number of waterfalls, so I was willing to haul my tripod down the trail with me.

Since I already had the tripod with me, I found that I used it for way more than the waterfall shots I had intended. Wow, what a difference it made! Instead of lots of blurred shots, the vast majority of my photos are keepers this time around, thanks to this handy tool. I've also learned a few things about the type of tripod I want in the future:

  1. It should be light
  2. It should have a ball head
  3. The adjustable leg locks should be sturdy

My current tripod is a tad bulky, and the multiple controls are a bother to work with. A multidimensional bubble level for my camera's hot shoe connector would also be useful.

In short, if you're planning a photo shoot in a forested area, or you're shooting on a cloudy day, make an effort to carry a tripod along with you. Your end results will justify the extra effort of lugging extra gear down the trail. As an added bonus, carrying a tripod will pique people's curiosity. I struck up more conversations with random people about photography on this trip than I've ever done previously. It's a lesson I'll remember for a long time.

Update: This problem has been fixed in PuTTY 0.62.

Back at the beginning of last month, PuTTY 0.61 was released after four years (!) of development. Since upgrading to this new release, I've noticed the occasional "Access Denied" message when connecting to certain Linux systems at work. The odd thing about this message is that it appears between the user ID prompt and the password prompt; in essence, before I even get the chance to log in! Example output looks something like this:

login as: root
Access denied
root@myserver's password:

Making things stranger, I can enter the correct password and log in to the system with no problems. As I found out from a commenter on another blog, it turns out this message is due to a new feature in PuTTY 0.61. To prevent this message from appearing, do the following:

  1. Drill down into the Connection » SSH » Auth » GSSAPI section of your session's configuration
  2. Uncheck the Attempt GSSAPI authentication (SSH-2 only) option

The phantom access denied message should then go away.

This afternoon, I finished season 2 of the original Star Trek series. The last few episodes of this season are incredibly bad, even by 1960's-era science fiction standards. What really gets me about the last few episodes, is the feeling that they were written by grumpy old men, unhappy with the political climate at the time. Let's take a look at the three worst examples:

Episode 23: The Omega Glory In this bizarre episode, Kirk finds a star-ship captain violating the prime directive. The Yangs (yanks) and Kohms (communists) are battling one another in a bizarro-world parallel-Earth scenario. Worst of all? The Yangs have their own "American" flag, and the Declaration of Independence is considered their "holy word" (which, ironically enough, is kept in a large King James Bible). Be sure to listen for the strains of "The Star Spangled Banner" and "America the Beautiful" every time the flag is shown.

Episode 25: Bread and Circuses While attempting to locate a missing star-ship crew, Kirk and company stumble upon a planet whose oppressive government is a 20th-century version of Earth's Roman empire. In the final 2 minutes of the episode, Lieutenant Uhura figures out that the "sun worshipers" (who are slaves in this world's society) aren't actually worshiping the sun, they're worshiping the son of God. The "aw, shucks" sentimentality of the crew at this discovery is really misplaced and simply feels tacked on. Maybe a network exec forced the writers to put this twist in?

Episode 26: Assignment: Earth The season finale plays on the cold war fears of the 1960s, and shows a lot of badly edited NASA footage of early Apollo-era flight tests. A stereotypical "dumb blonde" female character sums up the entirety of her generation's shortcomings in this unforgettable scene:

Mister Seven, I want to believe you. I do. I know this world needs help. That's why some of my generation are kind of crazy and rebels, you know. We wonder if we're going to be alive when we're thirty!

Is a quote like that the hallmark of an out-of-touch, angry old man, or what? "Kids these days ... am I right?"

There are some other particularly annoying episodes, like Episode 22: By Any Other Name. This episode was terrific for the first 45 minutes of the 50 total. In the last few minutes, the aliens who have taken the Enterprise crew hostage simply cave in to Kirk's reasoning for peace, totally destroying the tension that had built up to that point. I was hoping for the death and destruction of these monsters, but all they gave me was peace and harmony. This could have been a solid episode, but the ending ruined it completely.

I'm looking forward to season 3 (some of the episodes sound very interesting), but I'm boldly going forward with a grain of salt. There are bound to be rocky episodes ahead.

Way back in February of this year, I started a Musical Voyage: listening to my music in order, sorted by album title. Today, I finally finished the journey with Van Halen's "5150" (an album I consider mediocre at best; I never was a Sammy Hagar fan). I found this to be an interesting way to enjoy my music. Sometimes the jump from one album to the next was very pleasant (e.g. Relayer by Yes to Revolver by The Beatles); other times, it was jarring and unexpected (e.g. from Best of Schubert to Best of The Doors). I heard a ton of stuff I rarely listen to, reintroducing myself to some terrific music. Occasionally, I even heard something I didn't like (and which I've subsequently purged from my iPod). At least I can buy some new music for myself now; upon starting this goal, I set a rule that no new music could be added. There's several things I've been eager to get, and now I finally can. Mission accomplished!

One minor annoyance I have always had while surfing the web, is the non-standardized order in which you consume a website's content. Two pertinent examples spring to mind. First, are the "post navigation" links that you find on many websites. Out of the box, WordPress uses a link pointing to the left to indicate older posts (example: « Older posts), while a link to the right indicates newer posts (example: Newer posts »). This design decision no doubt stems from the humble beginning of the blog: the journal (as in the pen and paper variant). In English, we read left-to-right, top-to-bottom; and in a pen and paper journal, newer entries are always "to the right of" older ones. I'm sure this is one reason why WordPress themes come as they do. I have always taken the opposite stance, however. Digital entries on a site are not (in my mind) the same as handwritten entries in a journal. So I have always used a link pointing to the right to indicate older posts, while a link pointing the left indicates newer ones. In short, the newest content appears "first".

My opinion changes with my second example, however. The Twitter timeline presents the newest tweets at the top of your home page. This seems like a major design flaw, since I am seemingly shoe-horned into reading tweets in reverse order. My typical modus operandi for reading Tweets is to scroll down to my last known position, and work my way back up to the top of the page. This is really bothersome to have to do. I'd love to have an option to have the newest stuff appear last, so I could consume the content as it was presented to me.

I take a similar stance in Google Reader. I used to browse items in "newest first" mode, but I stopped doing that since I would see stories in reverse order. After switching to reading items in the "oldest first" mode, I've been much happier; it feels much more natural to me. I'm not sure why I feel so differently about two remarkably similar items, but I do.

Which order do you prefer? Is there a "right" way to do it?

Portal 2 Review

Apr 26, 2011

Having recently completed Portal 2, I thought I'd share a few thoughts on the experience. As usual, I played it through on the PC, so my review comes from that vantage point. I have yet to try the co-op portion of the game, so my thoughts are limited to the single player experience.

The Good

Writing
As usual, the writing from Valve is top notch. The dialogue in Portal 2 is really funny and Stephen Merchant is outstanding as Wheatley, the personality core. If for no other reason, you should purchase this game for the hilarity alone.
The Story Arc
Though I found the overall story a little predictable, the execution is well done. Lots of back-story on Aperture Science and GLaDOS is uncovered, providing some really neat "aha" moments.
New Puzzle Elements
Several new puzzle elements have been added to the mix including light bridges, lasers, and various forms of physics paint (the latter of which I found really entertaining). These all added interesting twists to how you ended up using your portals.
Look and Sound
The graphics and sound in the game are stellar, as usual. I really felt like a part of the world while playing through the game.

The Bad

Loading...
Load screens are way too frequent in this title. This is a problem Valve needs to solve first and foremost for their next game. Each of their games has always been heavy on load screens, but this was ridiculous. I'm guessing this was a limitation forced on them by the gaming consoles which they support.
Console-itis
Valve has always delivered top-notch PC experiences, but here the console-itis bleeds through. The menu system is clearly designed for console controllers, and game engine options were surprisingly anemic. Very frustrating.
Too Short (Again)
The first Portal suffered from an incredibly short gameplay experience, and Portal 2 sadly has the same problem. I finished the game in about 6 hours, which is pitiful compared to the 20 or 30 hours or so it took me to play through Half-Life 2 the first time. My hope was that this game would have been much longer.
Single Solution Puzzles
Most, if not all, of the puzzles in the game have essentially one single solution. Portal allowed the player to come up with various solutions to the game's puzzles; but here, each puzzle is designed with one solution in mind, which was a letdown.

Gripes aside, this is a game everyone should play. It's a whirlwind of good game design, with hilarious writing all the way through. I give it a solid 4 stars.

I ran into an interesting phenomenon with PHP and MySQL this morning while working on a web application I've been developing at work. Late last week, I noted that page loads in this application had gotten noticeably slower. With the help of Firebug, I was able to determine that a 1-second delay was consistently showing up on each PHP page load. Digging a little deeper, it became clear that the delay was a result of a change I recently made to the application's MySQL connection logic.

Previously, I was using the IP address 127.0.0.1 as the connection host for the MySQL server:

$db = new mysqli("127.0.0.1", "myUserName", "myPassword", "myDatabase");

I recently changed the string to localhost (for reasons I don't recall):

$db = new mysqli("localhost", "myUserName", "myPassword", "myDatabase");

This change yielded the aforementioned 1-second delay. But why? The hostname localhost simply resolves to 127.0.0.1, so where is the delay coming from? The answer, as it turns out, is that IPv6 handling is getting in the way and slowing us down.

I should mention that I'm running this application on a Windows Server 2008 system, which uses IIS 7 as the web server. By default, in the Windows Server 2008 hosts file, you're given two hostname entries:

127.0.0.1 localhost
::1 localhost

I found that if I commented out the IPV6 hostname (the second line), things sped up dramatically. PHP bug #45150, which has since been marked "bogus," helped point me in the right direction to understanding the root cause. A comment in that bug pointed me to an article describing MySQL connection problems with PHP 5.3. The article dealt with the failure to connect, which happily wasn't my problem, but it provided one useful nugget: namely that the MySQL driver is partially responsible for determining which protocol to use. Using this information in my search, I found a helpful comment in MySQL bug #6348:

The driver will now loop through all possible IP addresses for a given host, accepting the first one that works.

So, long story short, it seems as though the PHP MySQL driver searches for the appropriate protocol to use every time (it's amazing that this doesn't get cached). Apparently, Windows Server 2008 uses IPV6 routing by default, even though the IPV4 entry appears first in the hosts file. So, either the initial IPV6 lookup fails and it then tries the IPV4 entry, or the IPV6 route invokes additional overhead; in either case, we get an additional delay.

The easiest solution, therefore, is to continue using 127.0.0.1 as the connection address for the database server. Disabling IPV6, while a potential solution, isn't very elegant and it doesn't embrace our IPV6 future. Perhaps future MySQL drivers will correct this delay, and it might go away entirely once the world switches to IPV6 for good.

As an additional interesting note, the PHP documentation indicates that a local socket gets used when the MySQL server name is localhost, while the TCP/IP protocol gets used in all other cases. But this is only true in *NIX environments. In Windows, TCP/IP gets used regardless of your connection method (unless you have previously enabled named pipes, in which case it will use that instead).

It's incredible to me that in 2011, programming languages still have problems with files larger than 2GB in size. We've had files that size for years, and yet overflow problems in this arena still persist. At work, I ran into this problem trying to get the file size of very large files (between 3 and 4 GB in size). The typical filesize() call, as shown below, would return an overflowed result on a very large file:

$size = filesize($someLargeFile);

Because PHP uses signed 32-bit integers to represent some file function return types, and because a 64-bit version of PHP is not officially available, you have to resort to farming the job out to the OS. In Windows, the most elegant way I've found so far is to use a COM object:

$fsobj = new COM("Scripting.FileSystemObject");
$f = $fsobj->GetFile($file);
$size = $file->Size;

Uglier hacks involve capturing the output of the dir command from the command line. There are two bug reports filed on this very issue: 27792 and 34750. The newest of these was filed in late 2005; a little more than 5 years ago! It's sad to see a language as prolific as PHP struggling with a problem so basic. Perhaps this issue will finally get fixed in PHP 6.

As I tweeted recently, Firefox 4 is to the 3.x line what Windows 7 is to Windows XP. It really feels like a worthy successor in so many ways. Tabs on top is a great enhancement, and I especially like the tabs-in-the-title-bar approach. I'm really able to maximize my screen real estate with these options. Surprisingly, I don't miss the status bar or menu bar as much as I thought I would (and yes, I know the menu bar is still present; I've simply chosen to turn it off). The orange "Firefox button" is a little strange, and takes some getting used to, but I can live with it.

The biggest improvement in my eyes is the ability to pin certain sites as "app tabs." Currently, I have GMail and Twitter pinned open. I am the world's worst at closing Firefox down completely at various points during the day. I don't know why I do this, but knowing I have some app-tabs open will hopefully help me break this terrible habit. One other great improvement worth mentioning is start-up time, which is notably faster. They've really caught up to (though not surpassed) Chrome in this regard, which has always been lightning fast to boot up. Hopefully this trend will continue.

I recently ran into a stupid problem using the system() call in C++ on Windows platforms. For some strange reason, calls to system() get passed through the cmd /c command. This has some strange side effects if your paths contain spaces, and you try to use double quotes to allow those paths. From the cmd documentation:

If /C or /K is specified, then the remainder of the command line after the switch is processed as a command line, where the following logic is used to process quote (") characters:
  1. If all of the following conditions are met, then quote characters on the command line are preserved:
    • no /S switch
    • exactly two quote characters
    • no special characters between the two quote characters, where special is one of: &<>()@^|
    • there are one or more whitespace characters between the two quote characters
    • the string between the two quote characters is the name of an executable file
  2. Otherwise, old behavior is to see if the first character is a quote character and if so, strip the leading character and remove the last quote character on the command line, preserving any text after the last quote character.

As you can see from this documentation, if you have any special characters or spaces in your call to system(), you must wrap the entire command in an extra set of double quotes. Here's a working example:

string myCommand = "\"\"C:\\Some Path\\Here.exe\" -various -parameters\"";
int retVal = system(myCommand.c_str());
if (retVal != 0)
{
    // Handle the error
}

Note that I've got a pair of quotes around the entire command, as well as a pair around the path with spaces. This requirement isn't apparent at first glance, but it's something to keep in mind if you ever find yourself in this situation.

Musical Voyage

Feb 9, 2011

Over the course of the next few months, I am going to try something my dad did last year: listening to my entire music library in order, sorted alphabetically by album title. This sort order should provide a fairly diverse musical experience. iTunes tells me that I currently have 4174 songs in my library, which comes out to 12.4 days of non-stop music. I'll be going from The Beatles' Abbey Road to Van Halen's 5150 (iTunes places numerically titled albums at the end for some reason). As I make progress, I will occasionally tweet my location in the library. My current plan is to use the #musicstream hash-tag on twitter to demarcate my progress. I'm looking forward to hearing the music that I don't listen to often; there's plenty that I frequently overlook.

Smart Games

Feb 2, 2011

Over the Christmas holiday, I purchased Dead Space on Steam (happily, for only $7). The game was a major letdown on a number of levels, but there's one nit in particular that I'd like to pick. I was really struck by how dumb the game assumed I was. Often, direct audio cues (i.e. the spaceship's computer) would tell you exactly what to do. Here's a typical example:

The player enters a room filled with radioactive debris. Upon entering said room, the ship's computer announces, out loud, that the room is locked down due to these dangerous conditions. In order to lift this lock down, all radioactive debris must be removed. To further complicate matters, the debris can only be removed when an airlock to outer space is opened (again, all of this is announced by the computer). A monitor in one corner of the room displays, in what would realistically be a 200-point font, the text "open airlock." Using this computer opens the airlock, and the player is then free to remove the debris.

Sadly, a number of other games make this same assumption; namely, that I as the player am generally unable to figure out how to proceed on my own. I think this is what draws me to the games that Valve develops. Every Half-Life title ever released assumes from the outset that the player is smart. Clues are always provided as to how to proceed, but precious few hints are explicitly stated. Portal is another perfect example of this. The user is instructed (via the narrative itself) how the portal gun works. It's then up to the player to figure out how to use it to proceed through the game.

As a gamer, I would much rather developers assume my intelligence, rather than my stupidity. It simply makes a game that much more fun to play.

Adblock Plus is a terrific extension for Firefox, along with the EasyList rule set. One minor problem I've run into recently, however, is that EasyList blocks the automatic package-tracking links that appear in the sidebar in GMail (when viewing emails that contain a tracking number). I found the offending rule in the list and disabled it, allowing me to get my links back. Here's how to do it:

  1. Open the Adblock Plus Preferences dialog (Tools » Adblock Plus Preferences)
  2. Press Ctrl + F to open the find bar
  3. Search for the following text (only one rule should match it): &view=ad
  4. Disable said rule

The entire rule looks like this, in case you're curious: ||mail.google.com/mail/*&view=ad

One of the strangest decisions (among many) made in Firefox 4 is the removal of the browser's status bar. No longer can users glance down at the bottom of the screen to see where a particular link will take them. Instead, this information is displayed on the right side of the URL bar in a surprisingly low-contrast font (how are low-vision users supposed to cope with this?). I cannot think of a single application, in Windows or otherwise, that exhibits this behavior.

Removing the status bar from Firefox completely changes the standard windowing paradigm. I'm all for maximizing vertical real estate, but I really think they should have copied Chrome and made the status bar invisible, showing it only when necessary. Besides, gaining 20 pixels or so isn't that much of a real estate win.

I'll be interested to see if this decision, along with a few other similar changes (removing the menu bar by default) impacts Firefox's usage rate, if at all. I can't imagine too many corporations will adopt Firefox 4 out of the gate due to changes like this, but perhaps my perception is too closed minded. What do you think about these changes? Are you willing to put up with them, or will you use a different browser?