<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Annoyed.ca</title>
	<atom:link href="http://annoyed.ca/feed/" rel="self" type="application/rss+xml" />
	<link>http://annoyed.ca</link>
	<description>Life - Technology</description>
	<lastBuildDate>Sat, 30 Jun 2012 01:34:53 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Why Are We Still Using Internet Explorer 6? &#8211; Part Two</title>
		<link>http://annoyed.ca/2010/11/14/why-are-we-still-using-internet-explorer-6-part-two/</link>
		<comments>http://annoyed.ca/2010/11/14/why-are-we-still-using-internet-explorer-6-part-two/#comments</comments>
		<pubDate>Mon, 15 Nov 2010 02:24:24 +0000</pubDate>
		<dc:creator>Christopher Hyne</dc:creator>
				<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://annoyed.ca/2010/11/14/why-are-we-still-using-internet-explorer-6-part-two/</guid>
		<description><![CDATA[Nearly a year and a half ago I wrote this post about why many large organizations are still using Internet Explorer 6. Every now and again, the post is re-discovered and is re-circulated and I get some great feedback about &#8230; <a href="http://annoyed.ca/2010/11/14/why-are-we-still-using-internet-explorer-6-part-two/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Nearly a year and a half ago I wrote <a href="http://annoyed.ca/2009/07/27/why-are-we-still-using-internet-explorer-6/">this post about why many large organizations are still using Internet Explorer 6</a>. Every now and again, the post is re-discovered and is re-circulated and I get some great feedback about it. I’ve decided that it is time for a bit of an update on the subject, so here goes.</p>
<p>I’m going to assume that you’ve read my original post, but in one line, the reason many large organizations still use Internet Explorer 6 is application compatibility. My employer (a large government department) has recently experienced this first-hand, having had to postpone deployment of Internet Explorer 8 after discovering compatibility issues (mid-deployment) with some important business applications. I have no idea how come they only discovered the issues after starting to deploy. Either someone didn’t do due diligence and test before-hand, or worse, they were completely clueless about the risks of incompatibilities. Either way, as a fellow IT employee in the same organization, it’s down right embarrassing.</p>
<p>One of the most frequent comments I receive as feedback on my original post is that folks get the compatibility issues, but they believe that we wouldn’t be in this situation if these incompatible applications had been written using web standards. It’s the fault of the application developers that their applications only work properly with Internet Explorer 6.</p>
<p>  <span id="more-1127"></span>
<p>It is definitely true that Internet Explorer 6 isn’t very standards compliant… well, not by 2010 standards anyways. Thing is, these incompatible apps weren’t written last week, or last year. The state of web standards was very different when many of these applications were written.</p>
<p>Time for a little web history lesson. Let’s go back in time, about 13 years or so to late 1997.</p>
<p>HTML 3.2 is an W3C recommendation (HTML 4.0 will be a recommendation by the end of 1997, but will be updated and re-published again in April 1998). CSS level 1 is also a W3C recommendation. In the world of browsers, the world is basically using Netscape 4.0 or Internet Explorer 4.0 (I’m ignoring Opera, cause lets face it, most other folks did too). Both of the 4.0 browsers support HTML 3.2 and some CSS 1, but both browsers have serious bugs in their CSS implementations. At this point, other than HTML 3.2, neither browser is really “standards compliant”. Opera was closer, but web site designer/developers weren’t about to implement standards compliant sites if it would only work in Opera.</p>
<p>Fast forward a couple years to 1999. HTML 4.0 has been published (twice) as a W3C recommendation, as has CSS level 2. Internet Explorer is now at version 5.0 and Netscape has… essentially vanished from the scene. The Netscape story is a long and interesting one, but in a nutshell, they open sourced a large part of the code, started building version 5 on top of that, but discovered that the code was a complete disaster. So they tossed it out and started from scratch. Netscape 5.0 would never see the light of day. Internet Explorer 5 on the other hand included improved CSS and HTML standards support. In fact, Internet Explorer 5.0 for Mac was the first browser to achieve full support of CSS 1 (it had even better standards support than Opera). Internet Explorer 5.0 was also the first browser to include XMLHttpRequest, the basis for AJAX, the technology on which almost every major web site today depends (there is no “#NewTwitter” without AJAX &amp; XMLHttpRequest). XMLHttpRequest in IE5.0 wasn’t script accessible, but it was there behind the scenes.</p>
<p>Move forward another year to 2000. Nothing has changed in the world of W3C web standards (they went off and focussed on XML, XSLT, etc. for the next few years, I think) Netscape 6 is re-born, with a largely re-written codebase. But the browser is bloated, and generally doesn’t work well on any PC that isn’t relatively new. By the time a couple of minor versions (6.1 &amp; 6.2) come along to improve the performance situation, the world has been introduced to Internet Explorer 6.0. Shortly thereafter, the world is also introduced to Windows XP, with which comes a bundled IE6. This is about where I (and a huge chunk of the rest of the world) made the switch to Internet Explorer as my personally preferred web browser. Both of the IE and Netscape 6.x browsers support the current W3C standards, but the realm of CSS 2 in particular there is a huge difference in the implementation. Both products still contains major bugs and in many cases each product has interpreted some aspects of CSS 2 differently (so-called CSS 2 errata, clarified in CSS 2.1). In fact, the next revision of CSS, version 2.1 will drop parts that nobody implemented correctly, and will change other parts to match how the browsers of the day actually worked. The browsers drove CSS 2.1, rather than the other way around. By this time, it is important to note, Internet Explorer 6.0 accounts for almost +90% of the browser market share. Internet Explorer 6.0 is for all intents and purposes, <strong>the</strong> standard. It has bugs in its implementation of CSS (most notably in the box model). But in the first few years of the 21st century, if you build a site to 100% W3C standards, it’s going to be broken in +90% of the worlds browsers.</p>
<p>This is the era in which these applications which are incompatible today, in 2010, were built. To the Internet Explorer 6 de facto web standard.</p>
<p>Over the next 4 years, the situation doesn’t change much. HTML stays at 4, CSS stays at 2. Netscape and Opera (and several other smaller browsers) continue to release updates with improved implementations of W3C standards, but can’t seem to gain (or re-gain) any significant market share. In fact, Internet Explorer remains at version 6 (with a couple of service packs added) and peaks at +95% market share. Of course Microsoft is also been investigated for anti-trust issues related to their bundling of Internet Explorer with their operating systems. All this to say that frankly they haven’t got much motivation to release newer browser versions. The only other significant thing to come out of these years is XHTML, which frankly was a misguided detour which thankfully will likely be abandoned as a result of the adoption of HTML 5. The reasons why deserve their own post, but in a nutshell, there isn’t a single released version of Internet Explorer available today which supports XHTML. At least not when served by a web server using the correct MIME-type (application/xhtml+xml). So most web servers deliver XHTML with a MIME-type of text/html which most browsers parse as HTML (not XML or XHTML). Even if your site is XHTML compliant, if you serve it with the correct MIME-type to a supported browser, it won’t look the way you’d expect. Only a tiny percentage of sites are XHTML coded and served, on purpose and by design, using the correct MIME-type. And most of those are owned by computer science academics and grad students. But I digress.</p>
<p>Things begin to change at the end of 2004, when a little browser known as Firefox begins to actually take a chunk out of Internet Explorer’s market share. What made Firefox different from the dozens of other browsers that had tried before? I honestly couldn’t tell you. Probably just a good example of right place at the right time. I know I jumped on Firefox at about 1.0 and haven’t looked back. But Firefox re-ignited the so-called browser-wars of the late 1990’s, but in the 2000’s one of the things that earns you points is standards compliance. It also re-ignited the actual <strong>development</strong> of web standards: CSS 2.1 (2005 &amp; 2007), CSS 3 (2005) and HTML 5 (2008 draft).</p>
<p>The thing I want you to take away from this post is that these critical business applications which today are holding us back from moving forward with more standards compliant browsers were in fact developed to the standard that existed in their day. Namely, Microsoft Internet Explorer 6’s (buggy) interpretation of HTML 4 and CSS 1&amp;2. With +90% market share, for better or for worse, Internet Explorer 6’s version of the standard was <strong>THE</strong> standard.</p>
]]></content:encoded>
			<wfw:commentRss>http://annoyed.ca/2010/11/14/why-are-we-still-using-internet-explorer-6-part-two/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ottawa circa 1907</title>
		<link>http://annoyed.ca/2010/05/31/ottawa-circa-1907/</link>
		<comments>http://annoyed.ca/2010/05/31/ottawa-circa-1907/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 01:39:13 +0000</pubDate>
		<dc:creator>Christopher Hyne</dc:creator>
				<category><![CDATA[Books]]></category>

		<guid isPermaLink="false">http://annoyed.ca/2010/05/31/ottawa-circa-1907/</guid>
		<description><![CDATA[Source: Baedeker’s Canada (published in 1907). I purchased this book at a used book sale about a decade ago for 25¢.]]></description>
				<content:encoded><![CDATA[<p><a href="http://annoyed.ca/wp-content/uploads/2010/05/ottawa19072.jpg" target="_blank" rel="lightbox[866]"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="ottawa-1907" border="0" alt="ottawa-1907" src="http://annoyed.ca/wp-content/uploads/2010/05/ottawa1907_thumb2.jpg" width="466" height="335" /></a> </p>
<p>Source: Baedeker’s Canada (published in 1907). I purchased this book at a used book sale about a decade ago for 25¢.</p>
]]></content:encoded>
			<wfw:commentRss>http://annoyed.ca/2010/05/31/ottawa-circa-1907/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Planning to build a new PC</title>
		<link>http://annoyed.ca/2009/09/01/planning-to-build-a-new-pc/</link>
		<comments>http://annoyed.ca/2009/09/01/planning-to-build-a-new-pc/#comments</comments>
		<pubDate>Wed, 02 Sep 2009 01:29:44 +0000</pubDate>
		<dc:creator>Christopher Hyne</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://annoyed.ca/2009/09/01/planning-to-build-a-new-pc/</guid>
		<description><![CDATA[About 6 or 7 years ago I wrote a series of blog posts about the process of selecting components for a new PC. Believe it or not, the PC I actually built as a result of those posts is still &#8230; <a href="http://annoyed.ca/2009/09/01/planning-to-build-a-new-pc/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>About 6 or 7 years ago I wrote a series of blog posts about the process of selecting components for a new PC. Believe it or not, the PC I actually built as a result of those posts is still my primary PC today. I’ve added addition hard drive, and memory and replaced the video card a few times, but otherwise it’s the same box. And it’s beginning to show its age. Okay, more than just beginning to…</p>
<p>So I am starting to again plan to build a new PC and figured I might as well blog about it again. If only to give myself a place to track my hardware decisions.</p>
<p>Here’s what I’ve got so far:</p>
<ul>
<li>Intel Quad-Core processor (or better, maybe Intel i7)</li>
<li>Minimum of 8GB of RAM</li>
<li>Asus SLI-capable motherboard (P5Q or P6?)</li>
<li>Intel X25 or OCZ Vertex SSD hard drive (system drive)</li>
<li>Western Digital SATA hard drive (bulk storage)</li>
<li>Promise SATA RAID controller (maybe)</li>
<li>Antec 300 Case</li>
<li>NVidia video card (GT 260?)</li>
<li>Windows 7</li>
</ul>
<p>Any suggestions?</p>
]]></content:encoded>
			<wfw:commentRss>http://annoyed.ca/2009/09/01/planning-to-build-a-new-pc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Why Are We Still Using Internet Explorer 6?</title>
		<link>http://annoyed.ca/2009/07/27/why-are-we-still-using-internet-explorer-6/</link>
		<comments>http://annoyed.ca/2009/07/27/why-are-we-still-using-internet-explorer-6/#comments</comments>
		<pubDate>Tue, 28 Jul 2009 01:25:07 +0000</pubDate>
		<dc:creator>Christopher Hyne</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://annoyed.ca/?p=442</guid>
		<description><![CDATA[There has been some discussion online recently between public servants about how the public service is still overwhelmingly using Microsoft Internet Explorer 6. I got involved when someone tweeted a link to this site: http://hey-it.com/download.html. The site provides cute posters &#8230; <a href="http://annoyed.ca/2009/07/27/why-are-we-still-using-internet-explorer-6/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>There has been some discussion online recently between public servants about how the public service is still overwhelmingly using Microsoft Internet Explorer 6. I got involved when someone tweeted a link to this site: <a title="http://hey-it.com/download.html" href="http://hey-it.com/download.html">http://hey-it.com/download.html</a>. The site provides cute posters asking the IT folks to basically get off their arses and give us a newer web browser. I responded back that there are other issues involved when upgrading web browsers, such as legacy application compatibility, and that things aren’t as clear cut as it may seem from the perspective of someone outside IT.</p>
<p>Well, responses to that included “don’t punish users for your deployment issues” and “are you afraid of losing your job if I upgrade my own browser”? Oh, and the term “visionless IT geeks” was tossed around. My response to this was a flurry of tweets quoting other folks rhyming off reasons why large organizations all over still use Internet Explorer 6. I then signed off Twitter and did not log back in for two days.</p>
<p>I essentially had a hissy-fit.</p>
<p> <span id="more-442"></span><br />
<blockquote>
<p>Screw you guys… I’m going home! – Eric Cartman</p>
</blockquote>
<p>Not particularly mature, but what can I say. I’m passionate about IT and took things a bit more personally than I should have. But I’ve spent several days since thinking about it and have decided there is an opportunity here to share some knowledge of how the IT group in a large organization views a web browser upgrade. As folks who know me can attest, I am not one to miss an opportunity to share (or receive) knowledge, so here goes.</p>
<p>First, a little about me for the sake of context.</p>
<ul>
<li>I am an IT guy. My entire professional career has been IT, all within the same department (the name has changed more times than I can count, but it’s still the same department). I am NOT a LAN support/Helpdesk person. I am NOT an IT standards person. I am NOT an IT Security person.     </p>
<p>In other words I personally have NO control what so ever about what gets installed or not installed on your GoC workstation (nor do I have anything to do with what Internet sites are blocked, by the way). I am simply a programmer, and like everyone else, I have to deal with the consequences of what “IT” deems suitable.</li>
<li>While my entire career has been IT, I spent the first several years of it OUTSIDE the IT group, in what would be labelled a shadow IT group. A shadow IT group is basically folks that the business people deal with to get things done. They get stuff done independently, and regardless of what the official IT group says. We had our own servers, our own un-filtered Internet connection and our own, separate network and workstations (we ran Linux on our desktops). To be clear though, our stuff was completely separate from the corporate stuff. We were a much smaller threat than the average shadow IT shop (I don’t mean threat to IT jobs, but threat to the security/stability of the department).
<p>So I know first hand the “I/We can do it better than IT” mentality that exists in large organizations, outside of the IT group. Been there, done that.</li>
<li>I also side-line as a web developer/designer. I own a company that started life as a web design firm. I am VERY well aware of the limitations of Internet Explorer 6. Access to my own stuff is broken when I am at work.</li>
</ul>
<p>So, why one standard browser?</p>
<p>Once upon a time there was a large government department with some 24,000 employees and two Internet browsers, Netscape 4 and Internet Explorer 4. This was in the height of the so-called browser wars and things that worked in one browser didn’t necessarily work in the other. Applications were increasingly being developed as web-based applications, because it was simpler: they can be centrally managed and there is no need to worry about incompatibilities between products on workstations. Think about it: standardize on one web browser, make your web application work for that web browser, and your application will just work for everyone! Bliss!</p>
<p>And that’s exactly what happened. Internet Explorer was likely chosen because it is basically built right in to the Windows operating system. You can’t really uninstall Internet Explorer, like you can Netscape. So Internet Explorer it is. I suspect the same story played out in other departments, and in fact in other corporations around the world.</p>
<p>One browser also has the advantage that it means only one product to monitor for vulnerabilities and patches/security updates. Internet Explorer updates, additionally, can be deployed using the same infrastructure that is publishing Windows operating system updates, Office Suite updates, etc.</p>
<p>Time marched on, Netscape all but disappeared from the scene and for awhile Internet Explorer was just about the only game in town. During this time, internal applications continued to be developed targeting Internet Explorer 6. Third-party companies developing software for large organizations could also pretty much guarantee that those organizations were using Internet Explorer 6 so they to targeted their software at that platform.</p>
<p>Fast forward to today and that 24,000 employee department has 100s (if not 1000s) of applications that were built to target Internet Explorer 6. Some just work in Internet Explorer 7, others have some minor things that don’t, and some just don’t work at all. And the story is even worse when we contemplate a switch to a completely difference browser, such as Firefox, Opera, Safari or Chrome.</p>
<blockquote><p>But Internet Explorer 7 is free. There is no cost to upgrade.</p>
</blockquote>
<p>Okay, let’s talk about where that reasoning breaks down. Say that in our 24,000 employee organization, 500 use Product X, sold to us 7 years ago by Company ABC. Product X works with Internet Explorer 6, but doesn’t work at all with Internet Explorer 7. Product X is an essential tool for those 500 people to do their jobs.&#160; We contact Company ABC for an update for IE 7, but it turns out Company ABC was bought 2 years ago by its competitor, Company 123. Company 123 has no update, but instead has their Product Z with works with IE 7. And it will only cost $10 million for licenses. And $1 million for a consultant to help migrate data from Product X to Product Z. And $1 million to train the users on Product Z.</p>
<p>But you know what? I don’t think we can’t legally just upgrade from one company’s product to another. We have to go through a Request For Proposal process, to allow other company’s to also compete on the contract. Optimistically that’s a 2 year process, just to acquire the new software. The process also requires the business area’s time, because it’s their software. They have to make sure that the replacement is capable of handling everything they need it too. Oh, and the business area has to pony up the money too.</p>
<p>Think about that from the business side’s point of view. You’ve got 500 employees working each day, happy doing their jobs. Then IT comes to you and says “We’re going to upgrade to IE 7. But first we need 2 years of you time (for the RFP alone, plus deployment, migration and training) and $12 million of your dollars (doesn’t include salary dollars). I know what my response would be, but I am too polite to actually publish it here.</p>
<p>And that conversation would replay 100s of times across the organization.</p>
<p>Internet Explorer 7 is nowhere near free. Not even close.</p>
<p>Internally, or in-house, developed applications are a similar story. They need to be upgraded, but the resources that would be used for the upgrade have to be prioritized. Government, business/program and IT priorities all have to be balanced. So instead of upgrading existing applications for Internet Explorer 7, IT is implementing Common Look and Feel 2.0 before the Treasury Board deadline passes, or they’re re-themeing existing web sites because the old red and white theme was too “Liberal” for the current government’s tastes (seriously, this is what you tax dollars get spent on).</p>
<p>Oh, by the way. Internet Explorer 7 requires Microsoft Windows XP or better. For a 24,000 employee organization, an on-going migration from Windows 2000 to Windows XP is an expensive and time consuming task, which suffers from its own set of compatibility issues (they are applications in use that don’t work in Windows XP).</p>
<p>Upgrading a web browser on your PC at home is an easy task. In a large government department however, it’s a huge tangled web of issues.</p>
]]></content:encoded>
			<wfw:commentRss>http://annoyed.ca/2009/07/27/why-are-we-still-using-internet-explorer-6/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>An Introduction to Subversion</title>
		<link>http://annoyed.ca/2009/03/05/an-introduction-to-subversion/</link>
		<comments>http://annoyed.ca/2009/03/05/an-introduction-to-subversion/#comments</comments>
		<pubDate>Thu, 05 Mar 2009 13:45:13 +0000</pubDate>
		<dc:creator>Christopher Hyne</dc:creator>
				<category><![CDATA[Subversion]]></category>

		<guid isPermaLink="false">http://annoyed.ca/?p=275</guid>
		<description><![CDATA[Subversion (also referred to as SVN) is an open-source revision control system. Subversion tracks changes to files and folders, and keeps copies of all revisions, or versions, of your files and folders. Subversion allows you to retrieve at any time &#8230; <a href="http://annoyed.ca/2009/03/05/an-introduction-to-subversion/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Subversion (also referred to as SVN) is an open-source revision control system. Subversion tracks changes to files and folders, and keeps copies of all revisions, or versions, of your files and folders. Subversion allows you to retrieve at any time older versions of your files and folder. And because subversions keeps copies of all revisions of your files separate from the copy you&#8217;re currently working with, there&#8217;s an element of a backup system to it. Subversion can work across a network, with more than one user as well, and can help manage the situation where many users may be modifying the same file. Subversion can help manage any conflicts that may arise when more than one users makes changes to the same file.</p>
<p>For this tutorial we are going to start with the basics. We will assume that there is only one user, and we won&#8217;t deal with Subversion being used across a network. We are also going to focus on one particular Subversion program, TortoiseSVN. TortoiseSVN is an open-source windows implementation of a Subversion client program.</p>
<p><span id="more-275"></span>
</p>
<p>First things first, let&#8217;s get define some basic Subversion terminology:</p>
<ul>
<li><strong>Repository</strong>: This is the central location where Subversion maintain all the information about all the different copies of your files and folders.
<li><strong>Working Copy</strong>: This is the copy of your files and folders that you work with. You can have any number of Working Copies for one Repository, though normal each user would only need one Working Copy (per computer, anyway).
<li><strong>Import</strong>: This is what you do to initially include existing files into your Subversion repository.
<li><strong>Check Out</strong>: This is how you would create a new Working Copy from an existing Repository.
<li><strong>Update</strong>: You would do an Update on an existing Working Copy to make sure it contains the latest versions of the files and folders from the Repository.
<li><strong>Commit</strong>: When you make changes to files in your Working Copy, Commit will push those changes into the Repository. </li>
</ul>
<p>We will go through each of these in detail later in this tutorial.</p>
<h2>Getting and Installing TortoiseSVN</h2>
<p>You can download TortoiseSVN from the TortoiseSVN site here: <a href="http://tortoisesvn.net/downloads" target="_blank">http://tortoisesvn.net/downloads</a>. Double-click the downloaded file to begin the installation. The installation process itself is quite straightforward. Once the installation is done, you will need to restart your computer because TortoiseSVN integrates itself into Windows Explorer (not Internet Explorer). There is no TortoiseSVN &#8220;program&#8221;. You access all of TortoiseSVN&#8217;s functionality via the right-click menu on files and folders on your computer.</p>
<p>Once you&#8217;ve installed TortoiseSVN and rebooted your computer we can move on and create our first repository.</p>
<h2>Creating a Repository</h2>
<p>The repository is the central location where Subversion keeps information about all the versions of the files and folders you will keep until version control. You can create the repository somewhere on the same hard disk that you will work on, but I would recommend keeping it on a separate disk because that way you get the added benefit being protected if one of your hard disks fails. The ultimate place to put your files is on another computer in another part of the country (or of the world), but that is beyond the scope of this tutorial. For this tutorial, I will create the repository on my E:\ drive and I will work with my files on the C:\ drive.</p>
<p>On the E:\ drive I created a new folder, &#8220;SVN Repository&#8221;. You can call it whatever you like.</p>
<p><a href="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-2.png" rel="lightbox[275]"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="559" alt="image" src="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-thumb.png" width="750" border="0"></a></p>
<p>I then right-click on the &#8220;SVN Repository&#8221; folder, and from the context menu select &#8220;TortoiseSVN&#8221; &gt; &#8220;Create repository here&#8221;.</p>
<p><a href="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-4.png" rel="lightbox[275]"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="613" alt="image" src="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-thumb-1.png" width="754" border="0"></a></p>
<p>You should see a message stating that the repository was successfully created.</p>
<p><a href="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-6.png" rel="lightbox[275]"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="159" alt="image" src="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-thumb-2.png" width="432" border="0"></a></p>
<p>If you look inside the &#8220;SVN repository&#8221; folder you&#8217;ll see that a bunch of files and sub-folders were created. Don&#8217;t worry too much about the contents, you should never really have to worry about the repository folder again, except perhaps if you want to include the whole folder in your backup routine. All you need to know about the repository is where it is, in my case &#8220;E:\SVN Repository&#8221;.</p>
<h2>Adding Existing Files into a New Subversion Repository</h2>
<p>Let says that on my C:\ drive I have a folder, &#8220;Project X&#8221; that contains a number of files related to a project I am working on.</p>
<p><a href="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-8.png" rel="lightbox[275]"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="454" alt="image" src="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-thumb-3.png" width="670" border="0"></a></p>
<p>I want to import these files into my Subversion repository so that I can track changes to them. To do this I need to Import them into Subversion. I will go up one folder level and right-click on the &#8220;Project X&#8221; folders and select &#8220;SVN Import&#8221; from the context menu. You may need to select &#8220;TortoiseSVN&#8221; &gt; &#8220;SVN Import&#8221;. Which SVN commands appear directly on the context menu versus on the TortoiseSVN sub-menu is configurable.</p>
<p><a href="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-10.png" rel="lightbox[275]"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="426" alt="image" src="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-thumb-4.png" width="439" border="0"></a></p>
<p>In the resulting dialog window I enter <a href="file:///E:/SVN Repository">File:///E:/SVN Repository</a> as the URL of my repository. This is the path to the repository I created earlier in the tutorial. If I had a repository out on the Internet, my URL might start with http:// instead of <a href="file:///">file:///</a> (note, there are 3 slashes).</p>
<p><a href="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-12.png" rel="lightbox[275]"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="439" alt="image" src="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-thumb-5.png" width="597" border="0"></a></p>
<p>Click the &#8220;&#8230;&#8221; button to browse the contents of the given repository. This allows you to choose where in the repository you want to import your files.</p>
<p>As you can see below, my repository is empty. If I were to leave the URL as shown, the 4 files in my &#8220;Project X&#8221; folder would be imported directly into the root of the repository. You can have one project per repository, or you can place several projects in a repository. I will have several projects in one repository, so I will use the Repository Browser windows to create a folder structure prior to importing my files.</p>
<p><a href="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-14.png" rel="lightbox[275]"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="577" alt="image" src="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-thumb-6.png" width="755" border="0"></a></p>
<p>I will right-click in the Repository Browser a few times to create a structure where I want to save the files in my &#8220;Project X&#8221; folder (see image below):</p>
<p><a href="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-16.png" rel="lightbox[275]"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="588" alt="image" src="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-thumb-7.png" width="766" border="0"></a></p>
<p>When I&#8217;ve created my structure in the repository, I&#8217;ll select the &#8220;Project X&#8221; sub-folder in the Repository Browser window, click OK and I&#8217;ll be back in the Import window. Notice the URL in the Import window now points at the sub-folder in the repository.</p>
<p><a href="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-18.png" rel="lightbox[275]"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="375" alt="image" src="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-thumb-8.png" width="510" border="0"></a></p>
<p>Click OK in the Import window and the files are imported.</p>
<p><a href="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-20.png" rel="lightbox[275]"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="326" alt="image" src="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-thumb-9.png" width="724" border="0"></a></p>
<p>Yay! My files are in the repository. The only problem now is that my files in the repository are not linked to the files in my original &#8220;C:\Project X&#8221; folder. I need to check-out a Working Copy in order to have files to work with.</p>
<h2>Checking-Out a Working Copy</h2>
<p>To create a working copy of my files on my C:\ drive I will right-click in the C:\ explorer window and select &#8220;SVN Checkout&#8221;.</p>
<p><a href="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-22.png" rel="lightbox[275]"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="601" alt="image" src="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-thumb-10.png" width="325" border="0"></a></p>
<p>In the Checkout window, the URL will point to the URL where I imported my files, and the Checkout directory will be a new directory on my C:\ drive&nbsp; where I want a copy of the files so I can work with them. TortoiseSVN will create the directory if it doesn&#8217;t exist.</p>
<p><a href="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-24.png" rel="lightbox[275]"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="394" alt="image" src="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-thumb-11.png" width="513" border="0"></a></p>
<p>I now have a working copy of the files in my repository. I can now safely delete my original &#8220;Project X&#8221; directory as all the files are now both in the repository (on my E:\ drive) and my new working copy (on the C:\ drive).</p>
<h2>Working with your Working Copy</h2>
<p>Notice the little green checkmark icon on my working copy directory. This tells me that none of the files inside that directory have been modified since I last got copies from the repository.</p>
<p><a href="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-26.png" rel="lightbox[275]"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="441" alt="image" src="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-thumb-12.png" width="732" border="0"></a></p>
<p>If I modify one of the files in my working copy, I will see a little red exclamation point icon on the folder.</p>
<p><a href="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-28.png" rel="lightbox[275]"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="446" alt="image" src="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-thumb-13.png" width="741" border="0"></a></p>
<p>I can then drill down through the folders to find exactly what file has changed, in this case my index.html file.</p>
<p><a href="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-30.png" rel="lightbox[275]"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="449" alt="image" src="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-thumb-14.png" width="746" border="0"></a></p>
<p>I can right click the file, and chose &#8220;SVN Diff (or &#8220;TortoiseSVN&#8221; &gt; &#8220;SVN Diff&#8221;) to find out exactly what has changed in the file.</p>
<p><a href="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-32.png" rel="lightbox[275]"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="446" alt="image" src="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-thumb-15.png" width="389" border="0"></a></p>
<p>In the image below you can see that I added &#8220;: The Web Site&#8221; to my title element. Note: the image below is not from the built-in TortoiseSVN Diff tool, but rather from WinMerge. TortoiseSVN&#8217;s built-in tool will show you the differences, but you can use other third-party tools if you prefer.</p>
<p><a href="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-34.png" rel="lightbox[275]"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="529" alt="image" src="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-thumb-16.png" width="732" border="0"></a></p>
<p>I am happy with that change, so I will go ahead and commit that change to the repository. I right-click on the changed file, and select &#8220;SVN Commit&#8221; from the context menu.</p>
<p><a href="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-36.png" rel="lightbox[275]"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="488" alt="image" src="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-thumb-17.png" width="448" border="0"></a></p>
<p>The commit window gives me a chance to enter a message about the changes made. This can be helpful if you ever need to know exactly when something was changed. Click OK to commit the change.</p>
<p><a href="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-38.png" rel="lightbox[275]"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="549" alt="image" src="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-thumb-18.png" width="522" border="0"></a></p>
<p>If I now refresh my working copy folder view in Explorer, the icon on the file will change back to the green checkmark meaning that what is in my working folder is up to date with what&#8217;s in the repository.</p>
<p><a href="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-40.png" rel="lightbox[275]"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="393" alt="image" src="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-thumb-19.png" width="653" border="0"></a></p>
<p>If I wasn&#8217;t happy with the changes I had made, I could have done an &#8220;SVN Revert&#8221; to restore the previous version of the file from the repository rather than committing the change.</p>
<h2>Keeping Your Working Copy Up To Date</h2>
<p>If you end up with multiple working copies on different computers (for example you have one repository on a shared drive, but you have working copies on both your PC and your laptop) the green checkmark doesn&#8217;t guarantee you&#8217;ve got the latest version from the repository. The green checkmark means that as far as this working copy is concerned, the last time it checked the repository things were up to date. If you have two working copies and one of them falls behind in terms of being up to date, you can do an &#8220;SVN Update&#8221; to update a working copy. This will go out and check the repository for updates and update the working copy accordingly.</p>
<p><a href="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-42.png" rel="lightbox[275]"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="362" alt="image" src="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-thumb-20.png" width="431" border="0"></a></p>
<p>If I add a new file to my working directory, you notice that it won&#8217;t automatically have any associated SVN icon. This is because by default the file will be considered &#8220;non-versioned&#8221;. To make it versioned you&#8217;ll need to right-click it and select &#8220;SVN Add&#8221;. When you are ready you will still need to commit the file to the repository.</p>
<h2>Deleting a File from the Working Copy</h2>
<p>If you want to delete a file from the working copy you have to do more than just pressing the delete button. If you just press the delete button, then the repository doesn&#8217;t know that you meant to delete it, so the next time you do an update it will re-appear (copied back from the version in the repository). Instead you need to right-click the file and select &#8220;SVN Delete&#8221;.</p>
<p><a href="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-44.png" rel="lightbox[275]"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="454" alt="image" src="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-thumb-21.png" width="426" border="0"></a></p>
<p>That will delete the file, but also mark the file as deleted within your working copy. You will again need to do an commit to make the deletion in the repository.</p>
<p><a href="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-46.png" rel="lightbox[275]"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="482" alt="image" src="http://annoyed.ca/wp-content/uploads/2009/02/windowslivewriteranintroductiontosubversion-d8d9image-thumb-22.png" width="458" border="0"></a></p>
<h2>Revisions</h2>
<p>Every time you make a commit to the repository, the revision number of the repository increases by one. Revisions are counted for the repository as a whole. The most recent revision can be referred to by the alias &#8220;HEAD&#8221;.</p>
<h2>What are all the .svn folders in my Working Copy?</h2>
<p>If you look closely in your working copy, you may see an .svn folder in each folder of your working copy. The folders are hidden folders, so depending on the Windows settings you may not see them, but they are there. Those folders contain the information that Subversion uses to link your working copy to the repository. If ever you need to get a copy of what&#8217;s in the repository, but without all the .svn folders, say for example you&#8217;re ready to publish it or hand the files over to your client, you can do an &#8220;SVN Export&#8221; into a new folder to get a &#8220;clean&#8221; copy of what&#8217;s in your repository.</p>
<h2>Conclusion</h2>
<p>This tutorial has just scratched the surface of what you can do with Subversion. We&#8217;ve seen how to create a Subversion repository, add files to it, checkout a working copy, modify, add, delete and commit files to the repository, revert files back from the repository and export a copy of the files suitable for distribution. We haven&#8217;t talked about integrating subversion with your favourite editor or IDE, or about advanced topics like tagging, branching. Those are topics worthy of their own tutorial.</p>
<p>I use Subversion on a daily basis for tracking everything from projects I am working on, to configuration files, to my resume.</p>
<p>I hope you found this tutorial useful.</p>
]]></content:encoded>
			<wfw:commentRss>http://annoyed.ca/2009/03/05/an-introduction-to-subversion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Full Story: How Windows 7 Messed Up My System and How Windows Home Server Saved the Day</title>
		<link>http://annoyed.ca/2009/01/30/full-story-how-windows-7-messed-up-my-system-and-how-windows-home-server-saved-the-day/</link>
		<comments>http://annoyed.ca/2009/01/30/full-story-how-windows-7-messed-up-my-system-and-how-windows-home-server-saved-the-day/#comments</comments>
		<pubDate>Sat, 31 Jan 2009 02:53:29 +0000</pubDate>
		<dc:creator>Christopher Hyne</dc:creator>
				<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://annoyed.ca/2009/01/30/full-story-how-windows-7-messed-up-my-system-and-how-windows-home-server-saved-the-day/</guid>
		<description><![CDATA[I&#8217;ve had a number of people ask about the two posts I made to Twitter (and this blog) yesterday. So here&#8217;s the story. I&#8217;d heard a lot of good things about the new Windows 7 Beta operating system. I&#8217;d read &#8230; <a href="http://annoyed.ca/2009/01/30/full-story-how-windows-7-messed-up-my-system-and-how-windows-home-server-saved-the-day/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve had a number of people ask about the two posts I made to Twitter (and this blog) yesterday. So here&#8217;s the story.</p>
<p>I&#8217;d heard a lot of good things about the new Windows 7 Beta operating system. I&#8217;d read a number of posts about how easy it is to dual-boot a Windows 7 installation along side a Windows XP or Vista installation.</p>
<p>My computer has 2 Windows XP installations: one that I use for everyday computing and one that basically exists only for those rare occasions when the main installation won&#8217;t boot for whatever reason (I&#8217;ve used the second installation 2 or 3 times in the last 5 years. It&#8217;s handy to have around). I figured a Windows 7 installation would be just as useful a as second installation for recovery. So I decided to install Windows 7 on the hard disk partition that contained my second Windows XP installation.</p>
<p>So I started up the Windows 7 installation, found the partition that contained the second Windows XP installation, re-formatted it, and installed Windows 7. Piece of cake, worked like a charm. Poked around in Windows 7 for awhile, overall a pretty cool operating system. Then I started thinking about rebooting into Windows XP (my primary computing environment). Started looking around to check that Windows 7 had set itself up with an entry to boot &#8220;Previous Version of Windows&#8221; as all the blog posts had told me it would.</p>
<p>It hadn&#8217;t. In fact it wasn&#8217;t even aware that the hard drive containing my Windows XP installation even existed.</p>
<p>Then it hit me. My XP installation is on a RAID 0 volume. Windows 7 didn&#8217;t have the drivers, so it didn&#8217;t find the drive, didn&#8217;t see the existing XP installation, and didn&#8217;t set up dual-boot automatically. Fortunately Windows 7 was able to recognize the older RAID drivers, and I was able to get it to find the RAID volume. Now I just had to get the boot loader set up. Well, I can tell you one of the things about Windows 7 that isn&#8217;t that great the tool for managing the boot loader bcdedit.exe. I tried a couple of times to get a working boot record going, but ultimately had to give up.</p>
<p>How was I going to get back into my Windows XP installation, where ALL my files are located? Fortunately I have a Windows Home Server that backup all the PCs on my home network every night. I was able to pop the Restore CD into my PC, and rebooted into the recovery console. At first it didn&#8217;t find my network card, or my RAID volume, but all I had to do was put the network and RAID drivers on a USB drive and hit the &#8220;Scan&#8221; button. It takes a minute or two and scans the USB drive, finds the drivers and enabled the network card and RAID volume.</p>
<p>It then connects to the Windows Home Server, prompts you to pick which volumes you wish to restore and from which backup. I choose my D: drive (my second Windows XP installation) and let it do it&#8217;s thing. In about 20 minutes my D: drive was back to the state it was in at 2:30 am that morning. Boot loader and all.</p>
<p>So, in the end it wasn&#8217;t necessarily Windows 7 that messed things up. But it was Windows Home Server that saved me in the end.</p>
<p>In about 20 minutes.</p>
]]></content:encoded>
			<wfw:commentRss>http://annoyed.ca/2009/01/30/full-story-how-windows-7-messed-up-my-system-and-how-windows-home-server-saved-the-day/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My Current Thoughts on the OC Transpo Bus Strike</title>
		<link>http://annoyed.ca/2009/01/28/my-current-thoughts-on-the-oc-transpo-bus-strike/</link>
		<comments>http://annoyed.ca/2009/01/28/my-current-thoughts-on-the-oc-transpo-bus-strike/#comments</comments>
		<pubDate>Thu, 29 Jan 2009 02:08:40 +0000</pubDate>
		<dc:creator>Christopher Hyne</dc:creator>
				<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://annoyed.ca/2009/01/28/my-current-thoughts-on-the-oc-transpo-bus-strike/</guid>
		<description><![CDATA[The union is doing what it has to do. They are being asked to give up certain benefits (i.e. the ability to control their scheduling). From the union&#8217;s perspective it&#8217;s a dangerous precedent if they start giving stuff up so &#8230; <a href="http://annoyed.ca/2009/01/28/my-current-thoughts-on-the-oc-transpo-bus-strike/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>The union is doing what it has to do. They are being asked to give up certain benefits (i.e. the ability to control their scheduling). From the union&#8217;s perspective it&#8217;s a dangerous precedent if they start giving stuff up so they HAVE to hold their ground.
<p>The problem I think is that the majority of Ottawa residents (myself included) believe that the drivers don&#8217;t deserve to have control of the scheduling (in part because, true or false, we hear that they abuse it). The residents who most want this strike settled at any cost are those who are suffering the most because of it. Therefore the union needs as many people as possible suffering, so that the strike gets settled at any cost, most likely in the union&#8217;s favour. That is why the union had to strike just before Christmas, in the dead of winter. Maximum pain = union&#8217;s best chances of getting/keeping what it wants.
<p>The union and drivers are prepared to see this through, because we&#8217;ve heard them say that they banked up their overtime in the summer (presumably by abusing their scheduling privileges) so they can afford to keep fighting.
<p>For highlights of their last contract, Google &#8220;oc transpo collective agreement&#8221; (should be the first result, a PDF).
<p>Their starting salary is more than what mine would be if I was starting out today. They start earning 6 weeks of vacation 4 years before I will. The most senior drivers will get 7 weeks, which isn&#8217;t even possible for me. They have just as many paid holidays as I do.
<p>I&#8217;m a federal civil servant working in the Information Technology (IT) field, for goodness sakes. I thought I had one of the cushiest jobs in the world, but apparently OC Transpo bus drivers do.
<p>I am in my early 30s and don&#8217;t have a drivers license. I&#8217;ve lived in Ottawa all my life, and my reasoning has always been that I don&#8217;t need a license because we had an awesome bus system. I&#8217;ve defended the bus system.
<p>I&#8217;m beginning to change my mind.
<p>I&#8217;ll either be getting my drivers license soon, or leaving Ottawa.
<p>Seriously.
<p align="center"></p>
<div class="wlWriterSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:f34988fd-ba59-430b-a0c5-43b0ed08167d" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px; text-align: center">
<div id="b400eace-4273-4acc-954d-5d72378459e6" style="margin: 0px; padding: 0px; display: inline;">
<div><a href="http://www.youtube.com/watch?v=rhsEa1NuPuQ&amp;eurl=http://www.rickcurrie.com/AV.htm&amp;feature=player_embedded" target="_new"><img src="http://annoyed.ca/wp-content/uploads/2009/01/windowslivewritermycurrentthoughtsontheoctranspobusstrike-12956video0a041c113a4c.jpg" galleryimg="no" onload="var downlevelDiv = document.getElementById('b400eace-4273-4acc-954d-5d72378459e6'); downlevelDiv.innerHTML = &quot;&lt;div&gt;&lt;object width=\&quot;425\&quot; height=\&quot;355\&quot;&gt;&lt;param name=\&quot;movie\&quot; value=\&quot;http://www.youtube.com/v/rhsEa1NuPuQ&amp;eurl=http://www.rickcurrie.com/AV.htm&amp;feature=player_embedded\&quot;&gt;&lt;\/param&gt;&lt;param name=\&quot;wmode\&quot; value=\&quot;transparent\&quot;&gt;&lt;\/param&gt;&lt;embed src=\&quot;http://www.youtube.com/v/rhsEa1NuPuQ&amp;eurl=http://www.rickcurrie.com/AV.htm&amp;feature=player_embedded\&quot; type=\&quot;application/x-shockwave-flash\&quot; wmode=\&quot;transparent\&quot; width=\&quot;425\&quot; height=\&quot;355\&quot;&gt;&lt;\/embed&gt;&lt;\/object&gt;&lt;\/div&gt;&quot;;" alt=""></a></div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://annoyed.ca/2009/01/28/my-current-thoughts-on-the-oc-transpo-bus-strike/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Defining Access Strategy in FluentNHibernate</title>
		<link>http://annoyed.ca/2009/01/05/defining-access-strategy-in-fluentnhibernate/</link>
		<comments>http://annoyed.ca/2009/01/05/defining-access-strategy-in-fluentnhibernate/#comments</comments>
		<pubDate>Tue, 06 Jan 2009 02:57:02 +0000</pubDate>
		<dc:creator>Christopher Hyne</dc:creator>
				<category><![CDATA[Fluent NHibernate]]></category>

		<guid isPermaLink="false">http://annoyed.ca/2009/01/05/defining-access-strategy-in-fluentnhibernate/</guid>
		<description><![CDATA[I am posting this because it took me a little while (longer than it should have) to figure out how to define the access strategy for an domain object&#8217;s fields or properties. The documentation for FluentNHibernate is still fairly basic, &#8230; <a href="http://annoyed.ca/2009/01/05/defining-access-strategy-in-fluentnhibernate/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>I am posting this because it took me a little while (longer than it should have) to figure out how to define the access strategy for an domain object&#8217;s fields or properties. The documentation for FluentNHibernate is still fairly basic, and Googling for the answer didn&#8217;t get me anywhere. In the end I figured it out from Visual Studio&#8217;s intellisense (which frankly is where I should have looked in the first place).</p>
<p>For all those like me who decide to Google first, here is the answer.</p>
<p>A number of the *Part classes in the FluentNHibernate.Mapping namespace implement the IAccessStrategy(Of ComponentPart(Of T)) interface. This interface defines one property, Access which returns an AccessStrategyBuilder(Of T) object. The AccessStrategyBuilder object has a number of methods used to define the access strategy:</p>
<ul>
<li>AsCamelCaseField
<li>AsField
<li>AsLowerCaseField
<li>AsPascalCaseField
<li>AsProperty
<li>AsReadOnlyPropertyThroughCamelCaseField
<li>AsReadOnlyPropertyThroughLowerCaseField
<li>AsReadOnlyPropertyThroughPascalCaseField</li>
</ul>
<p>This information I found relatively quickly. What I was missing was how to specify that my camel case fields are prefixed with the underscore character. But all of the CamelCase, LowerCase and PascalCase variations of the methods listed above have an overload which accepts an instance of a Prefix object, of which there are 4 variations:</p>
<ul>
<li>m
<li>mUnderscore
<li>None
<li>Underscore</li>
</ul>
<p>So in the end, my mapping is as follows:</p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">WithTable(<span style="color: #006080">"client"</span>)

Id(<span style="color: #0000ff">Function</span>(c) c.ID, <span style="color: #006080">"id"</span>).WithUnsavedValue(0).GeneratedBy.Identity()

Map(<span style="color: #0000ff">Function</span>(c) c.AccountName).TheColumnNameIs(<span style="color: #006080">"account_name"</span>)
Map(<span style="color: #0000ff">Function</span>(c) c.Company).TheColumnNameIs(<span style="color: #006080">"company"</span>)
Map(<span style="color: #0000ff">Function</span>(c) c.Created).TheColumnNameIs(<span style="color: #006080">"created"</span>)
Map(<span style="color: #0000ff">Function</span>(c) c.Updated).TheColumnNameIs(<span style="color: #006080">"updated"</span>)
Map(<span style="color: #0000ff">Function</span>(c) c.UseAdministrativeContactAsBillingContact).TheColumnNameIs(<span style="color: #006080">"blg_is_adm"</span>)

Component(Of Client)(<span style="color: #0000ff">Function</span>(c) c.AdministrativeContact, _
                     <span style="color: #0000ff">AddressOf</span> MapAdministrativeContact).Access.AsCamelCaseField(Prefix.Underscore)
Component(Of Client)(<span style="color: #0000ff">Function</span>(c) c.BillingContact, _
                     <span style="color: #0000ff">AddressOf</span> MapBillingContact).Access.AsCamelCaseField(Prefix.Underscore)</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://annoyed.ca/2009/01/05/defining-access-strategy-in-fluentnhibernate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My First Extension Method</title>
		<link>http://annoyed.ca/2008/12/27/my-first-extension-method/</link>
		<comments>http://annoyed.ca/2008/12/27/my-first-extension-method/#comments</comments>
		<pubDate>Sat, 27 Dec 2008 05:43:53 +0000</pubDate>
		<dc:creator>Christopher Hyne</dc:creator>
				<category><![CDATA[S#arp Architecture]]></category>
		<category><![CDATA[VB.Net]]></category>

		<guid isPermaLink="false">http://annoyed.ca/2008/12/28/my-first-extension-method/</guid>
		<description><![CDATA[This evening I wrote my first VB.Net extension method while working on my S#arp Architecture based project. I added another overload of the TextBox method (which is itself an extension method, I believe). I wanted to be able to specify &#8230; <a href="http://annoyed.ca/2008/12/27/my-first-extension-method/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>This evening I wrote my first VB.Net extension method while working on my S#arp Architecture based project. I added another overload of the TextBox method (which is itself an extension method, I believe). I wanted to be able to specify the size of the text box. One of the existing TextBox methods has the following signature:</p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">HtmlHelper.TextBox(name <span style="color: #0000ff">As</span> <span style="color: #0000ff">String</span>, value <span style="color: #0000ff">As</span> <span style="color: #0000ff">Object</span>, htmlAttributes <span style="color: #0000ff">As</span> IDictionary(Of <span style="color: #0000ff">String</span>, <span style="color: #0000ff">Object</span>))</pre>
</div>
<p>I wanted to be able to specify a text box size without having to declare a new IDictionary every time. So I wrote the following extension method:</p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">&lt;Extension()&gt; _
<span style="color: #0000ff">Public</span> <span style="color: #0000ff">Function</span>(html <span style="color: #0000ff">As</span> HtmlHelper, name <span style="color: #0000ff">As</span> <span style="color: #0000ff">String</span>, value <span style="color: #0000ff">As</span> <span style="color: #0000ff">Object</span>, size <span style="color: #0000ff">As</span> <span style="color: #0000ff">Integer</span>)
    <span style="color: #0000ff">Dim</span> attributes <span style="color: #0000ff">as</span> IDictionary(Of <span style="color: #0000ff">String</span>, <span style="color: #0000ff">Object</span>) = <span style="color: #0000ff">New</span> Dictionary(Of <span style="color: #0000ff">String</span>, <span style="color: #0000ff">Object</span>)

    attributes.Add(<span style="color: #006080">"size"</span>, size)

    <span style="color: #0000ff">Return</span> html.TextBox(name, value, attributes)
<span style="color: #0000ff">End</span> Function</pre>
</div>
<p>Neat stuff.</p>
<p>Now I just have to figure out how to create an extension method that will allow me to pass a lambda expression to RedirectToAction().</p>
]]></content:encoded>
			<wfw:commentRss>http://annoyed.ca/2008/12/27/my-first-extension-method/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Inner Workings of *.vbproj Files: &lt;ProjectTypeGuids&gt;</title>
		<link>http://annoyed.ca/2008/12/23/the-inner-workings-of-vbproj-files-projecttypeguids/</link>
		<comments>http://annoyed.ca/2008/12/23/the-inner-workings-of-vbproj-files-projecttypeguids/#comments</comments>
		<pubDate>Wed, 24 Dec 2008 02:58:26 +0000</pubDate>
		<dc:creator>Christopher Hyne</dc:creator>
				<category><![CDATA[ASP.Net]]></category>
		<category><![CDATA[ASP.Net MVC]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[S#arp Architecture]]></category>
		<category><![CDATA[VB.Net]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://annoyed.ca/2008/12/26/the-inner-workings-of-vbproj-files-projecttypeguids/</guid>
		<description><![CDATA[During the conversion of the S#arp Architecture template project from C# to VB.Net I inadvertently broke (at least) one thing: the ability to add ASP.Net MVC items directly to the SharpArch.Web project directly from the &#8220;Add New Items&#8230;&#8221; dialog. This &#8230; <a href="http://annoyed.ca/2008/12/23/the-inner-workings-of-vbproj-files-projecttypeguids/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>During the conversion of the S#arp Architecture template project from C# to VB.Net I inadvertently broke (at least) one thing: the ability to add ASP.Net MVC items directly to the SharpArch.Web project directly from the &#8220;Add New Items&#8230;&#8221; dialog. This led to <a href="http://stackoverflow.com/questions/386548/how-to-enable-aspnet-mvc-item-templates-for-sarp-architecture-project" target="_blank">my first question asked on StackOverflow.com</a> (which I ended up answering myself, 38 minutes later).</p>
<p>Turns out Visual Studio project files can have an element called &lt;ProjectTypeGuids&gt; which contains one or more guids identifying what type of project the file describes. ASP.Net MVC projects have a particular guid specified: <strong>{603c0e0b-db56-11dc-be95-000d561079b0}</strong>.</p>
<p>So I added this guid to both my SharpArch.Web project file and my SharpArch.Controllers project file, and now I can add new MVC template items directly from the &#8220;Add New Item&#8230;&#8221; dialog. Cool!</p>
]]></content:encoded>
			<wfw:commentRss>http://annoyed.ca/2008/12/23/the-inner-workings-of-vbproj-files-projecttypeguids/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>S#arp Architecture</title>
		<link>http://annoyed.ca/2008/12/19/sarp-architecture/</link>
		<comments>http://annoyed.ca/2008/12/19/sarp-architecture/#comments</comments>
		<pubDate>Sat, 20 Dec 2008 03:57:18 +0000</pubDate>
		<dc:creator>Christopher Hyne</dc:creator>
				<category><![CDATA[ASP.Net MVC]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Fluent NHibernate]]></category>
		<category><![CDATA[NUnit]]></category>
		<category><![CDATA[Rhino Mocks]]></category>
		<category><![CDATA[S#arp Architecture]]></category>
		<category><![CDATA[VB.Net]]></category>

		<guid isPermaLink="false">http://annoyed.ca/2008/12/19/sarp-architecture/</guid>
		<description><![CDATA[I&#8217;ve been poking around in the latest release of the S#arp Architecture over the last couple days. I like what I see. Pronounced &#8220;Sharp Architecture,&#8221; this is a solid architectural foundation for rapidly building maintainable web applications leveraging the ASP.NET &#8230; <a href="http://annoyed.ca/2008/12/19/sarp-architecture/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve been poking around in the latest release of the <a href="http://code.google.com/p/sharp-architecture/" target="_blank">S#arp Architecture</a> over the last couple days. I like what I see.</p>
<blockquote><p>Pronounced &#8220;Sharp Architecture,&#8221; this is a solid architectural foundation for rapidly building maintainable web applications leveraging the ASP.NET MVC framework with NHibernate.</p>
</blockquote>
<p>This evening I took about an hour and converted the basic starter solution template from C# to VB.Net. Why? Well, for the following reasons:</p>
<ol>
<li>While I can work with C# well enough, I&#8217;m much more familiar with VB.Net, which I am required to use at my 9 to 5 job. I tend to stick with VB.Net even for my personal projects for simplicity. Anything I learn on my own I can easily apply at work.</li>
<li>It gave me an opportunity to confirm that I understand (at least at a high level) what the S#arp Architecture is doing.</li>
</ol>
<p>The conversion was straight forward. Pretty well every line of C# had a corresponding line in VB.Net. The only thing I had to add was an Imports tag in the markup of the Site.Master page in order to get the ActionLink and Image extension methods to resolve. I had already tried adding an imports to the code-behind with no luck. Not sure why that was necessary, but it worked.</p>
<p>The architecture is pretty neat. Here&#8217;s a few things I&#8217;ve noted already:</p>
<ul>
<li>The Models, Views and Controllers (I.e. the M, V and C in MVC) are each in their own projects.</li>
<li>The Repository/IRepository pattern is used, with the Interfaces defined in the same project as the Models, and the Repository implementation(s) in a separate project.</li>
<li>Includes support for NUnit, Castle Windsor, (Fluent) NHibernate, and Rhino Mocks</li>
<li>The ASP.Net MVC routes are defined in the Controllers project, not in the Global.asax of the Web/Views project. Excellent separation of concerns!</li>
</ul>
<p>I&#8217;m going to go ahead and trying putting together an actual application based on S#arp Architecture.</p>
]]></content:encoded>
			<wfw:commentRss>http://annoyed.ca/2008/12/19/sarp-architecture/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Secunia Personal Software Inspector</title>
		<link>http://annoyed.ca/2008/12/18/secunia-personal-software-inspector/</link>
		<comments>http://annoyed.ca/2008/12/18/secunia-personal-software-inspector/#comments</comments>
		<pubDate>Fri, 19 Dec 2008 03:18:41 +0000</pubDate>
		<dc:creator>Christopher Hyne</dc:creator>
				<category><![CDATA[Security]]></category>

		<guid isPermaLink="false">http://annoyed.ca/2008/12/17/secunia-personal-software-inspector/</guid>
		<description><![CDATA[I been using Secunia Personal Software Inspector (PSI) on my primary PC at home for about 3 or 4 weeks now and today I finally got my Secunia System Score to 100%. Secunia PSI is an application that scans your &#8230; <a href="http://annoyed.ca/2008/12/18/secunia-personal-software-inspector/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>I been using <a href="http://secunia.com/vulnerability_scanning/personal/" target="_blank">Secunia Personal Software Inspector</a> (PSI) on my primary PC at home for about 3 or 4 weeks now and today I finally got my Secunia System Score to 100%.</p>
<p>Secunia PSI is an application that scans your PC for installed programs and compares them against Secunia&#8217;s list of applications with known security vulnerabilities. It&#8217;s free for home users. When it&#8217;s not scanning it sits quietly in your system tray watching for changes in programs (added or removed).</p>
<p>It helped me realize that even though I was updating some software regularly, the updates would often leave the old, vulnerable version installed (I&#8217;m looking at you Java). Here&#8217;s what the overview screen looks like on my PC right now:</p>
<p align="center"><a href="http://annoyed.ca/wp-content/uploads/2008/12/windowslivewritersecuniapersonalsoftwareinspector-13521image-2.png" rel="lightbox[166]"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="416" alt="image" src="http://annoyed.ca/wp-content/uploads/2008/12/windowslivewritersecuniapersonalsoftwareinspector-13521image-thumb.png" width="509" border="0"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://annoyed.ca/2008/12/18/secunia-personal-software-inspector/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Working from Home</title>
		<link>http://annoyed.ca/2008/12/17/working-from-home/</link>
		<comments>http://annoyed.ca/2008/12/17/working-from-home/#comments</comments>
		<pubDate>Thu, 18 Dec 2008 03:18:45 +0000</pubDate>
		<dc:creator>Christopher Hyne</dc:creator>
				<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://annoyed.ca/2008/12/17/working-from-home/</guid>
		<description><![CDATA[In case you weren&#8217;t aware, we are on day 8 of a transit strike here in Ottawa. I don&#8217;t drive (at all) so I normally rely heavily on the bus system here (which, in my mind, is top notch, when &#8230; <a href="http://annoyed.ca/2008/12/17/working-from-home/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>In case you weren&#8217;t aware, we are on day 8 of a transit strike here in Ottawa. I don&#8217;t drive (at all) so I normally rely heavily on the bus system here (which, in my mind, is top notch, when it&#8217;s running). Fortunately the nature of my work (and my manager) has allowed me to work from home on most of the strike days so far.</p>
<p>I was a little worried about working from home. I wasn&#8217;t sure how productive I&#8217;d be. But as it turns out, I am more productive at home than I am in the office. Here is a quick pro and con list of my experience working from home so far:</p>
<p>Pros:</p>
<ul>
<li>I control the work environment (temperature, lighting, etc.)
<li>Quiet! I am all by myself all day (heaven for an introvert like me)
<li>More screen real-estate. At the office I have dual 17&#8243; monitors (both @ 1280&#215;1024). At home I am using a laptop (@ 1600&#215;1050), plus the laptop is hooked into my 2nd monitor via the KVM (@ 1280&#215;1024) PLUS I have my 24&#8243; monitor (@ 1920&#215;1200) connected to my home PC, which I can use for web browsing, media, etc). That&#8217;s over 5 million pixels in all!
<li>Quiet! I can get focused and stay focused (again, for an introvert, getting focused, or getting back into focus, can be difficult)
<li>Lunch and snacks are closer, and cheaper.
<li>I have full access to the office network (via VPN) and my office PC&#8217;s hard drive.
<li>Better chair than the one in my office.
<li>I can play my music as loud as I want!</li>
</ul>
<p>Cons (both relatively easy to resolve):</p>
<ul>
<li>The laptop only has 1 GB of RAM!
<li><strike>I haven&#8217;t been able to get the laptop to share my mouse and keyboard (the mouse works, but it&#8217;s laggy. No wonder though: USB Mouse -&gt; USB to PS/2 adapter -&gt; KVM -&gt; KVM Cable -&gt; PS/2 to USB adapter -&gt; laptop)</strike>. <strong>Update</strong>: Resolved via laptop docking station borrowed from the office.</li>
</ul>
<p>Here&#8217;s my home office setup:</p>
<p align="center"><a href="http://annoyed.ca/wp-content/uploads/2008/12/windowslivewriterworkingfromhome-13043img-2150-2.jpg" target="" rel="lightbox[160]"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="250" alt="IMG_2150" src="http://annoyed.ca/wp-content/uploads/2008/12/windowslivewriterworkingfromhome-13043img-2150-thumb.jpg" width="326" border="0"></a> <a href="http://annoyed.ca/wp-content/uploads/2008/12/windowslivewriterworkingfromhome-13043img-2151-2.jpg" rel="lightbox[160]"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="250" alt="IMG_2151" src="http://annoyed.ca/wp-content/uploads/2008/12/windowslivewriterworkingfromhome-13043img-2151-thumb.jpg" width="327" border="0"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://annoyed.ca/2008/12/17/working-from-home/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&quot;Weird Al&quot; Yankovic &#8211; Trapped in the Drive-Thru</title>
		<link>http://annoyed.ca/2008/12/07/weird-al-yankovic-trapped-in-the-drive-thru/</link>
		<comments>http://annoyed.ca/2008/12/07/weird-al-yankovic-trapped-in-the-drive-thru/#comments</comments>
		<pubDate>Mon, 08 Dec 2008 02:59:02 +0000</pubDate>
		<dc:creator>Christopher Hyne</dc:creator>
				<category><![CDATA[Quick Videos]]></category>

		<guid isPermaLink="false">http://annoyed.ca/2008/12/07/weird-al-yankovic-trapped-in-the-drive-thru/</guid>
		<description><![CDATA[]]></description>
				<content:encoded><![CDATA[<p align="center"><embed src="http://www.youtube.com/v/qmGVYki-oyQ&amp;hl=en&amp;fs=1&amp;rel=0&amp;border=1" width="445" height="364" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true"></p>
<p></embed></p>
]]></content:encoded>
			<wfw:commentRss>http://annoyed.ca/2008/12/07/weird-al-yankovic-trapped-in-the-drive-thru/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tech Days Ottawa</title>
		<link>http://annoyed.ca/2008/11/29/tech-days-ottawa/</link>
		<comments>http://annoyed.ca/2008/11/29/tech-days-ottawa/#comments</comments>
		<pubDate>Sun, 30 Nov 2008 02:41:52 +0000</pubDate>
		<dc:creator>Christopher Hyne</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Microsoft]]></category>

		<guid isPermaLink="false">http://annoyed.ca/2008/11/29/tech-days-ottawa/</guid>
		<description><![CDATA[I attended Tech Days in Ottawa this past Thursday. I stuck with the &#8220;Web Developer&#8221; stream all day and I have to say, I was a little disappointed. To be fair I think I had very high expectations. I&#8217;ve been &#8230; <a href="http://annoyed.ca/2008/11/29/tech-days-ottawa/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>I attended Tech Days in Ottawa this past Thursday. I stuck with the &#8220;Web Developer&#8221; stream all day and I have to say, I was a little disappointed.</p>
<p>To be fair I think I had very high expectations. I&#8217;ve been watching a lot of the PDC session videos online, videos of presentations by Oren Eini (aka Ayende Rahien) and attending Karl Seguin recent excellent presentation at ODNC. Needless to say, the people who presented at a one day conference in Ottawa (of all places) were not all of the same calibre. On top of that, the presentations and slide decks used are not created by the presenters. These are just people re-presenting someone else&#8217;s presentation (and in some cases re-telling someone else&#8217;s jokes).</p>
<p>The conference&#8217;s swag bag, or rather box, was a cereal box of &#8220;Techie Crunch&#8221; with some relatively good stuff including:</p>
<ol>
<li>6 month TechNet subscription (but I already have a 1 year subscription)
<li>Full version of Visual Studio 2008 Professional (already have this too)
<li>Full version of Expression Web 2 (no source control support,&nbsp; not even for Visual SourceSafe. BOO!)
<li>Full TechEd DVD set (this is actually AWESOME)</li>
</ol>
<p>The last one includes hundreds of presentations, including the presentations I attend, but presented by the original presenters, by engaging and entertaining people.</p>
<p>Ironically, the best presentation I attended all day was given by a man with a primarily Unix/Linux background who nearly completely skipped over the Microsoft specific topics in the slide desk he was presenting.</p>
]]></content:encoded>
			<wfw:commentRss>http://annoyed.ca/2008/11/29/tech-days-ottawa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Finally Got Dual Monitors Working</title>
		<link>http://annoyed.ca/2008/11/24/finally-got-dual-monitors-working/</link>
		<comments>http://annoyed.ca/2008/11/24/finally-got-dual-monitors-working/#comments</comments>
		<pubDate>Tue, 25 Nov 2008 02:33:08 +0000</pubDate>
		<dc:creator>Christopher Hyne</dc:creator>
				<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://annoyed.ca/2008/11/24/finally-got-dual-monitors-working/</guid>
		<description><![CDATA[I spent nearly 2 hours trying to get it working yesterday (or rather spent 15 minutes trying to get it working, and 1 hour 45 minutes trying to undo the damage and get my computer useable again). I decided to &#8230; <a href="http://annoyed.ca/2008/11/24/finally-got-dual-monitors-working/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>I spent nearly 2 hours trying to get it working yesterday (or rather spent 15 minutes trying to get it working, and 1 hour 45 minutes trying to undo the damage and get my computer useable again). I decided to try again this evening and got it working in 5 minutes.</p>
<p>This picture is a (slightly chopped) image of my complete desktop. The original image is 3200&#215;1024, my actual screen resolutions are 1920&#215;1200 and 1280&#215;1024 so the image cropped 176 pixels off the bottom of my big screen.</p>
<p><a href="http://annoyed.ca/wp-content/uploads/2008/11/windowslivewriterfinallygotdualmonitorsworking-12753image-2.png" rel="lightbox[148]"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="261" alt="image" src="http://annoyed.ca/wp-content/uploads/2008/11/windowslivewriterfinallygotdualmonitorsworking-12753image-thumb.png" width="804" border="0"></a> </p>
<p>Mind blowing screen real estate! Awesome!</p>
]]></content:encoded>
			<wfw:commentRss>http://annoyed.ca/2008/11/24/finally-got-dual-monitors-working/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Setting Up a Local PHP Development Environment</title>
		<link>http://annoyed.ca/2008/11/23/setting-up-a-local-php-development-environment/</link>
		<comments>http://annoyed.ca/2008/11/23/setting-up-a-local-php-development-environment/#comments</comments>
		<pubDate>Mon, 24 Nov 2008 03:19:16 +0000</pubDate>
		<dc:creator>Christopher Hyne</dc:creator>
				<category><![CDATA[NetBeans]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://annoyed.ca/2008/11/23/setting-up-a-local-php-development-environment/</guid>
		<description><![CDATA[I spent a good part of yesterday afternoon setting up a PHP development environment on my primary PC. I already had PHP setup to run locally under IIS, but I wanted to make some changes to a site which makes &#8230; <a href="http://annoyed.ca/2008/11/23/setting-up-a-local-php-development-environment/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>I spent a good part of yesterday afternoon setting up a PHP development environment on my primary PC. I already had PHP setup to run locally under IIS, but I wanted to make some changes to a site which makes use of Apache&#8217;s mod_rewrite module for &#8216;routing&#8217;. I figured it would be easier to get Apache setup locally that try to find some way of rewriting URLs in IIS (version 6, not 7).</p>
<p>So I downloaded a Windows binary package of Apache and installed it. I had some issues with installing for current user only, so I ended up installing it for all users. Configuring Apache was fairly straightforward, but then I have a lot of experience with Apache on Linux and the configuration files on Windows are the same. I did have to tweak one of my RewriteRule directives for some reason. Frankly I can understand why I had to change it from what I had in production. What I don&#8217;t understand is why production works the way it is.</p>
<p>I already had both MySQL and PHP installed. I did go ahead and install the PEAR classes. I also had to grab a copy of the HTML/IT PEAR package from one of my Linux servers since I make extensive use of it and it no longer seems to be supported in the official PEAR repository. I&#8217;ll either have to switch to another PHP template solution (like Smarty) or start using a PHP framework (like CodeIgniter). For now I&#8217;ll continue with my customize HTML/IT implementation I guess.</p>
<p>Next I needed a PHP IDE. In the past I&#8217;ve used Dreamweaver, but I was looking for something new (and something free, LEGALLY free I mean). I&#8217;ve been trying out Aptana Studio, but I decided to try the latest release of NetBeans. So far I am pretty happy with NetBeans. It seems to integrate pretty well with my Subversion version control repository, seems stable and has pretty good intellisense. It&#8217;s also XDebug compatible, so I can debug my PHP code in the IDE like I would debug .Net code in Visual Studio. It&#8217;s already helped me fix a whole bunch of errors I wasn&#8217;t even aware of (typos, unmatched tags, etc).</p>
]]></content:encoded>
			<wfw:commentRss>http://annoyed.ca/2008/11/23/setting-up-a-local-php-development-environment/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Karl Seguin&#8217;s Foundations of Programming e-Book</title>
		<link>http://annoyed.ca/2008/11/18/karl-seguins-foundations-of-programming-e-book/</link>
		<comments>http://annoyed.ca/2008/11/18/karl-seguins-foundations-of-programming-e-book/#comments</comments>
		<pubDate>Wed, 19 Nov 2008 02:17:41 +0000</pubDate>
		<dc:creator>Christopher Hyne</dc:creator>
				<category><![CDATA[.Net]]></category>

		<guid isPermaLink="false">http://annoyed.ca/2008/11/18/karl-seguins-foundations-of-programming-e-book/</guid>
		<description><![CDATA[I just finished reading Karl Seguin&#8216;s excellent, and free, e-Book &#8220;Foundations of Programming&#8220;. The book was brought to my attention via an invite to a lunch time session Karl is doing for the Ottawa .Net Community this Thursday. I find &#8230; <a href="http://annoyed.ca/2008/11/18/karl-seguins-foundations-of-programming-e-book/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>I just finished reading <a href="http://codebetter.com/blogs/karlseguin/default.aspx" target="_blank">Karl Seguin</a>&#8216;s excellent, and free, e-Book &#8220;<a href="http://codebetter.com/blogs/karlseguin/archive/2008/06/24/foundations-of-programming-ebook.aspx" target="_blank">Foundations of Programming</a>&#8220;.</p>
<p>The book was brought to my attention via an invite to a lunch time session Karl is doing for the Ottawa .Net Community this Thursday. I find both the presentation and the e-book particularly timely as I am just recently getting into Test Driven Development (TDD), unit tests, mocking, Dependency Injection (DI) and Inversion of Control (IoC) frameworks.</p>
<p>Most of these things I&#8217;ve known about for some time, but I am just starting to actually use them all together, and I am finally starting to &#8216;grok&#8217; them.</p>
<p>After reading the book I am looking forward to Karl&#8217;s presentation on Thursday all the more.</p>
]]></content:encoded>
			<wfw:commentRss>http://annoyed.ca/2008/11/18/karl-seguins-foundations-of-programming-e-book/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>I Plugged My RSS Feed Into Wordle&#8230;</title>
		<link>http://annoyed.ca/2008/11/14/i-plugged-my-rss-feed-into-wordle/</link>
		<comments>http://annoyed.ca/2008/11/14/i-plugged-my-rss-feed-into-wordle/#comments</comments>
		<pubDate>Sat, 15 Nov 2008 01:33:39 +0000</pubDate>
		<dc:creator>Christopher Hyne</dc:creator>
				<category><![CDATA[My Blog]]></category>

		<guid isPermaLink="false">http://annoyed.ca/2008/11/14/i-plugged-my-rss-feed-into-wordle/</guid>
		<description><![CDATA[&#8230; And this is what I got. &#160; Do you think I blog about code a lot?]]></description>
				<content:encoded><![CDATA[<p>&#8230; And this is what I got.</p>
<p><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="477" alt="image" src="http://annoyed.ca/wp-content/uploads/2008/11/windowslivewriteripluggedmyrssfeedintowordle-11a1eimage-3.png" width="748" border="0">&nbsp;</p>
<p>Do you think I blog about code a lot?</p>
]]></content:encoded>
			<wfw:commentRss>http://annoyed.ca/2008/11/14/i-plugged-my-rss-feed-into-wordle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Investigating a .Net Web Application&#8217;s Performance Issues</title>
		<link>http://annoyed.ca/2008/11/08/investigating-a-net-web-applications-performance-issues/</link>
		<comments>http://annoyed.ca/2008/11/08/investigating-a-net-web-applications-performance-issues/#comments</comments>
		<pubDate>Sun, 09 Nov 2008 03:28:26 +0000</pubDate>
		<dc:creator>Christopher Hyne</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://annoyed.ca/2008/11/08/investigating-a-net-web-applications-performance-issues/</guid>
		<description><![CDATA[Yesterday my boss and I meet with a group that has been having some significant performance issues with one of their web applications. It&#8217;s a basic .Net web forms application (in C#). Their issue was that they had one page &#8230; <a href="http://annoyed.ca/2008/11/08/investigating-a-net-web-applications-performance-issues/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Yesterday my boss and I meet with a group that has been having some significant performance issues with one of their web applications.</p>
<p>It&#8217;s a basic .Net web forms application (in C#). Their issue was that they had one page that was taking upwards of 75 seconds to load! Seriously. 75 seconds! They said they were using NHibernate and they had tracked the issue down to one method that was taking up the majority of those 75 seconds. They also said they had tried some direct database (Oracle) queries that returned MUCH faster than the NHibernate.</p>
<p>We suggested that they look at caching the results of the database queries and that they confirm exactly what queries NHibernate is making on their behalf (I think they assumed it would execute the same query they had tested directly, which may or may not be the case).</p>
<p>Now I am a fan of NHibernate, and I have done some things with it that resulted in less than stellar performance, but I&#8217;ve always found tweak things to near direct database performance levels without much effort by changing/correcting some basic assumptions I had about the data and model. So when I left the meeting I felt that NHibernate had unfairly been labelled as the source of the performance issues, so I decided to have a look at the code for myself.</p>
<p>After grabbing a local copy of the code from their source control repository, I ran the code in debug mode and quickly came to the conclusion that the method they had identified as taking a long time to execute was in fact really taking a long time to execute. So I had a closer look at that method, and here (essentially) is what I saw:</p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #008000">/* ... */</span>
IQuery query = CreateQuery(<span style="color: #006080">"SELECT ..."</span>);

<span style="color: #0000ff">for</span> (i = 0; i &lt; query.List().Count; i++)
{
    <span style="color: #0000ff">if</span> ((!((<span style="color: #0000ff">object</span>[])(<span style="color: #0000ff">new</span> ArrayList(query.List())[i]))[0] == <span style="color: #0000ff">null</span>) 
       &amp;&amp; (!((<span style="color: #0000ff">object</span>[])(<span style="color: #0000ff">new</span> ArrayList(query.List())[i]))[2] == <span style="color: #0000ff">null</span>))
    {
        String <span style="color: #0000ff">value</span> = (((<span style="color: #0000ff">object</span>[])(<span style="color: #0000ff">new</span> ArrayList(query.List())))[2]).ToString();
    }
}
<span style="color: #008000">/* ... */</span></pre>
</div>
<p>I am &#8220;paraphrasing&#8221; a bit (the real code was worse).</p>
<p>The query.List() call returns an IList instance containing all the results of the SQL query. I don&#8217;t know if each call to query.List() actually executes the database query again (there may be some caching involved somewhere) but each call to query.List() did involve some database activity (according to my network sniffer). You notice that query.List is being called 3 times per loop (in the real code it was more like 6 times per loop)!</p>
<p>Changing this code to make one call to query.List, storing the results in a local IList variable and subsequently re-using that local variable shaved nearly 50 seconds of the response time.</p>
<p>On top of that there would also be improvements by removing the code that creates 3 ArrayLists per loop (again in the real code, 6 ArrayLists per loop), copies the IList of database results into each ArrayList, uses each of those ArrayLists to access only one single item and them discards the ArrayLists (only to recreate them again on the next loop).</p>
<p>NHibernate wasn&#8217;t the source of their problem&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://annoyed.ca/2008/11/08/investigating-a-net-web-applications-performance-issues/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
