<?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>Steven's weblog</title>
	<atom:link href="http://www.ourada.org/blog/feed" rel="self" type="application/rss+xml" />
	<link>http://www.ourada.org/blog</link>
	<description></description>
	<lastBuildDate>Thu, 26 Jan 2012 07:27:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>The difficulty of describing bugs in code</title>
		<link>http://www.ourada.org/blog/archives/672?&#038;owa_medium=feed&#038;owa_sid=</link>
		<comments>http://www.ourada.org/blog/archives/672#comments</comments>
		<pubDate>Thu, 26 Jan 2012 07:26:20 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=672</guid>
		<description><![CDATA[I&#8217;m working with someone to fix a bug in some code. I want him to be able to actually do the fix, and in the process, learn more about the code base. He&#8217;s taking over a project from me that I&#8217;ve been working on in isolation for a year or so, so the priority is [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m working with someone to fix a bug in some code. I want him to be able to actually do the fix, and in the process, learn more about the code base. He&#8217;s taking over a project from me that I&#8217;ve been working on in isolation for a year or so, so the priority is on shifting the knowledge from my head to his rather than immediately fixing the bug.</p>
<p>I think I have a fix (which I developed in the process of trying to explain the code), but just handing it over wouldn&#8217;t achieve the goal of giving him the deeper understanding of the code that he needs going forward (I still offered him the option; we&#8217;ll see what he thinks). The fix only affects about three lines of code, and it probably would have taken me about 45 minutes to find and fix myself. But explaining the whole context of the code, and precisely how it was that I screwed up in the first place, that&#8217;s a lot more work. I spent 3 hours trying to document the meaning of one relevant variable, and I still feel like I didn&#8217;t do a great job of it. It will be at least another couple hours of work to describe exactly how I fixed the bug, if he wants to hear it.</p>
<p>This might be one of those cases where he&#8217;d be better off refactoring the code. Sometimes people use refactoring as a way to gain deeper understanding of the code, as well as making it easier to understand in the future. In this case, for example, I wrote a function called adjust-rowspan-vec, which probably should have been named update-rowspan-vec-for-next-row. Though the name rowspan-vec in itself is not all that clear, but ugh, it&#8217;s hard to find a good name for that one; maybe data-for-cells-which-span-rows-and-are-currently-in-flight-so-that-we-can-track-where-to-insert-dummy-cells-as-we-scan-down-the-input-rows, or something. So, yeah, probably needs a refactoring, just so that we can better wrap our heads around whatever concept I was trying to express with rowspan-vec.</p>
<p>It&#8217;s hard to describe the concepts in use in the code even if it was working properly, but to describe my partially-broken mental model when I wrote the incorrect code would add another level of complexity. I think I could do it, though, and it&#8217;s awesome that human languages have the ability to express such deep weirdness.</p>
<p>[And just to vent a little more, none of this is made any easier by the fact that the code in question is in a functional language, which means we're using immutable variables and two levels of recursion rather than mutable variables and loops. Nor is it made easier by my lack of confidence in communicating in English with someone who's first language is not English...]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/672/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Vias and edges</title>
		<link>http://www.ourada.org/blog/archives/664?&#038;owa_medium=feed&#038;owa_sid=</link>
		<comments>http://www.ourada.org/blog/archives/664#comments</comments>
		<pubDate>Wed, 28 Sep 2011 17:31:41 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=664</guid>
		<description><![CDATA[Jayson was asking on Twitter whether anyone knew where to get pins like the ones on Basic Stamps. I wasn&#8217;t able to help him, but I did have fun looking around at the catalogs of Mill-Max, TE Connectivity, Interplex, and Keystone. There are a damn lot of connectivity solutions out there! Sparkfun did have a [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.tautic.com/">Jayson</a> was asking on <a href="https://twitter.com/#!/TAUTIC/status/119043575404183552">Twitter</a> whether anyone knew where to get pins like <a href="http://www.ictradenet.com/BS2-IC/">the ones on Basic Stamps</a>. I wasn&#8217;t able to help him, but I did have fun looking around at the catalogs of <a href="http://mill-max.com/">Mill-Max</a>, <a href="http://www.te.com/default.aspx">TE Connectivity</a>, <a href="http://www.interplex.com/interplex">Interplex</a>, and <a href="http://www.keyelco.com/">Keystone</a>. There are a damn lot of connectivity solutions out there!</p>
<p>Sparkfun did have a couple interesting forum threads about these, <a href="http://forum.sparkfun.com/viewtopic.php?t=13699">here</a> and <a href="http://forum.sparkfun.com/viewtopic.php?f=14&#038;t=13764">here</a>, and at Mill-Max, I found <a href="http://www.mill-max.com/pin_rec_catalog/productInfo.cfm?webpartnumber=7310&#038;start=1&#038;leaddiameterrange=&#038;pin_or_rec=&#038;PartDescription=Edge-Mount%20Pin&#038;taildiameter=0.040&#038;tailtype=SOLDERTAIL&#038;mountingfeature=SOLDER&#038;mountinghole=&#038;bodylength=&#038;search=&#038;pr=pin&#038;stagecode=">something close</a> (though that doesn&#8217;t lead to any small-quantity distributors).</p>
<p>Anyway, when I was looking at the Basic Stamp, it popped into my mind that maybe one could save some hassle in doing home prototyping of 2-layer PCBs if one could route vias out to the edge of the board and use clips at the edges, rather than drilling and using rivets, wires soldered on both sides, etc. But then I realized that such a scheme is like trying to lay out your graph on a sphere rather than a plane, which leads to no advantage, as is well-known in topology. Topology is good for something, eh?</p>
<p>Thinking along those lines, though, makes me wonder about other methods that might yield some advantage. For example, route out a hole in the middle of the board and clip traces on those edges and you&#8217;ve got yourself a torus, which does (I think) get you more flexibility. It might be fun to do an investigation of graph embeddings in a variety of physically-realizable connection schemes, with an eye toward finding some method that is easy for a home prototypist given some small catalog of techniques and pre-manufactured connectors. There&#8217;s probably some paper written by Euler when he was 7 that lays this all out, so I suppose I should hit the library and brush up on my topology&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/664/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Soup</title>
		<link>http://www.ourada.org/blog/archives/665?&#038;owa_medium=feed&#038;owa_sid=</link>
		<comments>http://www.ourada.org/blog/archives/665#comments</comments>
		<pubDate>Fri, 23 Sep 2011 23:02:28 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=665</guid>
		<description><![CDATA[After reading The Milo Criterion, I was reminded of a thought I had a while ago: it&#8217;s one thing to say &#8220;oh, that soup i just made from some random ingredients turned out really well.&#8221;. it&#8217;s another thing to throw up the recipe on your blog and let people put it together themselves. it&#8217;s yet [...]]]></description>
			<content:encoded><![CDATA[<p>After reading <a href="http://www.ribbonfarm.com/2011/09/23/the-milo-criterion/" title="The Milo Criterion">The Milo Criterion</a>, I was reminded of a thought I had a while ago:</p>
<blockquote><p>it&#8217;s one thing to say &#8220;oh, that soup i just made from some random ingredients turned out really well.&#8221;. it&#8217;s another thing to throw up the recipe on your blog and let people put it together themselves. it&#8217;s yet another thing, though, for the entrepreneur to turn that into a can of soup that millions of people can buy for $0.99 as just another option in the soup aisle.</p></blockquote>
<p>After I wrote that, I had a feeling that there was something odd about my use of the word &#8216;entrepreneur&#8217; there. I think it&#8217;s that the average entrepreneur wants to think that their product is so radical that it wouldn&#8217;t fit in the soup aisle. It has to be in an end-cap display with a space cleared out around it so that people fainting from joy won&#8217;t hit their heads on shelves.</p>
<p>Maybe your thing <em>is</em> so radical it can&#8217;t rightly be called soup any more. But there&#8217;s quite a bit of marketing power in being on the shelf next to the soup, such that a customer in the soup aisle can use existing decision processes to decide on your product. If it really is a significant departure from soup, customers will tell <em>you</em> (and others) that, and they&#8217;ll work with you to define a new category. That&#8217;s probably a lot easier than trying to define that category ahead of time and then drag people there with you.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/665/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rescaling the economies of scale</title>
		<link>http://www.ourada.org/blog/archives/662?&#038;owa_medium=feed&#038;owa_sid=</link>
		<comments>http://www.ourada.org/blog/archives/662#comments</comments>
		<pubDate>Tue, 06 Sep 2011 09:09:46 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=662</guid>
		<description><![CDATA[I&#8217;d like to work on rescaling the economies of scale. Let me start with a brief look at what&#8217;s meant by &#8216;economies of scale&#8217;. This is very simplified, and we could talk for days about different nuances and exceptions and such, and if you want to start that conversation, I&#8217;m up for it. But this [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;d like to work on rescaling the economies of scale. Let me start with a brief look at what&#8217;s meant by &#8216;economies of scale&#8217;. This is very simplified, and we could talk for days about different nuances and exceptions and such, and if you want to start that conversation, I&#8217;m up for it. But this model will suffice for me to explain what I mean by &#8216;rescaling&#8217;.</p>
<p>For any given product, we can find a number of ways to manufacture it. (A rubber ball can be fashioned by hand-kneading and rolling a bit of rubber, or by injection molding.) For each method of manufacture, we can separate costs into two buckets: setup and per-unit costs. (Hand-rolling balls has basically zero setup costs but pretty high unit costs, injection molding has high setup costs but quite a bit lower unit costs.) These costs mean that for any given product, there are a number of regimes, under each of which a particular manufacturing method is most economical.</p>
<p>So, at its simplest, the concept of rescaling the economies of scale means using the same ingenuity we use in devising those different methods of manufacture to improve upon the tools which are part of those methods, as well. We figured out how to make rubber balls cheaper by using injection molding, now let&#8217;s figure out how to make setting up molds for new products cheaper, too.</p>
<p>And of course, we do that. At least, whenever a production process is not completely vertically integrated, and the product is under competitive stress, then there are separate firms making tools for the process, and they are subject to competitive pressure to reduce their prices. The successful ball maker will seek and find cheaper alternative vendors for the mold making process.</p>
<p>So, not necessarily a radical idea, looked at that way. It might be a little more radical to say that my reason for wanting to rescale things is so that smaller producers are empowered to use more sophisticated production methods for smaller batches. To shrink the gap between the concepts of &#8216;prototype&#8217; and &#8216;small production run&#8217;. To help bring the promise of mass customization to fruition. To allow more people to scratch their own itches. To give more little ideas a chance to come to life without having to appease the mighty powers of capital. OK, that last one is probably skirting radical, so I&#8217;ll stop there for now.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/662/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>I am a magazine subscriber</title>
		<link>http://www.ourada.org/blog/archives/659?&#038;owa_medium=feed&#038;owa_sid=</link>
		<comments>http://www.ourada.org/blog/archives/659#comments</comments>
		<pubDate>Sat, 20 Aug 2011 03:05:04 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=659</guid>
		<description><![CDATA[I just subscribed to a new, paper, magazine (Circuit Cellar, if you wanna know). This is odd, because I don&#8217;t much like paper*, especially with ephemeral content like magazines. But I think I know why I did. Paper magazines, after I&#8217;m &#8216;done reading&#8217; them, become totems. Of what I was, or want to be, or [...]]]></description>
			<content:encoded><![CDATA[<p>I just subscribed to a new, paper, magazine (<a href="http://www.circuitcellar.com/" title="Circuit Cellar">Circuit Cellar</a>, if you wanna know). This is odd, because I don&#8217;t much like paper*, especially with ephemeral content like magazines.</p>
<p>But I think I know why I did. Paper magazines, after I&#8217;m &#8216;done reading&#8217; them, become totems. Of what I was, or want to be, or want to do. But like any such totems, they can sorta disappear into the background of my perception after they&#8217;ve laid around the floor for a few days. Magazines, though, come again fresh every month, on someone else&#8217;s schedule. So I think I got the subscription mainly to help establish habits that I want to establish.</p>
<p>Or, whatever. I probably don&#8217;t actually know why I do things.</p>
<p>(* The fact that I have a couple thousand pounds of books does not contradict the assertion that I don&#8217;t much like paper. Deal with that as you must.)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/659/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>AVR Raven</title>
		<link>http://www.ourada.org/blog/archives/655?&#038;owa_medium=feed&#038;owa_sid=</link>
		<comments>http://www.ourada.org/blog/archives/655#comments</comments>
		<pubDate>Sat, 06 Aug 2011 07:00:45 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=655</guid>
		<description><![CDATA[If you recently bought an AVR Raven, and you were horrified to discover that the AVR Wireless Studio includes USB drivers that only work in Windows XP SP2 and previous, it may help you to know that you can get better drivers installed by installing AVR Studio, after which you can return to AVR Wireless [...]]]></description>
			<content:encoded><![CDATA[<p>If you recently bought an AVR Raven, and you were horrified to discover that the AVR Wireless Studio includes USB drivers that only work in Windows XP SP2 and previous, it may help you to know that you can get better drivers installed by installing AVR Studio, after which you can return to AVR Wireless Studio to do something with your expensive little dev kit.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/655/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Product/inquiry</title>
		<link>http://www.ourada.org/blog/archives/653?&#038;owa_medium=feed&#038;owa_sid=</link>
		<comments>http://www.ourada.org/blog/archives/653#comments</comments>
		<pubDate>Sat, 06 Aug 2011 04:59:58 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=653</guid>
		<description><![CDATA[Here&#8217;s a nice example of how a product spurred an inquiry by a customer which results in interesting answers that excite the product designers and improve the product and design understanding of the whole community: iCufflinks improved battery life code hacking…. Not that you were necessarily looking for that. I happened to be thinking about [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a nice example of how a product spurred an inquiry by a customer which results in interesting answers that excite the product designers and improve the product and design understanding of the whole community:<br />
<a href="http://www.adafruit.com/blog/2011/08/05/icufflinks-improved-battery-life-code-hacking/" title="icufflinks improved battery life">iCufflinks improved battery life code hacking…</a>.</p>
<p>Not that you were necessarily looking for that. I happened to be thinking about just this sort of thing a minute before I saw this post, so to me, it&#8217;s an answer to a question&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/653/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Work/stress</title>
		<link>http://www.ourada.org/blog/archives/650?&#038;owa_medium=feed&#038;owa_sid=</link>
		<comments>http://www.ourada.org/blog/archives/650#comments</comments>
		<pubDate>Wed, 03 Aug 2011 08:03:06 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=650</guid>
		<description><![CDATA[For a while I&#8217;ve thought that I needed to reduce the amount of work I do in order to be more satisfied. And I&#8217;ve got a pretty good setup in that regard, as I&#8217;m working well less than full-time and on my own schedule. I think I need to point out that I don&#8217;t spend [...]]]></description>
			<content:encoded><![CDATA[<p>For a while I&#8217;ve thought that I needed to reduce the amount of work I do in order to be more satisfied. And I&#8217;ve got a pretty good setup in that regard, as I&#8217;m working well less than full-time and on my own schedule.</p>
<p>I think I need to point out that I don&#8217;t spend my time outside work just soaking in radiation on the couch. I wouldn&#8217;t have thought to mention it, except I heard that someone asked that when they heard about my workstyle. I guess I just assume that anyone who has found a way to free up their time would spend a lot of it reading, designing, walking, philosophizing &#8230;</p>
<p>So I guess my recent discovery that what I want is _more_ work, just less stress, is not a big revelation. It&#8217;s probably more a terminological shift than anything. Other ways to state my intention would be that I want less job and more work; stress without the distress; to get paid a little for the playing around that I do that some people would call work; to find ways to apply my lust for learning to applications that others can benefit from&#8230; something like that.</p>
<p>Which is why I have to start a company. Not yet gonna give up the current consulting gigs that give me a semi-steady income, because the last thing I want is to design a system for pushing my stress levels into the stratosphere, all the while knowing that I did it to myself, just because I have to generate significant income quickly. I&#8217;m going to develop my company in parallel with my consulting. I&#8217;m sure things will dovetail nicely as I progress.</p>
<p>I&#8217;m spending a little time seeking out people who seem to have similar ideas in mind for creating their best work. I&#8217;ll try to write up some of the conversations I have; just spoke to the owner of a small book store here in Ames and learned a few things&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/650/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>MythTV, Ubuntu Natty, WinTV HVR-950Q analog, Mac Mini</title>
		<link>http://www.ourada.org/blog/archives/645?&#038;owa_medium=feed&#038;owa_sid=</link>
		<comments>http://www.ourada.org/blog/archives/645#comments</comments>
		<pubDate>Sun, 22 May 2011 15:51:11 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=645</guid>
		<description><![CDATA[This one took a while to figure out. I bought a USB TV tuner, even though I have a perfectly good PCI one, because I want to replace my big loud server machine with an old Mac Mini refitted with some more storage and a new OS. Oh, I should tell the story of the [...]]]></description>
			<content:encoded><![CDATA[<p>This one took a while to figure out.</p>
<p>I bought a USB TV tuner, even though I have a perfectly good PCI one, because I want to replace my big loud server machine with an old Mac Mini refitted with some more storage and a new OS. Oh, I should tell the story of the Mac Mini first.</p>
<p>So, as mentioned above, I have a nice working server machine with (analog NTSC cable) DVR capability thanks to my <a href="http://www.hauppauge.com/site/products/data_hvr1600.html">WinTV HVR-1600</a> PCI card and the excellent work of the <a href="http://linuxtv.org/">LinuxTV</a>, <a href="http://www.mythtv.org/">MythTV</a>, and <a href="http://ivtvdriver.org/index.php/Main_Page">IVTV</a> people (and, surely, the credits could roll on forever, but I&#8217;ll be brief).</p>
<p>But it&#8217;s too noisy. I realized that the Mac Mini was quiet and could probably take on the various duties of my server machine, simple as they are, if only I had DVR. USB TV tuners must be as good as PCI ones these days, right? That&#8217;s true to a point: the HVR-950Q can record all the same stuff (NTSC, ATSC, ClearQAM, OTA/cable, etc.), but I didn&#8217;t realize until I bought it that it doesn&#8217;t do MPEG2 encoding on-board like the HVR-1600 does. Ah well, the little processor in the Mini (mid-2007 model with 1.83GHz Core 2 Duo) should be able to handle that.</p>
<p>So I pushed ahead: utilizing guides from around the internet, I popped the Mini open and gave it 4GB of RAM (collected from an old laptop) and a 500GB HD (which I had as a spare for a little RAID box that is currently unused because of _its_ fan noise, which is a story for another day). Along the way I had to replace the stupid connector for the HD temperature sensor that stupid broke because I inadvertently yanked the stupid wire out (thanks for your sacrifice, girlfriend&#8217;s old trash laptop!). Then I installed Ubuntu Natty server 64-bit on it, which was a convoluted process. But worthwhile, because now I have a nice, somewhat capable Linux server that&#8217;s quite small and quiet. I don&#8217;t care that much about being able to run OSX, though I can still do that if necessary by plugging the old drive into the box through USB, and, yeah, I&#8217;ll probably end up buying another OSX box some day for some reason, because I just have the sort of life that requires me to run a lot of OSs.</p>
<p>Anyway, now I have everything in line to do the DVR thang with my quiety hardware. A test run recording something with mencoder worked, and only used 40% of one CPU core, so the little processor can handle the video encoding well enough. But MythTV refused to work with the 950Q,  and I&#8217;m _not_ going to give up all the goodness of MythTV and MythWeb.</p>
<p>Forum/blog posts by users and even a <a href="http://www.kernellabs.com/blog/?p=889">driver writer/all-around 950Q-debugging-all-star</a> declared victory with this hardware; one even specifically mentioned a Mac Mini. The MythTV logs, even at maximum verbosity, failed to uncover the root cause (spoiler alert: the failure point in this case is not logged, even though similar failures around it are). Poring over more posts and more logs, trying out dozens of settings changes, playing with alternate encoders, reading through code, etc. added up to more hours than I really should have spent with this, especially since I was getting nowhere.</p>
<p>Finally I broke down and pulled out gdb to see if I could debug into the heart of this thing. Luckily, the Ubuntu packagers included a package with debug symbols, so I was able to do pretty decent source-level debugging without having to recompile (spoiler: yet). Turns out that somewhere around kernel version 2.6.38, the old V4L1 header was removed (deprecated, no doubt), which caused problems for the Ubuntu people in packaging MythTV. They worked out a patch to separate out the V4L1 functionality from the V4L2 stuff, but they didn&#8217;t get it quite right for my case. A little, crucial, function called SetFormatV4L2 was defined as a dummy returning false (failure), but the driver for the 950Q is a V4L2 thing, so the recorder quietly died every time, quietly (remember how I said this particular failure mode is not logged?).</p>
<p>This being the open-source world, I was able to mimic the ifdef patterns that the <a href="http://www.mythbuntu.org/">MythBuntu</a> people had applied elsewhere, so as to get the SetFormatV4L2 and DoV4L2 functions defined properly while still being able to compile without the V4L1 header. And, woot, it all works now. I posted a <a href="https://answers.launchpad.net/ubuntu/+source/mythtv/+question/158555">bug report</a> to the MythBuntu team, so hopefully that&#8217;ll get fixed upstream before the next update to libmythtv hits my box.</p>
<p>In any case, thanks once again to open source and the bazillion people who inadvertently cooperated to ensure that I can time-shift <a href="http://en.wikipedia.org/wiki/Soul_Quest_Overdrive">Soul Quest Overdrive</a>. Because, in the end, that&#8217;s really what it&#8217;s all about, isn&#8217;t it?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/645/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Cross-cutting concerns</title>
		<link>http://www.ourada.org/blog/archives/642?&#038;owa_medium=feed&#038;owa_sid=</link>
		<comments>http://www.ourada.org/blog/archives/642#comments</comments>
		<pubDate>Sun, 24 Apr 2011 04:25:45 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=642</guid>
		<description><![CDATA[Oh, the cross-cutting concerns. Working on optimizing the amount of downloading clients have to live with when the big ol&#8217; Flex app is updated. Need to compute the build dependencies of the SWFs. But one of the SWFs depends on a set of Python components on the server, the list of which can only be [...]]]></description>
			<content:encoded><![CDATA[<p>Oh, the cross-cutting concerns. Working on optimizing the amount of downloading clients have to live with when the big ol&#8217; Flex app is updated. Need to compute the build dependencies of the SWFs. But one of the SWFs depends on a set of Python components on the server, the list of which can only be computed by running a complicated algorithm that imports a bunch of modules, performs some introspection on them, compiles lists of&#8230; Like I said, it&#8217;s complicated.</p>
<p>Do I live with this and split out the algorithm to compute the dependencies for me, or do I try to restructure the generation process so that the dependencies become simple again? Or do I skip the whole dependency-calculation thing and run at it from the other end?</p>
<p>Such are the problems of the Steven.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/642/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Diffing SWFs</title>
		<link>http://www.ourada.org/blog/archives/634?&#038;owa_medium=feed&#038;owa_sid=</link>
		<comments>http://www.ourada.org/blog/archives/634#comments</comments>
		<pubDate>Tue, 05 Apr 2011 03:40:53 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=634</guid>
		<description><![CDATA[In case I&#8217;m not the only one trying to do this, I thought I&#8217;d write this up. Given: a build that produces many SWFs, a source tree with lots of dependencies, not all of which are obvious, a revision control system from which to get a history of your source. You wish to write a [...]]]></description>
			<content:encoded><![CDATA[<p>In case I&#8217;m not the only one trying to do this, I thought I&#8217;d write this up.</p>
<p>Given: a build that produces many SWFs, a source tree with lots of dependencies, not all of which are obvious, a revision control system from which to get a history of your source. You wish to write a script that correctly predicts which SWFs will change between two revisions of the source. You want to test that script by actually comparing the binaries to see if the predictions were correct.</p>
<p>The first thing you&#8217;ll note is that doing a binary compare of the SWFs, or a text compare of the swfdumps, does not answer the question. There&#8217;s a timestamp, and if debugging is on, there&#8217;s a debugger password. But much worse, internal ID numbers and ordering of classes and chunks of code changes semi-randomly. Do two builds of precisely the same source, and unless you write a lot of fancy code, you can&#8217;t tell whether the SWFs are really the same.</p>
<p>So, go grab the <a href="http://opensource.adobe.com/wiki/display/flexsdk/Get+Source+Code">Flex SDK</a> source and modify it with the following two bits of sed:</p>
<pre class="brush: bash;">
sed -i 's/\bHashSet/LinkedHashSet/g' `find -name \*.java`
sed -i 's/\bHashMap/LinkedHashMap/g' `find -name \*.java`
</pre>
<p>In other words, replace the Java collections which have non-deterministic iterators with equivalents that have deterministic iterators.</p>
<p>Your new compiler produces pretty deterministic output. You still have to deal with the timestamp and debug password. One way to do that is to
<pre class="brush: bash;">swfdump -abc</pre>
<p> the binaries and compare the dumps textually, ignoring those few lines that always change. Another approach is to modify SimpleMovie.java to remove the code conditional on configuration.generateDebugTags(), and set the last argument in the ProductInfo constructor (the timestamp) to 0. Then the binaries should be bitwise identical.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/634/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Literature of programs</title>
		<link>http://www.ourada.org/blog/archives/631?&#038;owa_medium=feed&#038;owa_sid=</link>
		<comments>http://www.ourada.org/blog/archives/631#comments</comments>
		<pubDate>Fri, 18 Mar 2011 02:15:26 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=631</guid>
		<description><![CDATA[I wonder what programming will be like in a couple thousand years, when, presumably, programming languages and the systems built up from them will have attained a richly layered history of idioms, allusions, allegories, metaphors, genres, fads and past fads&#8230; I suppose it won&#8217;t take thousands of years, necessarily, since programming languages inherit a lot [...]]]></description>
			<content:encoded><![CDATA[<p>I wonder what programming will be like in a couple thousand years, when, presumably, programming languages and the systems built up from them will have attained a richly layered history of idioms, allusions, allegories, metaphors, genres, fads and past fads&#8230; I suppose it won&#8217;t take thousands of years, necessarily, since programming languages inherit a lot from human languages, and because software is mixed up in everything humans do and absorbs some of those flavors. But I also don&#8217;t think there&#8217;s really a literature of programs right now; at least, I haven&#8217;t been introduced to it yet, and I&#8217;d think I would have been. I&#8217;d love to have someone prove me wrong, though.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/631/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Software development and the study of human aspiration</title>
		<link>http://www.ourada.org/blog/archives/629?&#038;owa_medium=feed&#038;owa_sid=</link>
		<comments>http://www.ourada.org/blog/archives/629#comments</comments>
		<pubDate>Sat, 05 Mar 2011 05:01:52 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=629</guid>
		<description><![CDATA[Though the technical aspects are a source of joy for me in software development, the human aspects are no less fascinating. The practice of making software provides some unique insights into human psychology, because software is pretty much made of pure thought, and because software is intertwined in so many human activities. Software developers often [...]]]></description>
			<content:encoded><![CDATA[<p>Though the technical aspects are a source of joy for me in software development, the human aspects are no less fascinating. The practice of making software provides some unique insights into human psychology, because software is pretty much made of pure thought, and because software is intertwined in so many human activities. Software developers often get a very detailed look at what people do or where they expect to go in their lives through the ongoing development of a project or their requirements for a new project. That&#8217;s pretty cool, when you think about it.</p>
<p>Maybe some day I&#8217;ll be able to add to my resume that I have great expertise in understanding and eliciting people&#8217;s aspirations.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/629/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Heuristics and bestiaries</title>
		<link>http://www.ourada.org/blog/archives/616?&#038;owa_medium=feed&#038;owa_sid=</link>
		<comments>http://www.ourada.org/blog/archives/616#comments</comments>
		<pubDate>Wed, 02 Mar 2011 06:49:25 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=616</guid>
		<description><![CDATA[I&#8217;ve worked on more than what I consider my fair share of projects where I had to deal with crazy input. What I mean by crazy input is: it fails to meet the basic criteria of the standard to which it&#8217;s supposed to conform, or there is not a standard to which it&#8217;s supposed to [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve worked on more than what I consider my fair share of projects where I had to deal with crazy input. What I mean by crazy input is: it fails to meet the basic criteria of the standard to which it&#8217;s supposed to conform, or there is not a standard to which it&#8217;s supposed to conform, or standard elements are mashed together in unanticipated ways to try to achieve non-standard effects, or some combination of those.</p>
<p>I suppose that if you dig deep, you&#8217;ll find that most of the data in the world is crazy in this sense. So despite my distaste for it, I&#8217;ll probably never get away from it. Still, I need to whine about it occasionally. But in addition to whining about it, I&#8217;ll present a little practical advice on dealing with it.</p>
<p>The first and most obvious reality in dealing with crazy input is that some heuristic methods will have to be used. For example, in some HTML input, I had to deal with this little number, which, in some documents, occurred between every two paragraphs (well, divs, because these documents don&#8217;t use p tags much at all):</p>
<pre class="brush: xml;">
&lt;div style=&quot;margin-top: 6pt; font-size: 1pt&quot;&gt;&amp;nbsp;&lt;/div&gt;
</pre>
<p>These aren&#8217;t really paragraphs. Even if you call a div a paragraph, they&#8217;re still not paragraphs; they&#8217;re just there for spacing. So I have a rule that says something like &#8220;If a paragraph is preceded by a paragraph that is essentially empty and has a font size less than 5, remove the empty paragraph and change the spacing on the current one to get the same spacing effect&#8221;.</p>
<p>That&#8217;s not the best/worst example, but it gets the point across. Heuristics will be necessary. That implies two things: the overall code structure must be adaptable to the addition of heuristics, and I&#8217;ll need a bestiary to test the code.</p>
<p>It&#8217;s part of the software developer&#8217;s mindset to try to neatly partition the entire universe into non-overlapping subsets, then write chunks of code to deal with each partition separately. The introduction of heuristics into such a beautiful scheme will cause some pain. In the beautiful world, I&#8217;d have code that says &#8220;it&#8217;s a paragraph, let&#8217;s do the paragraph thing with it&#8221;. In a world laden with heuristics, I have code that says &#8220;it&#8217;s a paragraph, but let&#8217;s see if it&#8217;s _really_ a paragraph, then we&#8217;ll either do the paragraph thing or do some wildly different thing&#8221;. I guess it&#8217;s less that the code structure has to be adaptable than it&#8217;s that my mindset has to be adaptable.</p>
<p>Regardless of the flexibility of my mindset or my code, though, heuristics, by their nature, do not neatly partition the universe. They leave some things out, they overlap, and/or they tangle together in increasingly strange ways. I&#8217;ll never remember, when it comes time to add some new code, all the situations that got me to this point or all the ways that things can go wrong.</p>
<p>I&#8217;m not yet a full convert to test-driven development, but when dealing with beastly input, I consider a bestiary to be quite necessary. A big set of unit tests, with a perfect specimen of each of the beasts I&#8217;ve encountered, each named after the ticket in the ticket-tracking system that brought it to me. I had one project in the past where I should have created a bestiary but didn&#8217;t, and that project was one of the worst disasters in my professional life. Another one like that and I would have traded my keyboard in for a shovel and started a new career&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/616/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Design Balls</title>
		<link>http://www.ourada.org/blog/archives/613?&#038;owa_medium=feed&#038;owa_sid=</link>
		<comments>http://www.ourada.org/blog/archives/613#comments</comments>
		<pubDate>Sat, 12 Feb 2011 04:06:37 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=613</guid>
		<description><![CDATA[A friend once told me about one of his introductory computer science classes, wherein a fellow student would occasionally stop the professor to ask &#8220;Yeah, but, how do we know what computers can do?!?&#8221;. The professor didn&#8217;t really have a great answer for him, and after a while the student gave up asking and dropped [...]]]></description>
			<content:encoded><![CDATA[<p>A friend once told me about one of his introductory computer science classes, wherein a fellow student would occasionally stop the professor to ask &#8220;Yeah, but, how do we know what computers can do?!?&#8221;. The professor didn&#8217;t really have a great answer for him, and after a while the student gave up asking and dropped the class.</p>
<p>It&#8217;s easy to think that this person just <em>did not have it</em>, whatever it takes to be in computer science. Naturally, he should leave because he had no business in the class in the first place. And in a sense, yeah, that&#8217;s precisely right, he didn&#8217;t have It, and It is quite necessary. But I wonder whether what It was is something that could be gifted by the professor or another student, or if he could have continued with the lectures and exercises for a while before It began to dawn on him, and things would start to crystallize.</p>
<p>I also wonder whether It was, to quote a phrase that popped up unbidden in my head just a while ago, &#8220;design balls&#8221;. Because I remember a time when I didn&#8217;t have my computer program design balls, when I was basically bluffing it, and now I really have It, and I&#8217;m not bluffing. I&#8217;ll have to do some serious introspection to determine when the magic transition happened, though I can say that luckily it happened well before I was taking formal courses in computer science, so I didn&#8217;t have the great difficulty outlined above.</p>
<p>You can build a textbook definition of the design process by stringing together various phrases:</p>
<ul>
<li>define need</li>
<li>derive system outline</li>
<li>calculate component parameters</li>
<li>analyze expected system response</li>
<li>simulate or prototype system</li>
<li>verify conformance to the specification</li>
<li>ship design artifacts to manufacturer for implementation</li>
</ul>
<p>blah blah blah, you know what I mean. Those phrases even make sense to someone who is already past a certain point in their design education. But there&#8217;s an unspoken, ummm, let&#8217;s say, glue, that holds the pieces of the process together. I don&#8217;t know if it&#8217;s unspoken because it&#8217;s impossible to speak of, as my lame analogy suggests, or whether it&#8217;s just that sort of silence that develops around certain conceptual vortexes in a field, for whatever reasons.</p>
<p>And for now, I&#8217;m going to give up on speaking about this. Not forever, because now that I&#8217;m pondering it, I feel like it&#8217;s a really important thing, and perhaps there is hope and help for those who want to have It but don&#8217;t yet have It, and maybe It is teachable. Hmmmm.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/613/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>debdiff</title>
		<link>http://www.ourada.org/blog/archives/611?&#038;owa_medium=feed&#038;owa_sid=</link>
		<comments>http://www.ourada.org/blog/archives/611#comments</comments>
		<pubDate>Fri, 11 Feb 2011 02:33:38 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=611</guid>
		<description><![CDATA[Hmmm, never ran across a debdiff before today. Gonna see if the one posted for this libvirt problem helps me. Update (which was actually posted simultaneously with the original): yup. Yay, open source is just so sweet to me.]]></description>
			<content:encoded><![CDATA[<p>Hmmm, never ran across a <a href="https://wiki.ubuntu.com/UbuntuPackagingGuide/BuildFromDebdiff?highlight=%28debdiff%29">debdiff</a> before today. Gonna see if the one posted for this <a href="https://bugs.launchpad.net/ubuntu/+source/virt-manager/+bug/696936">libvirt problem</a> helps me.</p>
<p><strong>Update</strong> (which was actually posted simultaneously with the original): yup. Yay, open source is just so sweet to me.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/611/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Things undone</title>
		<link>http://www.ourada.org/blog/archives/596?&#038;owa_medium=feed&#038;owa_sid=</link>
		<comments>http://www.ourada.org/blog/archives/596#comments</comments>
		<pubDate>Wed, 09 Feb 2011 05:27:05 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=596</guid>
		<description><![CDATA[Occasionally I feel bad about all the things left undone. In software development, there are two things we routinely do that occasion such feelings. (Ooops, I&#8217;ve been told I&#8217;ve been using the word &#8216;feel&#8217; too much.) We use ticket-tracking systems, and we write TODO comments. Ticket-tracking systems are a way to keep track of work [...]]]></description>
			<content:encoded><![CDATA[<p>Occasionally I feel bad about all the things left undone.</p>
<p>In software development, there are two things we routinely do that occasion such feelings. (Ooops, I&#8217;ve been told I&#8217;ve been using the word &#8216;feel&#8217; too much.) We use ticket-tracking systems, and we write TODO comments.</p>
<p>Ticket-tracking systems are a way to keep track of work to be done and the evolution of the product. A ticket is a short, detailed description of an action to be taken to improve the product. They come in different types: bug, improvement, feature, task, etc. The description is action-oriented and specific, and assumes the current product as the context (at least the best tickets are like that; maybe I&#8217;ll talk a little more later about less-than-best tickets). Here&#8217;s a decent-looking <a href="https://issues.apache.org/bugzilla/show_bug.cgi?id=37194">example of a ticket</a>. I could go on for quite a while about the good and the bad of ticket-tracking systems&#8230; For now, the salient points are:</p>
<ul>
<li>a ticket represents some work to be done</li>
<li>tickets are assigned to someone, to do the work</li>
<li>as a developer, you spend time daily looking at the list of tickets assigned to you</li>
</ul>
<p>TODO comments are a simpler manifestation of a similar idea. When writing code, you might see room for improvement in some particular technical aspect, but you don&#8217;t have the time to tackle it right now. So you put a little TODO comment in there explaining what you think might be improved. Here&#8217;s a little contrived example:</p>
<pre class="brush: python;">
if n == 0:
  print &quot;none&quot;
elif n &gt; 0:
  print &quot;some&quot;
# TODO: what if n is negative?
</pre>
<p>In this case, I can see that the set of all numbers is not covered by the two conditions, so I&#8217;m led to wonder whether I should be handling the case where n is negative. Now, if I really thought that case was going to arise naturally and soon, I&#8217;d figure out how to handle it and write the code. But in this example, I&#8217;m thinking: it could happen, but I can&#8217;t see any reason it should. Let&#8217;s say n is the count of apples in the box from the apple-counting machine. No reason for that to be negative. But, ya know, it could be, somehow. So I note that I feel uneasy about leaving that case uncovered. Later, when browsing through the code or debugging it, I might see that comment, and due to an increased understanding of the world or an abundance of spare time or something, I&#8217;ll decide to cover the case. Maybe I learned that the apple-counter counts a zucchini as -1 apples, and somehow a zucchini gets in the box occasionally.</p>
<p>Where tickets and TODOs can get depressing is when you look at your list and realize that there are 30 tickets on it, 10 of which are more than a year old, and 23 of which you&#8217;ve been systematically ignoring for a long time. Or you run across a TODO and a scenario flashes through your mind, where the improbable thing happens, and the resulting chain of causality ends with a lawsuit in Taiwan.</p>
<p>It might be easy to say &#8220;Well, this simply should never happen! These tasks should be dispatched with great haste and with all available resources!&#8221;. Certainly one can imagine a process or organization where that is the rule, and buildups of old cruft never happen. But follow me for now into my world: in the places where I&#8217;ve worked, there is no such rule, and the cruft does build up. I&#8217;ve left jobs with dozens of tickets and TODOs left in my wake, where they either evaporated when I left or are still lurking around somewhere today.</p>
<p>The rule in these places is more like &#8220;Good ideas should be captured immediately and dealt with when there&#8217;s time&#8221;. That&#8217;s a perfectly valid rule to use, but it does tend to lead to a situation where there are lists of lots of good ideas left unattended. If you believe in good ideas and you want to perfect your work, then these lists sometimes look pretty grim, numerically speaking. There are always more good ideas than time to implement them, by a laaarge factor.</p>
<p>So, you learn to live with the backlog.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/596/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>A DSL menagerie</title>
		<link>http://www.ourada.org/blog/archives/603?&#038;owa_medium=feed&#038;owa_sid=</link>
		<comments>http://www.ourada.org/blog/archives/603#comments</comments>
		<pubDate>Sun, 06 Feb 2011 01:16:21 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=603</guid>
		<description><![CDATA[Someone should compile a menagerie of domain specific languages, to highlight all the different ways people have used DSLs to solve real-world problems&#8230;]]></description>
			<content:encoded><![CDATA[<p>Someone should compile a menagerie of domain specific languages, to highlight all the different ways people have used DSLs to solve real-world problems&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/603/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Digging for answers</title>
		<link>http://www.ourada.org/blog/archives/601?&#038;owa_medium=feed&#038;owa_sid=</link>
		<comments>http://www.ourada.org/blog/archives/601#comments</comments>
		<pubDate>Thu, 03 Feb 2011 07:19:59 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=601</guid>
		<description><![CDATA[Frustration. While it feels like a waste of time and can put my stomach in knots, I think it can help me become a better person, in general, at least. Lately I&#8217;ve been working on adapting this big open source server project for use for a client (sorry about the vagueness, but the stuff I&#8217;m [...]]]></description>
			<content:encoded><![CDATA[<p>Frustration. While it feels like a waste of time and can put my stomach in knots, I think it can help me become a better person, in general, at least.</p>
<p>Lately I&#8217;ve been working on adapting this big open source server project for use for a client (sorry about the vagueness, but the stuff I&#8217;m working on is proprietary). In the best of all worlds, I&#8217;d deploy the client&#8217;s app on the server and it would just work. And it won&#8217;t surprise you to learn that we don&#8217;t live in that world. The world we live in has features like:</p>
<ul>
<li>the server has an old version of the main framework that the client&#8217;s app uses, meaning I have to find the uses of the new features and back them up to older code</li>
<li>the server project has issued very little documentation. That might make me look for an alternative server, but it happens that there are only two alternatives and this one seems, from various viewpoints, to be the best by far</li>
<li>there is some problem</li>
</ul>
<p>That last point might seem even more vague than the others, and believe me, I wish I could be more specific. But ya see, that&#8217;s approximately all the information I can get the server to give me about this particular problem. I try to run a tiny piece of code, and it tells me &#8220;Error: 500&#8243;. I&#8217;ve spent hours digging through the pieces of the server; it has load-balancers and caches and proxies and RPC servers talking to database adapters talking to databases, talking in HTTP and a few other protocols; it has components written in Python and Ruby, Java, and C; it has log files in many different places and with different ways to enable logging in each component; etc.</p>
<p>So far, all this digging has led me to the conclusion that yes, there still is a problem. That&#8217;s frustrating. But the process leads me to probe into the server components with various techniques, so I&#8217;m learning. Learned about <a href="http://ngrep.sourceforge.net/">ngrep</a>, tonight, for example. Learned how to use the shells provided with the various databases to try to see what&#8217;s going on in them. Learned about the wonders of <a href="http://libvirt.org/">libvirt</a>. Learned about some new network protocols.</p>
<p>At a higher level, I think these experiences teach me about patience, persistence and investigative techniques. Those abilities come in handy, and it seems I still somehow have less than the maximum amount of each of them.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/601/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sense of accomplishment</title>
		<link>http://www.ourada.org/blog/archives/588?&#038;owa_medium=feed&#038;owa_sid=</link>
		<comments>http://www.ourada.org/blog/archives/588#comments</comments>
		<pubDate>Sun, 23 Jan 2011 06:28:24 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=588</guid>
		<description><![CDATA[I have a difficult relationship with the concept of &#8216;a sense of accomplishment&#8217;. I feel like it&#8217;s somewhat necessary to true motivation, but then I feel it&#8217;s a character flaw to truly feel such a sense. I feel like I&#8217;ve done a lot of good work, but there&#8217;s always more I could have done. I [...]]]></description>
			<content:encoded><![CDATA[<p>I have a difficult relationship with the concept of &#8216;a sense of accomplishment&#8217;. I feel like it&#8217;s somewhat necessary to true motivation, but then I feel it&#8217;s a character flaw to truly feel such a sense. I feel like I&#8217;ve done a lot of good work, but there&#8217;s always more I could have done. I feel like the things I&#8217;ve done are significant, but if I pointed them out to the average person, they&#8217;d be far less than impressed.</p>
<p>One of my clients reached a big <a href="http://www.webfilings.com/about/news/webfilings-rolls-out-q1-2011-release-its-end-end-sec-reporting-solution">product milestone</a> recently. It&#8217;s pretty amazing that I&#8217;ve been with this product since its inception until this milestone. I felt the need to reflect on what I&#8217;ve worked on in the product in that time.</p>
<ul>
<li>code generation for AS3 to Python RPC</li>
<li>HTML and RTF paste</li>
<li>spell checking</li>
<li>highlights and callouts</li>
<li>XBRL HTML slicing</li>
<li>equation parsing and evaluation</li>
<li>slimming Flex module download size</li>
<li>HTML import</li>
<li>browser issues with keys and mousewheel</li>
<li>Google AppEngine/EC2 integration</li>
<li>parallelization of translation functions</li>
<li>Undisclosed Big-Deal Project</li>
<li>PDF export</li>
</ul>
<p>When I look at each of those bullets, I remember lots of work that I had to do on each, the difficult problems that arose and the solutions to them, the necessity of each function and the contribution toward the overall product. But I also remember the things left undone that could make each function more perfect, the work that others did that I can&#8217;t take credit for, that if I pointed out these functions in the app, someone unfamiliar with the job wouldn&#8217;t understand the work that it represents, and that in at least one of these projects, all of my code is now dead.</p>
<p>So my sense of accomplishment is a complicated and fragile thing. That&#8217;s not a problem; actually, when I say it, I feel like that&#8217;s a more mature attitude than one that&#8217;s more monolithic. Maybe that&#8217;s a partial solution to the question I mentioned above of whether it&#8217;s a character flaw to feel a sense of accomplishment: maybe it&#8217;s only hubris to feel good about the foreground of one&#8217;s accomplishments if one doesn&#8217;t also understand the inseparable background against which they are viewed.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/588/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

