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?

According to the WHATWG blog, future versions of the HTML specification will no longer use a version number. I can't imagine why this is a good idea. How are web designers supposed to know how to target their sites to visitors? A "living and breathing spec" will require frequent updates from every browser vendor, so as to stay current with what's allowed. As new features are implemented, how will developers know who's compliant and who's not? It seems to me that removing the version is a big step backwards. Perhaps they have ways of handling these situations?

Jury Duty

Sep 26, 2010

Earlier this week, I had the opportunity to serve on a jury for the first time. The experience lasted for three full days and I learned a lot about how the process works. Now that the case is closed and I can openly discuss it, I figured I'd write up a little bit about my experience. I'll go through each day's proceedings, the case itself, and the outcome.

Day 1: Wednesday

Court is held in the Durham County Judicial Building, located in downtown Durham. The building itself is fairly old and could really stand to be replaced, something that Durham is currently working on (the new building is currently under construction). Jurors are asked to report the first day at 8:30 AM which, as it turns out, is really when the building opens to the public. Going through security to enter the building was a bother. Men have to remove their belts, and everyone must empty their pockets and pass through a metal detector. All bags are also x-rayed. I lost my pocket knife in the process, as you aren't allowed to take "weapons" into the building. I could have taken my knife back to my car, but it was a good three to four block walk back to the juror parking deck, so I just decided to simply toss it.

Upon reaching the jury pool room on the fifth floor, I checked in and took a seat. Although I didn't count, there were apparently over 100 potential jurors (numbers 1 through 160 had been called to report that day). After everyone was checked in, we all watched a short video about the process of a judicial case. The jury clerk, a very nice lady, then came out and gave us further information and instruction. After that was complete, we sat. And sat. And sat some more. Our lunch break was quite long that day (12:15 to 2:30), which allowed me to kill some time. The day ends at 5:00, so at 4:00 we all figured we were going to get through the day without being called. At 4:10, that all changed. All the jurors were called into the superior court room to be seen by a judge. The judge apologized for the delay (he had been held up by a previous case), and asked us all the report at 9:30 the next morning to be selected for a case involving assault on a female. Before letting us go, he asked if anyone had any reason for which they should be excused. It was interesting to see which reasons he allowed and which he denied. One individual was a convicted felon, which got him off the hook immediately. Two people were excused for either being a current or former corrections officer. Other folks tried to be excused, but the judge only allowed a few to go (most of the excuses were denied). He then released us all for the rest of the day.

Day 2: Thursday

