<?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>Ryan J. Thompson</title>
	<atom:link href="http://ry.ca/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://ry.ca/blog</link>
	<description>Technical Tidbits</description>
	<lastBuildDate>Wed, 02 Mar 2011 01:35:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>HP Laserjet 2600 or 2605 toner: &#8220;Replace supplies&#8221; is a lie</title>
		<link>http://ry.ca/blog/2009/08/hp-laserjet-2600-or-2605-toner-replace-supplies-is-a-lie/</link>
		<comments>http://ry.ca/blog/2009/08/hp-laserjet-2600-or-2605-toner-replace-supplies-is-a-lie/#comments</comments>
		<pubDate>Thu, 20 Aug 2009 15:33:25 +0000</pubDate>
		<dc:creator>Ryan Thompson</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Technical Articles]]></category>
		<category><![CDATA[2600]]></category>
		<category><![CDATA[2605]]></category>
		<category><![CDATA[2605dn]]></category>
		<category><![CDATA[hp]]></category>
		<category><![CDATA[hplj]]></category>
		<category><![CDATA[laserjet]]></category>
		<category><![CDATA[scam]]></category>
		<category><![CDATA[supplies]]></category>
		<category><![CDATA[toner]]></category>

		<guid isPermaLink="false">http://ry.ca/blog/?p=148</guid>
		<description><![CDATA[I&#8217;ve had a Laserjet 2605dn for a few years. It&#8217;s been a pretty good printer, but I&#8217;d like to throw it in the bin. But first, if you will: fraud, n. 1. A deception deliberately practiced in order to secure unfair or unlawful gain. 2. A piece of trickery; a trick. 3. a. One that [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve had a Laserjet 2605dn for a few years. It&#8217;s been a pretty good printer, but I&#8217;d like to throw it in the bin. But first, if you will:</p>
<p style="padding-left: 30px;"><em>fraud,</em> n.</p>
<p style="padding-left: 30px;">1. A deception deliberately practiced in order to secure unfair or unlawful gain.<br />
2. A piece of trickery; a trick.<br />
3. a. One that defrauds; a cheat. b. One who assumes a false pose; an impostor.</p>
<p><img class="alignleft" title="Scam truck" src="http://farm3.static.flickr.com/2037/2046188221_dbd7640faf.jpg" alt="" width="333" height="250" /></p>
<p>It&#8217;s no secret that printer companies don&#8217;t make any money off the actual printers. The supplies (like toner) are where they make their millions.</p>
<p>When all three of my cyan, magenta, and yellow cartridges in my HP Laserjet 2605 ran out of toner simultaneously (i.e., on the same page), I was immediately suspicious. The printer&#8217;s LCD flashed &#8220;Replace Supplies&#8221; and refused to print another page (even grayscale!) unless I replaced all three cartridges, to the tune of about $300 CAD.</p>
<p>My suspicion was confirmed when I pulled the yellow cartridge and realized it was almost full. The printer ticks a counter every time a page is run through the printer, which has nothing to do with how much toner is actually consumed.</p>
<p>Thankfully, there is a printer setting that HP probably doesn&#8217;t want you to know about.</p>
<h2>How to use <span style="text-decoration: underline;">ALL</span> of the toner in your HP Laserjet 2605 or 2600</h2>
<ol>
<li>On the printer itself, hit the big green checkmark button to access the menu.</li>
<li>Select System Setup -&gt; Print Quality -&gt; Replace Supplies.</li>
<li>There is likely an asterisk (*) beside &#8220;Stop at out&#8221;.</li>
<li>Hit the &gt; arrow once, and the display should read &#8220;Override out&#8221;.</li>
<li>Press the checkmark to confirm that (the asterisk should now be beside &#8220;Override out&#8221;).</li>
<li>Back out of the menu. The LCD should now display &#8220;Override in use&#8221;, meaning, you can now continue printing for as long as you actually have toner in the cartridges (and beyond, probably).</li>
</ol>
<p>Thank you HP, for providing this &#8220;feature&#8221;, and for burying four levels into a completely non-obvious menu. I guess they had to call it &#8220;Print quality&#8221;, because  &#8220;Not paying triple on already overpriced toner&#8221; wouldn&#8217;t fit on the LCD. Now we know how they turn a healthy profit on their oh-so-green cartridge recycling program. (&#8220;It&#8217;s free!&#8221;)</p>
<p>HP <a href="http://h20000.www2.hp.com/bizsupport/TechSupport/Document.jsp?lang=en&amp;cc=us&amp;taskId=120&amp;prodSeriesId=446153&amp;prodTypeId=18972&amp;objectID=c00314429">does describe this feature on their knowledge base</a>. They also strongly recommend against using it, because it may cause &#8220;Color matching and other print quality defects related to the absent(sic) of a color.&#8221; Ha! Who would have thought. Oh, and&#8211;better yet&#8211;this feature <em>voids the warranty </em>on the toner you were about to <span style="text-decoration: line-through;">throw out</span> send to HP for recycling anyway<em>.</em></p>
<p>Yes, printer companies have done this before, and yes, I&#8217;m still page flipping mad about it. If this article saves one poor soul the expense of $300 worth of toner cartridges, it&#8217;d make my day.</p>
<p>[Photo credit:  jepoirrier (flickr)]</p>
]]></content:encoded>
			<wfw:commentRss>http://ry.ca/blog/2009/08/hp-laserjet-2600-or-2605-toner-replace-supplies-is-a-lie/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>Globe and Mail Column on Multiple Monitors</title>
		<link>http://ry.ca/blog/2009/08/globe-and-mail-column-on-multiple-monitors/</link>
		<comments>http://ry.ca/blog/2009/08/globe-and-mail-column-on-multiple-monitors/#comments</comments>
		<pubDate>Mon, 10 Aug 2009 18:49:20 +0000</pubDate>
		<dc:creator>Ryan Thompson</dc:creator>
				<category><![CDATA[Technical Articles]]></category>

		<guid isPermaLink="false">http://ry.ca/blog/?p=134</guid>
		<description><![CDATA[Harvey Schachter of the Globe and Mail interviewed me for a column on multiple monitors. The article appeared in today&#8217;s edition of the paper, and it&#8217;s available online as well. I believe he does give the topic a reasonable treatment, for his target audience. Let me know what you think!]]></description>
			<content:encoded><![CDATA[<p>Harvey Schachter of the Globe and Mail interviewed me for a column on multiple monitors. The article appeared in today&#8217;s edition of the paper, and <a href="http://www.theglobeandmail.com/report-on-business/why-settle-for-one-screen/article1246434/">it&#8217;s available online</a> as well.</p>
<p>I believe he does give the topic a reasonable treatment, for his target audience. Let me know what you think!</p>
]]></content:encoded>
			<wfw:commentRss>http://ry.ca/blog/2009/08/globe-and-mail-column-on-multiple-monitors/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>How to Tell Thunderbird to Really Delete Messages From Your IMAP Server</title>
		<link>http://ry.ca/blog/2009/06/thunderbird_imap_really_delete/</link>
		<comments>http://ry.ca/blog/2009/06/thunderbird_imap_really_delete/#comments</comments>
		<pubDate>Mon, 08 Jun 2009 14:43:42 +0000</pubDate>
		<dc:creator>Ryan Thompson</dc:creator>
				<category><![CDATA[Email]]></category>
		<category><![CDATA[Macintosh]]></category>
		<category><![CDATA[Technical Articles]]></category>
		<category><![CDATA[Thunderbird]]></category>
		<category><![CDATA[UNIX/Linux]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[delete]]></category>
		<category><![CDATA[expunge]]></category>
		<category><![CDATA[imap]]></category>
		<category><![CDATA[trash]]></category>
		<category><![CDATA[webmail]]></category>

		<guid isPermaLink="false">http://ry.ca/blog/?p=123</guid>
		<description><![CDATA[This quick tip is for Mozilla Thunderbird users who use Thunderbird with an IMAP account, but also use another mail user application (MUA) such as Outlook or webmail. If you&#8217;re in a similar situation, you might notice that when you delete messages in Thunderbird, they remain visible in your other MUA, until you exit Thunderbird. [...]]]></description>
			<content:encoded><![CDATA[<p>This quick tip is for Mozilla Thunderbird users who use Thunderbird with an IMAP account, but also use another mail user application (MUA) such as Outlook or webmail. If you&#8217;re in a similar situation, you might notice that when you delete messages in Thunderbird, they remain visible in your other MUA, until you exit Thunderbird. This can be especially impractical, for example, when you left Thunderbird running at the office and go to check your webmail from home. All of the spam you deleted in Thunderbird is still sitting there.</p>
<p>Fortunately, there&#8217;s an extremely simple solution to this problem. In Thunderbird:</p>
<blockquote><p>Preferences -> Advanced -> Config Editor&#8230;</p></blockquote>
<p>Search for <b>&#8220;expunge&#8221;</b>, and enable the <b>&#8220;mail.imap.expunge_after_delete&#8221;</b> option by double-clicking it. You need to restart Thunderbird after applying this setting.</p>
<p>Here are the before and after shots:</p>
<p><img src="http://ry.ca/blog/wp-content/uploads/2009/06/expunge.png" alt="Expunge - Before and After" title="Expunge - Before and After" width="518" height="320" class="aligncenter size-full wp-image-127" style="margin-left: -12px;" /></p>
<p>This setting tells Thunderbird to automatically &#8220;expunge&#8221; (IMAP terminology for &#8220;permanently delete&#8221;) any messages that have been deleted within Thunderbird. Otherwise, it just marks the message with a &#8220;delete&#8221; flag that many other mail clients ignore by default.</p>
<p>The <b>&#8220;expunge_after_delete&#8221;</b> option should be safe to use; your Trash folder will still work normally. This setting only controls the communication with the email server.</p>
]]></content:encoded>
			<wfw:commentRss>http://ry.ca/blog/2009/06/thunderbird_imap_really_delete/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Statistical Testing</title>
		<link>http://ry.ca/blog/2009/05/statistical-testing/</link>
		<comments>http://ry.ca/blog/2009/05/statistical-testing/#comments</comments>
		<pubDate>Tue, 26 May 2009 14:15:43 +0000</pubDate>
		<dc:creator>Ryan Thompson</dc:creator>
				<category><![CDATA[Technical Articles]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[lottery]]></category>
		<category><![CDATA[parser]]></category>
		<category><![CDATA[random]]></category>
		<category><![CDATA[segfault]]></category>
		<category><![CDATA[statistics]]></category>

		<guid isPermaLink="false">http://ry.ca/blog/?p=111</guid>
		<description><![CDATA[Sometimes, when you need some extra confidence in your algorithm, it doesn&#8217;t hurt to employ random data and statistics. You may be able to take your testing a step further by throwing literally every input&#8212;or at least a random sample of every input&#8212;at your program in an attempt to raise an error or unexpected success. [...]]]></description>
			<content:encoded><![CDATA[<p>Sometimes, when you need some extra confidence in your algorithm, it doesn&#8217;t hurt to employ random data and statistics. You may be able to take your testing a step further by throwing literally every input&mdash;or at least a random sample of every input&mdash;at your program in an attempt to raise an error or unexpected success.</p>
<p>I used this technique today, with a low-level program that accepts structured binary input (including variable length fields, nested records, and some other non-trivial parsing requirements). I had already tested as many execution paths and pathological corner cases as I could design tests for, but I wanted some extra assurance that my program would not segfault or produce unexpected results, no matter what a user might throw at it.</p>
<div class="wp-caption alignleft" style="width: 343px"><img alt="Representative Sample?" src="http://farm1.static.flickr.com/67/175474658_adfcd13a00.jpg" title="Lottery Balls" width="333" height="250" /><p class="wp-caption-text">Representative Sample?</p></div>
<p>So, naturally, I threw /dev/random at it.</p>
<p>In a few minutes, I wrote a script to run my program against about one thousand completely random data sets, which, barring a miracle, should have been complete gibberish to my parser. I was looking for program crashes, but thankfully my parser handled all of the random inputs gracefully.</p>
<p>I did get an unexpected result, however: Within the first few hundred iterations, my parser had actually picked out small sections of valid data. Over the thousand-or-so runs, it pulled out six valid values. This looked fishy to me, so I did the math. If my parser was working correctly, the probability of a match was about 1:18,000,000. So, six hits out of a thousand was a real red flag. After all, I can never even win a free lottery ticket.</p>
<p>When I inspected one of the random files that contained the supposed valid data, I quickly discovered a subtle bug in my parser that made it far too permissive in some cases. The bug was easy to fix, but would have been very difficult to spot otherwise.</p>
<p>So, don&#8217;t forget to throw some complete rubbish at your programs during testing once in a while.</p>
<p>[ Photo credit: <a rel="nofollow" href="http://www.flickr.com/photos/rcktmanil/175474658/">Nice balls by RcktManIL, on Flickr</a> ]</p>
]]></content:encoded>
			<wfw:commentRss>http://ry.ca/blog/2009/05/statistical-testing/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Showing Sub Pages in WordPress</title>
		<link>http://ry.ca/blog/2009/05/showing-sub-pages-in-wordpress/</link>
		<comments>http://ry.ca/blog/2009/05/showing-sub-pages-in-wordpress/#comments</comments>
		<pubDate>Tue, 19 May 2009 15:21:46 +0000</pubDate>
		<dc:creator>Ryan Thompson</dc:creator>
				<category><![CDATA[Technical Articles]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://ry.ca/blog/?p=88</guid>
		<description><![CDATA[WordPress allows site owners to create &#8220;Pages&#8221;, in addition to normal blog posts. Pages are simply static content. Most WordPress blogs at the very least have some sort of &#8220;About&#8221; page, but it&#8217;s possible to deeply nest pages and create a rich hierarchy. Depending on your chosen theme, this hierarchy is (by default) shown on [...]]]></description>
			<content:encoded><![CDATA[<p>WordPress allows site owners to create &#8220;Pages&#8221;, in addition to normal blog posts. Pages are simply static content. Most WordPress blogs at the very least have some sort of &#8220;About&#8221; page, but it&#8217;s possible to deeply nest pages and create a rich hierarchy.</p>
<p>Depending on your chosen theme, this hierarchy is (by default) shown on the sidebar. However, that can get unwieldy if you have a complex site structure. One approach I sometimes take is to limit the hierarchy on the sidebar, but display links to the sub-pages on each of the main pages. What do I mean?</p>
<p>Suppose I have arranged my pages as follows (<a title="Wordpress Permalinks" href="http://codex.wordpress.org/Using_Permalinks" target="_blank">using Permalinks</a> of course!)</p>
<ul>
<li>About Me
<ul>
<li>My Career
<ul>
<li>Resume</li>
</ul>
</li>
<li>My Hobbies</li>
</ul>
</li>
</ul>
<p>Normally, the content section of the About page would look something like this:</p>
<div style="padding-left: 30px; border: 1px solid; background: #eee">
<p><font size="+2"><b><u>About Me</u></b></font></p>
<p>Posted by Ryan Thompson</p>
<p>Content&#8230;
</p></div>
<p>But, with just a little template magic, we can tell WordPress to show all of the subpages of the current page.</p>
<p>In your WordPress admin page, click on Appearance -&gt; Editor, and then find the Page Template (page.php) on the right hand side of the page. Then, look for a line like this:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">&lt;h2&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span> the_title<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/h2&gt;</pre></div></div>

<p>After that line (or wherever you would like the sub pages to appear), add the following line:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">&lt;ul&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span> wp_list_pages<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'title_li=Sub%20Topics:&amp;depth=4&amp;child_of='</span> <span style="color: #339933;">.</span> get_the_ID<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/ul&gt;</pre></div></div>

<p>Now, your page will look something like this:</p>
<div style="padding-left: 30px; border: 1px solid; background: #eee">
<p><font size="+2"><b><u>About Me</u></b></font></p>
<ul>
<li>Sub Topics:
<ul>
<li><u>My Career</u>
<ul>
<li><u>Resume</u></li>
</ul>
</li>
<li><u>My Hobbies</u></li>
</ul>
</li>
</ul>
<p>Posted by Ryan Thompson</p>
<p>Content&#8230;</p></div>
<p>The sub-pages (and the &#8220;Sub Topics:&#8221; heading) will only display <i>if</i> the page actually has sub-pages, so it is safe to use this code on all pages.</p>
<p>The important bit is the wp_list_pages() call, and the use of get_the_ID() to retrieve the current numeric page ID.</p>
<p>Once you have your sub pages displaying correctly, you&#8217;re of course free to apply a style to the unordered list (&lt;ul class=&#8221;&#8230;&#8221;&gt;) to render this particular list in a more imaginative format, assuming you have some HTML/CSS know-how.</p>
]]></content:encoded>
			<wfw:commentRss>http://ry.ca/blog/2009/05/showing-sub-pages-in-wordpress/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Staying Connected on the Road</title>
		<link>http://ry.ca/blog/2009/05/staying_connected_on_the_road/</link>
		<comments>http://ry.ca/blog/2009/05/staying_connected_on_the_road/#comments</comments>
		<pubDate>Mon, 11 May 2009 15:32:18 +0000</pubDate>
		<dc:creator>Ryan Thompson</dc:creator>
				<category><![CDATA[Technical Articles]]></category>
		<category><![CDATA[3g]]></category>
		<category><![CDATA[blackberry]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[laptop]]></category>
		<category><![CDATA[netbook]]></category>
		<category><![CDATA[travel]]></category>

		<guid isPermaLink="false">http://ry.ca/blog/?p=76</guid>
		<description><![CDATA[Just how do you go about accessing the Internet while you are away from home? Today I&#8217;m going to do my best to sum up the three main options. To slightly differing degrees, this information will pertain to any sort of typical Internet/email/web/Twitter/Facebook access. If you&#8217;re bent on carrying technology with you to stay connected [...]]]></description>
			<content:encoded><![CDATA[<p>Just how do you go about accessing the Internet while you are away from home? Today I&#8217;m going to do my best to sum up the three main options. To slightly differing degrees, this information will pertain to any sort of typical Internet/email/web/Twitter/Facebook access.</p>
<p>If you&#8217;re bent on carrying technology with you to stay connected on the road, the main factor that will drive your decision will be the wireless access in the region you&#8217;ll be traveling, and the associated costs. You will obviously have more options in modern metropolitan areas than they would be in, say, rural India. When you need the &#8216;net away from home, there are three main options, and my favorite option&mdash;perhaps surprisingly&mdash;is to travel free of technology.</p>
<h2>Option 1: Laptop or Netbook</h2>
<p>In this scenario, you carry a laptop or netbook, and periodically &#8220;jack in&#8221; to Wi-Fi networks in hotels, airports, major train stations, free Wi-Fi hotspots, or paid network ports. You will not have persistent access to the Internet; you will only be able to connect and check email when you are plugged in to a network. When you are connected, a laptop or netbook will give you the best experience (bigger screen, full keyboard, fast access&mdash;much like working from home), but this comes at a price: You need to lug a big piece of fragile, shiny, criminally-tempting equipment around with you, and it will only be really useful in certain areas where you can find a connection. At all other times, you&#8217;re essentially carrying dead weight.</p>
<h2>Option 2: Smart Phone</h2>
<p><img class="alignright size-full wp-image-80" title="GSM Tower" src="http://ry.ca/blog/wp-content/uploads/2009/05/istock_000001587208xsmall.jpg" alt="GSM Tower" width="283" height="424" /><br />
Smart phones (Blackberry, iPhone, or similar) carry the promise of a handheld, mobile computing platform. These devices rely on cell phone networks, so, in theory, will work anywhere you can get cell phone reception (while driving in the car, even). However, there are two very important considerations to keep in mind:</p>
<ol>
<li>When you are away from your &#8220;home&#8221; network, you are considered to be roaming, and roaming charges can be ridiculously high. There have been a lot of stories recently about people getting $60,000 cell phone bills for, say, watching half of a college football game on their phone. Of course, you&#8217;re only in danger of being blessed with a bill like this if your phone will actually work at your destination.</li>
<li>Depending to some extent on what phone you go with, email/Internet services may not even be available in certain areas when you are roaming. If you end up backpacking in the Scottish highlands, you might be lucky to get analog cell phone coverage, which means your Internet/email capabilities are dead in the water. If you&#8217;re thinking of going this route, you&#8217;d be wise to check out the digital/3G network coverage in the locations you plan to visit.</li>
</ol>
<h2>Option 3: Travel Free</h2>
<p>I&#8217;m not pulling any punches, here; my bias should be obvious by now. I stopped carrying a laptop (or any other sort of network device) well over a year ago. Now when I need my email fix (once a day or less), I borrow a computer (or head to an Internet caf&eacute;) and use webmail (or, free remote desktop applications such as LogMeIn). If you go this route, you can expect to pay a few bucks here and there if the hotels you&#8217;re staying in don&#8217;t have free computer terminals, but even so, there&#8217;s no up-front purchase, and the per-use access fees themselves could well be cheaper than the Wi-Fi and cell phone roaming charges I&#8217;ve described above. Nomadic computing is getting easier to do every day, with the plethora of free web-based applications available, and more and more locations offering cheap/free computer use. If you tried this a few years ago, and were discouraged by the lack of availability, try again; the situation has improved greatly.</p>
<p>Now, don&#8217;t get me wrong: I like shiny gadgets at least as much as the next technology professional. But after schlepping a (small!) laptop literally around the world on business trips a number of times (and going for months of massage treatments to straighten my neck and shoulders out again), traveling without it has been a true joy. I would absolutely not hesitate to bum my way through almost any country with not much more than a decent GPS, point and shoot camera, and an (old-fashioned) hard cover notebook. Self-imposed technical luddism can be most refreshing.</p>
<p>Obviously, this advice will not be a good fit for everyone in all situations. For instance, some (but certainly not all) types of business travel are still easier when you pack your own hardware. What I&#8217;m suggesting is that you take another look at your scenario on a per-trip basis, and seriously question your dependency on that laptop or cell phone.</p>
<p>Happy travels!</p>
]]></content:encoded>
			<wfw:commentRss>http://ry.ca/blog/2009/05/staying_connected_on_the_road/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Evaluate Your Display Configuration</title>
		<link>http://ry.ca/blog/2009/01/display-configuration/</link>
		<comments>http://ry.ca/blog/2009/01/display-configuration/#comments</comments>
		<pubDate>Fri, 02 Jan 2009 03:32:03 +0000</pubDate>
		<dc:creator>Ryan Thompson</dc:creator>
				<category><![CDATA[Macintosh]]></category>
		<category><![CDATA[Technical Articles]]></category>
		<category><![CDATA[UNIX/Linux]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[multiple displays]]></category>
		<category><![CDATA[multiple monitors]]></category>

		<guid isPermaLink="false">http://ry.ca/blog/?p=29</guid>
		<description><![CDATA[Happy New Year, everyone. Michelle V. Rafter has written an interesting article about multiple monitors. She contacted me in December to obtain permission to publish some of my comments. Her article contains a healthy dose of anecdotal support for multiple displays, as well as some links to multiple display how-to information. Rafter makes the claim [...]]]></description>
			<content:encoded><![CDATA[<p>Happy New Year, everyone.</p>
<p>Michelle V. Rafter has written an <a href="http://technology.inc.com/hardware/articles/200901/monitors.html">interesting article about multiple monitors</a>. She contacted me in December to obtain permission to publish some of my comments. Her article contains a healthy dose of anecdotal support for multiple displays, as well as some links to multiple display how-to information.</p>
<p>Rafter makes the claim that &#8220;Business people whoÃ¢â‚¬â„¢ve made the switch say using two monitors &#8212; or even more &#8212; make them more productive. And they swear theyÃ¢â‚¬â„¢d never go back.&#8221;</p>
<p>To me, Rafter&#8217;s article serves as a good reminder to really evaluate your computer display(s) in the new year, to determine whether you really have the optimal display configuration for the type of work you do. (Do you?)</p>
]]></content:encoded>
			<wfw:commentRss>http://ry.ca/blog/2009/01/display-configuration/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>CAPTCHA: Are you for real?</title>
		<link>http://ry.ca/blog/2008/12/captcha_are_you_for_real/</link>
		<comments>http://ry.ca/blog/2008/12/captcha_are_you_for_real/#comments</comments>
		<pubDate>Tue, 09 Dec 2008 20:14:23 +0000</pubDate>
		<dc:creator>Ryan Thompson</dc:creator>
				<category><![CDATA[Technical Articles]]></category>

		<guid isPermaLink="false">http://ry.ca/blog/?p=26</guid>
		<description><![CDATA[CAPTCHA challenges are so ubiquitous these days that major web sites are frustrating users by the millions with distorted text, mathematical equations, puppies, and more. CAPTCHA stands for &#8220;Completely Automated Public Turing test to tell Computers and Humans Apart&#8221;. Typically, they are employed to allow web sites to reject, for example, blog spam entered by [...]]]></description>
			<content:encoded><![CDATA[<p>CAPTCHA challenges are so ubiquitous these days that major web sites are frustrating users by the millions with distorted text, mathematical equations, puppies, and more. CAPTCHA stands for &#8220;<b>C</b>ompletely <b>A</b>utomated <b>P</b>ublic <b>T</b>uring test to tell <b>C</b>omputers and <b>H</b>umans <b>A</b>part&#8221;. Typically, they are employed to allow web sites to reject, for example, blog spam entered by automatic spam programs.</p>
<p>Unfortunately, CAPTCHAs don&#8217;t work.</p>
<h2>The problems with CAPTCHAs</h2>
<p>It&#8217;s an arms race. As spammers and attackers get better at programmatically breaking CAPTCHAs, web sites use more ridiculous CAPTCHAs, and so on. We are already at the point where many CAPTCHAs are very difficult for most humans to read:</p>
<p><img src="http://ry.ca/blog/wp-content/uploads/2008/12/captcha_tough.png" border="1" alt="Tough CAPTCHA image" title="captcha_tough" /></p>
<p>Of course, on the other end of the spectrum, CAPTCHAs like the following are really just an inconvenience to both users and computers alike (this one is very easy for a computer to see, so it defeats the purpose of CAPTCHA altogether):</p>
<p><img src="http://ry.ca/blog/wp-content/uploads/2008/12/captcha_easy-300x90.png" border="1" alt="Easy CAPTCHA" title="captcha_easy" /></p>
<p>The majority of ordinary users are penalized for the actions of the minority of spammers. This is like forcing all drivers of a certain highway to take a breathalyzer test without probable cause in case they <i>might</i> be drunk.</p>
<p>Users with impaired vision (in some cases, colorblindness might be enough!) might find it impossible to read CAPTCHAs. On sites that do not have an audio CAPTCHA option, vision-impaired users are often out of luck. Heck, my vision is fine, and even I have to take several attempts at some CAPTCHAs.</p>
<p>Real humans are for hire. A truly determined spammer with a few dollars to spare can easily hire extremely cheap labor to sit at a computer and type in CAPTCHA responses all day long. Sadly, this is surprisingly cost effective for many spammers.</p>
<p>Humans will tend to give up after a few attempts, but computers are very patient by nature, and robots have numbers on their side. If a site doesn&#8217;t have any sort of rate limiting, a spam bot can and will easily hammer a form hundreds of times to slip one submission through.</p>
<p>For these reasons, current CAPTCHAs are far from a panacea.</p>
<h2>In a nutshell</h2>
<p>The pure idea is sound&mdash;to tell humans and computers apart&mdash;but, in my opinion, the execution is fatally flawed. All current CAPTCHAs, being &#8220;Completely Automated&#8221;, rely on <i>computers</i> to tell humans and computers apart. Essentially, this boils down to computers trying to fool other computers. See the problem, here?</p>
<p>Sure, if we had computers that could replicate human AI, they would probably do pretty well at telling humans and today&#8217;s computers apart. But, by then, the spammers&#8217; bots will have full human AI, too. That&#8217;s an even bigger problem. See <a href="http://en.wikipedia.org/wiki/Turing_test">http://en.wikipedia.org/wiki/Turing_test</a></p>
<p>I am definitely not saying that web sites should immediately abandon all use of CAPTCHAs. I still use CAPTCHAs on this blog to slow down the spammers. I would get a few more comments from real users if not for that, but I understand the drawbacks, and I&#8217;m willing to take the hit.</p>
<p>It is beyond the scope of this article to go into a full discussion of all alternatives to CAPTCHA, so I will say only this:</p>
<blockquote><p><em>Choose the right tool for the actual problem you need to solve.</em></p></blockquote>
<p>CAPTCHA on, say, a sign-up page, can easily do more harm than good; you&#8217;ll be losing some percentage of legitimate users while you unwittingly support some 3rd-world economy. Basic rate limiting, exponential backoff, and reporting on new account creation, are probably enough for all but the most high-profile sites. But, again, this depends on a thorough understanding of your problem domain, coupled by a careful analysis of the available options.</p>
]]></content:encoded>
			<wfw:commentRss>http://ry.ca/blog/2008/12/captcha_are_you_for_real/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Pitfalls in Software Post Mortems</title>
		<link>http://ry.ca/blog/2008/12/pitfalls_in_software_post_mortems/</link>
		<comments>http://ry.ca/blog/2008/12/pitfalls_in_software_post_mortems/#comments</comments>
		<pubDate>Thu, 04 Dec 2008 20:57:51 +0000</pubDate>
		<dc:creator>Ryan Thompson</dc:creator>
				<category><![CDATA[Software Process]]></category>
		<category><![CDATA[Technical Articles]]></category>
		<category><![CDATA[post-mortem]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[subcontracting]]></category>

		<guid isPermaLink="false">http://ry.ca/blog/?p=23</guid>
		<description><![CDATA[One of the tenets of software process improvement (or, really, any process improvement) is conducting a thorough, honest &#8220;post-mortem&#8221; on a completed project. The concept is simple: you take a recently completed project (or well-defined milestone), and look at the good, the bad, and the ugly, and turn your observations into actionable steps you will [...]]]></description>
			<content:encoded><![CDATA[<p>One of the tenets of software process improvement (or, really, any process improvement) is conducting a thorough, honest &#8220;post-mortem&#8221; on a completed project. The concept is simple: you take a recently completed project (or well-defined milestone), and look at the good, the bad, and the ugly, and turn your observations into actionable steps you will take on the next project.</p>
<p>Actually executing a post-mortem can be a challenge to companies of any size. In my experience, there are a number of roadblocks to actually completing a post-mortem. This article discusses them, and is targeted towards the typical middle management software professional heading up a project. However, stakeholders of all levels will hopefully appreciate the points herein.</p>
<h2>&#8220;We don&#8217;t have time to sacrifice billable/profitable hours to do a post-mortem.&#8221;</h2>
<p>This is a difficult point to argue, especially when it comes as a directive from the executive. Even if you successfully browbeat the boss into letting your team do a post-mortem, you are then faced with the even more daunting task of later convincing him/her that the outcome is going to be a net benefit to the company&#8217;s bottom line, when you may not actually have the authority or the buy-in to implement all of the recommendations from the post-mortem.</p>
<p>All hope is not lost. For the purposes of a successful post-mortem, you really need buy-in from all parties, and I suggest you start from the bottom. I have consistently found that motivated developers (and even some unmotivated ones) are very, very eager to share their experiences and opinions, so get them on-board, along with vendors, customers, and anyone else with a stake in the project who is available for a few questions. Essentially, I am suggesting you go ahead and do the post mortem anyway&mdash;informally is just fine. Getting fired is unlikely. At the very least, you and your team will learn some valuable lessons, and it&#8217;s possible the chief may soften up, too.</p>
<h2>&#8220;The project went well. We don&#8217;t need to do a post-mortem&#8221;.</h2>
<p>This is a common pitfall. Whether the project really went well&mdash;or you think it went well&mdash;is debatable. Unless your company directly profits from the warm, fuzzy feelings of your project management team, you really need to analyze and measure your success criteria.</p>
<p>Let&#8217;s be generous, for a moment, and assume that the project was successful. The more successful the project, the more you have to gain by doing a post-mortem. Imagine the army of doctors that would line up to do an autopsy of a real-life Superman. The idea here is, find out what worked, why it worked, and then reproduce it.</p>
<h2>&#8220;The project was on time, on spec, and on budget. We don&#8217;t need to improve.&#8221;</h2>
<p>This seems to be a Holy Grail of sorts for some companies. It isn&#8217;t. Even though a project may indeed be on time, on spec, and on budget, who defined the timeline, specification, and budget? The problem is, some mature software and business teams get very good at working together and setting goals they know they can meet. To the extent attainable goals are a good thing, the danger lies in becoming complacent with sub-optimal developments.</p>
<p>The company that can develop a certain widget in 6 months for $500K is in for a shock (not to mention the possibility of significant lost revenue) when their competitor develops a better widget in 4 months. Wouldn&#8217;t it be nice to be ahead of the curve?</p>
<h2>&#8220;The project was a flop for obvious reasons. Let&#8217;s not waste more time by over-analyzing it!&#8221;</h2>
<p>To some, doing a post-mortem on a failed project can feel something like eating a box of thumbtacks; more so, if the outcome seems inevitable. Suppose you chose a vendor to develop a seemingly innocent bit of middleware for your project, and they significantly overran their deadline, creating a cascade effect on your entire timeline. It is easy to blame the vendor for your failure, and vow never to use them again. It is harder, and so much more valuable,  to step up a level, swallow your corporate pride, and ask the more difficult questions, like:</p>
<ul>
<li>Was outsourcing this component really the best strategic move?</li>
<li>Did we make any serious attempt to mitigate this risk in our project plan?</li>
<li>Did we fail to recognize a dependency upon this vendor&#8217;s deliverable that caused the critical path slip?</li>
<li>Were there any early warning signs that we failed to act on?</li>
<li>Could a different approach to managing this subcontractor have helped us identify the problem earlier, or keep the project on track?</li>
</ul>
<p>Of course these are just a few of the questions you might want to ask in a case like this. Always remember to keep a mixture of &#8220;standard&#8221; post-mortem questions, and to really ask the hard questions that are specific to the project&#8217;s circumstances, as well. Resist the urge to take a &#8220;clean room&#8221; approach and let just one person come up with all of the questions. Encourage all stakeholders to participate; good answers are more likely to follow good questions.</p>
<h2>&#8220;We don&#8217;t want to say anything negative, because it will make us look bad/get fired/lose our bonus/etc.&#8221;</h2>
<p>For whatever reason, some companies manage to create an unfortunate culture where employee performance appraisals trump honesty, and developers become loathe to admitting mistakes&mdash;or even suggesting improvements. To be fair, I doubt that companies&#8217; top execs intend for this to happen. However, some of these same companies are also pretty bad at recognizing and fixing a gun-shy culture. Doing a post-mortem in this sort of environment may not net the most useful results, and shifting a defensive culture in short order may be next to impossible, in your position.</p>
<p>The best advice I can give you in this case, is to create a small bubble of trust within your project. Go one-on-one if necessary. If you think your stakeholders won&#8217;t be honest with you, that&#8217;s another problem entirely. Clearly this is not the best time to flex authority and demand honest answers. I have seen entire teams literally go stiff when someone takes this tack, with some mixture of fear, hostility, and apathy, in proportion to the relative burn-out of the team. Instead, I suggest finding someone on the team (probably below you) that is well-connected to most people, and have them take a soft approach. Put them in charge of gathering the inputs (preferably around the lunch table, not the boardroom table), and back them up with tools, information and mentoring, not muscle. Putting the best people on a task is of course one of your best strengths, right? Don&#8217;t forget to look at the project&#8217;s culture as part of the post-mortem, as it almost certainly had an effect on the project itself.</p>
<h2>&#8220;We have done post-mortems before. Nothing ever changes.&#8221;</h2>
<p>You are more likely to hear this sort of comment from the trenches. The perception (probably based in reality) is that the company&#8217;s efforts to analyze projects have historically not brought any real change. Developers don&#8217;t see the value, and believe the post-mortems are little more than a chance to vent, or pat themselves on the back, or otherwise waste time they could be devoting to the next project you are keeping them from.</p>
<p>There is no easy response to this assertion. If your people feel nothing has changed, they are probably right. Surely, not every recommendation will be implemented, but, by choosing a set of suggestions from a key project, and then reviewing the effects of those suggestions, in a visible and inclusive way, is the key to demonstrating a company&#8217;s resolve to benefit from the collective genius of its employees (not to mention vendors and clients). This need not be an onerous undertaking. Having a quick meeting&mdash;or at least some sort of announcement&mdash;a month or so after the post-mortem to review the implementation status of the suggestions will go a long way, providing some actual progress has been made. Having measurable criteria for improvement is also important, but the time quantum there is typically longer. Keep the door open for additional suggestions at any time, and, if one of the recommendations isn&#8217;t working, get rid of it. Obviously, before making a serious investment into any recommendation (including job creation), the company should absolutely undertake due diligence&mdash;just don&#8217;t over-analyze.</p>
<p style="align: center;">- &#8211; -</p>
<p>These are just some of the more common sticking points I have encountered. I am sure that the seasoned readers of this article will have had varying experiences when attempting to run software project post-mortems. Please do share your comments here!</p>
]]></content:encoded>
			<wfw:commentRss>http://ry.ca/blog/2008/12/pitfalls_in_software_post_mortems/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress Syntax Highlighting (It&#8217;s About Time!)</title>
		<link>http://ry.ca/blog/2008/11/wordpress-syntax-highlighting/</link>
		<comments>http://ry.ca/blog/2008/11/wordpress-syntax-highlighting/#comments</comments>
		<pubDate>Wed, 19 Nov 2008 22:01:04 +0000</pubDate>
		<dc:creator>Ryan Thompson</dc:creator>
				<category><![CDATA[Technical Articles]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[syntax highlighting]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://ry.ca/blog/?p=21</guid>
		<description><![CDATA[For years, I&#8217;ve been using tidy (and perltidy) to clean up and pretty-print source code. I&#8217;ve also used the HTML output switches to produce markup that I can cut/paste into this blog. For short snippets, it was often faster to just hack the markup myself. Believe me, that gets boring pretty fast. Plus, as an [...]]]></description>
			<content:encoded><![CDATA[<p>For years, I&#8217;ve been using tidy (and perltidy) to clean up and pretty-print source code. I&#8217;ve also used the HTML output switches to produce markup that I can cut/paste into this blog. For short snippets, it was often faster to just hack the markup myself. Believe me, that gets boring pretty fast. Plus, as an author, it&#8217;s pretty tough to be a proponent of code reuse when you&#8217;ve been reduced to manually adding a bunch of <i>&lt;span&gt;</i> tags to your own blog posts.</p>
<p>Five seconds of searching led me to <a href="http://wordpress.org/extend/plugins/wp-syntax/">WP-Syntax</a>. Installing was literally as easy as unzipping it in the wp-content/plugins directory and Activating the plugin from the WP Admin interface. Now, syntax highlighting is as automatic as it should be.</p>
<p>WP-Syntax will turn this:</p>
<pre>
&lt;pre lang="c"&gt;
#include &lt;stdio.h&gt;

int
main(void)
{

    printf("Hello world!"); /* A comment */

    exit 0;
}
&lt;/pre&gt;
</pre>
<p>into this:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span>
main<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Hello world!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/* A comment */</span>
&nbsp;
    exit <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>I really have no excuse for not doing this much sooner.</p>
]]></content:encoded>
			<wfw:commentRss>http://ry.ca/blog/2008/11/wordpress-syntax-highlighting/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

