web 2.0

Windows Home Server 2011: Custom PC Build

I've blogged before about Windows Home Server (WHS) and its advantages as both a NAS and automated backup centre for your entire home network. For several years now I've been using an HP EX470 (modded with a quieter power supply fan, 2GB of RAM, and an AMD LE-1640 CPU) to which I've added two 1.5TB drives. It's been chugging along 24/7 since the day I bought it, and it works well.

But, I feel I'm losing a lot of geek-cred running my server on an old creaky Windows Server 2003 platform. WHS 2011 has been out for a while now and is based on the much more modern Windows Server 2008 R2 platform. I, like most WHS fans, was initially miffed that Microsoft removed Drive Extender from this new WHS version. Drive Extender is the feature that lets you seamlessly and painlessly add more storage to your server just by inserting a new hard drive and pressing a button. So I've not been in a big hurry to move to WHS 2011 since it requires more brain-effort in setting up a scheme for storage. However, time marches on and I feel it's time now to replace the venerable HP box.

Unfortunately, HP is no longer in the WHS business and there are very few other OEM options (in North America at least). One is left with no choice than to assemble a custom-built machine on which to run this new WHS version. Thus, I set out a few weeks ago to start researching available hardware to build a nice server/NAS box. And boy, it wasn't easy. At first, I wanted to use as small a case as possible to replace the diminutive HP EX470. Well, there is NO computer case that can house 4 hard drives that is as small as the EX4xx machines (except for HP's own Microserver, but it doesn't have a WHS OS option - I also wanted a more powerful CPU). What I did find that was close was Fractal's Array R2 Mini ITX case. It has room for not 4, but 6 hard drives and is only slightly larger than the EX470. After extensive research on this unit, however, I became turned off by reports of it being an absolute nightmare to install the actual hard drives (you have to remove the entire drive cage first), questions about its cooling capacity, and being unsure if the CPU cooler I planned to use would even fit. So I moved on to try to find something else.

Slightly larger than the Array R2 is the new Lian-Li PC-Q25. However, hard drive management appears to be much easier in this unit, and the cooling capacity also seems much better. Unlike the Array R2, though, the PC-Q25 doesn't come with a power supply (PSU) and there isn't much room to install one, either. Finding a modular PSU with a maximum depth of 140mm wasn't easy, but I eventually discovered the Silverstone Strider 500 plus. This is the case and PSU I finally picked, though I also flirted with the idea of using an mATX case instead, including the Fractal Define Mini (an absolutely awesome case), a few Lian-Li units (why the hell did they have to use all those blue LED fans?), and even Antec's aging Mini P180. In the end, I decided that I didn't want a case as large as an mATX footprint, so the PC-Q25 won out.

Next up was the choice of CPU and motherboard. WHS doesn't really need a lot of horsepower, but I use it not only for backups and NAS duties, but also as a media streaming server for uncompressed 1080p material. I would also like to install SQL Server on it for some light-duty tasks, such as hosting my personal TFS source-control system. Depending on how loud it eventually turns out to be, I may also move it to the living room to serve double-(triple?) duty as my HTPC. So, I decided on an Intel Core i5 2500K. Overkill, to be sure, but it's only $100 more than an i3 2100 and for the added lifespan of the server, why not? For the motherboard, I really wanted to have an integrated Intel NIC so I chose the Intel DQ67EP mini-ITX board. It doesn't play well with Windows server OSes, but there are well known work-arounds to get the chipset drivers installed.

All that was left was to add some RAM, a hard drive, and a CPU cooler. WHS 2011 is a somewhat crippled version of Windows Server that only support 8GB of RAM. I selected 2 x 4GB sticks of Mushkin Silverline Stilletos for this. For a hard drive I picked a 2TB Western Digital Green drive to act as the system drive and video storage. This drive won't be mirrored or backed up. I was then going to move my two 1.5TB drives as a mirrored volume for documents, pictures, and other important files. To cool the CPU, I picked the Scythe Big Shuriken 2 as it's a low profile unit which should fit well with an mITX system.

Case: Lian-Li PC-Q25 $120.00
PSU: Silverstone Strider Plus 500 $80.00
Motherboard: Intel DQ67EP mITX $140.00
CPU: Intel Core i5 2500K $220.00
CPU Cooler: Scythe Big Shuriken 2 $45.00
RAM: Mushkin Silverline Stilletos (8 GB) $50.00
Storage: Western Digital 2TB Green $140.00

It took me over two weeks of heavy research to pick the components for my new server build. My biggest issues were the case and the motherboard. There aren't many NAS-oriented cases on the market, and motherboards with Intel NICs are rare. But I finally made the decision and was ready to go. Except when I added it all up, I exceeded my budget by a good $300. I wanted to bring it all in for less than $700 if possible, but after taxes and shipping my custom WHS 2011 build came it at close to $1,000. Ouch. So for the time being, I'm going to stick with my trusty HP EX470 and hope it can last at least a few months longer.

Tags:

Making The Jump To LightSpeed - Bell Aliant FibreOP

Ever since Bell Aliant began their rollout of FibreOP in New Brunswick two years ago, I've been anxiously awaiting its arrival in the Halifax area. Early this year, it was announced they would be rolling out the service in HRM over the summer months. Summer came and went, and while FibreOP was deployed in my neighbourhood in August, my cul-de-sac street was passed over. Well, ultimately in mid-October it became available to my address and I made the appointment. A week and a half later, I finally had my 70/30 internet connection and the FibreOP TV package.

