Upgrading to an Intel Core i7 920 and Asus P6T motherboard

I get the itch to upgrade my PC every now and again. Usually I ignore it. I generally refuse to upgrade until I can at least double the performance of my existing system.

Fortunately (or unfortunately depending on your point of view) Moore's Law is hard at work; every few years the jump in performance becomes significant enough to justify an upgrade under my totally unscientific, rule of thumb doubling requirement.

This time around it's upgrading from a single core Athlon 64 (2.4GHZ) to an Intel Core i7 920.  As is usually the case upgrading the CPU meant that I had to upgrade the motherboard. This time around it was also necessary to upgrade RAM since the board I went with (an Asus P6T) doesn't support DDR.

The Core i7 architecture features some major improvements over its predecessor Core 2 architecture. Others, including Intel, have gone to great lengths to describe these improvements so I won't reproduce their discussions here.
The 2 architectural improvements that stand out the most to me are the new Quick Path Interconnect (QPI) and the return of HyperThreading (HT). That's right, HyperThreading is back with a vengeance. Before the Core series, which dropped HT, it was all the rage as it allows a single processor to execute 2 independent instruction streams simultaneously.

Quick Path Interconnect (QPI) is similar to AMD's HyperTransport except that its faster and transfers larger data chunks (bit-width). HyperTransport was responsible for AMDs lead in performance for the previous 3 or 4 years. Even at the same clock speed Intel CPUs couldn't get data into and out of the CPUs fast enough using the already overcrowded North and South bridges. When AMD went multicore the gap widened; without HyperTransport data had to be passed from core to core. Hypertransport provided a direct core to core connection at speeds much faster than anything the Core 2 series could hope to match. All of that is potentially wiped out by Intel's introduction of QPI.

Since I wanted to do the upgrade as cheaply as possible I've reused as much of my existing hardware as I can. The CoolerMaster Wave Master case, shown below, has a detachable motherboard tray to simplify mounting motherboard on the standoffs.

After removing the unused standoffs, which were shorting the board, the P6T fits nicely onto the tray. This Asus board shipped with an insulated back panel:

The Asus board's colored DIMM slots showed which slots were paired (shown below). The Gigabyte board had a chart to convey the same information but I prefer the Asus approach since it doesn't require me to refer to the manual the next time I upgrade RAM. Also, the gigabyte board only had 4 DIMM slots.

One final feature that anyone building a PC can appreciate is Asus' QuickConnect feature. Connecting the front panel to the header pins on the board (e.g., power sw, reset, speaker, hdd LED) has always been difficult and only becomes more difficult as our eyesight and dexterity fade away with age. Asus ships this board with an labeled extender (shown below) that can be pre-attached to the front panel connectors then mounted into the header board. Thanks Asus!!

Chrome on Vista x64

So I scratched the itch and downloaded Google's Chrome browser. Since I spent so many years as a web developer I have generally been unfriendly to alternative browsers. Multiple browsers typically meant more work accomodating the quirks and peculiarities of each browser. Or worse, when there wasn't time to code around the quirks webapps were reduced to least common denominator functionality.

I have to say that so far I'm impressed. It is noticeably faster than IE. I'm a total speed demon when it comes to computing. I use keyboard shortcuts to minimize trips to the mouse. I disable services that aren't necessary to minimize boot time. I've even gone so far as to prune the directories that Windows Search indexes to minimize its impact on responsiveness. I really *really* hate having to wait on my PC for any sort of routine operation.

Fellow speed demons will have no problem adopting Chrome. Not only is it faster at rendering the web sites I tend to use, it does better the more script oriented the site. That optimized javascript engine really shines on sites like facebook. Kudos to Google for raising the bar on what we should expect from a web browser.

The UI is also refreshingly clean (though I did struggle a little bit looking for the "Home" button - just added my homepage as a link). Immediately after installing it I noticed more screenspace devoted to the web page - no status bar at the bottom of the page, no file menu at the top and the favorites/bookmarks section isn't in the floating toolbar style. Not using the floating toolbar frees up a little vertical space taken up by toolbar borders. It's just a cleaner UI.

So far so good. They've definitely met their goal of getting the browser out of the way.

Replacing the Chassis Fan in the CoolerMaster Wave Master PC case

Sometime during 2005 I bought a Wave Master chassis. Seduced by its brushed aluminum and cool blue LEDs I figured, "It's a CoolerMaster, they make great cases, so it's worth the extra money."

