<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://thewebjedi.com/cs/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Jedi Meditations</title><subtitle type="html" /><id>http://thewebjedi.com/cs/blogs/meditations/atom.aspx</id><link rel="alternate" type="text/html" href="http://thewebjedi.com/cs/blogs/meditations/default.aspx" /><link rel="self" type="application/atom+xml" href="http://thewebjedi.com/cs/blogs/meditations/atom.aspx" /><generator uri="http://communityserver.org" version="4.1.31106.3070">Community Server</generator><updated>2007-06-18T22:21:00Z</updated><entry><title>Core i7-860 PC Build 2009</title><link rel="alternate" type="text/html" href="/cs/blogs/meditations/archive/2010/01/31/core-i7-860-pc-build-2009.aspx" /><id>/cs/blogs/meditations/archive/2010/01/31/core-i7-860-pc-build-2009.aspx</id><published>2010-01-31T16:45:00Z</published><updated>2010-01-31T16:45:00Z</updated><content type="html">&lt;p&gt;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).&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;So, I
 ended up with the following build:&lt;br /&gt;&lt;br /&gt;Motherboard: ASUS Maximus III
 Formula&lt;br /&gt;CPU: Core i7-860&lt;br /&gt;CPU Cooler: Noctua NH-U12P&lt;br /&gt;RAM: 8GB 
OCZ DDR-3 1600MHz CL-8&lt;br /&gt;System Drive: OCZ Vertex 120 SSD&lt;br /&gt;Data 
Drive: Seagate 7200.12 1TB HD, er, Seagate 7200.11 1.5TB HD&lt;br /&gt;Graphics 
Card: Sapphire Radeon 5870&lt;br /&gt;OS: Windows 7 Ultimate&lt;br /&gt;&lt;br /&gt;The Core i7 
is a no-brainer: it&amp;#39;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&amp;#39;s wicked fast!&lt;br /&gt;&lt;br /&gt;The motherboard took a lot more research before
 I made a decision. I&amp;#39;m not a PC gamer, so it probably looks a little 
odd that I would choose a high-end gaming board. While gaming doesn&amp;#39;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&amp;#39;s almost 
unavoidable than any board is going to have the odd issue or two, I 
figure it&amp;#39;s worth the extra bucks to buy something that&amp;#39;s 
over-engineered. And certainly, the Maximus is not trouble-free, but 
it&amp;#39;s the most reliable board I&amp;#39;ve ever owned.&lt;br /&gt;&lt;br /&gt;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&amp;#39;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&amp;#39;t really evaluate the Noctua&amp;#39;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&amp;#39;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&amp;#39;t have any fancy 
heatspreaders so they are not especially tall anyway.&lt;br /&gt;&lt;br /&gt;I&amp;#39;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&amp;#39;ve now
 been using it for about a month without any hiccups whatsoever.&lt;br /&gt;&lt;br /&gt;The
 Sapphire Radeon 5870 works very well, as you might expect. Again, I&amp;#39;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&amp;#39;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&amp;#39;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.&lt;br /&gt;&lt;br /&gt;Up to this point, I hadn&amp;#39;t installed my OCZ Vertex SSD 