I've always been an eager beaver when it comes to faster internet speeds. Back in 1998 I was torturing the phone company (then called MT&T) on a regular basis to bring their ADSL offering to my town so I could get off dial-up. That eventually happened, of course, and while the DSL speed was increased over the years, it finally topped out at about 6.5 Mbps downstream, and only 0.5 Mbps upstream. It was serviceable, but way behind the times especially with Eastlink offering a 40 Mbps service. Still, I had my Sympatico email address that I didn't want to give up, so I stuck it out with Bell Aliant.

Installation

On the day of the appointment, I got up bright and early to await the arrival of the FibreOP tech, who would be here "between 8am and 6pm". After much hand-wringing all morning thinking the appointment might be cancelled, the techs (2 of them) arrived at about 1:30. They got right to work stringing a fiber-optic cable from the telephone pole to my house, and preparing the ONT (Optical Network Terminal) inside my house. About 3 hours later, they were all done and I had 70/30 internet and FibreOP TV.

Connecting the fibre optic line.
Hooray! He's here!


Internet

First off, the internet speed is a world of difference from the High-Speed Ultra DSL service I had been using. I wasn't sure if regular web browsing would be much different, but it is noticeably more responsive. Of course, it depends on the site you're using, but most popular sites now completely load in sub 1-second speed. Some even feel nearly instantaneous. Since I never used Eastlink's internet offering, I can't compare the experience with them, but it is a much better experience than DSL. As for file transfer rates, as you might expect, it is an order-of-magnitude difference. With DSL, my downloads would max out at around 0.8 MB per second (800 KB/s). When I can find a server with big enough pipes, my FibreOP downloads will sometimes reach 8 MB/s, though 5 MB/s seems to be more common. This makes a tremendous difference with usability, since as a Microsoft developer I am often downloading large installers from MSDN which I previously had to let run overnight, but can now run pretty much on-demand, as even a 1.5 GB download will take only 15 minutes. Oh, and my wife's web-browsing experience is unaffected when I'm downloading large files, which wasn't the case on High-Speed Ultra.

Upload speeds are also in a completely different class. This is extremely important with the advent of "cloud computing" and the internet-based backing-up of files. If you upload files regularly (such as using Carbonite or Mozy for backup, or even say uploading images to blog posts), you'll definitely appreciate the 30 Mpbs upstream capability of FibreOP.

The new "modem" is an ActionTEC R1000H (bottom) that dwarfs my old DSL modem (top).

FibreOP TV

Moving on the TV service, well, I had my reservations about moving off Eastlink to FibreOP TV. My thinking was that Eastlink has been doing TV for decades, and Bell Aliant has only recently gotten into that game. I like the "phone company" for my telephone, and the "cable company" for my TV (I have too many trees around my property for satellite service to be an option). Of course, both companies now offer pretty much the exact same services, and their pricing structure is such that, financially, it makes little sense to divide your services between the two. The "bundle" pricing from both companies is designed to ensure you are very motivated to keep all your services with that one provider, and FibreOP is no different. Even with the $15/month upgrade to 70 Mbps downstream, and opting for the "Best" bundle offering which includes the movie channels and HBO, I'll be saving somewhere in the neighbourhood of $75 a month (after the 3-month promotional price of $99 per month) versus having my cable service separately with Eastlink. So I decided to take a leap of faith and switch my TV to FibreOP and cancel my Eastlink account.

I've only had FibreOP for five days, but the TV service actually does seem to be adequate. Some individuals on internet forums had been reporting that the picture quality with FibreOP TV was a bit "soft" or less sharp than Eastlink. This may be true, but if it is the difference is very subtle. And it would surely be noticeable to me, as my "TV" is actually a 120-inch front-projector (smaller TV sizes are better at hiding signal flaws). And while the picture may not be as sharp (I haven't really decided yet if it is or isn't), what does seem to be gone, or at least much less prevalent, is the "macro blocking" on high-definition stations that was so frequent on Eastlink. Macro blocking is the pixilation effect you see on a video image when there is a lot of motion on the screen, and the video compression is turned up rather high by the provider. If my research is correct, this may be because Eastlink uses MPEG-2 compression while FibreOP uses MPEG-4 (H.264). MPEG-2 is good (it's the compression used on Blu-ray discs) but requires almost twice the bandwidth that MPEG-4 needs for similar image quality. So, perhaps FibreOP doesn't have to compress the signal as much due to the lower bandwidth requirements, but I'm really just guessing and I'm not very sure of my facts here. One thing that I am sure of, however, is the irritating lack of proper lip-synchronization on at least one channel (CityTV) with FibreOP. I'm not sure what the root cause of this is and I haven't spent any time trying to fix it yet, but it's a problem I didn't have with CityTV on Eastlink.

The ONT (Optical Network Terminal) attached to a joist in my basement.

The PVR that FibreOP uses is the Motorola VIP1216 running Mircosoft's MediaRoom IPTV software. It's a much smaller unit than Eastlink's Motorola DCX3400 unit and while the features are similar, the user interface looks completely different. Instead of the colourful, opaque UI on the Eastlink box, MediaRoom uses a translucent overlay on top of the video that's currently playing. I don't find either interface to be inherently better, but the MediaRoom fonts are much more smooth (no jaggies) and the TV listings show a 2-hour window instead of Eastlink's 90-minute window. Also, the FibreOP unit is nearly silent compared to the constant hard-drive spinning and clicking you hear from the Eastlink unit. In fact, I had to double-check that the FibreOP box even came with a hard drive because I couldn't hear it at all! The recording options are slightly more impressive than the Eastlink PVR I was using, too. The FibreOP unit can record up to four programs at once, although only two of those can be high-def. FibreOP's PVR is also "whole-home" capable, essentially acting as a kind of media server for all the TVs in your house. Eastlink also has a "whole-home" PVR option, though I've never tried either service - I only have one TV.