I decided to show up a littler earlier than requested, just to err on the side of caution, so I came back to the courthouse at 8:45 the next morning. After going through security again, those of us from the previous day were seated in a sectioned-off area of the jury pool room. Around 9:45 or so, we were all called back to the court room from the previous day. After being seated, the judge explained to us what the case concerned. We were to be trying a criminal case in which a male was accused of assault on a female. The state was prosecuting the case, as the victim had either chosen not to appear, or was unable to (it was never made clear why she wasn't present).

The court clerk called 12 names, mine being one of those 12. We proceeded one by one to the jury box, and were then questioned by the attorney representing the state. After each being asked a number of questions, the state attorney decided to excuse three jurors. Three more names were called, and those folks were asked the same questions. Once the state was satisfied, the defense attorney then questioned each of us. He was dissatisfied with several jurors, and asked that they be removed. It's interesting to note that each side can choose to excuse 6 jurors for no reason at all. Beyond that, they must have a valid reason for which a juror may not serve. I'm not fully clear on all the rules, but it was very interesting to see how each side handled the selection process. Choosing jurors literally took most of the day, during which I got to hear the same set of questions 7 or 8 times (this got quite boring). At about 2:45 or 3:00 in the afternoon, both sides were finally pleased with the jury, and all other jurors were excused from duty. There were a total of 12 jurors plus 1 alternate.

Once all the other jurors had been excused and left the courtroom, the case started. Since the state attorney had the burden of proof, she got to go first in the opening statements. Once she had completed, the defense attorney gave his opening statement. After he was finished, the state began to offer evidence. Two witnesses were called to the stand: a person who had been in the room at the time of the incident (albeit with her back turned), and one of the responding officers. We heard testimony from both of these witnesses. I found it interesting that, because the victim was not present, no hearsay from her could be entered into evidence. This affected the police officer's testimony, since he was reading from a filed incident report. The jury was asked to step out of the court room on a number of occasions, as the lawyers wrangled with the judge over these sorts of legal matters. At the end of testimony, and after the defense attorney got a chance to cross examine the witnesses, the state essentially rested their case. The day was spent by this point, so we were asked to return at 9:30 again the next morning to hear evidence from the defense. I should point out that jurors may not discuss the case with anyone (even other jurors) while the case is ongoing. This made all of the jury breaks fairly boring, as we could only chit-chat with one another about random stuff.

Day 3: Friday

At about 9:45 or so on Friday morning, the case got underway again. The defendant took the stand and testified on his own behalf, giving his side of the story. We found out during this testimony that he had been previously charged with two offenses: a drug charge with intent to sell and distribute, and assault on a minor under the age of 12. At least one of these charges was dismissed, presumably the assault charge (he had apparently served some time for the drug charge). The judge later told us that we could only use these previous charges to weigh the truthfulness of the defendant's testimony; we could not use it to make a decision on the current charge against him. In other words, we couldn't find him guilty of assault just because he had a prior assault charge brought against him.

Once the defendant had completed his testimony, we were asked to step out of the jury room while he stepped down from the box. I also found this to be interesting. Perhaps the judge deemed it necessary since the witness stand was located on our side of the courtroom. Once we returned, the state recalled the officer to the stand as further evidence. This got thrown out, however, on some technical grounds that we weren't privy to (the jury was again asked to leave the courtroom while the lawyers argued their position). Returning once more, we got to hear closing arguments from both sides, and we were then given the case. The judge instructed us to evaluate three points in the law concerning the active charge against this individual:

  1. The victim was a female
  2. The accused was a male
  3. There was an intent to harm on the part of the accused

Once we were given the case, we then went to the jury room to make our decision. It was clear from testimony that an injury obviously happened (the victim's mouth had been injured to the point of bleeding), but whether or not it was intentional was debatable. The defendant claimed that it had been an accident. According to testimony from all of the witnesses, there had been no arguing beforehand, nor were there any arguments afterward. This, coupled with the fact that no witness really saw what happened, helped us lean towards a "not guilty" verdict, simply because the state attorney had failed to prove that the defendant had intended to do harm. I should point out that this defendant had driven the victim quite a long ways to Duke Hospital to have her son checked out by doctors, going well out of his way to help her. Seeing as he had been friendly enough to do that, and that he had asked about the child's well-being during an interview with police, seemed to indicate to us that there was no intention of harm on his part.

The reading of the verdict was an interesting and tense moment. After the jury was called back in, our foreman handed the verdict to a deputy, who then handed it to the judge. He looked over it, then gave it to the court clerk to read aloud. The defendant was asked to stand, and then the court clerk began to read out her boilerplate statement. She eventually got to the decision itself, the reading of which really reached a crescendo (it read something like "We the twelve members of this jury hereby find the defendant..."). I couldn't imagine being in the defendant's position, waiting for those few words that indicate whether you're free to go, or are on your way to jail. After the verdict was read, the jury was excused and our time was considered completely served. Now that I have served, I cannot be recalled for jury duty for two years.

I'm very glad I got the opportunity to serve on a jury. Although there was a fair share of boring moments, I found the experience quite educational. Plus, I get $52 for my three days served ($12 for the first day, $20 each for days 2 and 3)! This was definitely an experience I'll never forget.

Has anyone here run into sound corruption problems in Windows 7? I'm having occasional audio problems with my current system, and I'm wondering whether my Sound Blaster Audigy 2 ZS is to blame (it's an ancient card). All I need is another hardware failure...

Disliking Java

Sep 21, 2010

If you were to ask me which programming language I hated, my first answer would most certainly be Lisp (short for "Lots of Stupid, Irritating Parentheses"). On the right day, my second answer might be Java. But seeing as hate is such a strong word, I'll opt for the statement that I dislike Java instead.

For the first time in probably 7 or 8 years, I'm having to write some Java code for a project at work. In all fairness, one of the main reasons I dislike the language is that I'm simply not very familiar with it. I'm sure that if I spent more time writing Java code, I might warm up to some of its quirks. But there are too many annoyances out of the gate to make me want to write stuff in Java for fun. Jumping back into Java development reminds me just how lucky I am to work with Perl and C++ code on a daily basis. Here are a few of my main gripes:

  1. It's a little ridiculous that the language requires the filename containing a class to exactly match the name of the class (so, a class named MyClass has to be placed in a file named "MyClass.java"). Other than making it easy to find where certain code resides, what's the benefit of this practice? The compiler simply translates your human-readable code into machine-specific byte code; filenames get lost in the translation!
  2. It pains me to have to write System.out.println("Some string"); to print some text, when in Perl it's simply print "Some string";. This leads me to my next major gripe:
  3. Java is way too verbose. I have to write 100 lines of code in Java to do what can be done in 10 lines of Perl. My time is worth something and I'm spending too much of it dealing with Java boilerplate code. In C++, I can use the public: keyword once, and everything that follows is public (until either another similar control keyword is reached or we come to the end of the block). It doesn't look like that's allowed in Java. Instead, I have to place the public keyword in front of each and every member variable and function. Ugh!
  4. Surprisingly, Java's documentation is pretty poor. Examples are few and far between and varying terminology makes it unclear when to use what function. For example, in some list-based data structure classes, getting a count of the items in said list might be getSize(), it might be getLength(), it could be just length(), or it might even be getNumberOfItems(). There's apparently no standard. Every other language manual I've ever used, be it PHP, Perl, or even the official C++ manual, has examples throughout, and relatively sane naming conventions. I can find no such help in Java-land.
  5. Automatic memory management can be handy, but it can also be a bother. I know for a fact that there are folks out there who make competent Java programmers who wouldn't last 10 minutes with C++ code. Pointers still matter in the world of computing. That Java hides all of those concepts from programmers, especially young programmers learning the trade, seems detrimental to me. It pays to know how memory allocation works. Trusting the computer to "just handle it" for you isn't always the best solution.
  6. Nearly all Java IDE's make Visual Studio look like the greatest thing on the planet; and Visual Studio sucks!

All that being said, the language does have a few redeeming features. Packages are a nice way to bundle up chunks of code (I wish C++ had a similar feature). It's also nice that the language recognizes certain data types as top-level objects (strings being one; again, C++ really hurts in this department, and yes I know about STL string which has its own set of problems).

I know there are folks who read this site that make a living writing Java code, so please don't take offense at my views. It's not that I hate Java; it's just that I don't like it.

Having recently replaced my graphics card, I was surprised to learn that the latest generation of cards requires not one, but two PCI-E power connections (with recommended power ratings of 20A on the +12V rail). Seeing as graphics cards have gotten larger (they now take up the width of 2 or more PCI slots) and more power hungry, I got thinking about their future. Several questions came to mind:

  • In 5 or 10 years, will graphics cards require their own dedicated power supply?
  • Will computer manufacturers forgo the PCI-E format for some sort of on-board socket, similar to the CPU?
  • If not, how will card size factor in to motherboard and case design?

It seems to me, especially seeing as how some graphics cards have cooling units larger than the card itself, that the PCI-E form factor for GPUs can't last for many more years. Perhaps smaller-scale, multiple cores will prevent them from growing even larger than they are today. It's interesting to think about the various possibilities.

I found an old video card around my house last night, so I swapped my current one out for it. I was able to boot my system, but upon entering Windows, I still see graphical trash. That indicates to me that the motherboard is most likely to blame.

After doing a little bit of hardware research last night, it appears that my CPU is still among the best, so I doubt I'll replace that after all. And seeing as my graphics card might not actually be to blame, I'll probably hang on to it as well (it, too, is still fairly decent). The motherboard definitely needs to be replaced, and I'm thinking about going to DDR3 memory instead of DDR2 (though if I stayed with DDR2 I could get by with just purchasing a new motherboard).

So, long story short, the situation doesn't appear to be as dire as I had initially thought. It still bites that I have to deal with this though. Why can't technology just work?

My desktop computer at home has been giving me some occasional graphical problems ever since I updated to Windows 7. I have the latest and greatest drivers for my graphics card, but every so often I get graphical trash on screen that, usually, corrects itself. Tonight, it seems to have died for good. I can't get the system to boot reliably, even after trying to reseat the card. To add to my woes, I've also been having the occasional "double-beep" at startup, indicating that I have a memory problem. This has been an issue ever since I switched to the abit motherboard I'm currently using.

Anyways, I'm going to bite the bullet and buy a bunch of new hardware to fix all of this. New motherboard, CPU, memory, graphics card; the whole shebang.

If you have recommendations as to what to buy these days, I'd sure appreciate it. I'll be putting in some orders ASAP, so the sooner you can recommend something, the better.

Tracking My Weight

Aug 13, 2010

I've been slightly overweight for quite a long time. Two months ago, I decided I would start tracking my weight daily, in an effort to try and motivate myself to shed a few pounds. Desiring a tool to make this easy, I immediately searched the Android marketplace and found Libra. This incredibly handy tool uses a weight trend line as described in the excellent book The Hacker's Diet.

Allow me to quickly talk about The Hacker's Diet. Written by John Walker, founder of AutoDesk, this book tackles weight loss as an engineering problem. The author is funny, to the point, and provides a careful analysis of how weight loss works. The briefest summary: you will only lose weight by eating fewer calories than you need. Exercise won't do it (though it helps), and weird diets (Atkins, South Beach, et al.) won't do it either. Read the book for further discussion and analysis of this viewpoint. The author presents a pretty solid case that's hard to argue against. Best of all, the book is available for free as a PDF!

The trend line in a weight chart tells you where you're headed: am I gaining weight (line going up), maintaining it (horizontal), or losing it (line going down)? With this simple tool, I was able to see in no time at all that my weight was going upwards at an alarming rate. After waking up to my weight gain, I set a modest goal of losing 9 pounds (I was 9 pounds above the "overweight" line for someone my height).

After reading The Hacker's Diet, I made one simple change to my lifestyle: I altered how much I eat at each meal. I didn't change what I eat; only how much. And wow what a difference that has made! Today, I weighed in at my goal weight for the very first time! Here's the proof:

As you can see from the chart, I started heading up, turned the corner, and have been headed down ever since. My trend line hasn't yet hit my target weight (as of today's measurement, it's scheduled to hit the target on August 21), but at least it's heading in the right direction. It was a great feeling to hit my target this morning. I'm looking forward to shedding a few more pounds and maintaining a healthier weight.

This weekend, for my mom's birthday, we took a trip over to Greensboro, NC to visit the Greensboro Historical Museum and the Guilford Courthouse Military Park. Having never visited Greensboro proper, we didn't really know what to expect from either.

The historical museum in Greensboro is way larger than it may look from the outside. We easily spent two hours wandering through the various exhibits, some of which are tremendously large. More time could easily be spent here; the rainy weather limited our outdoor experiences (a few exhibits are outside the building). I was surprised to learn about the history of the area; a number of corporations were founded there, and several prominent events have occurred over the course of time. Best of all, the visit is absolutely free! I came away from the museum very impressed. It easily rivals the state museums in Raleigh.

Guilford county courthouse, site of a pivotal battle in the Revolutionary War, is equally as entertaining. Again, the rainy weather limited our outdoor activity at the park, but it should be noted that there are miles of hiking trails and a number of memorials around the park. The visitor center has an excellent 30-minute film describing the events of the battle. A number of artifacts from the battlefield are also on display; from rifles, to cannonballs, to belt buckles, it's all here. The collection is truly gigantic. Again, the visit is completely free. This is a park I will definitely return to.

If you're ever in the Greensboro area, I highly recommend both destinations. Both provide a relaxing environment, and a historical perspective on the Piedmont region of North Carolina.

Useful Tool: ImgBurn

Jul 20, 2010

I needed a quick and easy way to burn an ISO image here at work, so I took a look around and found ImgBurn. A Windows-only app, it's small, easy to set up, and took no time at all to get working. The only annoyance was that the installer included an option to install an "Ask" toolbar in IE (along with a few other advertising options). Thankfully, you can disable them all at setup time.

Recommended LCDs?

Jul 12, 2010

Exactly five years ago today, I bought a used NEC 22" monitor for my personal computer at home. It has served me well for that time, but I've seen it act up a time or two recently. Seeing as LCD technology has progressed much over the past few 5 years, I feel like it's finally time to bite the bullet and join the mainstream. As such, I'm starting the hunt for a new display. Here's what I want:

  • Real Estate: I run 1600 x 1200 at home, and I'd like to stay in that neighborhood
  • Fast Response Times: The display would primarily be used for gaming, so fast response times are a requirement.
  • Vibrant Colors: Some LCD displays have pretty weak white-balance; I want something with nice color reproduction, since I'll also be doing occasional photo editing.

Does anyone here have any recommendations on brands or where to start looking? Is there a model or manufacturer you've been happy with? Any ideas would be appreciated!