The case is very sturdy but has some flaws that, in hindsight, would have prevented me from buying it. One of the most annoying is the swiveling door on the front of the chassis. The elegant wave must have distracted my attention away from its colossally impractical design. Everytime I burn a DVD I'm reminded of my oversight when the ejecting DVD collides into the beautiful but totally annoying front swivel door. Sometimes the door wins, sometimes the DVD tray wins but no matter who wins I would LOVE to end this little war by removing the door.

But that's not the topic of this post. With 2 Nvidia GT 6600 video cards (remember this system was built in 2005) and all of the "Cool N Quiet" options of the ASUS A8N-SLI motherboard disabled, this baby was quite the audible beast. So loud that I can hear it a floor away; it's easily the loudest "ambient" (and I'm using ambient loosely) noise source in the house.

This was tolerable back whilst wiling away the hours hacking and slashing through World of Warcraft. Now that most of my non-work related computing is done from the comfort of my couch via laptop, having a rarely used PC that noisy was too much to take.

So we're off to the races. First, a few before shots:

This is a front view of the chassis. Who wouldn't be seduced by wavy Aluminum? And with the lights off the soft blue backlight is a geeks dream.

After removing what has to be the most inconveniently placed hex screw (top) in all of Chassis-dom and a philips head screw (on the bottom) the wavy front bezel glides, like a crypt, on its hinges revealing 2 80x80x25 chassis fans.

Unfortunately these fans had cosmetic surgery performed on them making them much louder than necessary. Instead of being powered by the standard 3 pin (or 4pin) arrangement that would allow a properly nTuned/AMD Cool'n'Quieted system to slow the fan speed, these fans were wired directly into the molex power connectors. And they always ran at max RPM!!! These two fans, coupled with a poorly placed sound card (I stupidly put an Audigy 2 right below the bottom GT6600 - not much space for airflow there) pumped out enough noise to wake the dead!

The odious fan connector wired into the molex power connector is right below the needle-nosed pliers.

Out comes those ridiculous fans:

In goes the fan with the standard 3-pin connector (connected to CHA1 on the motherboard):

After a little cleanup the system hums along MUCH quieter. After all, a hum isn't a yodel. Or a rumble. It's a hum, hardly noticeable. The way an unused PC should be :)

Using xcopy in batches/scripts

I like using xcopy to copy files because it has an option to print out the source and destination file paths during the copy (/f). Unfortunately it's got some quirky behavior; if you're changing the name of the file you're copying then it asks you if the target is a file or directory. This is a royal pain because much of my xcopy use occurs in the context of non-interactively executed .bat files.

Finally figured out a way to teach .bat files to answer xcopy. It's laughably simple, don't know why I didn't think of it sooner:

echo f ¦ xcopy /f source.file renamed.dest.file