Not everything is rosy with the FibreOP machine, though. Eastlink's is definitely more responsive - I've found the FibreOP box hesitates more often, frequently requiring an extra second or two before it will process a command from the remote. Not a big difference, but noticeable. Also, Eastlink's PVR allowed me to plug in an external 1GB eSATA hard drive to obtain a vastly increased storage capacity. The FibreOP PVR only has a USB port but it currently serves no function. I'm not even sure if USB 2 can support the speed necessary for real-time recording of high-def video anyway. The hard drive in the FibreOP unit is a measly 160 GB (using a quaint IDE interface instead of SATA), but the MPEG-4 efficiency allows it to store just about the same amount as the bigger Eastlink drive. Still, not being able to expand the storage capacity of the unit is a definite disadvantage. Also, on occasion I've used the Firewire port on the Eastlink machine to record material to my computer for longer-term storage. No such ability exists with the FibreOP unit.

FibreOP TV has a robust offering of "video on-demand" (VOD) services, and so did Eastlink. I haven't bothered much with either, but I'm completely aghast at FibreOP's $7 price-tag for "rented" movies using VOD. Sorry, but that's way too much to charge for a movie rental. I'll be giving this feature a big miss.

Lastly, there are some differences in the channel line-up, both in available packages and stations. Moving from Eastlink, I've lost AMC, History HD and MovieTime HD (FibreOP doesn't offer AMC at all, History is in standard-def only and MovieTime is only available in standard-def in a $5/month theme pack) but FibreOP's movie package includes MPix, which was an additional charge with Eastlink. There are likely other differences (say, with Sports programming, but I'm not much of a sports fan anyway) but by and large, I'm satisfied with the FibreOP channel offerings.

Conclusion

Overall, I am extremely happy with my move to Bell Aliant's FibreOP services. I mostly made the move for the high-speed internet service, and opted to include the TV service only for the cost savings over a separate Eastlink account. Naturally, the internet offering blows pretty much everything else out of the water, while the TV option isn't bad at all. If you can live without AMC or some of the other channels only available on Eastlink, I would definitely suggest you consider FibreOP TV. As a bundled service, I would highly recommend it.

Tags:

Entertainment | Tech

Silverlight: Displaying UTC Date Values in Local Time

I've recently started working on an existing project that's using Silverlight for the UI. One of the first things I ran up against was displaying DateTime values that come from the database in UTC format. I want to display these values in the user's local time zone, not as UTC. The DateTime object in .NET has methods that allow for the conversion of UTC to local time and back, but I didn't want to write a translation layer between the objects (entities) coming from the remoting call and the actual Silverlight UI. So, what to do?

Thankfully, Google is my friend. I quickly found some source code for a ValueConverter that does just this. Check out this forum post for the details: http://forums.silverlight.net/t/206312.aspx/1

After I created this class in a separate project, all I had to do was add this ValueConverter to the App.xaml's <Application.Resources> element, and I was good to go. Well, almost. I'm using Telerik's RadGridView control for Silverlight, so the column in question looks like this:

<telerik:GridViewDataColumn Header="Last Modified" DataMemberBinding="{Binding LastModifiedDate, Converter={StaticResource DateTimeUtc2LocalValueConverter}}" />

The only problem here is that the grid control wants this value converted into an Object and doesn't specify a DateTime as the target type. After a small modification in the ValueConverter code to allow this, I was good to go.

Tags:

Silverlight

My Love-Hate Relationship with the iPhone

I have never been much of a fan of Apple. Perhaps it's because I resent them for surviving the platform wars in the 90's while my favourite technology, the far-superior Amiga computer, was squandered by Commodore and faded into obsolescence. Or perhaps it's because for all those Apple fans who beat the drum exulting the superiority of Macintosh machines, my experience reveals that Macs have the same amount of irritations as Windows machines, just different ones (side note: I sold Macs for over a year in the early 90s, around the time when Apple was switching to the PowerPC processor). For whatever reason, I am unable to embrace the religion of Apple and, in fact, I resist it at every opportunity. Which is often quite difficult since several of my respected co-workers are ardent Mac fans and I am inundated daily with Apple love talk while I grimace and grumble in the corner.

So then, what possessed me to place aside my hatred of all things from Cupertino and eagerly buy an iPhone 3GS 16 months ago on a competing carrier while I was only half-way through my 3 year contract with my HTC Touch (a Windows Mobile 6 phone)? Quite simply it was and still is the best smart-phone experience available. Even Android hasn't been able to achieve the same elegance and integration offered by the iOS device. Here is what makes the iPhone the must-have mobile device for me:

  • Large screen (for a phone, though Android phones are just as large now or larger)
  • Extremely responsive capacitive touch screen (again, Android matches it here)
  • Elegant and fluid user-interface (Android seems similar though I have never used it)
  • Availability of applications and extreme ease of purchase and installation
  • Unmatched media management experience
  • Killer-feature for me: it plugs into and integrates completely with my car stereo

