<?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>Best Webfoot Forward &#187; Hacking</title>
	<atom:link href="http://blog.webfoot.com/category/hacking/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.webfoot.com</link>
	<description></description>
	<lastBuildDate>Mon, 25 Jan 2010 06:20:01 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Early days of the computer revolution</title>
		<link>http://blog.webfoot.com/2010/01/02/early-days-of-the-computer-revolution/</link>
		<comments>http://blog.webfoot.com/2010/01/02/early-days-of-the-computer-revolution/#comments</comments>
		<pubDate>Sat, 02 Jan 2010 22:39:08 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Hacking]]></category>

		<guid isPermaLink="false">http://blog.webfoot.com/?p=1006</guid>
		<description><![CDATA[I was talking to a friend of mine who I&#8217;m guessing was born in the late 1970s, and mentioned that I had been using computers since 1968ish and email since 1974.  (Yes, really.)
I saw a lightbulb go off over his head.  He knew I was in my mid-forties, and knew I was a computer geek, [...]]]></description>
			<content:encoded><![CDATA[<p>I was talking to a friend of mine who I&#8217;m guessing was born in the late 1970s, and mentioned that I had been using computers since 1968ish and email since 1974.  (Yes, <a href="http://en.wikipedia.org/wiki/PLATO_%28computer_system%29">really</a>.)</p>
<p>I saw a lightbulb go off over his head.  He knew I was in my mid-forties, and knew I was a computer geek, but hadn&#8217;t ever really put two and two together.  &#8220;Oh!  You were around for the start of the personal computer revolution?  What was that like?  That must have been <em>totally *<strong>COOL*!!</strong>!</em>&#8221;</p>
<p>I said, &#8220;Not really.&#8221;</p>
<p>He was stunned.  How could it have possibly not been totally cool and awesome?  I could see him struggling with trying to figure out how to express his confusion, how to figure out what question to even ask.</p>
<p>I said, &#8220;Look.  You are old enough that you were around for the start of the mobile phone revolution, right?  That must have been <em>totally <strong>*COOL*</strong>!!!</em>&#8221;</p>
<p>&#8220;Oh&#8221;, he said.  &#8220;I get it.&#8221;</p>
<p>Mobile phones, when they first started out were kind of cool, I guess, but they weren&#8217;t &#8220;magic&#8221; then: they took real effort and patience.  They were wickedly expensive, heavy, had lousy user interfaces, and you had to constantly worry about whether you had enough battery life for the call.  The reception was frequently (usually?) poor, so even if you could make a connection, your call frequently got dropped.  The signal quality was poor, so you had to TALK LOUDLY to be heard and really concentrate to understand the other person.  And they didn&#8217;t <em>do</em> much.  It took a long time for mobile phones to become &#8220;magic&#8221;, and they only got better incrementally.</p>
<p>When they first came out, personal computers were kind of cool, I guess, but they weren&#8217;t &#8220;magic&#8221; then: they took real effort and patience.  They were wickedly expensive.  They crashed frequently enough that you always had to worry about saving your work.  They had so little disk space that managing your storage was a constant struggle (and why floppies held on for so very long after the introduction of the hard drive).</p>
<p>When I started my first job out of college (working at a DRAM factory for Intel in 1984), they had only recently put in place two  data-entry clerks to input information about the materials (&#8220;lots&#8221;) as the lots traversed the manufacturing plant. (When did the lot arrive at a processing step?  When did it get processed?  Who processed it?  What were the settings and reading on the machine?)  However, to get <em>at</em> that information, engineers like me had to get a signature from higher level of management to authorize a request to MIS (which might get turned down!) for that information.</p>
<p>A few months after I started, they bought three <a href="http://en.wikipedia.org/wiki/IBM_Personal_Computer_XT">IBM PC XT</a>s and put them in a cramped little room for us engineers to use.  I believe the only programs on them were a word processor and a spreadsheet.  There was no storage available to us.  They had hard drives, but we were not allowed to leave anything on the hard drive; we had to take our work away on floppies.  The PCs were not networked, so not only was there no email (and of course no Web), but no way to access the data that was collected out on the manufacturing floor.</p>
<p>If I wanted to make a spreadsheet analyzing e.g. the relationship between measured thickness of the aluminum layer, the measured sputtering voltage, and how long it had been since the raw materials had been replenished, I would go to the factory floor, walk around to find different lots in different stages of processing, copy the information to a piece of paper, take the piece of paper and a floppy disk to the computer room (hoping that there was a free computer), copy the data from the piece of paper into the spreadsheet, print the spreadsheet (maybe making a graph, but that was a little advanced), and copy the data onto my floppy if I wanted to look at it again.</p>
<p>Even though we &#8220;had computers&#8221;, we had no network, no email, and no wiki.  The way I shared information was still:</p>
<ul>
<li>make a bunch of photocopies and put them in people&#8217;s (physical) mailboxes,</li>
<li>make a bunch of photocopies and walk around putting them on people&#8217;s desks,</li>
<li>make a bunch of photocopies and pass them out at a meeting where I presented my results, or</li>
<li>make one photocopy, write a routing list on it (a list of names with checkboxes), and put it on the first person&#8217;s desk.  They would read it, check their name off, and pass it to someone else on the list.</li>
</ul>
<p>At the next company I worked at (1985-7), I got a PC on my desk because I was implementing the materials tracking system (because I had bitched about how stupid it was not to have one &#8212; yeah!!).  Our company had a network, but it was expensive and complicated enough that my desktop computer wasn&#8217;t on the network, nor were the two machines on the floor.  Ethernet used a coax cable and (if I recall correctly) you had to make a physical connection by puncturing the cable just right.  The configuration was tricky and not very fault-tolerant: if one computer on the network was misconfigured, it would mess up the entire network AND it was difficult even for a skilled network technician to figure out which computer was misconfigured.</p>
<p>At the next company I worked for (1987), I had a Sun workstation on my desk, and we had a network file servers, but I don&#8217;t think we used email, even internally.</p>
<p>At my next company (1988-90), I had a Wyse 50 &#8220;<a href="http://en.wikipedia.org/wiki/Computer_terminal#Dumb_terminal">glass teletype</a>&#8221; on my desktop and full email capability.  The Wyse 50 didn&#8217;t have any graphics, but that wasn&#8217;t a real big deal because no programs I would ever want to use at work had graphics of any sort. My department used email heavily, but there were some departments in the company that did not use email, so there were lots of memos that were still issued on paper.  They would go either into my (physical) mailbox, or would be pinned to cubicle corridor walls.</p>
<p>While I had the theoretical ability to send email to the outside world then, almost nobody I knew outside the company had email, and figuring out how to address messages to get to the outside was difficult: you had to specify all the intermediate computers, e.g. sun!ubc!decwrl!decshr!slaney<em>.</em></p>
<p>It wasn&#8217;t until that company imploded in about 1990 and my colleagues scattered to other computer companies that I had anyone outside my company to correspond with.  (Fortunately, at about the same time, it got easier to address external email messages.)</p>
<p>It wasn&#8217;t until 1991 that I stopped seeing paper memos &#8212; <em><strong>a full twenty years after the introduction of the <a href="http://en.wikipedia.org/wiki/Apple_II_series">Apple II</a> computer</strong></em>.  My husband reports that he also stopped seeing paper memos in about 1991.</p>
<p>I would contend that computers didn&#8217;t really start to become &#8220;magic&#8221; until about 1996 or so, when the World Wide Web had been absorbed by the masses and various Web services were available.  Only after about 1996 could you pretty reliably assume that anyone (well, those born after WW2 started, at least) used computers or had an email address.</p>
<p>So when personal computers first came out, they were not totally cool.  The <em>idea</em> of personal computers was totally cool.  The potential was totally cool.  But that potential was unrealized for many many years.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.webfoot.com/2010/01/02/early-days-of-the-computer-revolution/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Progress!  Including census tracts!</title>
		<link>http://blog.webfoot.com/2009/08/15/progress-including-census-tracts/</link>
		<comments>http://blog.webfoot.com/2009/08/15/progress-including-census-tracts/#comments</comments>
		<pubDate>Sun, 16 Aug 2009 05:54:41 +0000</pubDate>
		<dc:creator>ducky</dc:creator>
				<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Maps]]></category>

		<guid isPermaLink="false">http://www.webfoot.com/blog/?p=914</guid>
		<description><![CDATA[It might not look like I have done much with my maps in a while, but I have been doing quite a lot behind the scenes.
Census Tracts
I am thrilled to say that I now have demographic data at the census tract level now on my electoral map!  Unlike my old demographic maps (e.g. my old [...]]]></description>
			<content:encoded><![CDATA[<p>It might not look like I have done much with my maps in a while, but I have been doing quite a lot behind the scenes.</p>
<p><strong>Census Tracts</strong></p>
<p>I am thrilled to say that I now have demographic data at the census tract level now on my <a href="http://maps.webfoot.com/demos/election2008/">electoral map</a>!  Unlike my old demographic maps (e.g. my old <a href="http://maps.webfoot.com/RaceOverlays.php">racial demographics map</a>), the code is fast enough that I don&#8217;t have to cache the overlay images.  This means that I can allow people to zoom all the way out if they choose, while before I only let people zoom back to zoom level 5 (so you could only see about 1/4 of the continental US at once).</p>
<p>These speed improvements were <em>not</em> easy, and it&#8217;s still not super-fast, but it is acceptable.  It takes between 5-30 seconds to show a thematic map for 65,323 census tracts. (If you think that is slow, go to <a href="http://geocommons.com">Geocommons</a>, the only other site I&#8217;ve found to serve similarly complex maps on-the-fly.  They take about 40 seconds to show a thematic map for the 3,143 counties.)</p>
<p>A number of people have suggested that I could make things faster by aggregating the data &#8212; show things per-state when way zoomed out, then switch to per-county when closer in, then per-census tract when zoomed in even more.  I think that sacrifices too much.  Take, for example, these two slices of a demographic map of the percent of the population that is black.  The %black by county is on the left, the %black by census tract is on the right.  The redder an area is, the higher the percentage of black people is.</p>
<div id="attachment_916" class="wp-caption aligncenter" style="width: 522px"><a rel="attachment wp-att-916" href="http://www.webfoot.com/blog/2009/08/15/progress-including-census-tracts/countiesvstracts/"><img class="size-full wp-image-916" title="countiesVsTracts" src="http://blog.webfoot.com/wp-content/uploads/2009/08/countiesVsTracts.png" alt="Percent of population that is black; by counties on left, by census tracts on the right" width="512" height="412" /></a><p class="wp-caption-text">Percent of population that is black; by counties on left, by census tracts on the right</p></div>
<p>You&#8217;ll notice that the map on the right makes it much clearer just how segregated black communities are outside of the &#8220;black belt&#8221; in the South.  It&#8217;s not just that black folks are a significant percentage of the population in a few Northern counties, they are only significantly present in tiny little parts of Northern counties.  That&#8217;s visible even at zoom level 4 (which is the zoom level that my <a href="http://maps.webfoot.com/demos/election2008/">electoral map</a> opens on).  Aggregating the data to the state level would be even more misleading.</p>
<p><strong>Flexibility</strong></p>
<p>Something else that you wouldn&#8217;t notice is that my site is now more buzzword-compliant!  When I started, I hard-coded the information layers that I wanted: what the name of the attribute was in the database (e.g. whitePop), what the English-language description was (e.g. &#8220;% White&#8221;), what colour mapping to use, and what min/max numeric values to use.  I now have all that information in an XML file on the server, and my client code calls to the server to get the information for the various layers with AJAX techniques.  It is thus really easy for me to insert a new layer into a map or even to create a new map with different layers on it.  (For example, I have dithered about making a map that shows only the unemployment rate by county, for each of the past twelve months.)</p>
<p>Some time ago, I also added the ability for me to specify how to calcualte a new number with two different attributes.  Before, if I wanted to plot something like %white, I had to add a column to the database of (white population / total population) and map that.  Instead, I added the ability to do divisions on-the-fly.   Subtracting two attributes was also obviously useful for things like the difference in unemployment from year to year. While I don&#8217;t ever add two attributes together yet, I can see that I might want to, like to show the percentage of people who are either Evangelical or Morman.  (If you come up with an idea for how multiplying two attributes might be useful, please let me know.)</p>
<p><strong>Loading Data</strong></p>
<p>Something else that isn&#8217;t obvious is that I have developed some tools to make it much easier for me to load attribute data.  I now use a data definition file to spell out the mapping between fields in an input data file and where the data should go in the database.  This makes it much faster for me to add data.</p>
<p>The process still isn&#8217;t completely turnkey, alas, because there are a million-six different oddnesses in the data.  Here are some of the issues that I&#8217;ve faced with data that makes it non-straightforward:</p>
<ul>
<li>Sometimes the data is ambiguous.  For example, there are a number of states that have two jurisdictions with the same name.  For example, the census records separately a region that has Bedford City, VA and Bedford County, VA.  Both are frequently just named &#8220;Bedford&#8221; in databases, so I have to go through by hand and figure out which Bedford it is and assign the right code to it.  (And sometimes when the code is assigned, it is wrong.)</li>
<li>Electoral results are reported by county everywhere except Alaska, where they are reported by state House district.  That meant that I had to copy the county shapes to a US federal electoral districts database, then delete all the Alaskan polygons, load up the state House district polygons, and copy those to the US federal electoral districts database.</li>
<li>I spent some time trying to reverse-engineer the (undocumented) Census Bureau site so that I could automate downloading Census Bureau data.  No luck so far.  (If you can help, please let me know!)  This means that I have to go through an annoyingly manual process to download census tract attributes.</li>
<li>Federal congressional districts have names like &#8220;CA-32&#8243; and &#8220;IL-7&#8243;, and the databases reflect that.  I thought I&#8217;d just use the state jurisdiction ID (the FIPS code, for mapping geeks) for two digits and two digits for the district ID, so CA-32 would turn into 0632 and IL-7 would turn into 1707.  Unfortunately, if a state has a small enough population, they only get one congressional rep; the data file had entries like &#8220;AK-At large&#8221; which not only messed up my parsing, but raised the question of whether at-large congresspeople should be district 0 or district 1.  I scratched my head and decided assign 0 to at-large districts.  (So AK-At large became 0200.)  Well, I found out later that data files seem to assign at-large districts the number 1, so I had to redo it.</li>
</ul>
<p>None of these data issues are <em>hard</em> problems, they are just annoying and mean that I have to do some hand-tweaking of the process for almost every new jurisdiction type or attribute.  It also takes time just to load the data up to my database server.</p>
<p>I am really excited to get the on-the-fly census tract maps working.  I&#8217;ve been wanting it for about three years, and working on it off and on (mostly off) for about six months.  It really closes a chapter for me.</p>
<p>Now there is one more quickie mapping application that I want to do, and then I plan to dive into adding Canadian information.  If you know of good Canadian data that I can use freely, please let me know.  (And yes, I already know about <a href="http://geogratis.ca">GeoGratis</a>.)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.webfoot.com/2009/08/15/progress-including-census-tracts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gender and programming</title>
		<link>http://blog.webfoot.com/2009/05/20/gender-and-programming/</link>
		<comments>http://blog.webfoot.com/2009/05/20/gender-and-programming/#comments</comments>
		<pubDate>Wed, 20 May 2009 19:44:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Technology trends]]></category>
		<category><![CDATA[programmer productivity]]></category>
		<category><![CDATA[robobait]]></category>

		<guid isPermaLink="false">http://www.webfoot.com/blog/?p=737</guid>
		<description><![CDATA[I had a very brief but very interesting talk with Prof. Margaret Burnett.  She does research on gender and programming. at Oregon State University, but was in town for the International Conference on Software Engineering.  She said that many studies have shown that women are &#8212; in general &#8212; more risk averse than men are.  [...]]]></description>
			<content:encoded><![CDATA[<p>I had a very brief but very interesting talk with Prof. Margaret Burnett.  She does <a href="http://eusesconsortium.org/gender/gender.php">research on gender and programming</a>. at Oregon State University, but was in town for the <a href="http://www.icse-conferences.org/">International Conference on Software Engineering</a>.  She said that many studies have shown that women are &#8212; in general &#8212; more risk averse than men are.  (I&#8217;ve also <a href="http://www.webfoot.com/blog/2007/10/15/why-dont-women-go-into-computer-science/">commented</a> on this.)  She said that her research found that risk-averse people (most women and some men) are less likely to tinker, to explore, to try out novel features in both tools and languages when programming.</p>
<p>I extrapolate that this means that risk-seeking people (most men and some women) were more likely to have better command of tools, and this ties into something that I&#8217;ve been voicing frustration with for some time &#8212; there is no instruction on how to use tools in the CS curriculum &#8212; but I had never seen it as a gender-bias issue before.  I can see how a male universe would think there was no need to explain how to use tools because the figured that the guys would just figure it out on their own.  And the most guys might &#8212; but most of the women and some of the men might not figure out how to use tools on their own.</p>
<p>In particular, there is no instruction on how to use the debugger: not on what features are available, not on when you should use a debugger vs. not, and none on good debugging strategy.  (I&#8217;ve commented on that <a href="http://www.webfoot.com/blog/2007/10/15/why-dont-women-go-into-computer-science/">here</a>.)  Some of using the debugger is art, true, but there are teachable strategies &#8211; practically algorithms &#8212; for how to use the debugger to achieve specific ends.   (For example, I wrote up <a href="http://programmerproductivity.info/index.php?title=Debugging#How_to_debug_hangs">how to use the debugger to localize the causes of hangs</a>.)</p>
<p>Full of excitement from Prof. Burnett&#8217;s revelations, I went to dinner with a bunch of people connected to the research lab I did my MS research in.  All men, of course.  I related how Prof. Burnett said that women didn&#8217;t tinker, and how this obviously implied to me that CS departments should give some instruction on how to use tools.  The guys had a different response: &#8220;The departments should teach the women how to tinker.&#8221;</p>
<p>That was an unsatisfying response to me, but it took me a while to figure out why.  It suggests that the risk-averse pool doesn&#8217;t know <em>how</em> to tinker, while in my risk-averse model, it is not <em>appropriate</em> to tinker: one shouldn&#8217;t goof off fiddling with stuff that has a risk of not being useful when there is work to do!</p>
<p>(It has been emotionally very difficult for me to write this blog post today.  I think it is important and worthwhile, but I have a little risk-averse agent in my head screaming, <em>screaming</em> at me that I shouldn&#8217;t be wasting my time on this: I should be applying for jobs, looking for an immigration lawyer, doing laundry, or working on improving the performance of my maps code.  In other words, writing this post is risky behaviour: it takes time for no immediate payoff, and only a low chance of a future payoff.  It might also be controversial enough that it upsets people.  Doing laundry, however, is a low-risk behaviour: I am guaranteed that it will make my life fractionally better.)</p>
<p>To change the risk-averse population&#8217;s behaviour, you would have to change their entire model of risk-reward.  I&#8217;m not sure that&#8217;s possible, but I also think that you shouldn&#8217;t <em>want</em> to change the attitude.  You want some people to be risk-seeking, as they are the ones who will get you the big wins.  However, they will also get you the big losses.  The risk-averse people are the ones who provide stability.</p>
<p>Also note that because there is <a href="http://www.webfoot.com/blog/2008/02/06/vandev-talk-summary/">such asymmetry in task completion time between above-median and below-median</a>, you might expect that a bunch of median programmers are, in the aggregate, more productive than a group at both extremes.  (There are limits to how much faster you can get at completing a task, but there are no limits to how much slower you can get.)  It might be that risk aversion is a good thing!</p>
<p>There was a study I heard of second-hand (I wish I had a citation &#8212; anybody know?) that found that startups with a lot of women (I&#8217;m remembering 40%) had much MUCH higher survival rates than ones with lower proportions of women.  This makes perfect sense to me; a risk-averse population would rein in the potentially destructive tendencies of a risk-seeking population.</p>
<p>Thus I think it <em>does</em> make sense to provide academic training in how to use tools.  This should perhaps be coupled with some propaganda about how it is important to set aside some time in the future to get comfortable with tools.  (Perhaps it should be presented as risky to <em>not</em> spend time tinkering with tools!)</p>
<p><em>UPDATE: There&#8217;s an interesting (though all-too-brief!) <a href="http://www.womensadventuremagazine.com/features/article-index/june-09/psychobabble/">article</a> that mentions differences in the biochemical responses to risk that men and women produce.  It says that men produce adrenaline, which fun.  Women produce acetylcholine, which the article says pretty much makes them want to vomit.  That could certainly change one&#8217;s reaction to risk..</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.webfoot.com/2009/05/20/gender-and-programming/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UBC programming team takes 34th in the world!</title>
		<link>http://blog.webfoot.com/2009/04/21/ubc-programming-team-takes-34th-in-the-world/</link>
		<comments>http://blog.webfoot.com/2009/04/21/ubc-programming-team-takes-34th-in-the-world/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 19:47:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Canadian life]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[University life]]></category>

		<guid isPermaLink="false">http://www.webfoot.com/blog/?p=693</guid>
		<description><![CDATA[The UBC programming team took 34th place at the 2009 International Collegiate Programming Contest (ICPC) World Finals in Stockholm!  W00t!!
This marks the sixth year in a row that UBC has gone to the World Finals, despite being entirely undergraduates and entirely without World Finals experience.  (We have information on past teams, but don&#8217;t know the [...]]]></description>
			<content:encoded><![CDATA[<p>The UBC programming team <a href="http://cm2prod.baylor.edu/ICPCWiki/Wiki.jsp?page=Results%20World%20Finals%202009">took 34th</a> place at the 2009 International Collegiate Programming Contest (ICPC) World Finals in Stockholm!  W00t!!</p>
<p>This marks the sixth year in a row that UBC has gone to the World Finals, despite being entirely undergraduates and entirely without World Finals experience.  (We have <a href="https://bugs.cs.ubc.ca/cgi-bin/twiki/view/Main/ProgrammingTeamHistory">information on past teams</a>, but don&#8217;t know the seniority of the 2004 team.)</p>
<p>Congratulations, team!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.webfoot.com/2009/04/21/ubc-programming-team-takes-34th-in-the-world/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programming persistence</title>
		<link>http://blog.webfoot.com/2008/11/30/programming-persistence/</link>
		<comments>http://blog.webfoot.com/2008/11/30/programming-persistence/#comments</comments>
		<pubDate>Mon, 01 Dec 2008 07:21:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Maps]]></category>
		<category><![CDATA[Too Much Information]]></category>

		<guid isPermaLink="false">http://www.webfoot.com/blog/?p=444</guid>
		<description><![CDATA[Warning: this is a long and geeky post.
From time to time in the past few years, I have mentioned that I was a little puzzled as to why more people didn&#8217;t render tiles on-the-fly for Google Maps, as I do in my U.S. Census Bureau/Google Maps mashup.
I have reappraised my attitude.  I have been redoing [...]]]></description>
			<content:encoded><![CDATA[<p><em>Warning: this is a long and geeky post.</em></p>
<p>From time to time in the past few years, I have mentioned that I was a little puzzled as to why more people didn&#8217;t render tiles on-the-fly for Google Maps, as I do in my <a href="http://maps.webfoot.com/index.php" target="_blank">U.S. Census Bureau/Google Maps mashup</a>.</p>
<p>I have reappraised my attitude.  I have been redoing my mapping framework to make it easier to use.  I have reminded myself of all the hurdles I had to overcome, and discovered a number of annoying new ones.</p>
<h2>First pass</h2>
<p>I originally wrote my mapping framework in an <em>extreme</em> hurry.  It was a term project, and a month before the end of the term, I realized that it would be good for personal reasons to hand it in a week early.  The code functioned well enough to get me an A+, but I cut a huge number of corners.</p>
<h3>Language/libraries/database choice</h3>
<p>It was very important to minimize risk, so I wrote the framework in C++.  I would have liked to use a scripting language, but I knew that I would need to use a graphics library and a library to interpret shapefiles.  The only ones I found that looked reasonable were C-based libraries (Frank Warmerdam&#8217;s <a href="http://shapelib.maptools.org/" target="_blank">Shapelib</a> library andThomas Boutell&#8217;s  <a href="http://www.boutell.com/gd/manual2.0.33.html">gd</a> library).   I knew it was possible using a tool called <a href="http://www.swig.org/" target="_blank">SWIG</a>, but I hadn&#8217;t ever used SWIG and had heard that it was touchy.  Doing it in C++ was guaranteed to be painful, but I knew what the limits of that pain were.  I didn&#8217;t know what the limits of pain of using SWIG would be.</p>
<h3>Projection</h3>
<p>I also had problems figuring out how to convert from latitude/longitude to pixel coordinates in the Google tile space.  At the time (December 2005), I had a hard time simply finding out what the mathematics of the Mercator transformation were.  (It is easier to find <a href="http://en.wikipedia.org/wiki/Mercator_projection" target="_blank">Mercator projection</a> information now.)  I was able to figure out something that worked most of the time, but if you zoomed out past a certain level, there would be a consistent error in the y-coordinates.  The more you zoomed out, the bigger the error.  I&#8217;m pretty sure it&#8217;s some sort of rounding error.  I looked at it several times, trying to figure out where I could possibly have a roundoff error, but never did figure it out.  I just restricted how far people could zoom out.  (It also took a very long time to render tiles if you were way zoomed out, so it seemed reasonable to restrict it.)</p>
<h3>Polygon intersection</h3>
<p>I remember that I spent quite a lot of time on my polygon intersection code.  I believe that I looked around the Web and didn&#8217;t find any helpful code, so developed it from scratch on little sleep.  (Remember, I was doing this in a frantic, frantic hurry.)  I ended up with eight comparisons that needed to be done for each polygon in the database for every tile.  More on this later.</p>
<h3>Rendering bug</h3>
<p>The version I handed in had a bug where horizontal lines would show up at the bottom of tiles frequently, as you can see in the bottom left tile:</p>
<p style="text-align: center;"><img class="aligncenter" src="http://www.webfoot.com/blog/wp-content/uploads/2008/11/corsicawithline.php" alt="" width="256" height="256" /></p>
<p>It was pretty obvious that the bug was my fault, as gd is a very mature and well-used graphics library.  My old office partner Carlos Pero had used it way back in 1994 to develop <a href="http://www.coloring.com/" target="_blank">Carlos&#8217; Coloring Book</a>, so it was clear to me that the problem was my fault.</p>
<p>After I handed in my project, I spent quite a lot of time going through my code trying to figure out where the problem was with no luck.  Frustrated, I downloaded and built gd so that I could put breakpoints into the gd code.  Much to my surprise, I discovered that the bug was in the gd library!  I thus had to study and understand the gd code, fix it, <a href="http://bugs.libgd.org/?do=details&amp;task_id=100" target="_blank">report the bug</a> (and patch), and of course <a href="http://www.webfoot.com/blog/2007/08/12/robobait-gd-library-bug-horizontal-lines/" target="_blank">blog about it</a> so that other people wouldn&#8217;t have the same problem.</p>
<h3>Pointing my code to the fixed gd</h3>
<p>Then, in order to actually get the fix, I had to figure out how to statically link gd into my binaries.  I like my ISP (<a href="http://dreamhost.com">Dreamhost</a>) and wasn&#8217;t particularly interested in changing, but that meant I couldn&#8217;t use the system-installed gd libraries.  Statically linking wasn&#8217;t a <em>huge</em> deal, but it took me at least several hours to figure out which flag to insert where in my makefile to get it to build statically.  It was just one more thing.</p>
<h2>Second pass</h2>
<p>I have graduated, but haven&#8217;t found a job yet, so I decided to revamp my mapping framework.  In addition to the aesthetic joy of making nice clean code:</p>
<ul>
<li>It would be an opportunity to learn and demonstrate competence in another technology.</li>
<li>I had ideas for how I could improve the performance by pre-computing some things.</li>
<li>With a more flexible framework, I would be able to do some cool new mashups that I figured would get me more exposure, and hence lead to some consulting jobs.</li>
</ul>
<h3>Language/libraries/database choice</h3>
<p>Vancouver is a PHP town, so I thought I&#8217;d give PHP a shot.  I expected that I might have to rewrite my code in C++ eventually, but that I could get the basics of my improved algorithms shaken out first.  (I&#8217;m not done yet, but so far, I have been very very pleased with that strategy.)</p>
<p>I also decided to use <a href="http://mysql.com/?bydis_dis_index=1" target="_blank">MySQL</a>.  While the feeling in the <a href="http://en.wikipedia.org/wiki/Geographic_information_system" target="_blank">GIS</a> community is that the <a href="http://www.postgresql.org/" target="_blank">Postgres</a>&#8216; GIS extensions (<a href="http://postgis.refractions.net/" target="_blank">PostGIS</a>) are better than the GIS extensions to MySQL, I can&#8217;t run Postgres on my ISP, and MySQL is used more than Postgres.</p>
<p>I had installed PHP4 and MySQL 4 on my home computer some time ago, when I was working on <a href="http://maps.webfoot.com/mapeteria/index.php" target="_blank">Mapeteria</a>.  However, I recently upgraded my home Ubuntu installation to Hardy Heron, and PHP4 was no longer supported.  That meant I need to install a variety of packages, and I went through a process of downloading, trying, discovering I was missing a package, downloading/installing, discovering I was missing a package, lather, rinse, repeat.  I needed to install  mysql-server-5.0,  mysql-client-5.0, php5, php5-mcrypt, php5-cli, php5-gd, libgd2-xpm-dev, php5-mysql, and php5-curl.  I also spent some time trying to figure out why <tt>php5</tt> wouldn&#8217;t run scripts that were in my <tt>cgi-bin</tt> directory before realizing/discovering that with <tt>mod_php</tt>, it was supposed to run from everywhere <em>but</em> the <tt>cgi-bin</tt> directory.</p>
<p>Note that I could have done all my development on my ISP&#8217;s machines, but that seemed clunky.  I knew I&#8217;d want to be able to develop offline at some point, so wanted to get it done sooner rather than later.  It&#8217;s also a little faster to develop on my local system.</p>
<p>I did a little bit of looking around for a graphics library, but stopped when I found that PHP had hooks to the gd library.  I knew that if gd had not yet incorporated my horizontal lines bug fix, then I might have to drop back to C++ in order to link in &#8220;my&#8221; gd, but I figured I could worry about that later.</p>
<h3>Projection</h3>
<p>I made a conscious decision to write my Mercator conversion code from scratch, without looking at my C++ code.  I did this because I didn&#8217;t want to be influenced in a way that might lead me to get the same error at way-zoomed-out that I did before.  I was able to find equations on <a href="http://en.wikipedia.org/wiki/Mercator_projection" target="_blank">the Wikipedia Mercator page</a> for transforming Mercator coordinates to X-Y coordinates, but those equations didn&#8217;t give a <em>scale</em> for the X-Y coordinates!  It took some trial and error to sort that out.</p>
<h3>Data</h3>
<p>For the initial development, I decided to use country boundaries instead of census tract boundaries.  The code wouldn&#8217;t care which data it was using, and it would be nice to have tiles that would render faster when way-zoomed-out.  I whipped up a script read a KML file with country boundaries (that I got from <a href="http://www.geoblogspot.com/" target="_blank">Valery Hronusov</a> and used in my <a href="http://maps.webfoot.com/mapeteria/" target="_blank">Mapeteria</a> project) and loaded it into MySQL.  Unfortunately, I had real problems with precision.  I don&#8217;t remember whether it was PHP or MySQL, but I kept losing some precision in the latitude and longitude when I read and uploaded it.  I eventually converted to uploading integers that were 1,000,000 times the latitude and longitude, and so had no rounding difficulties.</p>
<p>One thing that helped me enormously when working on the projection algorithm was to gather actual data via Google.  I found a number of places on the Google maps where three territories (e.g. British Columbia, Alberta, and Montana) came together.  I would determine the latitude/longitude of those points, then figure out what the tile coordinates, pixel X, and pixel Y of that point were for various zoom levels.  That let me assemble high-quality test cases, which were absolutely essential in figuring out what the transformation algorithm should be, but it was very slow, boring, and tedious to collect that data.</p>
<h3>Polygon intersection</h3>
<p>When it came time to implement my polygon bounding box intersection code again, I looked at my old polygon intersection code again, saw that it took eight comparisons, and thought to myself, &#8220;That can&#8217;t be right!&#8221;  Indeed, it took me very little time to come up with a version with only four comparisons, (and was now able to find <a href="http://tekpool.wordpress.com/2006/10/12/rectangle-intersection-find-the-intersecting-rectangle/" target="_blank">sources on the Web that describe that algorithm</a>).</p>
<h3>Stored procedures</h3>
<p>One thing that I saw regularly in employment ads was a request for use of stored procedures, which became available with MySQL 5.  It seemed reasonable that using a stored procedure to calculate the bounding box intersection would be even faster, so I ran some timing tests.  In one, I used PHP to generate a complex WHERE clause string from eight values; in the other, I passed eight values to a stored procedure and used that in the WHERE clause.  Much to my suprise, it took almost 20 times more time to use the stored procedure!  I think I understand why, but it was interesting to discover that it was not always faster.</p>
<h3>GIS extensions</h3>
<p>My beloved husband had been harping on me to use the built-in GIS extensions.  I had been ignoring him because a large part of the point of this exercise was to learn more about MySQL, including stored procedures, but now that I found that the stored procedure was slow, it was time to time the built-in bounding box intersection routine.  If I stored the bounding box as a POLYGON type instead of as two coordinate pairs, then calculating the intersection took half the time.  Woot!</p>
<h3>Rendering</h3>
<p>I discovered that despite my having reported the horizontal lines bug fifteen months ago, the gd team hasn&#8217;t done anything with it yet.  Needless to say, this means that the version of libgd.a on Dreamhost has the bug in it.  I thought about porting back to C++.  I figured that porting back would probably take at minimum a week, and would raise the possibility of nasty pointer bugs, so it was worth spending a few days trying to get PHP to use my version of gd.</p>
<p>It is possible to compile your own version of PHP and use it, though it means using the CGI version of PHP instead of mod_php.  I looked around for information on how to do that, and found a Dreamhost page on how to do so.. but failed utterly when I followed the directions.  I almost gave up at that point, but sent a detailed message to Dreamhost customer support explaining what I was trying to do, why, and what was blocking me.  On US Thanksgiving Day, I got a very thoughtful response back from Robert at Dreamhost customer support which pointed me at <a href="http://wiki.dreamhost.com/Installing_PHP5#Compiling_a_Customized_PHP_5" target="_blank">a different how-to-compile-PHP-on-Dreamhost</a> page that ultimately proved successful.  (This is part of why I like Dreamhost and don&#8217;t really want to change ISPs.)</p>
<p>Compiling unfamiliar packages can be a real pain, and this was no different.  The Dreamhost page (on their user-generated wiki) had a few scripts that would do the install/build for me, but they weren&#8217;t the whole story.  Each of the scripts downloaded a number of projects (like openSSL, IMAP, CURL, etc) in compressed form, extracted the files, and built them.  The scripts were somewhat fragile &#8212; they would just break if something didn&#8217;t work right.  They were sometimes opaque &#8212; they didn&#8217;t always print an error message if something broke.  If there was a problem, they started over from the beginning, removing everything that had been downloaded and extracted.  Something small &#8212; like if the mirror site for mcrypt was so busy that the download timed out &#8212; would mean starting from scratch.  (I ended up iteratively commenting out large swaths of the scripts so that I wouldn&#8217;t have to redo work.)</p>
<p>There was some problem with the IMAP build having to do with SSL.  I finally changed one of the flags so that IMAP built without SSL &#8212; figuring that I was unlikely to be using this instance of PHP to do IMAP, let alone IMAP with SSL &#8212; but it took several false starts, each taking quite a long time to go through.</p>
<p>Finally, once I got it to build without my custom gd, I tried folding in my gd.  I uploaded my gd/.libs directory, but that wasn&#8217;t enough &#8212; it wanted the gd.h file.  I suppose I could have tried to figure out what it wanted, where it wanted it, but I figured it would be faster to just re-build gd on my Dreamhost account, then do a <tt>make install</tt> to some local directory.  Uploading my source was fast and the build was slow but straightforward.  However, I couldn&#8217;t figure out how to specify where the install should go.  The makefiles were all autogenerated and very difficult to follow.  I tried to figure out where in <tt>configure</tt> the install directory got set, but that too was hard to decipher.  Finally, I just hand-edited the default installation directory.  So there.  That worked.  PHP built!</p>
<p>Unfortunately, it wouldn&#8217;t run.  It turned out that the installation script had a bug in it:</p>
<blockquote><p>cp ${INSTALLDIR}/bin/php ${HOME}/${DOMAIN}/cgi-bin/php.cgi</p></blockquote>
<p>instead of</p>
<blockquote><p>cp ${INSTALLDIR}/bin/php.cgi ${HOME}/${DOMAIN}/cgi-bin/php.cgi</p></blockquote>
<p>But finally, after all that, success!</p>
<p style="text-align: center;"><img class="aligncenter" src="http://www.webfoot.com/blog/wp-content/uploads/2008/11/corsicawithoutline.php" alt="" width="256" height="256" /></p>
<h3>Bottom line</h3>
<p>So let me review what it took to get to tile rendering on the second pass:</p>
<ol>
<li>Choose a database and figure out how to extract data from it, requiring reading and learning.</li>
<li>Find and load boundary information into the database, requiring trial and error.</li>
<li>Choose a graphics library and figure out how to draw coloured polygons with it, requiring reading and learning.</li>
<li>Gather test cases for converting from latitude/longitude into Google coordinate system, requiring patience.  A lot of patience.</li>
<li>Figure out how to translate from latitude/longitude pairs into the Google coordinate system, requiring algorithmic skills.</li>
<li>Diagnose and fix a bug in a large-ish C graphics library, requiring skill debugging in C.</li>
<li>Download and install PHP and MySQL, requiring system administration skills.</li>
<li>Figure out how to build a custom PHP, requiring understanding of bash scripts and makefiles.</li>
</ol>
<p>So now, I guess it isn&#8217;t that easy to generate tiles!</p>
<p><em>Note: there is an entirely different ecosystem for generating tiles, one that comes from the mainline GIS world, one that descends from the <a href="http://www.esri.com/" target="_blank">ESRI</a> ecosystem. I expect that I could have used PostGIS and <a href="http://geotools.codehaus.org/" target="_blank">GeoTools</a> with <a href="http://udig.refractions.net/" target="_blank">uDig</a> look like fine tools, but they are complex tools with many many features.  Had I gone that route, I would have had to wade through a lot of documentation of features I didn&#8217;t care about.  (I also would have had to figure out which ISP to move to in order to get Postgres.)  I think that it would have taken me long enough to learn / install that ecosystem&#8217;s tools that it wouldn&#8217;t have been worth it for the relatively simple things that I needed to do.  Your milage may vary.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.webfoot.com/2008/11/30/programming-persistence/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hire me!</title>
		<link>http://blog.webfoot.com/2008/10/20/looking-for-java-development-job/</link>
		<comments>http://blog.webfoot.com/2008/10/20/looking-for-java-development-job/#comments</comments>
		<pubDate>Mon, 20 Oct 2008 23:28:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Canadian life]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[programmer productivity]]></category>

		<guid isPermaLink="false">http://www.webfoot.com/blog/?p=304</guid>
		<description><![CDATA[I am looking for a job.  If you know anybody in the Vancouver area who is looking for a really good hire, point them at this blog posting or send them to my resume.
Ideally, I&#8217;d like a intermediate (possibly junior, let&#8217;s talk) Java software development position, preferably where I could become an expert in [...]]]></description>
			<content:encoded><![CDATA[<p>I am looking for a job.  If you know anybody in the Vancouver area who is looking for a really good hire, point them at this blog posting or send them to my <a href="http://webfoot.com/biz/history.html" target="_blank">resume</a>.</p>
<p>Ideally, I&#8217;d like a intermediate (possibly junior, let&#8217;s talk) Java software development position, preferably where I could become an expert in Java-based web applications.  (Java because <a href="http://www.webfoot.com/blog/2007/05/21/comparative-programming-linguistics/" target="_blank">I think it has the best long-term prospects</a>.  My second choice would be a Ruby position, as it looks like Ruby has long-term staying power as well.)  I believe that I would advance quickly, as I have very broad experience with many languages and environments.</p>
<p>Development is only partially about coding, and I am very, very strong in the secondary skills.  While studying <a href="http://www.webfoot.com/blog/category/programmer-productivity/" target="_blank">programmer productivity</a> for my MSCS.  I uncovered a few unknown or poorly known, broadlly applicable, <em>teachable</em> skills that will improve programmer productivity.  Hire me, and not only will you get a good coder, I make the coders around me better.</p>
<p>I am particularly good at seeing how to solve users&#8217; problems, sometimes problems that they themselves do not see. I am good both at interaction design, at seeing the possibilities in a new technology, and seeing how to combine the two. I have won a few awards for web sites I developed.</p>
<p>I also have really good communication skills.  I&#8217;ve written books, I blog, and I&#8217;ve written a number of articles.  I even have significant on-camera television experience.</p>
<p>If you want a really low-stress way of checking me out, invite me to give a talk on programmer productivity.  (I like giving the talk, and am happy to give it to basically any group of developers, basically any time, any where in the BC Lower Mainland.  Outside of the Lower Mainland, you have to pay me for the travel time.)</p>
<p>Do you know of any developer opportunities that I should check out?  Let me know at ducky at webfoot dot com.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.webfoot.com/2008/10/20/looking-for-java-development-job/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tripoli: Differential code coverage tool</title>
		<link>http://blog.webfoot.com/2008/09/10/tripoli-differential-code-coverage-tool/</link>
		<comments>http://blog.webfoot.com/2008/09/10/tripoli-differential-code-coverage-tool/#comments</comments>
		<pubDate>Thu, 11 Sep 2008 02:41:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[programmer productivity]]></category>

		<guid isPermaLink="false">http://www.webfoot.com/blog/?p=295</guid>
		<description><![CDATA[In the observations of professional programmers that I did for my thesis, I frequently saw them get sidetracked because they didn&#8217;t have good information about whether the code they were looking at was executed as part of the feature they were exploring.  I theorized that being able to look at the differences in code [...]]]></description>
			<content:encoded><![CDATA[<p>In the observations of professional programmers that I did for my thesis, I frequently saw them get sidetracked because they didn&#8217;t have good information about whether the code they were looking at was executed as part of the feature they were exploring.  I theorized that being able to look at the differences in code coverage between two runs &#8212; one where they exercised the feature and one where they didn&#8217;t &#8212; would be useful.  Being able to see which methods executed in the first but not the second would hopefully help developers focus in quickly on the methods that were important to their task.</p>
<p>In my last month at UBC, I whipped up a prototype, an Eclipse plug-in called Tripoli, and ran a quickie user study.  The differential code coverage information really <em>does</em> make a big difference.  You can read a detailed account in <a href="http://www.cs.ubc.ca/cgi-bin/tr/2008/TR-2008-14" target="_blank">UBC Technical Report TR-2008-14</a>, but basically graduate students using Tripoli were frequently more successful than professional programmers who didn&#8217;t use Tripoli.</p>
<p>As an example, in the Size task, the subject needed to find where a pane was resized.  That was hard.  There is no menu item or key stroke invocation for developers to use a starting point.  They also didn&#8217;t know what the pane was called: was it a canvas, a pane, a panel, a frame, a drawing, or a view?  Between pilot subjects and actual subjects, at least eleven people tried and failed to find a method that was always called when a pane was resized and never called when it wasn&#8217;t.  <em><strong>I</strong></em> even spent a few hours  trying to figure out where the pane was resized and couldn&#8217;t.</p>
<p>As soon as I got Tripoli working, I tried the Size task, and in my first diff, I saw ten methods, including one named endResizingFrame().  And yes, it turned out to be the right spot. I realized that most of the methods came from not hovering over the corner of the frame such that the cursor changed into the grab handle, and reran.  This time I got exactly one method: endResizingFrame().  Wow.  The graduate students in my second study were also all able to find endResizingFrame() by using Tripoli.</p>
<p>Tripoli does take some getting used to.  Even as the author, it took me a while before I consistently remembered right away that I could use Tripoli on my problems.  I&#8217;ve also clearly gotten better over time at figuring out what to do in my second run to ensure that the &#8220;diff&#8221; has very few methods in it.</p>
<p>If you want to try Tripoli out, <a href="http://programmerproductivity.info/tripoli" target="_blank">I&#8217;ve posted it online</a>.  Just remember it&#8217;s a prototype.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.webfoot.com/2008/09/10/tripoli-differential-code-coverage-tool/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>geek cool alert: Triage</title>
		<link>http://blog.webfoot.com/2008/07/29/geek-cool-alert-triage/</link>
		<comments>http://blog.webfoot.com/2008/07/29/geek-cool-alert-triage/#comments</comments>
		<pubDate>Tue, 29 Jul 2008 19:01:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Technology trends]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[programmer productivity]]></category>

		<guid isPermaLink="false">http://www.webfoot.com/blog/?p=290</guid>
		<description><![CDATA[There&#8217;s a cool paper on a tool to do semi-automatic debugging: Triage: diagnosing production run failures at the user&#8217;s site.  While Triage was designed to diagnose bugs at a customer site (where the software developers don&#8217;t have access to either the configuration or the data), I think a similar tool would be very valuable [...]]]></description>
			<content:encoded><![CDATA[<p>There&#8217;s a cool paper on a tool to do semi-automatic debugging: <a href="http://portal.acm.org/citation.cfm?id=1294261.1294275" target="_blank">Triage: diagnosing production run failures at the user&#8217;s site</a>.  While Triage was designed to diagnose bugs at a customer site (where the software developers don&#8217;t have access to either the configuration or the data), I think a similar tool would be very valuable even for debugging in-house.</p>
<p>They use a number of different techniques to debug C++ code.</p>
<ul>
<li>Checkpoint the code at a number of steps.</li>
<li>Attempt to reproduce the bug.  This tells whether it is deterministic or not.</li>
<li>Analyzes the memory by walking the heap and stack to find possible corruptions.</li>
<li>Roll back to previous checkpoints and rerun, looking for buffer overflows, dangling pointers, double frees, data races, semantic bugs, etc.</li>
<li>Fuzz the inputs: intentionally vary the inputs, thread scheduling, memory layouts, signal delivery, and even control flows and memory states to narrow the conditions that trigger the failure for easy reproduction</li>
<li>Compare the code paths from failing replays and non-failing replays to determine what code was involved in that failure.</li>
<li>Generate a report.  This gives information on the failure and a suggestion of which lines to look at to fix it.</li>
</ul>
<p>They did a user study and found that programmers took 45% less time to debug when they used Triage than when they didn&#8217;t for &#8220;real&#8221; bugs, and 18% for &#8220;toy&#8221; bugs.  (&#8220;&#8230;although Triage still helped, the effect was not as large since the toy bugs are very simple and straightforward to diagnose even without Triage.&#8221;)</p>
<p>It looks like the subjects were given the Triage bug reports before they started work, so the time that it takes to run Triage wasn&#8217;t factored into the time it took.  The time it took Triage to run was significant (up to 64 min for one of the bugs), but presumably the Triage run would be done in background.  I could set up Triage to run while I went to lunch, for example.</p>
<p>This looks cool.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.webfoot.com/2008/07/29/geek-cool-alert-triage/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>it&#039;s not just me!</title>
		<link>http://blog.webfoot.com/2008/05/12/its-not-just-me/</link>
		<comments>http://blog.webfoot.com/2008/05/12/its-not-just-me/#comments</comments>
		<pubDate>Tue, 13 May 2008 04:31:20 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Random thoughts]]></category>

		<guid isPermaLink="false">http://www.webfoot.com/blog/?p=263</guid>
		<description><![CDATA[It&#8217;s not just me!  Someone else gets frustrated by Web sites that won&#8217;t allow dashes or spaces in credit card numbers!
It is just unfathomable to me why any Web site would not insert the ONE LINE OF CODE to handle spaces and dashes.  I am glad to see that it&#8217;s not just me.
]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s not just <a href="http://www.webfoot.com/blog/2005/08/12/rant-spaces-between-numbers-in-credit-cards/" target="_blank">me</a>!  <a href="http://www.unixwiz.net/ndos-shame.html" target="_blank">Someone else gets frustrated by Web sites that won&#8217;t allow dashes or spaces in credit card numbers</a>!</p>
<p>It is just unfathomable to me why any Web site would not insert the ONE LINE OF CODE to handle spaces and dashes.  I am glad to see that it&#8217;s not just me.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.webfoot.com/2008/05/12/its-not-just-me/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>geek humour</title>
		<link>http://blog.webfoot.com/2008/05/10/geek-humour/</link>
		<comments>http://blog.webfoot.com/2008/05/10/geek-humour/#comments</comments>
		<pubDate>Sat, 10 May 2008 17:38:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Family]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Random thoughts]]></category>

		<guid isPermaLink="false">http://www.webfoot.com/blog/?p=261</guid>
		<description><![CDATA[My husband and I are geeks.  This manifests itself in many ways.  One way is that when we moved up to Canada from Palo Alto, we numbered all of the boxes and logged all of the contents of all of the boxes.
In anticipation of our move to a tiny tiny apartment in downtown [...]]]></description>
			<content:encoded><![CDATA[<p>My husband and I are geeks.  This manifests itself in many ways.  One way is that when we moved up to Canada from Palo Alto, we numbered all of the boxes and logged all of the contents of all of the boxes.</p>
<p>In anticipation of our move to<a href="http://maps.google.com/maps?f=q&amp;hl=en&amp;geocode=&amp;q=49.278677N+123.120527W&amp;ie=UTF8&amp;ll=49.278683,-123.120518&amp;spn=0.001459,0.002604&amp;t=h&amp;z=19" target="_blank"> a tiny tiny apartment in downtown Vancouver</a>, I packed up a box of books and class notes to take down to our storage locker in the US.  Jim said that he&#8217;d been assigning new boxes numbers in the 200 series &#8212; 200, 201, etc.</p>
<p>Me: &#8220;Jim, would you be a name service for box numbers?&#8221;</p>
<p>He pulled out his PDA and got ready.</p>
<p>Me: &#8220;Um, &#8216;Hello.&#8217;&#8221;</p>
<p>Jim said nothing but was suppressing a grin.  He continued to say nothing.</p>
<p>Me: &#8220;Doh!  Right!  Carriage-return, carriage-return!&#8221;</p>
<p>Much laughter ensued.  We are such geeks.  <img src='http://blog.webfoot.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>(When taking DIRECTLY to Web servers, i.e. not through a Web browser, you have to issue a command like &#8220;GET / HTTP/1.0&#8243; and follow it with *two* carriage returns.  One won&#8217;t do, and it&#8217;s a really easy mistake to make.)</p>
<p>(PS, Yes, I know that HELOs (used in email protocols) don&#8217;t need two carriage returns.)</p>
<p>(PPS, Yes, I know that technically it&#8217;s CRLF, CRLF, not CR, CR.)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.webfoot.com/2008/05/10/geek-humour/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