Coming from the unix world you'd think that'd be the first thing to come to mind.... :(

Talking back to the FileDialog in OpenFileDialogEx

The .NET Framework is a many splendored thing but one eyesore in this otherwise resplendent masterpiece of engineering is the functionality (or lack thereof) of its Windows Forms wrappers around the FileOpenDialog common dialog.

To be fair they do cover the basics. It's useable as long as you don't want to take advantage of any of the templating/customization features available to the native world. When you do encounter a situation where you need to take advantage of those features, a lot of the groundwork has already been done in the form of a wonderful codeproject submission known as OpenFileDialogEx.

OpenFileDialogEx takes advantage of the fact that an owned window (not a child window, an owned window) is activated on top of the owning window. So it creates a hidden window that owns the OpenFileDialog then hooks into it's message loop via the .NET provided NativeWindow. As an aside, the existence of NativeWindow is yet another example of the genius of the framework; they knew they wouldn't be able to provide all of the windowing functionality available in Windows and so created a handy catch all class to make it easy to bridge the gap when needed.

Anyway, as awesome as OpenFileDialogEx is, one of its shortcomings is that it doesn't provide a way to interact with the main file listing (aka SysListView32). It'll tell you when a new file has been selected and when a new folder has been selected but updating the selection from your .net control/panel isn't supported.

One of the reasons I think this support wasn't added is the peculiar behavior of the common dialog. Whenever the user changes directories a new SysListView is created. Even more peculiar is that the newly created SysListView has a different control ID than the one published in the SDK docs! It changes from control ID 0x0460 to control id 1! This is doubly strange because, the first time the OpenFileDialog is shown one of the buttons gets control ID 1!

The approach I took to deal with this was to identify the newly created SysListView32 whenever the directory was changed (by enumerating child controls). Unfortunately I'm relying on the less-than-international-friendly approach of using its class to identify subsequently created list views.

Installing a new version of Visual Studio

Over the years Visual Studio has shipped with better defaults. By better I mean defaults that are less onerous; less in need of correction the minute after you install it. Still there are a few quick changes I make as soon as I'm done installing a new version.

  1. Point every directory that defaults to "my documents\Visual Studio..." to c:\src\Visual Studio.... The main ones to hit are the projects, project templates and item templates (Tools -> Options -> Projects and Solutions -> General). As of 2003 it also includes "Save my settings" directory (Tools -> Options -> Environment -> Import and Export Settings).
  2. Turn off partial matching and topic abstracts for help (Tools -> Options -> Help -> General).
  3. Up the help search results per page to 100 (same location as previous).
  4. Turn off online help ("try local only, not online) (Tools -> Options -> Help -> Online). At least in my experience it dramatically slows down searches. Besides, I use a web browser to find help online.
  5. Change the startup page to "Empty Environment". The default start page tries to load content from the web which slows startup. I wish they'd bring back the "Open Project" page, instead of the Open Project dialog box because sometimes I want to create a new project and don't want to have to dismiss the open dialog.
  6. Setup the symbol path to use the microsoft public symbol server. This helps a ton when debugging crash dumps; without it, it's nearly impossible to get an accurate stack. I have them downloaded to c:\windows\symbols then point all the various debugging programs (I include ProcessExplorer in this list) to use the local cache. BTW, the URL for the symbol server is http://msdl.microsoft.com/download/symbols. And for goodness sake make sure that symbols are only loaded when loaded manually (it's a checkbox in Tools -> Options -> Debugging -> Symbols); otherwise it takes the debugger a much longer time to spin up as it repeatedly searches for symbols that are not stored at the microsoft public symbol server. E.g., the symbols for any third party shell extensions, shell hooks, etc.. that you might have installed.

Windows Flip on Vista

Vista gets a bad wrap.  It got so much negative press that I consciously decided not to upgrade until after service pack 1 was issued.  While there are a few kinks (e.g., UAC is annoying but is easy enough to get used to) I'm finally getting comfortable with the OS.


Windows Aero is mostly eye candy but some of that eye candy comes in handy.  I'm totally loving the screen magnifier; especially since it's the default action for the thumb button on the Microsoft Notebook Optical Mouse 3000.  I'm also really digging Windows Flip 3D.  I'm so accustomed to Alt-Tab to switch applications that it's taking a while to get used to Winkey-tab but it IS cool being able to see all of the currently opened applications floating in a rolodex-like view (not that I've ever owned a rolodex but I have seen them).


It's eye candy but it provides context.  The context makes it easier to manage many more open windows at a time; I no longer have to remember exactly which browser windows I have open (or more importantly, do I already have one open for task X when it occurs to me to do task X).  With Windows Flip 3D you get instant reminders of what all you have open.


It doesn't hurt that the ms notebook optical mouse 3000 also has Windows Flip mapped to the middle mouse button ;)

Using Process Explorer to debug a hung process

So I'm finally getting around to reading the help file for ProcessExplorer. ProcessExplorer is one of the most useful utilities for developers (and administrators) on Windows systems. It's basically Task Manager on steroids.

Before I started using ProcessExplorer encountering "File in use" errors while trying to move/rename a file was cause for scowling, cursing and gnashing of teeth. With ProcessExplorer tracking down the offending process is a cinch; just search for the first few letters of the filename (CTRL+F) and all open handles, along with the process that owns the handle, are displayed. Click on the handle and its owning process is highlighted in the real-time updated process list.

ProcessExplorer is also turning out to be really useful for debugging a hung process. If you drill down into a process you can list its currently executing threads. For any given thread you can see its call stack. To get entrypoint names instead of address offsets you'll need to install Windows symbols. I do this by using microsoft's public symbol server then caching the symbols to a local directory (c:\windows\symbols). To speed things up I usually open up visual studio, turn on symbol server downloading and debug a native application - this forces the most commonly used symbols (e.g., kernel32, user32, gdi, etc...) to download; subsequent access is much faster from the local symbol store.

Once you install symbols (Options -> Configure Symbol Server) you get an intelligible stack trace for each of the threads executing (or not as the case may be) in a hung process.