While all these points are important, it's the last two or three that mean there is no alternative to the iPhone for me. While I'm not much of a music fan, I am a huge consumer of podcasts. I listen to them every day while commuting to and from work. It is the iPhone's media management capabilities combined with the ability to plug it into my car stereo that places it above all the rest. Other phones can be plugged into the AUX jack on my car, but only the iPhone integrates completely with it, allowing full control of the iPod feature via the radio's controls. And even if other phones had a similar dock connector, Android has almost no media story at all. How do you subscribe to podcasts and have them automatically updated on an Android phone? Windows Phone 7 is far better in this regard, relying on the relatively mature Zune media technology. However, Zune Marketplace support is extremely spotty outside the United States leaving the iPhone truly in a class by itself. Nothing can match the whole-package experience.

Which is why I was extremely frustrated when the iOS v4.2 update broke the compatibility with my car stereo. For over two months I was stuck listening to podcasts in the car with my headphones on like a sucker. Many users complained on the Apple discussion forums and conveyed the ambivalence of Apple technical support when they reported the issue. Even though the car stereo integration worked fine with every previous iOS version, Apple's official response to the v4.2 problem was "contact your vehicle manufacturer." Which brings up another reason I've been able to ward-off Apple religion for so long: Apple's astounding arrogance. Not that other tech companies aren't arrogant too, it's just that this makes Apple no different than anyone else. Lucky for me, a generous colleague who is a registered Apple developer set me up with the iOS 4.3 beta when it was finally posted and I'm happy to say it has fixed the car integration issue. But Apple has yet to release it to the general public.

So, while I'd happily switch my smart phone to a competing platform if I could, there just isn't anything else out there that meets my needs. It looks like I will continue to simultaneously praise and curse my iPhone for the foreseeable future. In the meantime, I'll keep my eye each new Android and Windows Phone release and hope for some kind of universal car-phone media integration standard. Yeah, looks like I'll be an iPhone owner for a long time.

Tags: ,

Where is the Programmer's Keyboard?

A few years ago, I wrote about my obsession with computer keyboards. At the time, I was particularly taken with the Microsoft Ergonomic Keyboard 4000 though I really wanted a keyboard that would let me remove the numeric keypad so that the mouse could be placed closer to where my hands usually reside - in the middle of the keyboard. Well, fast forward over four years later and not much has changed. I'm still using the Microsoft 4000 keyboard both at work and at home, and I still wish the numeric keypad would take a hike.

As far as the numeric keypad goes, it turns out there are a few keyboards that either omit it completely, or, as in the case of the Microsoft Sidewinder X6 keyboard, allow you to move it to the left side. I've often wanted to try the X6, but it isn't available locally (I'd have to order it) and I've really become accustomed to the ergonomic layout of the 4000. However, recently I've become annoyed with another issue that I think deserves some mentioning.

I'm a programmer - I write code all day long. But writing code is a lot different that writing, say, a document in Word or even an email. Most keyboards are designed for writing prose - normal sentences and paragraph formatting. But code looks nothing like this. Code is on the one hand full of symbols, a LOT of symbols that require the use of the SHIFT key to type. Take for example the angle brackets used for most XML-style markup languages (like HTML, XAML, and Adobe Flex, for instance). Shift key. Do you have any idea how many angle brackets I type in the course of a day? Or C-style code-grouping "curly brackets" for classes and methods. Shift key again. Double-quotes? Shift key. Number (or hash or pound, if you prefer) sign, percent symbol, ampersand, and asterisk? All need the shift key. I've lately come to find that very irritating.

And on the other hand, the process of writing code often requires further keyboard acrobatics. For compiled languages you have to build your source code. Sure, you can use the mouse to click a "build" button or select it from a menu but that means, well, you have to lift your hand off the keyboard and use the mouse. Or, in the case of Visual Studio (VS), you can press not only the SHIFT key but also the CTRL key and then 'B' to achieve the same effect. It's really not that hard but you do have to cramp up your hand just a little bit to press the three keys at the same time. How about debugging? In VS, pressing F5 will "build and launch" your program with the debugger attached. How intuitive. F5, the universal key for "refresh" is aggravatingly re-purposed in VS. And it does absolutely no good if you have to ATTACH to a running process instead of launching it. I will also frequently paste in a few lines of code, which sometimes messes up the formatting. The acrobatics to correct this? Hold down the Ctrl key then press and release the 'K' key, then press and release the 'D' key (I call this the Kraft Dinner maneuver, since it's the only way I can remember it). And what about other common coding tasks, such as checking code out and checking it back in? VS doesn't even have default shortcut keys for that! You have to invent your own crazy key combination that hasn't already been used by one of its other five ba-jillion commands. 