drive yet (&lt;a href="http://thewebjedi.com/cs/blogs/meditations/archive/2009/11/03/left-high-n-dry-by-onhop-ca.aspx"&gt;thanks OnHop&lt;/a&gt;). And while the rig was plenty fast, it wasn&amp;#39;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&amp;#39;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.&lt;br /&gt;&lt;br /&gt;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 &amp;quot;surfing 
the web at 50,000 frames per second&amp;quot; when it&amp;#39;ll likely be due for 
another replacement.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://thewebjedi.com/cs/aggbug.aspx?PostID=643" width="1" height="1"&gt;</content><author><name>Andre Perusse</name><uri>http://thewebjedi.com/cs/members/Andre-Perusse/default.aspx</uri></author></entry><entry><title>Left High 'n' Dry By OnHop.ca</title><link rel="alternate" type="text/html" href="/cs/blogs/meditations/archive/2009/11/03/left-high-n-dry-by-onhop-ca.aspx" /><id>/cs/blogs/meditations/archive/2009/11/03/left-high-n-dry-by-onhop-ca.aspx</id><published>2009-11-03T19:17:00Z</published><updated>2009-11-03T19:17:00Z</updated><content type="html">&lt;p&gt;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&amp;#39;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&amp;#39;t able to source my preferred drive (an OCZ Vertex 120GB) and my usual online retailer (ncix.com) had no stock.&lt;/p&gt;
&lt;p&gt;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 &amp;quot;in stock&amp;quot; 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.&lt;/p&gt;
&lt;p&gt;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 &amp;quot;lost&amp;quot; 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&amp;#39;m still unable to assemble my system.&lt;/p&gt;
&lt;p&gt;At this point, I&amp;#39;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 &amp;quot;delayed&amp;quot; because the item they had in stock was a &amp;quot;defective unit.&amp;quot; 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 &amp;quot;sorry we screwed up - please allow us to fix it and keep you as a customer&amp;quot; but no, here&amp;#39;s your money back, now get lost.&lt;/p&gt;
&lt;p&gt;Anyway, I&amp;#39;ll never order from OnHop again, and I&amp;#39;ve since reordered the drive from trusty ol&amp;#39; NCIX since they now list it back in stock. Here&amp;#39;s hoping it arrives by THIS Friday.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://thewebjedi.com/cs/aggbug.aspx?PostID=617" width="1" height="1"&gt;</content><author><name>Andre Perusse</name><uri>http://thewebjedi.com/cs/members/Andre-Perusse/default.aspx</uri></author><category term="Tech" scheme="http://thewebjedi.com/cs/blogs/meditations/archive/tags/Tech/default.aspx" /><category term="Toys" scheme="http://thewebjedi.com/cs/blogs/meditations/archive/tags/Toys/default.aspx" /></entry><entry><title>Windows Home Server Saves The Day!</title><link rel="alternate" type="text/html" href="/cs/blogs/meditations/archive/2009/07/16/windows-home-server-saves-the-day.aspx" /><id>/cs/blogs/meditations/archive/2009/07/16/windows-home-server-saves-the-day.aspx</id><published>2009-07-16T14:48:00Z</published><updated>2009-07-16T14:48:00Z</updated><content type="html">&lt;p&gt;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&amp;rsquo;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.&lt;/p&gt;
&lt;p&gt;The WHS box has been performing its job since then, quietly backup up my desktop and my wife&amp;rsquo;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&amp;rsquo;d never know it was doing anything, which is precisely how I like this technology to work.&lt;/p&gt;
&lt;p&gt;Yesterday, the 160 GB Hitachi hard drive in my wife&amp;rsquo;s 2-year-old laptop up and died. I have read &lt;a href="http://www.hanselman.com/blog/TheCaseOfTheFailingDiskDriveOrWindowsHomeServerSavedMyMarriage.aspx"&gt;how &amp;ldquo;easy&amp;rdquo; it is to restore&lt;/a&gt; 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 &amp;ldquo;Restore CD.&amp;rdquo; Using my working desktop, I went to the &amp;ldquo;Software&amp;rdquo; 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 &amp;ldquo;out of date&amp;rdquo; and that I had to download the newest version from Microsoft&amp;rsquo;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.&lt;/p&gt;
&lt;p&gt;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&amp;rsquo;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 &amp;ldquo;general network error&amp;rdquo; and that it can&amp;rsquo;t contact the WHS box. Lovely. So for the next 15 minutes I fart around with network cables and switches figuring I&amp;rsquo;ve got some kind of DHCP/DNS issue. I come to find out that the WHS admin console doesn&amp;rsquo;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.&lt;/p&gt;
&lt;p&gt;Anyway, back to the laptop and another 5 minutes for the Restore CD to boot and now I&amp;rsquo;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 &amp;ldquo;I&amp;rsquo;ve got it from here &amp;ndash; go get a coffee and come back in 30 minutes&amp;rdquo; but this was not the case. It pops up a window telling me that I have to &amp;ldquo;initialize&amp;rdquo; my new hard drive first, using the Windows Disk Manager. I&amp;rsquo;m no stranger to the Disk Manager, but there is no &amp;ldquo;Initialize&amp;rdquo; operation in Disk Manager. I come to figure out (after two attempts) that &amp;ldquo;initialize&amp;rdquo; means partition and format (not just selecting MBR vs GPT as the partitioning method) &amp;ndash; I wish it had told me that in the first place. Again, I was kind of hoping WHS would do this automatically for me.&lt;/p&gt;
&lt;p&gt;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 &amp;ndash; a manufacturer&amp;rsquo;s &amp;ldquo;SYSTEM VOLUME&amp;rdquo; at 1.5 GB, the large C: drive, and an 8GB D: drive. The &amp;ldquo;SYSTEM VOLUME&amp;rdquo; 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&amp;rsquo;t want to futz around again in Disk Manager trying to get the partition scheme recreated, and the mysterious &amp;ldquo;SYSTEM VOLUME&amp;rdquo; doesn&amp;rsquo;t even have a drive letter, so I don&amp;rsquo;t know how I would deal with that anyway.&lt;/p&gt;
&lt;p&gt;So the C: drive begins to restore. It tells me it&amp;rsquo;s going to take 4 minutes. Wow, I knew she didn&amp;rsquo;t have a lot on the drive, and I have a gigabit network but that&amp;rsquo;s still really fast. After 30 seconds, it tells me it&amp;rsquo;s going to be 5 minutes. Another 30 seconds and we&amp;rsquo;re up to 10 minutes. Then 32 minutes. Ah, the good ol&amp;rsquo; Microsoft progress bar that goes backwards before it goes forwards. Seriously, it&amp;rsquo;s 2009 &amp;ndash; 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!)&lt;/p&gt;
&lt;p&gt;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&amp;rsquo;s like there was never a problem &amp;ndash; 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.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://thewebjedi.com/cs/aggbug.aspx?PostID=381" width="1" height="1"&gt;</content><author><name>Andre Perusse</name><uri>http://thewebjedi.com/cs/members/Andre-Perusse/default.aspx</uri></author></entry><entry><title>Comparing Team Build and Cruise Control</title><link rel="alternate" type="text/html" href="/cs/blogs/meditations/archive/2009/03/09/comparing-team-build-and-cruise-control.aspx" /><id>/cs/blogs/meditations/archive/2009/03/09/comparing-team-build-and-cruise-control.aspx</id><published>2009-03-09T20:23:19Z</published><updated>2009-03-09T20:23:19Z</updated><content type="html">&lt;p&gt;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.&lt;/p&gt;  &lt;h3&gt;Why Have a Build Server?&lt;/h3&gt;  &lt;p&gt;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:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;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.&lt;/li&gt;    &lt;li&gt;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.&lt;/li&gt;    &lt;li&gt;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.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;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.&lt;/p&gt;  &lt;h3&gt;Cruise Control.NET&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://cruisecontrol.sourceforge.net/"&gt;Cruise Control&lt;/a&gt; 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 &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET"&gt;their site&lt;/a&gt;. 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.&lt;/p&gt;  &lt;p&gt;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.&lt;/p&gt;  &lt;p&gt;Something that’s both a strength AND a weakness with CC.NET is that it&amp;#39;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!&lt;/p&gt;  &lt;p&gt;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.&lt;/p&gt;  &lt;h3&gt;Team Build 2008&lt;/h3&gt;  &lt;p&gt;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.&lt;/p&gt;  &lt;p&gt;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. &lt;/p&gt;  &lt;p&gt;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.&lt;/p&gt;  &lt;p&gt;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.&lt;/p&gt;  &lt;p&gt;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.&lt;/p&gt;  &lt;p&gt;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 &lt;a href="http://msdn.microsoft.com/en-us/library/bb892990.aspx"&gt;Team System Web Access&lt;/a&gt; installed).&lt;/p&gt;  &lt;p&gt;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.&lt;/p&gt;  &lt;h3&gt;Related Resources&lt;/h3&gt;  &lt;p&gt;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:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://stackoverflow.com/questions/80120/cruise-control-net-vs-team-foundation-build"&gt;Cruise Control .Net vs Team Foundation Build on StackOverflow.com&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/buckh/default.aspx"&gt;Buck Hodges’ Blog (TFS Development Manager)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/jimlamb/default.aspx"&gt;Jim Lamb’s Blog (TFS Program Manager for Team Build)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.codeplex.com/MSBuildExtensionPack"&gt;MSBuild Extension Pack&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msbuildtasks.tigris.org/"&gt;MSBuild Community Tasks Project&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://thewebjedi.com/cs/aggbug.aspx?PostID=364" width="1" height="1"&gt;</content><author><name>Andre Perusse</name><uri>http://thewebjedi.com/cs/members/Andre-Perusse/default.aspx</uri></author><category term="Source Control" scheme="http://thewebjedi.com/cs/blogs/meditations/archive/tags/Source+Control/default.aspx" /></entry><entry><title>Build Engineering = Sorcery</title><link rel="alternate" type="text/html" href="/cs/blogs/meditations/archive/2009/01/08/build-engineering-sorcery.aspx" /><id>/cs/blogs/meditations/archive/2009/01/08/build-engineering-sorcery.aspx</id><published>2009-01-08T19:41:43Z</published><updated>2009-01-08T19:41:43Z</updated><content type="html">&lt;p&gt;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.&lt;/p&gt;  &lt;p&gt;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.&lt;/p&gt;  &lt;p&gt;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.&lt;/p&gt;  &lt;p&gt;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.&lt;/p&gt;  &lt;p&gt;Now, where did I leave my wizard’s hat?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://thewebjedi.com/cs/aggbug.aspx?PostID=359" width="1" height="1"&gt;</content><author><name>Andre Perusse</name><uri>http://thewebjedi.com/cs/members/Andre-Perusse/default.aspx</uri></author></entry><entry><title>Working with Active Directory in .NET 3.5</title><link rel="alternate" type="text/html" href="/cs/blogs/meditations/archive/2008/11/07/working-with-active-directory-in-net-3-5.aspx" /><id>/cs/blogs/meditations/archive/2008/11/07/working-with-active-directory-in-net-3-5.aspx</id><published>2008-11-07T20:22:37Z</published><updated>2008-11-07T20:22:37Z</updated><content type="html">&lt;p&gt;Many projects that I’ve worked on over the years have required some kind of interface with Active Directory. Back in the good ol’ ASP days, there was &lt;a href="http://msdn.microsoft.com/en-us/library/aa772170.aspx"&gt;ADSI&lt;/a&gt; (Active Directory Services Interface), and .NET uses the &lt;a href="http://msdn.microsoft.com/en-us/library/system.directoryservices.aspx"&gt;System.DirectoryServices&lt;/a&gt; namespace to essentially wrap ADSI with managed code. It’s been a long time since I worked directly with ADSI, but working with AD up to and including the .NET Framework 2.0 was never a very straight-forward task.&lt;/p&gt;  &lt;p&gt;Take for example the classic requirement of simply obtaining the current user’s full name from AD. Say you have a web site that uses either IIS/NTFS to protect pages using ACLs, or uses ASP.NET Forms Authentication with an AD Provider. Obtaining the user’s login name is relatively easy, using the Page’s &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.ui.page.user.aspx"&gt;User&lt;/a&gt; object:&lt;/p&gt;  &lt;p&gt;string loginName = User.Identity.Name;&lt;/p&gt;  &lt;p&gt;But getting the user’s full name from AD requires several lines of code involving &lt;a href="http://msdn.microsoft.com/en-us/library/system.directoryservices.directorysearcher.aspx"&gt;DirectorySearcher&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/system.directoryservices.searchresult.aspx"&gt;SearchResult&lt;/a&gt; objects:&lt;/p&gt;  &lt;div style="font-size:11pt;background:white;color:black;font-family:consolas;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt; firstName = &lt;span style="color:blue;"&gt;null&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt; lastName = &lt;span style="color:blue;"&gt;null&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;DirectoryEntry&lt;/span&gt; entry = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DirectoryEntry&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;DirectorySearcher&lt;/span&gt; searcher = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DirectorySearcher&lt;/span&gt;(entry);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;searcher.PropertiesToLoad.Add(&lt;span style="color:#a31515;"&gt;&amp;quot;givenName&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;searcher.PropertiesToLoad.Add(&lt;span style="color:#a31515;"&gt;&amp;quot;sn&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;searcher.Filter = &lt;span style="color:#a31515;"&gt;&amp;quot;(&amp;amp;(objectCategory=person)(samAccountName=jsmith))&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;SearchResult&lt;/span&gt; result = searcher.FindOne();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (result.Properties[&lt;span style="color:#a31515;"&gt;&amp;quot;givenName&amp;quot;&lt;/span&gt;].Count &amp;gt; 0) firstName = result.Properties[&lt;span style="color:#a31515;"&gt;&amp;quot;givenName&amp;quot;&lt;/span&gt;][0].ToString();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (result.Properties[&lt;span style="color:#a31515;"&gt;&amp;quot;sn&amp;quot;&lt;/span&gt;].Count &amp;gt; 0) lastName = result.Properties[&lt;span style="color:#a31515;"&gt;&amp;quot;sn&amp;quot;&lt;/span&gt;][0].ToString();&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Ick. Thankfully, .NET 3.5 has added the &lt;a href="http://msdn.microsoft.com/en-us/library/system.directoryservices.accountmanagement.aspx"&gt;System.DirectoryServices.AccountManagement&lt;/a&gt; namespace which abstracts most of this code and makes it super-easy to deal with AD Principals in a strongly-typed manner:&lt;/p&gt;  &lt;div style="font-size:11pt;background:white;color:black;font-family:consolas;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;PrincipalContext&lt;/span&gt; pc = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;PrincipalContext&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;ContextType&lt;/span&gt;.Domain);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;UserPrincipal&lt;/span&gt; user = &lt;span style="color:#2b91af;"&gt;UserPrincipal&lt;/span&gt;.FindByIdentity(pc, &lt;span style="color:#a31515;"&gt;&amp;quot;jsmith&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt; firstName = user.GivenName;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt; lastName = user.Surname;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Gotta love progress!&amp;#160; :-)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://thewebjedi.com/cs/aggbug.aspx?PostID=356" width="1" height="1"&gt;</content><author><name>Andre Perusse</name><uri>http://thewebjedi.com/cs/members/Andre-Perusse/default.aspx</uri></author><category term="Tech" scheme="http://thewebjedi.com/cs/blogs/meditations/archive/tags/Tech/default.aspx" /></entry><entry><title>Home Theater PC</title><link rel="alternate" type="text/html" href="/cs/blogs/meditations/archive/2008/10/14/home-theater-pc.aspx" /><id>/cs/blogs/meditations/archive/2008/10/14/home-theater-pc.aspx</id><published>2008-10-14T19:59:05Z</published><updated>2008-10-14T19:59:05Z</updated><content type="html">&lt;p&gt;I love having the ability to play computer video files on my living room television. Back in the old days (about 3 or 4 years ago), I used a modded original XBox with XBox Media Center (XBMC) to perform this task. XBMC was great because it worked with just about every video format out there. In fact, I don’t think I ever ran across a video file that XBMC wouldn’t play. Ahh, those were the good ol’ days.&lt;/p&gt;  &lt;p&gt;Unfortunately, the original XBox doesn’t have the horsepower necessary for playing today’s high-definition video files. Though I now have an XBox 360, the only high-definition video it will play is Windows Media or MPEG files. Oh, there are many solutions for performing on-the-fly transcoding from your PC for unsupported files, but I haven’t seen any that preserve multi-channel surround sound along with that transcoding. And modding the 360 may be possible, but it doesn’t seem as popular as the original XBox mods, so I’m not going down that dark alley.&lt;/p&gt;  &lt;p&gt;Instead, I recently bought and built a relatively cheap home theater PC (HTPC). Building a PC for dedicated home theater use isn’t a new idea – people have been doing it for years. But the concept has recently spiked in popularity with many generic components now available allowing people to build some pretty nice systems for not too much money. Still, putting a working HTPC together is not for the weak-hearted as the industry still has a long way to go before the technology is mature. At the outset of this project, I was worried that I wouldn’t be able to achieve the usability I wanted because of several factors: home network speed, audio/video codec configuration issues, integration with my Harmony remote control, proper display on my aging high-def TV, and more. In the end, it turned out to be a lot less effort than I anticipated.&lt;/p&gt;  &lt;p&gt;The system I put together consisted of the following:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.antec.com/usa/productDetails.php?lan=us&amp;amp;id=92480"&gt;Antec NSK2480&lt;/a&gt; mATX chassis (has no IR sensor or front-panel display) &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.giga-byte.com/Products/Motherboard/Products_Overview.aspx?ProductID=2814"&gt;Gigabyte GA-MA78GM-S2H&lt;/a&gt; mATX motherboard with integrated ATI HD 3200 graphics &lt;/li&gt;    &lt;li&gt;AMD Athlon 5200+ EE CPU &lt;/li&gt;    &lt;li&gt;2GB Crucial PC6400 RAM &lt;/li&gt;    &lt;li&gt;500GB Western Digital Hard Drive &lt;/li&gt;    &lt;li&gt;Windows Media Center remote control &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The entire package cost me less than $500. I chose this chassis because it looks like a piece of audio/video gear and fits nicely in my A/V rack. It was inexpensive, comes with a nice power supply, and has quiet case fans. This motherboard is a popular HTPC choice because of its micro-ATX form factor, integrated ATI graphics which handles high-def video with aplomb, the built-in HDMI connector, and built-in optical S/PDIF output connector. I was originally going to get an Athlon 4850 CPU, but there were none left in stock. So I got the slightly more power-hungry 5200 for only $10 more. The Windows Media Center (WMC) remote control was only $30, and I only bought it for the IR receiver that it comes with (since I planned to used my Harmony remote instead).&lt;/p&gt;  &lt;p&gt;Assembling the PC was a breeze, so I had no issues there. After installing Vista Ultimate as the OS, it was time to start getting my hands dirty with codec configuration. Before I get into that, I should mention that I was pleasantly surprised to find the WMC remote could be used to place the machine in and out of sleep mode. Excellent! Unfortunately, the IR code that is used for this also turns my XBox 360 on and off. I haven&amp;#39;t yet resolved this minor annoyance.&lt;/p&gt;  &lt;p&gt;Back to the codec thing. In preparation for what I assumed would be a nightmare of configuration trial and error, I spent some time over at &lt;a href="http://www.avsforum.com/"&gt;AVS Forums&lt;/a&gt; researching the recommended installation incantations. Though many senior members strongly recommended against installing pre-packaged “codec packs,” several others indicated they had very good luck with &lt;a href="http://shark007.net/"&gt;Vista Codec Pack&lt;/a&gt; (VCP). So, I tried out VCP and what do you know – it worked great! All my high-definition content (including the relatively new .mkv format) worked like a charm in Vista Media Center! I had some small issues getting DTS and Dolby Digital 5.1 surround sound formats to output properly to my surround processor, but I had that working within 15 minutes. So, the codec nightmare I had feared turned out to be a non-issue after all.&lt;/p&gt;  &lt;p&gt;I did have one video glitch, however, but it wasn’t a surprise. My TV is a circa 1999 Toshiba rear-projection HDTV set. When this thing was built, HDMI wasn’t even a gleam in some video engineer’s eye. All I have are component inputs on the back of my set. I did buy an HDMI-to-component converter off eBay that works fairly well, but it appears to introduce a slight horizontal and vertical offset that unfortunately cannot be corrected with ATI’s driver software alone. Thankfully, the multi-talented Swiss-army knife of video signal software, &lt;a href="http://www.entechtaiwan.com/util/ps.shtm"&gt;PowerStrip&lt;/a&gt;, was able to remedy this for me.&lt;/p&gt;  &lt;p&gt;After all this, I was pretty happy using Vista Media Center to browse my server for video files and play them back over my gigabit home network. I can completely control the HTPC and VMC with my Harmony remote control, and everything just works. However, having used XBox Media Center for years, I knew there was a better way to control the HTPC than with VMC. A friend at work told me about &lt;a href="http://www.team-mediaportal.com/"&gt;MediaPortal&lt;/a&gt;, a sort-of spin-off from XBMC for Windows machines. MediaPortal is somewhat more slick than VMC with my personal killer feature being the integration with the &lt;a href="http://www.imdb.com"&gt;Internet Movie Database&lt;/a&gt; (IMDB). Instead of browsing video files alphabetically with thumbnails (which are usually black squares since movies often start with a black screen), I can now browse my videos by genre and by using the poster cover art. It’s a much better way to work with your movie collection.&lt;/p&gt;  &lt;p&gt;I’ll still be tweaking with my HTPC for several weeks I’m sure, but for the moment I am extremely satisfied and impressed with how easy this was to put together. Stop watching video on your teeny-tiny computer screen – get yourself a nice HTPC today!&amp;#160; :-)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://thewebjedi.com/cs/aggbug.aspx?PostID=349" width="1" height="1"&gt;</content><author><name>Andre Perusse</name><uri>http://thewebjedi.com/cs/members/Andre-Perusse/default.aspx</uri></author></entry><entry><title>Car Dilemma Solved - Mostly</title><link rel="alternate" type="text/html" href="/cs/blogs/meditations/archive/2008/08/17/car-dilemma-solved-mostly.aspx" /><id>/cs/blogs/meditations/archive/2008/08/17/car-dilemma-solved-mostly.aspx</id><published>2008-08-17T11:58:00Z</published><updated>2008-08-17T11:58:00Z</updated><content type="html">&lt;p&gt;I few months ago, I &lt;a href="http://thewebjedi.com/cs/blogs/meditations/archive/2008/05/17/new-car-search-t-55-days-and-counting.aspx"&gt;blogged about my search&lt;/a&gt; for a replacement vehicle as my existing lease was about to end. My lament was that I absolutely loved my existing car (a 2004 Volvo XC70) but that the lease buyout price was far too high given its current market value. And leasing a new version of the same model was somewhat price-prohibitive. I began an exhaustive search for a replacement, but nothing else really caught my fancy.&lt;/p&gt; &lt;a href="http://thewebjedi.com/cs/photos/favourite_photos/images/original/2004-Volvo-XC70.aspx" target="_blank"&gt;&lt;img src="http://thewebjedi.com/cs/photos/favourite_photos/images/341/640x480.aspx" alt="" width="" align="right" border="0" height="" hspace="10" /&gt;&lt;/a&gt;&lt;p&gt;So, on the lease termination date I returned my car. It was a sad moment - tears were shed (well, no, not really). I was going to wait until the following month to see if Volvo&amp;#39;s lease deals were more attractive, though if you&amp;#39;ve been following the news in the automotive industry lately you&amp;#39;ll know that almost every car manufacturer is taking a bath on lease returns lately, with most manufacturers either raising their lease rates or discontinuing their lease programs altogether. This option was looking like a long shot and, as it turned out, it was.&lt;/p&gt; &lt;p&gt;So I starting looking at used XC70s to replace my returned 2004. A few days after I returned the car, I saw a gem of a car online. It was a nice 2004 XC70 and the price was agreeable. I dug a little deeper and realized that this was my car that I had just returned! So I scooted on down to the local Volvo dealer and said I&amp;#39;d like my car back, please.&lt;/p&gt; &lt;p&gt;Me and my precious 2004 XC70 have been reunited. However, it&amp;#39;s making some odd noises now - perhaps a new Volvo is still in my future after all.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://thewebjedi.com/cs/aggbug.aspx?PostID=339" width="1" height="1"&gt;</content><author><name>Andre Perusse</name><uri>http://thewebjedi.com/cs/members/Andre-Perusse/default.aspx</uri></author><category term="Toys" scheme="http://thewebjedi.com/cs/blogs/meditations/archive/tags/Toys/default.aspx" /></entry><entry><title>HTC Touch As An iPhone Replacement</title><link rel="alternate" type="text/html" href="/cs/blogs/meditations/archive/2008/08/17/htc-touch-as-an-iphone-replacement.aspx" /><id>/cs/blogs/meditations/archive/2008/08/17/htc-touch-as-an-iphone-replacement.aspx</id><published>2008-08-17T11:32:00Z</published><updated>2008-08-17T11:32:00Z</updated><content type="html">&lt;p&gt;In January of this year (2008), I was getting the itch to buy something to replace both my cell phone and my Palm PDA (I used the Palm as my MP3 player). I wanted an all-in-one solution so I wouldn&amp;#39;t have to carry around two pieces of technology with me. Being the geek that I am, I was naturally interested in the iPhone but at that time it still wasn&amp;#39;t available in Canada, and wouldn&amp;#39;t be available at all through my preferred mobility provider which uses a CDMA network. So entranced was I by this new Apple technology that I seriously considered getting an iPod Touch and just keeping my old cell phone. I&amp;#39;d still have two items to carry around, but at least one of them would be super-cool.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.engadget.com/media/2007/09/iphone-vs-iphone-440.jpg" align="right" height="240" hspace="10" vspace="10" width="439" alt="" /&gt;In doing some research, I came across an interesting Windows Mobile phone from HTC called the &amp;quot;Touch.&amp;quot; It has no number or key pad and instead relies almost completely on its touch sensitive screen for controlling the device (much like the iPhone). Windows Mobile was never designed to be operated by a touch screen, so HTC includes this glitzy little interface called Touch Flo which is neat enough, but doesn&amp;#39;t really replace the standard Windows Mobile interface. However, the real advantage of the HTC Touch was the network fee - it came with an UNLIMITED data plan for only $7 a month! For replacing my MP3 playing Palm, the HTC Touch uses a microSD card, so I could at least approximate the storage capacity of an 8GB iPod Touch.&lt;/p&gt;
&lt;p&gt;So that&amp;#39;s what I did. I bought the HTC Touch with an 8GB microSD card and I&amp;#39;ve been mostly happy with it. Unlike the iPod or iPhone, the HTC has both regular and stereo bluetooth, so I also bought a pair of Motorola S9 bluetooth headphones, which work and sound pretty darn good. So, things have been good - mostly. There are some serious downsides to this solution, however.&lt;/p&gt;
&lt;p&gt;First, I&amp;#39;ve mentioned that Windows Mobile is not really a mobile OS designed for touch screens so it has nowhere near the usability or cool flashiness of the iPod Touch/iPhone. Second, the battery life is atrocious - with the bluetooth radio on all the time and playing MP3s for about an hour a day, the device won&amp;#39;t last 24 hours without a recharge. These aren&amp;#39;t deal-breakers mind you, just a little annoying. What is more than just a little annoying is the fact that the HTC tends to corrupt the contents of the microSD card every once in a while (a couple of times a month on average). This is a known issue all over several Internet forums, but no one knows why and a fix is not forthcoming from HTC. So I just live with it, growling when it happens and re-copying my MP3s over when it does. I expect this doesn&amp;#39;t happen on the iPhone.&lt;/p&gt;
&lt;div style="border-top:1px solid #ffff99;border-bottom:1px solid #ffff99;background-color:#ffffe5;"&gt;
&lt;p&gt;&lt;b&gt;UPDATE&lt;/b&gt; (March 2, 2009): After upgrading the HTC Touch to Windows Mobile 6.1 (a free upgrade) several months ago, I haven&amp;#39;t experienced a single SD card corruption issue.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The latest &amp;quot;gotcha&amp;quot; with using the HTC as an iPhone replacement is with my car stereo, or pretty nearly any car stereo that supports &amp;quot;MP3 players.&amp;quot; Usually this means they have an AUX jack that you can plug your MP3 player&amp;#39;s headphone jack into. And I suppose that works well enough - it&amp;#39;s certainly way better than using a tiny FM transmitter to do the same thing. But if you&amp;#39;re lucky enough to have a decent car stereo, it will also come with an iPod dock connector so that you can completely control your iPod through the car stereo system! Playlists, artist names and song titles show up right on the car stereo display, and the iPod can be controlled with the steering-wheel radio controls, if your car is so equipped (mine is). But, if you don&amp;#39;t have the magical device from Apple, all you&amp;#39;ve got is the AUX jack. Boo. (I understand that come vehicles also let you plug in any USB memory stick that contains MP3s and will work much like the iPod control - alas, my car does not have this option.)&lt;/p&gt;
&lt;p&gt;So, do I buy an iPod so I can have the convenience (and cool) factor when I&amp;#39;m in my car (not to mention the absence of corrupted memory cards)? Do I go back to having two items of technology to lug around? I&amp;#39;m very tempted, though having everything on my cell phone is mighty handy. I suppose if it was really worth it to me, I could dump the HTC and switch mobility providers and get the iPhone now that it&amp;#39;s available in Canada. Honestly though, paying $75 a month for the privilege isn&amp;#39;t really enticing, not to mention the early termination fee I&amp;#39;d face with my existing provider. But I still have my eye on a new iPod. :)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://thewebjedi.com/cs/aggbug.aspx?PostID=338" width="1" height="1"&gt;</content><author><name>Andre Perusse</name><uri>http://thewebjedi.com/cs/members/Andre-Perusse/default.aspx</uri></author><category term="Tech" scheme="http://thewebjedi.com/cs/blogs/meditations/archive/tags/Tech/default.aspx" /><category term="Toys" scheme="http://thewebjedi.com/cs/blogs/meditations/archive/tags/Toys/default.aspx" /></entry><entry><title>New Car Search: T-55 Days And Counting</title><link rel="alternate" type="text/html" href="/cs/blogs/meditations/archive/2008/05/17/new-car-search-t-55-days-and-counting.aspx" /><id>/cs/blogs/meditations/archive/2008/05/17/new-car-search-t-55-days-and-counting.aspx</id><published>2008-05-17T15:03:28Z</published><updated>2008-05-17T15:03:28Z</updated><content type="html">&lt;p&gt;The lease on my beloved 2004 Volvo XC70 is up in July and I&amp;#39;ve been caught up in new car shopping fever for the past few months. Since my current car has been an absolute paragon of reliability and I utterly love it to death, a new 2008 XC70 would seem to be the obvious choice. And it is, except that it&amp;#39;s awfully bloody expensive. I was hoping to reduce the amount of money I pay every month for my transportation, so I decided to try out some other less expensive alternatives. Since the XC70 is actually quite competitively priced in its class, cross-shopping with similar models (Audi, BMW) wasn&amp;#39;t really an option. Other Volvo models aren&amp;#39;t really that much cheaper so I&amp;#39;m not considering those, either. So I started with some more commonly popular vehicles.&lt;/p&gt; &lt;p&gt;My first test drive was with the uber-popular Hyundai Sonata. I took their top trim level car (V6, leather, climate control, other niceties) for a drive and was thoroughly unimpressed. My main beef with this car was the short travel length of the suspension - it kept bottoming out on me. So much so in fact, that I thought there must have been something wrong with the car. But no, this is apparently how it rides. I understand that the 2009 model of this car is a complete redesign so I may have to revisit it in the future and see if it has improved. Unfortunately, my disappointment with this car was to be the first in a long line of disappointments.&lt;/p&gt; &lt;p&gt;My next test drive was with a top trim level Nissan Rogue. Though smaller than the big Murano, the Rogue is still SUVish in size and style. So SUVish in style, in fact, that my wife was sure it was going to roll over while we were driving it. And while the Rogue is wonderfully fuel-efficient, its 4 cylinder engine coupled with a CVT transmission means that it goes nowhere fast. My next test drive was going to be a Subaru Outback, but due to some crazy cash incentives from Subaru the dealer had none left in stock! I may still investigate this alternative, though reviewers claim the economically priced V4 is quite sluggish, and the more suitable V6 is almost as expensive as the XC70 so I&amp;#39;m not holding out much hope.&lt;/p&gt; &lt;p&gt;Other cars I have tested included the Volkswagen Passat which actually wasn&amp;#39;t too bad. It handled well, had very nice acceleration, and was more or less comfortable. The same could be said of the Honda CR-V I drove, too (except for the acceleration part). However, as was starting to become painfully clear to me, my expectations were way too high for any car to meet. Naturally, none of the cars I was driving were even in the same class as the XC70 and while I knew this intellectually, I couldn&amp;#39;t help but compare every car I drove to the Volvo. The result was that every test drive left me feeling empty inside (pathetic, I know).&lt;/p&gt; &lt;p&gt;On a whim, I even took a Mercedes C230 (they had no C300s in stock) out for a drive. It was the sport trim model, and I&amp;#39;m not a sporty car guy (bet you figured that out already, didn&amp;#39;t you) so you can see where this is headed. The Mercedes is a fantastic feat of engineering genius and high-quality manufacturing that more or less exactly failed to impress me. I would have taken the more luxurious &amp;quot;Elegance&amp;quot; trim level for a drive, but as you can probably guess they didn&amp;#39;t have one in stock.&lt;/p&gt; &lt;p&gt;So, I now have roughly 55 days until my Volvo lease expires and I have no idea what I&amp;#39;m going to do. Paying the buyout for my car isn&amp;#39;t an option since it&amp;#39;s much more than what the car is worth on the market today. Leasing a new 2008 XC70 leaves me in the poor house for another 4 years, though it is obvious I will not be satisfied with anything else. Actually, I have my eye on a 2009 instead of a 2008 since the 09 has a much better engine option and has integrated Bluetooth (for the two phone calls a year I make from my car - yes, Bluetooth is VERRRRY important to me). And that much better engine is going to cost even MORE money. I am totally, 100%, unequivocally screwed.&lt;/p&gt; &lt;p&gt;So what is it that I like so much about the Volvo? Two words: creature comfort. You&amp;#39;d be hard-pressed to find anyone who would disagree with the statement that Volvo has the absolute best seats in the automotive industry. I could ride all the way from Halifax to Vancouver and not feel the least bit fatigued, they are that good. And on this car the seats are at the perfect height to make getting into and out of the car totally effortless. So, the moment I get into the driver&amp;#39;s seat of any other car I am immediately unhappy. And, while many driving enthusiasts would likely find the wagon&amp;#39;s handling less than ideal, it is just about perfect for me. The steering has just the perfect amount of resistance, the suspension has the perfect blend of comfort and firmness, and the turbocharged engine with the all-wheel drive transmission has plenty of power. What more could I ask for (except for a lower price)?&lt;/p&gt; &lt;p&gt;So, seeing as how any car other than the Volvo is going to leave me terribly unsatisfied, I believe I have two real choices: suck it up and get the new Volvo, or simply buy some used late-model version of pretty much anything bigger than a Hyundai Accent. In the latter case, I may not be happy, but at least I won&amp;#39;t be paying much for my unhappiness (as opposed to say, a new VW Passat). Stay tuned as my pathetic melodrama continues to unfold over the next several weeks.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://thewebjedi.com/cs/aggbug.aspx?PostID=335" width="1" height="1"&gt;</content><author><name>Andre Perusse</name><uri>http://thewebjedi.com/cs/members/Andre-Perusse/default.aspx</uri></author><category term="Toys" scheme="http://thewebjedi.com/cs/blogs/meditations/archive/tags/Toys/default.aspx" /></entry><entry><title>On The Edge (and falling off a cliff)</title><link rel="alternate" type="text/html" href="/cs/blogs/meditations/archive/2008/01/06/on-the-edge-and-falling-off-a-cliff.aspx" /><id>/cs/blogs/meditations/archive/2008/01/06/on-the-edge-and-falling-off-a-cliff.aspx</id><published>2008-01-06T17:38:00Z</published><updated>2008-01-06T17:38:00Z</updated><content type="html">&lt;p&gt;&lt;span style="background-color:lightyellow;font-weight:bold;"&gt;UPDATE (Feb. 19, 2008):&lt;/span&gt; If you&amp;#39;re too busy to read the book, take a look at this &lt;a href="http://www.onnetworks.com/videos/play-value/budokon---part-2"&gt;8 minute video&lt;/a&gt; - it gives a pretty decent summary!&amp;nbsp;&lt;/p&gt;&lt;p&gt;Ars Technica recently began &lt;a href="http://arstechnica.com/articles/culture/a-history-of-the-amiga-part-1.ars"&gt;running a series&lt;/a&gt; on the history of the Amiga, my favourite computer of all time. From the comments posted to this series I discovered that in 2005 a book was published on the entire history of Commodore. Well, the entire history starting from 1974, anyway. Through hours of interviews with various engineers and executives of Commodore, the book titled &lt;a href="http://www.amazon.ca/Story-Commodore-Company-Edge/dp/0973864907/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1199632690&amp;amp;sr=8-1"&gt;On the Edge: The Spectacular Rise and Fall of Commodore&lt;/a&gt; by Brian Bagnall tells the story of Commodore&amp;#39;s pioneering role in the microcomputer industry, its rise to glory in the early to mid 1980&amp;#39;s, and ending with its bankruptcy on April 29, 1994.&lt;/p&gt; &lt;p&gt;Commodore was actually founded in Toronto in 1958 by &lt;a href="http://en.wikipedia.org/wiki/Jack_Tramiel"&gt;Jack Tramiel&lt;/a&gt; and Manfred Kapp as a typewriter manufacturer. After a stock scandal in the &amp;#39;60s, Commodore was bought by Canadian financier Irving Gould in 1966 who kept Jack Tramiel on as CEO to move Commodore into the then lucrative calculator sector. In the mid 70s, the calculator market was getting overcrowded, so Jack started looking for cheaper calculator parts. This lead to Commodore&amp;#39;s purchase of MOS Technology, a semiconductor manufacturer. At the time, MOS had recently hired Chuck Peddle, who soon developed the legendary &lt;a href="http://en.wikipedia.org/wiki/6502"&gt;6502 microprocessor&lt;/a&gt;. (Interesting side node: Chuck Peddle&amp;#39;s parents hailed from the Canadian Maritime provinces, though the book does not detail from where specifically. A quick look at Canada411 shows a high concentration of Peddle&amp;#39;s in Cape Breton, however.) The 6502 was extremely important to the nascent microcomputer industry because while the comparable 6800 from Motorola cost $300 (which Chuck Peddle was also involved with), the 6502 cost only $25. The 6502 became the processor in Commodore&amp;#39;s first microcomputer, the PET 2001. It was also used in the Apple I and Apple II computers, and Atari&amp;#39;s home computer models (the famous Atari 2600 game console used a variant of the 6502). The 6510 used in the world&amp;#39;s top-selling computer model of all time, the Commodore 64, was a direct descendant of the 6502.&lt;/p&gt; &lt;p&gt;While I found this book to be a long read (it is 557 pages), I was thoroughly enthralled with it. While it did not focus too much on the personal lives of those involved (an aspect I enjoyed in another computer history book I recently read, &lt;a href="http://thewebjedi.com/cs/blogs/meditations/archive/2006/12/26/54.aspx"&gt;Showstopper&lt;/a&gt; by G. Pascal Zachary), it did cover a lot of detail, including technical detail, which naturally I loved. It also detailed a lot of business transactions and, for me, illuminated much of how the business world works, or at least the dysfunctional business world of Commodore. Did you know that Steve Jobs offered to sell Apple to Commodore in the late 1970s? Jack turned them down because he thought $200,000 was an outlandish price. Oops. Of course, if Commodore had bought Apple, they&amp;#39;d be dead now, too. And did you know that the most successful microcomputer in 1977 was not from either Apple nor Commodore, but was in fact Tandy&amp;#39;s &lt;a href="http://en.wikipedia.org/wiki/TRS-80"&gt;TRS-80&lt;/a&gt;? Perhaps the most satisfying fact in the book is that Bill Gates learned his lesson on software licensing when Jack Tramiel negotiated a deal to use Microsoft&amp;#39;s BASIC in Commodore computers. Jack sold tens of MILLIONS of computers with the same Microsoft BASIC in them and he only paid Microsoft a one-time fee of $10,000. Microsoft received absolutely no royalties on any Commodore computer sold in the late 70s to mid 80s. Ha!&lt;/p&gt; &lt;p&gt;Much of the book pays special attention to Commodore&amp;#39;s founder and CEO until 1984, Jack Tramiel. Jack had a couple of battle cries that were interesting: &amp;quot;Business is War&amp;quot;, and &amp;quot;Computers for the masses, not the classes.&amp;quot; The first quote refers to Jack&amp;#39;s belief that you didn&amp;#39;t succeed by competing with competitors, you succeeded by destroying them completely. The second was Jack&amp;#39;s continual insistence on driving down the cost of computers. There are many stories in the book that illustrate this. For instance, the original case design for the PET was to be made as a futuristic-looking molded plastic design. However, Commodore at the time owned an office supply company in Toronto, so they instead used an angular sheet-metal case because it cost less. The case for the C-64 is the exact same one as the VIC-20, because Jack didn&amp;#39;t want to spend money designing a new case, which actually ended up causing the engineers to lose weeks worth of time trying to cram the C-64 guts into the VIC-20 case. Jack had some interesting characteristics, many of which I&amp;#39;ve noticed in other &amp;quot;successful&amp;quot; businessmen. However, what makes a successful businessman doesn&amp;#39;t appear to be totally compatible with what makes a successful human being, in my humble opinion. One case in point is the fact that when Chuck Peddle left Commodore in the 1980s to begin his own start-up, out of spite Jack filed a lawsuit that completely destroyed Chuck needlessly (Jack and Chuck had once been very good friends). A hero of the microcomputer era struck down by a mean-spirited, greedy CEO.&lt;/p&gt; &lt;p&gt;Still, I have to wonder if Commodore would ever have succeeded as much without a guy like Jack at the helm. Another very interesting, but oddly secretive character in the Commodore saga was its owner, Irving Gould. The book paints this man as a mostly absent father-figure, who, when his CEOs would become successful with his company, he would fire them out of fear they were gaining too much power. After Jack took Commodore to a billion-dollar company with the C-64, Irving fired him in 1984. After Commodore lost hundreds of millions over the next several quarters, ex-Pepsi executive Tom Rattigan was put in place as the company&amp;#39;s CEO and he turned it around in a matter of months! Once Commodore was successful again, Rattigan was let go by Gould, too. Commodore never recovered after this, and eventually failed at the inept hands of CEO Mehdi Ali (nicknamed the &amp;quot;speed bump&amp;quot; by Commodore engineers, who burned an effigy of him in Dave Haynie&amp;#39;s &lt;a href="http://www.frogpondmedia.com/dbv/"&gt;Deathbed Vigil video&lt;/a&gt;) in 1994.&lt;/p&gt; &lt;p&gt;Commodore was the first company to put a microcomputer on the market, they were the first to sell over one millions units, and they were the first with a multimedia computer (the Amiga, R.I.P.) before the word &amp;quot;multimedia&amp;quot; existed. Despite all this, they self-destructed and have become pretty much just a footnote in the annals of the birth of the microcomputer industry. If you love computers as much as I do, and want to learn what it was like to be a computer engineer back in the heyday, you HAVE to read this book. If you&amp;#39;re tired of the &amp;quot;revisionist history&amp;quot; that paints Apple as the founder of the microcomputer, you HAVE to read this book. If you ever look back nostalgically on that old Commodore computer you owned in the 1980s (and wonder why the 1541 disk drive was so slow), you HAVE to read this book. It will make you laugh, it will make you cry, and it will make you pound your fists in anger. What more can you ask from a book, especially a non-fiction one such as this?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://thewebjedi.com/cs/aggbug.aspx?PostID=330" width="1" height="1"&gt;</content><author><name>Andre Perusse</name><uri>http://thewebjedi.com/cs/members/Andre-Perusse/default.aspx</uri></author><category term="Tech" scheme="http://thewebjedi.com/cs/blogs/meditations/archive/tags/Tech/default.aspx" /></entry><entry><title>Rules for Checking In Code to Source Control</title><link rel="alternate" type="text/html" href="/cs/blogs/meditations/archive/2007/11/14/rules-for-checking-in-code-to-source-control.aspx" /><id>/cs/blogs/meditations/archive/2007/11/14/rules-for-checking-in-code-to-source-control.aspx</id><published>2007-11-14T18:50:00Z</published><updated>2007-11-14T18:50:00Z</updated><content type="html">&lt;p&gt;The golden rule of checking in code is: 
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Don&amp;#39;t check in code that will break the build.&lt;/em&gt;&lt;/strong&gt; &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Nobody likes code that won&amp;#39;t compile. Also see Scott Hanselman&amp;#39;s &lt;a href="http://www.hanselman.com/blog/FirstRuleOfSoftwareDevelopment.aspx"&gt;First Rule of Software Development&lt;/a&gt;. 
&lt;p&gt;In order to help verify that your pending check-in will continue to result in a healthy build, you may wish to view the following rules and procedures that I find helpful. 
&lt;ol&gt;
&lt;li&gt;Try to work on small chunks of code and features at any given time. As &lt;a href="http://timstall.dotnetdevelopersjournal.com/tips_to_avoid_breaking_the_build.htm"&gt;Tim Stall points out&lt;/a&gt;, &amp;quot;It&amp;#39;s easier to integrate 5 small things than 1 big thing.&amp;quot;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Before checking in anything, perform a &amp;quot;get latest&amp;quot; on your entire solution&amp;#39;s code-base. Resolve any version conflicts before proceeding. &lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;If you have any web sites in your solution that have references to&amp;nbsp;web services, make sure you update all web references. &lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Perform a build on your entire solution. Obviously, fix any compilation errors. &lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Database scripts. Ahhh, these are lovely, aren&amp;#39;t they? Unless you&amp;#39;re fortunate enough to be using some cool database tools (like Visual Studio for Database Professionals), you don&amp;#39;t likely have any compile-time error checking for your database scripts. It is essential that you ensure all your database scripts for changing the schema, updating the programming (e.g., stored procs), and inserting default foundation data work properly. If they don&amp;#39;t, you&amp;#39;ll soon have a swarm of angry developers beating down your door. The best way to do this is to run the update scripts on your machine and test the software. Update scripts should be written in such a way that they first check to see if a particular update has been applied first before trying to apply it again. This makes it much easier to test, and for other developers to apply to their database copies. &lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Check in ALL files you have checked out. This is a tricky one, since perhaps you know that a particular file doesn&amp;#39;t work properly, even though it will compile properly. Unfortunately, you may not know what dependencies exist on this file from some of the other files that you&amp;#39;re checking in. So, while you may think you&amp;#39;re doing a favour for the rest of your development team by not checking in a file you know to not work properly, you may actually be more causing grief by checking in code that won&amp;#39;t build! &lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Even if you use a fancy-shmancy tool that performs delayed commit or source integration (such as &lt;a href="http://www.jetbrains.com/teamcity/"&gt;TeamCity&lt;/a&gt;), as a professional developer you should really follow these guidelines to save yourself (and your team) pain and suffering.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://thewebjedi.com/cs/aggbug.aspx?PostID=329" width="1" height="1"&gt;</content><author><name>Andre Perusse</name><uri>http://thewebjedi.com/cs/members/Andre-Perusse/default.aspx</uri></author><category term="Tech" scheme="http://thewebjedi.com/cs/blogs/meditations/archive/tags/Tech/default.aspx" /><category term="Source Control" scheme="http://thewebjedi.com/cs/blogs/meditations/archive/tags/Source+Control/default.aspx" /></entry><entry><title>XBox 360 Fun</title><link rel="alternate" type="text/html" href="/cs/blogs/meditations/archive/2007/09/28/xbox-360-fun.aspx" /><id>/cs/blogs/meditations/archive/2007/09/28/xbox-360-fun.aspx</id><published>2007-09-28T18:52:00Z</published><updated>2007-09-28T18:52:00Z</updated><content type="html">&lt;p&gt;I had been holding off buying an XBox 360 since I&amp;#39;m really not that much of a gamer and when I do play I totally suck anyway. For us non-gamer types, the XBox Live Marketplace sounds interesting&amp;nbsp;since it offers high-definition movies, but alas as a Canadian I am deprived of such a useful&amp;nbsp;feature (though Microsoft has said this will be available in Canada by the end of 2007). However, with last week&amp;#39;s release of Halo 3, I really had no choice but to break down and get myself one. Halo is just about the only video game I&amp;#39;ve played in, oh, ten years so once again I bought an expensive piece of hardware just so I could play this damn intoxicating game.&lt;/p&gt;
&lt;p&gt;I decided to get an XBox Elite primary for the larger hard drive, since outside of Halo I expect my only primary use of the machine will be for buying and watching high-def content. I ordered my machine&amp;nbsp;through Dell Canada and got a deal where Halo 3 was included for free (I also got $30 off an extra controller with the play and charge kit). For a company that almost exclusively sells their stuff through an on-line web site, their on-line order tracking is really poor. I placed my order 2 weeks before Halo 3 was scheduled to ship. I got an email stating an &amp;quot;expected ship date&amp;quot; of September 21st (the Friday before Halo&amp;#39;s release). However, when I clicked on the order number to go directly to Dell&amp;#39;s site for an update, it said the order (or more presicely a single line-item on the order) wouldn&amp;#39;t ship until the 27th. The other line item had no details for the ship date, so was the first line item&amp;#39;s ship date also for the entire order?&lt;/p&gt;
&lt;p&gt;Naturally, being the instant gratification freak that is typical of my generation, I checked the site for updates several times a day. I even called Dell in an attempt to gain clarification. I was told that this deal was extremely popular, but that it probably wouldn&amp;#39;t ship until a day or two AFTER Halo&amp;#39;s release. Grrrr.....&amp;nbsp;&amp;nbsp;But then, on the 21st (this was the original &amp;quot;expected ship date&amp;quot;) something went haywire on Dell&amp;#39;s order tracking site and it now said an &amp;quot;expected DELIVERY date&amp;quot; of the 24th! Woo-hoo! Hours later, however, and it was back to a SHIP date of the 27th. Boo. I checked again on the morning of the 25th to find that it had actually shipped the day before (though no notification email was sent to me). They shipped it by air, and it actually arrived on the 25th! So, good marks for execution but an F for a rather useless order tracking system.&lt;/p&gt;
&lt;p&gt;Anyway, I hooked up my new toy that evening and was relieved to find the cooling fan was much more quiet than my original XBox. I used my original XBox with XBox Media Center to stream video from my PC to my television in the living room and the fan was always distracting. The DVD drive is another story - it is quite noisy when it&amp;#39;s in use&amp;nbsp;even though it&amp;#39;s the vaunted Benq drive which is supposed to be the most quite DVD drive in the 360s. I&amp;#39;d hate to hear what the noisy ones sound like.&lt;/p&gt;
&lt;p&gt;I won&amp;#39;t bore you with a review of Halo 3 since the entire gaming community has already given it plenty of thumbs-up. I haven&amp;#39;t even played it much yet, though it looks like Halo, feels like Halo, and sounds like Halo. That&amp;#39;s a good thing. Since I totally suck, I play on the&amp;nbsp;&amp;quot;easy&amp;quot; setting but in Halo 3 it is way&amp;nbsp;TOO easy - I haven&amp;#39;t died yet! I think I&amp;#39;ll restart on the normal difficulty setting and see how I fare. Oh, and the new hammer weapon totally rocks! &lt;/p&gt;
&lt;p&gt;One thing that I wasn&amp;#39;t looking forward to about the 360 was the fact that while it can play video from a PC, it only supports WMV and MPEG video formats. My original XBox with XBMC plays just about every video format on the planet and I like it that way. Thankfully, some clever programmers developed an ingenious (and free, let&amp;#39;s not forget free) piece of software that allows you to play just about any video format on the 360. It&amp;#39;s called &lt;a class="" href="http://tversity.com/home"&gt;Tversity&lt;/a&gt; and what it basically does is &amp;quot;transcode&amp;quot; a video file on-the-fly to an XBox 360 supported format. Since I just upgraded my rig to a quad-core system, I can easily transcode high-def material without breaking too much of a sweat. This is great stuff.&lt;/p&gt;
&lt;p&gt;So, I&amp;#39;m quite happy with my new Halo 3 Machine (let&amp;#39;s call it what it really is). Hell, I might even try to do the XBox Live multi-player thing too if I can think up a decent gamer tag. My usual nicknames are all taken, so this might take a while. (UPDATE: I am now known as UnhingedBeaker.)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://thewebjedi.com/cs/aggbug.aspx?PostID=321" width="1" height="1"&gt;</content><author><name>Andre Perusse</name><uri>http://thewebjedi.com/cs/members/Andre-Perusse/default.aspx</uri></author><category term="Tech" scheme="http://thewebjedi.com/cs/blogs/meditations/archive/tags/Tech/default.aspx" /><category term="Entertainment" scheme="http://thewebjedi.com/cs/blogs/meditations/archive/tags/Entertainment/default.aspx" /><category term="Toys" scheme="http://thewebjedi.com/cs/blogs/meditations/archive/tags/Toys/default.aspx" /></entry><entry><title>SQL Server 2005 Syntax Incompatible with SQL Server 2000</title><link rel="alternate" type="text/html" href="/cs/blogs/meditations/archive/2007/09/26/sql-server-2005-syntax-incompatible-with-sql-server-2000.aspx" /><id>/cs/blogs/meditations/archive/2007/09/26/sql-server-2005-syntax-incompatible-with-sql-server-2000.aspx</id><published>2007-09-26T19:22:00Z</published><updated>2007-09-26T19:22:00Z</updated><content type="html">&lt;div&gt;On a recent project we use SQL Server 2005 for development but the product officially supports installation on both SQL Server 2005 and SQL Server 2000. During development we&amp;#39;ll create tables in the database (using SQL 2005) using the GUI tools in either Visual Studio or Management Studio. When it comes time to create the installation scripts, we&amp;#39;ll &amp;quot;Generate CREATE scripts&amp;quot; from these GUI tools. With SQL 2005 (well, at least the version we&amp;#39;re using, which is SP2), the CREATE TABLE script will now use a SQL 2005 specific syntax that will not work on SQL 2000.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;For example, here is an auto-generated script that runs on SQL 2005, but not on SQL 2000:&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;font style="BACKGROUND-COLOR:#ffffff;" color="#339966"&gt;CREATE TABLE [dbo].[Order](&lt;br /&gt;&amp;nbsp;[orderID] [int] NOT NULL,&lt;br /&gt;&amp;nbsp;[customerID] [int] NOT NULL,&lt;br /&gt;&amp;nbsp;[orderDate] [datetime] NOT NULL,&lt;br /&gt;&amp;nbsp;[shipDate] [datetime] NOT NULL,&lt;br /&gt;&amp;nbsp;[shipperID] [int] NOT NULL,&lt;br /&gt;&amp;nbsp;[shipperTrackingNumber] [varchar](50) NULL,&lt;br /&gt;&amp;nbsp;CONSTRAINT [PK_Order] PRIMARY KEY CLUSTERED &lt;br /&gt;(&lt;br /&gt;&amp;nbsp;[orderID] ASC&lt;br /&gt;)WITH (PAD_INDEX&amp;nbsp; = OFF, STATISTICS_NORECOMPUTE&amp;nbsp; = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS&amp;nbsp; = ON, ALLOW_PAGE_LOCKS&amp;nbsp; = ON) ON [PRIMARY]&lt;br /&gt;) ON [PRIMARY]&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font style="BACKGROUND-COLOR:#ffffff;" color="#339966"&gt;GO&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;If you try to run this on SQL 2000, you&amp;#39;ll get the following error:&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;font color="#ff0000"&gt;Server: Msg 170, Level 15, State 1, Line 11&lt;br /&gt;Line 11: Incorrect syntax near &amp;#39;(&amp;#39;.&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;It would appear as though SQL 2000 does not like the syntax of the primary key constraint&amp;nbsp;included in the CREATE TABLE statement. Alternatively, the following script works on both SQL 2000 and SQL 2005:&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;font color="#339966"&gt;CREATE TABLE [dbo].[Order] (&lt;br /&gt;&amp;nbsp;[orderID] [int] NOT NULL ,&lt;br /&gt;&amp;nbsp;[customerID] [int] NOT NULL ,&lt;br /&gt;&amp;nbsp;[orderDate] [datetime] NOT NULL ,&lt;br /&gt;&amp;nbsp;[shipDate] [datetime] NOT NULL ,&lt;br /&gt;&amp;nbsp;[shipperID] [int] NOT NULL ,&lt;br /&gt;&amp;nbsp;[shipperTrackingNumber] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL &lt;br /&gt;) ON [PRIMARY]&lt;br /&gt;GO&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#339966"&gt;&lt;/font&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;font color="#339966"&gt;ALTER TABLE [dbo].[Order] ADD &lt;br /&gt;&amp;nbsp;CONSTRAINT [PK_Order] PRIMARY KEY&amp;nbsp; CLUSTERED &lt;br /&gt;&amp;nbsp;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;[orderID]&lt;br /&gt;&amp;nbsp;)&amp;nbsp; ON [PRIMARY] &lt;br /&gt;GO&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Now, if that was the only problem I could probably live with that. But wait! There&amp;#39;s more! When you create an object in SQL Server, it&amp;#39;s generally good practice to first make sure the object doesn&amp;#39;t already exist. In my day-to-day use, my scripts will often check for general objects, or foreign-key constraints. SQL 2005 uses the following code for these operations:&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;font color="#339966"&gt;IF&amp;nbsp; EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N&amp;#39;[dbo].[FK_Order_Customer]&amp;#39;) AND parent_object_id = OBJECT_ID(N&amp;#39;[dbo].[Customer]&amp;#39;))&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Run this on SQL 2000 and you&amp;#39;ll get:&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;font color="#ff0000"&gt;Server: Msg 208, Level 16, State 1, Line 1&lt;br /&gt;Invalid object name &amp;#39;sys.foreign_keys&amp;#39;.&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Also, the following code is used by SQL 2005:&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;font color="#339966"&gt;IF&amp;nbsp; EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N&amp;#39;[dbo].[Order]&amp;#39;) AND type in (N&amp;#39;U&amp;#39;))&lt;br /&gt;DROP TABLE [dbo].[Order]&lt;br /&gt;GO&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;which will give you the following on SQL 2000:&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;font color="#ff0000"&gt;Server: Msg 208, Level 16, State 1, Line 1&lt;br /&gt;Invalid object name &amp;#39;sys.objects&amp;#39;.&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Microsoft changed the way that meta-data is stored in SQL 2005 to improve security, amongst other things, but this means that these scripts won&amp;#39;t work on SQL 2000. Thankfully, however, they did provide &amp;quot;views&amp;quot; in SQL Server 2005&amp;nbsp;which mimic the old behavior on SQL 2000. To fix these errors on SQL 2000, you can use the following syntax which will work on both SQL 2005 and SQL 2000:&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;font color="#339966"&gt;IF&amp;nbsp; EXISTS (SELECT * FROM dbo.sysforeignkeys WHERE fkeyid = OBJECT_ID(N&amp;#39;[dbo].[FK_Order_Customer]&amp;#39;) AND rkeyid = OBJECT_ID(N&amp;#39;[dbo].[Order]&amp;#39;))&lt;br /&gt;ALTER TABLE [dbo].[Order] DROP CONSTRAINT [FK_Order_Customer]&lt;br /&gt;GO&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#339966"&gt;&lt;/font&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;font color="#339966"&gt;IF&amp;nbsp; EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N&amp;#39;[dbo].[Order]&amp;#39;) AND type in (N&amp;#39;U&amp;#39;))&lt;br /&gt;DROP TABLE [dbo].[Order]&lt;br /&gt;GO&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Thankfully, there is a way around this if you&amp;#39;re using SQL Management Studio. Instead of right-clicking on a table to generate a CREATE script, right-click on the Database and select &lt;strong&gt;Tasks -&amp;gt; Generate Scripts&lt;/strong&gt;. This will open the Script Wizard dialog. On the Choose Script Options page, set the &amp;quot;Script for Server Version&amp;quot; property to &amp;quot;SQL Server 2000&amp;quot; and your CREATE scripts will now be fully compatible. A little more clicking is required, but at least your scripts will work on both server versions.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;img src="http://thewebjedi.com/cs/photos/misc/images/318/original.aspx" border="0" alt="" /&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://thewebjedi.com/cs/aggbug.aspx?PostID=317" width="1" height="1"&gt;</content><author><name>Andre Perusse</name><uri>http://thewebjedi.com/cs/members/Andre-Perusse/default.aspx</uri></author><category term="Tech" scheme="http://thewebjedi.com/cs/blogs/meditations/archive/tags/Tech/default.aspx" /><category term="SQL Server" scheme="http://thewebjedi.com/cs/blogs/meditations/archive/tags/SQL+Server/default.aspx" /></entry><entry><title>The Easy Way To Alternate Background Colours on a Repeater</title><link rel="alternate" type="text/html" href="/cs/blogs/meditations/archive/2007/06/18/291.aspx" /><id>/cs/blogs/meditations/archive/2007/06/18/291.aspx</id><published>2007-06-18T22:21:00Z</published><updated>2007-06-18T22:21:00Z</updated><content type="html">&lt;P&gt;The ASP.NET Repeater is one of my favourite controls because it provides total flexibility in the layout of your data. I'll often use it to generate a list of data similar to a DataGrid or DataList. However, if I want to alternate the background colour of each row of data, the usual prescribed method is to use the AlternatingItemTemplate. But this is a such a waste of code and can be a pain to maintain if your ItemTemplate has any kind of complexity.&lt;BR&gt;&lt;BR&gt;There is a much easier method, though. A shortcut if you will. If you're using your Repeater to generate table rows, you can use the following code in your &amp;lt;tr&amp;gt; tag to change the CSS class for each alternating row:&lt;BR&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN&gt;tr&lt;/SPAN&gt;&lt;SPAN&gt; &lt;SPAN&gt;class&lt;/SPAN&gt;&lt;SPAN&gt;="&lt;/SPAN&gt;&lt;SPAN&gt;&amp;lt;%&lt;/SPAN&gt;# IIf(Container.ItemIndex Mod 2 = 0, "rowOdd", "rowEven") &lt;SPAN&gt;%&amp;gt;&lt;/SPAN&gt;&lt;SPAN&gt;"&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;Or, in C#:&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN&gt;tr&lt;/SPAN&gt;&lt;SPAN&gt; &lt;SPAN&gt;class&lt;/SPAN&gt;&lt;SPAN&gt;="&lt;/SPAN&gt;&lt;SPAN&gt;&amp;lt;%&lt;/SPAN&gt;# Container.ItemIndex % 2 == 0 ? "rowOdd" : "rowEven" &lt;SPAN&gt;%&amp;gt;&lt;/SPAN&gt;&lt;SPAN&gt;"&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;Easy peasy. This isn't really all that ingenious but every time I want to use this technique I forget the syntax (it's the "Container.ItemIndex" I can never remember) so I decided to write a blog entry so I'll have it for reference.&amp;nbsp; :-)&lt;BR&gt;&lt;BR&gt;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://thewebjedi.com/cs/aggbug.aspx?PostID=291" width="1" height="1"&gt;</content><author><name>Andre Perusse</name><uri>http://thewebjedi.com/cs/members/Andre-Perusse/default.aspx</uri></author><category term="Entertainment" scheme="http://thewebjedi.com/cs/blogs/meditations/archive/tags/Entertainment/default.aspx" /></entry></feed>