Certainly, I am not the first to postulate this dilemma. A very popular thread on Stack Overflow has many suggestions for keyboards for programmers. Even the removal of the numeric keypad is mentioned! (See, I'm not completely crazy, or at least not crazy all by myself.) But, they are all still mostly general-purpose keyboards that just seem to have some characteristics that might make them more suitable for coders than other keyboards. And most of these characteristics simply have to do with tactile response of the keys - how far they travel, do they click, are they mechanical switches or cheap rubber membranes. Important characteristic, to be sure, but there is little that addresses the fact that writing code is a completely different ball-game from writing regular text, like this blog post for example.

Curiously, however, from that Stack Overflow thread is the suggestion of using the Logitech G15 gaming keyboard as a programmer's keyboard. The primary reason being the dedicated, programmable "marco" keys on the left-hand side of the keyboard. In the new G510 there are 18 such macro keys selectable in 3 banks for up to 54 macros. I'm going to do some further research on this, but it's not an ergonomic keyboard so I'm still skeptical. And I'm a little uncertain as to the proper interaction with Visual Studio.

Thus, I submit that our industry, the programmer industry, needs a keyboard made just for us. One that has common symbols a single keypress away just like regular letters and numbers. One that has dedicated keys for building, debugging, source control, finding class and member references, and a handful of other common coding tasks. Our industry is huge - surely we are big enough to viably support a special-purpose keyboard, no? 

Tags: ,

Core i7-860 PC Build 2009

After using my Intel Core 2 Quad Q6600 machine for just over two years, I decided it was time for an upgrade. So, a few weeks ago I ordered my new Core i7-860 PC (some assembly required, of course). I was able to keep my four-year-old Antec P180 case (I love this case) and two-year-old Corsair 620 watt modular power supply, but everything else got replaced (oh, except for my trusty LG DVD writer - that stayed too).

I had been thinking about getting a Core i7-920, but the newer P55-based Core i7-860 seemed to be a slightly better value, especially considering that I have no plans to install mountains of RAM or run dual graphics cards, to which the i7-9xx line and associated X58 chipset is better suited. Since I always overclock my systems anyway, the 860 was a better choice than the 870, and hundreds of dollars cheaper, too.

So, I ended up with the following build:

Motherboard: ASUS Maximus III Formula
CPU: Core i7-860
CPU Cooler: Noctua NH-U12P
RAM: 8GB OCZ DDR-3 1600MHz CL-8
System Drive: OCZ Vertex 120 SSD
Data Drive: Seagate 7200.12 1TB HD, er, Seagate 7200.11 1.5TB HD
Graphics Card: Sapphire Radeon 5870
OS: Windows 7 Ultimate

The Core i7 is a no-brainer: it's a thoroughly modern CPU and Windows 7 is designed to take full advantage of it. It has great power-management, and the ability to throttle or burst individual cores based on system load. And it's wicked fast!

The motherboard took a lot more research before I made a decision. I'm not a PC gamer, so it probably looks a little odd that I would choose a high-end gaming board. While gaming doesn't interest me much, I do like quality and the Maximus board just oozes it. I hate owning boards that have peculiar quirks, and while it's almost unavoidable than any board is going to have the odd issue or two, I figure it's worth the extra bucks to buy something that's over-engineered. And certainly, the Maximus is not trouble-free, but it's the most reliable board I've ever owned.

As for the CPU cooler, I had wanted a Thermalright Ultra-120 Extreme (TRUE) but there were none in stock when I placed my order. So I got the Noctua cooler instead. It's very well built and includes two 120-mm fans with optional cables to regulate the fan speeds to trade off cooling performance (RPMs) vs noise. Having nothing else to compare the cooling performance with, I can't really evaluate the Noctua's performance properly. But, I was hoping for a bit better cooling - my CPU is overclocked to 3.8GHz and idles around 38 - 40 degrees Celsius. I haven't played with any other settings than BCLK, so maybe I can get the CPU voltage down, but I have seen idle temps in the high 20s on other coolers, so I am a bit disappointed here. On the other hand, I had no problem with this cooler blocking the RAM slots - the OCZ RAM doesn't have any fancy heatspreaders so they are not especially tall anyway.

I'll skip the SSD drive for a moment since it was the last component in my build. While I was waiting for it to arrive, however, I installed Windows 7 on the Seagate 1TB drive I had originally bought to use as my data drive. The Windows install went fine, but about 3 hours later the drive started ticking. And while it ticked, all hard drive operations were either suspended or terribly slow. The drive ticked for about 20 minutes and then stopped, at which time hard drive performance returned to normal. However, I no longer trusted the drive. It did this ticking thing a couple more times so it went back to the store. Seagate has had some serious problems with its 1TB drives lately, so instead of getting a straight replacement I opted instead for a Seagate 1.5TB drive. I've now been using it for about a month without any hiccups whatsoever.

The Sapphire Radeon 5870 works very well, as you might expect. Again, I'm not a gamer but I like having capable gear for the two times a year I haul out Flight Simulator X. I especially like the 5870 because of its terrific power management which means it doesn't consume gobs of juice while its just sitting there idle displaying the Windows desktop. I also like the fact that the stock fan is nearly silent at idle - I don't like my rig to make a lot of noise. Though sometimes (rarely) when the machine wakes from sleep the Radeon fan powers up to full speed and it is VERY loud. Once I log back into Windows, however, the fan returns to normal.

Up to this point, I hadn't installed my OCZ Vertex SSD drive yet (thanks OnHop). And while the rig was plenty fast, it wasn't a significant improvement over my Q6600 that it replaced. But after I put in the Vertex, it was a whole new ball game. Putting an SSD drive in your computer as the boot and system drive is like supercharging your entire machine. This thing is blazingly fast now! Windows 7 boots in just over 10 seconds. Shutting down takes around 4 seconds. Waking from sleep is nearly instantaneous. And most day-to-day operations performed on the computer desktop experience little to no lag at all. It's like removing a clog from a drain - everything just flows much more smoothly. The Vertex was an expensive component, but it is the best upgrade you can give your computer and worth every penny.

This rig is hands-down the fastest, most stable, and most trouble-free PC I have ever built. It takes less power than my Q6600/Radeon 2900XT machine and runs cooler, too. I am extremely impressed and pleased with the results of this build and I look forward to approximately 24 months of "surfing the web at 50,000 frames per second" when it'll likely be due for another replacement.

Tags: ,

Left High 'n' Dry By OnHop.ca

I recently decided to build myself a brand new computer system based on the new Intel P55 chipset and a Core i7 860 processor (I'll be blogging about that entire experience shortly). While I was at it, I decided I would dive into the wonderfully speedy world of SSD drives, too. Unfortunately, my local retailer wasn't able to source my preferred drive (an OCZ Vertex 120GB) and my usual online retailer (ncix.com) had no stock.

I decided to try OnHop.ca since they had the lowest price on PriceCanada.com and they had stock. They also have favourable reviews on PriceCanada, so I figured I was safe. The product page for the drive listed the item as "in stock" and a delivery estimate of 1 to 2 days. I ordered the drive late on a Tuesday night, so I figured it would arrive by Friday which would have worked out great since I had put aside the entire weekend to build my machine.

But Friday arrived and there was no drive. Boo. I was disappointed but well, these things happen so I decided to be patient. By the following Tuesday there was still no drive, so I sent an inquiry to OnHop to ask about my order. Wednesday morning I got a response back claiming that the shipping company had "lost" the order, and that OnHop was shipping out a new unit immediately, and that I would have it the following day. Thursday came and went, and so did Friday - no drive. So, weekend number 2 and I'm still unable to assemble my system.

At this point, I'd had enough and dispatched a strongly worded (but not abusive) email to OnHop demanding my money back, since their order fulfillment process was apparently horribly broken. Naturally, I had to wait until Monday afternoon for a reply, and while they complied and immediately refunded my purchase, I was rather shocked by their laissez-faire attitude about the whole matter. They claimed my order had been "delayed" because the item they had in stock was a "defective unit." I guess they only had the one defective item as stock, but why would a defective unit count against their sales inventory? And why did it take almost 2 weeks to discover the error? I was expecting a bit more along the lines of "sorry we screwed up - please allow us to fix it and keep you as a customer" but no, here's your money back, now get lost.

Anyway, I'll never order from OnHop again, and I've since reordered the drive from trusty ol' NCIX since they now list it back in stock. Here's hoping it arrives by THIS Friday.

Tags:

Tech | Toys

Windows Home Server Saves The Day!

I have never been very good about backing up my data at home, and I have occasionally been bitten by the odd hard drive failure. However, most of the data I lost to these infrequent failures wasn’t too terribly important. These days, however, I have gigabytes of photos and several years worth of documents and taxes on my PC, so backups have become critically important. So, last year I picked up an HP MediaSmart EX470 Windows Home Server (WHS) to help fortify my backup strategy (and it serves as a NAS too, which is very nice). Naturally, I upgraded the processor and RAM, and added a 1 TB drive.

The WHS box has been performing its job since then, quietly backup up my desktop and my wife’s laptop every night. During the early hours of the morning, it wakes both machines from their sleeping state, backs up the hard drives, and puts them back to sleep. You’d never know it was doing anything, which is precisely how I like this technology to work.

Yesterday, the 160 GB Hitachi hard drive in my wife’s 2-year-old laptop up and died. I have read how “easy” it is to restore an entire hard drive when using WHS, so I was looking forward to a painless operation. I swapped out the drive with a brand new one, and then went to prepare the WHS “Restore CD.” Using my working desktop, I went to the “Software” share on my WHS box to find the ISO of the Restore CD. However, in that folder was a ReadMe file that told me the ISO was “out of date” and that I had to download the newest version from Microsoft’s web site. I would have thought since the the ISO file is only 230 MB, that it would have been automatically updated by Windows Updates, but I have to manually get it myself. Oh well, no big deal. I download the new file and burn it to a CD.

I pop the CD into the laptop and it sounds like an old floppy drive grinding as it takes 5 minutes to boot up. It tells me it’s searching for the WHS machine and apparently finds it as it asks for my WHS password. I enter it, and after a 20 second wait, it tells me “general network error” and that it can’t contact the WHS box. Lovely. So for the next 15 minutes I fart around with network cables and switches figuring I’ve got some kind of DHCP/DNS issue. I come to find out that the WHS admin console doesn’t even work from my desktop anymore, so I bounce the WHS machine and everything is fine now. I have no idea what that was all about.

Anyway, back to the laptop and another 5 minutes for the Restore CD to boot and now I’m through to selecting the machine from the WHS backup catalog that I want to restore. At this point, I was hoping it would figure out that the new hard drive was EXACTLY the same size as the old one and just tell me “I’ve got it from here – go get a coffee and come back in 30 minutes” but this was not the case. It pops up a window telling me that I have to “initialize” my new hard drive first, using the Windows Disk Manager. I’m no stranger to the Disk Manager, but there is no “Initialize” operation in Disk Manager. I come to figure out (after two attempts) that “initialize” means partition and format (not just selecting MBR vs GPT as the partitioning method) – I wish it had told me that in the first place. Again, I was kind of hoping WHS would do this automatically for me.

So I create one large C: partition on the entire drive and proceed to the next step. It tells me to select a source hard drive backup from WHS and a destination partition on the laptop. There are THREE source hard drives listed for the laptop – a manufacturer’s “SYSTEM VOLUME” at 1.5 GB, the large C: drive, and an 8GB D: drive. The “SYSTEM VOLUME” and D: drives are obviously manufacturer partitions set up either to help with some kind of manual hard drive wipe and restore, or maybe for watching DVDs or listening to CDs without booting into Windows (some laptops have this capability, though neither me nor my wife have ever had any occasion to try it out on this laptop). I proceed with just restoring the C: drive because I don’t want to futz around again in Disk Manager trying to get the partition scheme recreated, and the mysterious “SYSTEM VOLUME” doesn’t even have a drive letter, so I don’t know how I would deal with that anyway.

So the C: drive begins to restore. It tells me it’s going to take 4 minutes. Wow, I knew she didn’t have a lot on the drive, and I have a gigabit network but that’s still really fast. After 30 seconds, it tells me it’s going to be 5 minutes. Another 30 seconds and we’re up to 10 minutes. Then 32 minutes. Ah, the good ol’ Microsoft progress bar that goes backwards before it goes forwards. Seriously, it’s 2009 – is it that hard to have a progress bar that works, or at least makes sense? (As a developer, I know programming progress bars is a pain, but it CAN be done!)

I never know how long it really takes because we go out for an hour, but when we return home the restore has completed. I reboot the laptop and it’s like there was never a problem – it looks and works exactly the same as it did before the hard drive died. And this is all worth it. Though I think the restore process could be much easier with a great reduction in the number of steps required, getting a machine back to EXACTLY the way it was before a hard drive crash is simply amazing. My usual method for restoring a machine is to re-install a fresh copy of the OS, then re-install ALL the applications, then manually configure all the settings for the OS and apps, then restore all the data files from whatever backups I happen to have. This process usually takes days and is never 100% completed. Compared to the old way, WHS is a MAJOR step forward. I simply think the WHS restore process could do with a little fine-tuning.

Tags:

Comparing Team Build and Cruise Control

In recent months, I’ve had the opportunity to set up two build servers; one using Cruise Control.NET and the other using Team Build (part of Team Foundation Server). In this article, I’d like to chronicle the strengths and weaknesses I’ve found in both systems in my particular environments. My experience with each build system is admittedly limited, but I hope the information below might prove useful to someone. Note that the source control system in both environments was Team Foundation Server 2008.

Why Have a Build Server?

Before I compare the two build systems, I should first point out the advantages of having a build server. In my case, the build server provides three essential services:

  1. Continuous Integration. As soon as a developer checks in some new code, a build is performed to ensure that the new code doesn’t break the build. If it does, everyone knows about as soon as possible so it can be fixed. No more waiting for integration builds to find out that there’s a problem.
  2. Automated nightly builds. Nightly builds provide your QA people (if you’re lucky enough to HAVE QA people) with a regular, reliable heartbeat of incremental builds. QA knows that every morning there will be a new build they can test.
  3. Reliable, repeatable installers. Our build server also outputs an MSI installer that allows the software to be installed much as if it was a shipping product. If someone needs a new installer or wants to search for a particular build, the build server is the place to go. If you don’t HAVE a build server, you need a developer to perform a build on their workstation instead and if there’s no developer available, you’re out of luck.

I believe build servers are an essential part of modern software engineering – if you don’t have one yet, get one set up as soon as you can.

Cruise Control.NET

Cruise Control is certainly the most popular build system available. It’s an open-source solution that has been around for years, works with all kinds of source control and repository systems, and has a huge community of users and plug-in developers. A spin-off version especially for .NET developers (herein called CC.NET) is managed by ThoughtWorks and is available from their site. CC.NET has a nice web-based dashboard for viewing the status and history of builds, as well as allowing control over the build process. A single CC.NET server can be configured to build multiple projects.

I think one of the strongest reasons to pick CC.NET is its maturity and resulting pervasiveness. It’s been around for what seems like forever, and if you’ve ever had to deal with a build server in either a Java or .NET environment, chances are you’ve used it already. In addition, the CC.NET plug-in developer community has written solutions for just about every conceivable problem you might have. There is a wealth of knowledge on the Internet on how to set it up and get it working, so it’s hard to go wrong with CC.NET.

Something that’s both a strength AND a weakness with CC.NET is that it's not part of the Team Foundation Server (TFS) ecosystem. This is a strength in the sense that it allows you some flexibility with the CC.NET server’s configuration. A single CC.NET server can work with multiple TFS installations (and/or other source control providers) and support multiple projects. In my particular case this was a huge reason to use CC.NET. As you’ll see below, Team Build has some restrictions on the account used to run the Team Build service, while CC.NET allows you to communicate with the target TFS server by simply specifying a username and password with TFS access. This “disconnection” with TFS is also a weakness in that the central TFS server has no idea what build environments are out there. There is is no automatic central storage of build profiles and definitions, and no way to automatically interact with build information from within the development environment. Once, one of my colleagues modified his build script to delete all files in a particular directory. Unfortunately, when it ran, it resolved that directory to the C:\ drive root folder, completely obliterating his build environment. The problem was exacerbated by the fact that the CC.NET build configuration had never been backed up so he had to start all over from scratch!

Another thing that I would list as a weakness for CC.NET is the fact that it uses its own XML schema for controlling builds. This means that you have to learn this schema inside and out in order to make maximum use of all CC.NET has to offer. While many may see this as a minor point (and it really is) it is nonetheless an additional barrier to getting CC.NET installed and configured to perform your builds.

Team Build 2008

Team Build is a service that comes with Team Foundation Server. Having used CC.NET before, I initially found the architecture of Team Build very confusing. Instead of setting up a build server, creating a build definition ON the build server, and pointing it at your source control server, Team Build handles things very differently. First, you install Team Build on a computer. That computer then becomes a “Build Agent” that the master TFS server can talk to. This is a major architectural difference: with CC.NET, the CC.NET server initiates communication with TFS during a build; with Team Build, it’s TFS that initiates the communication with a build agent of your choosing.

Because of this architecture, your build definitions don’t actually live on the build server. The build definitions are part of your TFS project and are under source control themselves. This centralizes the build definitions for the project where they can be deployed to any build agent in your environment simply by selecting that agent when you perform a build. Well, when I say “any build agent” I mean any build agent that has any dependencies installed on it that your particular project might need. In my case, that means a couple of MSBuild extentions, which isn’t very heavy-weight as far as dependencies go – they can be installed in about 30 seconds.

So, the centralized storage of build definitions can be a very good thing. Looking back at the problem my colleague encountered when his C:\ drive was deleted, well, that could still happen with Team Build but at least the build definition would still be intact since it is under source control. However, this centralized storage of build definitions has a downside, too – all build agents (i.e., build servers) must be on the same Windows domain as the TFS server, or at least on a trusted domain. In addition, the Team Build service must run under a domain account (so you need the password for this domain account when you set up Team Build). This can present some problems if you’re in an environment, like mine, where IT controls the TFS server and the domain it’s attached to, and getting your build server attached to the same domain requires requisitions, approvals, security checks, etc. To be sure, this can a royal pain in the neck and is where I see one of CC.NET’s biggest advantages. You can put CC.NET ANYWHERE and have it talk to TFS with no problem. Of course, you’ll need to put a TFS username and password in clear text in your CC.NET configuration file and that or may not be a cause for concern in your environment.

Another advantage of Team Build (sort of) is that it uses the same XML language to control builds as is used in your existing Visual Studio projects. Specifically, it uses MSBuild to define and control the build definition. So, if you’re already familiar with MSBuild, you can figure how to configure Team Build fairly easily. I was NOT familiar with MSBuild and I had a helluva time getting my builds to work the way I wanted, but then again, I was trying to do some fancy things with automatic assembly version number increments and integrating a couple of WiX installer projects. Like CC.NET, MSBuild has a community of extension developers and while I haven’t performed a formal comparison of the two communities, I would expect CC.NET to have a lot more available simply because it’s been around so much longer.

A major disadvantage of Team Build is a pretty heavy dependency in some cases. If you have created unit tests using the built-in features of Visual Studio, and you want to run those unit tests as part of your build, well you have to install Visual Studio on your build machine. Yuck. The same is true if you have a Visual Studio Database Edition project – you must install that edition of Visual Studio too if you want to build that project. I’m really hoping for a solution to this requirement in the next version of Visual Studio and TFS.

Lastly, while CC.NET has a pretty spiffy web dashboard for status display and build control, Team Build has its status and control built directly into Visual Studio. While this means that you can interact with your builds without leaving the development environment, it also means that anyone WITHOUT Visual Studio can’t see anything (unless your TFS server has Team System Web Access installed).

There’s obviously a lot more involved in the comparison of these two systems, but I hope this blog post gives you someplace to start. Check out the resources below for more information.

Related Resources

If you’re trying to decide which build system to go with, I suggest you check out the following resources which contain some additional helpful information:

Cruise Control .Net vs Team Foundation Build on StackOverflow.com

Buck Hodges’ Blog (TFS Development Manager)

Jim Lamb’s Blog (TFS Program Manager for Team Build)

MSBuild Extension Pack

MSBuild Community Tasks Project

Tags:

Source Control

Build Engineering = Sorcery

Most of my software engineering career has been involved with internal intranet applications. Since applications were typically only deployed once on one application server, I’ve never had the opportunity to explore the wondrous world of build engineering. For the last two years, however, I’ve been working for a software vendor and build engineering is very much an important part of the development process. And until recently we’ve had a dedicated build engineering department that looked after most of the nasty details involved with this tricky voodoo science. But that department is now gone, and my team has to look after its own build requirements.

For the past 4 to 6 weeks, I’ve been delving deep into the bowels of MSBuild, the technology provided by Microsoft to perform builds of .NET projects. When you select “Build” from within Visual Studio, it’s calling MSBuild to do the work and generally Visual Studio shields you from all the intricacies of this build engine. However, when you need to perform automated builds, properly version your output assemblies, and automatically create MSI installers, you really need to learn how MSBuild works. And let me tell you, it is pure sorcery. You have to a be a bloody wizard to understand how all of these pieces interact with one another and how to control them to do your bidding.

At the root of the problem is the fact that the build engine and pretty much every artifact that interfaces with it is represented by an XML file. I used to love XML files – it solved so many of my problems trying to store and retrieve structured data where a SQL database was not available or suited to the task at hand. Now I’m starting to develop a true resentment of this once heroic technology that has been twisted to perform evil. It pretty much boils down to this: XML is being used to specify the granular tasks that must be performed to compile and output your entire solution, including all the projects, and all the classes and other files included in those projects. XML in this case is not being used to represent data storage, but instead is being used as a primitive command and control language. Individual XML nodes can be used to set variables, to check conditions, and to execute tasks. To create these XML files, you must be a master of both the XML schema available to you, as well as how the actual build engine interprets the schema. Though Visual Studio provides some rudimentary Intellisense when editing XML files, all it can show you is a list of valid elements and/or attributes. And there is NO compiler for these XML files – the only way to see if what you’ve written is syntactically valid is to actually run it! Holy smurf, I feel like I’m back in 1983 or something.

To complicate matters further, MSBuild and its related technologies (Visual Studio, WiX, Team Build Server) just LOVE to scatter all kinds of environment and preprocessor variables throughout these XML files. While extremely helpful when performing tasks, these variables are damn near inscrutable – the development environment provides you little assistance with determining what variables are available in any given location, what they mean, where they’re coming from, and what process is setting their values. You must scour through reference documentation, online forums, and the occasional helpful blog to find out just what the hell is going on at any point in time. Writing XML code to control your build and your installer is very much like reciting some obscure Latin incantation to perform some magic. You just have to hope you’ve said it in just the right way and with the proper inflections so that that the build gods will oblige your request. It’s enough to drive anyone completely batty.

Now, where did I leave my wizard’s hat?

Tags: