<?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>Sun, 07 Mar 2010 23:56:17 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Brother MFC-9320CW</title>
		<link>http://www.ourada.org/blog/archives/436</link>
		<comments>http://www.ourada.org/blog/archives/436#comments</comments>
		<pubDate>Sun, 07 Mar 2010 23:56:17 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=436</guid>
		<description><![CDATA[Just bought a Brother MFC-9320CW. It&#8217;s good so far. I use Ubuntu 9.10 for almost everything, and Brother actually supplies Linux drivers and source for both the printer and the scanner. The printer driver is just a PPD, but the scanner driver has some code-y components. But they provide a scanner .deb, even for 64-bit. [...]]]></description>
			<content:encoded><![CDATA[<p>Just bought a <a href="http://www.brother-usa.com/MFC/ModelDetail.aspx?ProductID=mfc9320cw">Brother MFC-9320CW</a>. It&#8217;s good so far. I use Ubuntu 9.10 for almost everything, and Brother actually supplies Linux drivers and source for both the printer and the scanner. The printer driver is just a PPD, but the scanner driver has some code-y components. But they provide a scanner .deb, even for 64-bit. In addition, the scanner is smart enough to be able to scan directly to a CIFS share, so if there are ever problems with the scanner driver, there&#8217;s still a decent way to scan.</p>
<p>The onboard web-based configuration software is pretty lackluster, but it does seem to do the job if you know what you&#8217;re doing and/or are curious enough (like, if you want to set up the CIFS parameters for scanning, don&#8217;t look under &#8216;Network Configuration&#8217;, and don&#8217;t try to find a &#8216;Scanner Settings&#8217; like the &#8216;Fax Settings&#8217; and &#8216;Printer Settings&#8217;&#8230; You have to find &#8216;Administrator Settings&#8217; and the subpage &#8216;FTP/Network Scan Settings&#8217; then &#8216;FTP/Network Scan Profile&#8217;.).</p>
<p>Since it&#8217;s all network-based and the onboard computer seems to be pretty smart, I can share it with all my computers easily and with Mac or Windows when I happen to be in those sort of modes.</p>
<p>The hardware is also good; the automatic document feeder is a big reason I got this model, and it seems to be robust and fast. Prints look very nice. I like the fact that it&#8217;s a toner system rather than an ink system, because I use my printer so seldom that inks would dry out on me between uses (though I haven&#8217;t used an inkjet in about 5 years, maybe they&#8217;re better now).</p>
<p>I&#8217;m not much for writing comprehensive reviews, but I just wanted to make a note for those who use Linux and were looking at this model. I&#8217;ll answer questions should any such person come around&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/436/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unexpected/expected</title>
		<link>http://www.ourada.org/blog/archives/434</link>
		<comments>http://www.ourada.org/blog/archives/434#comments</comments>
		<pubDate>Sun, 28 Feb 2010 23:53:52 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=434</guid>
		<description><![CDATA[Have I mentioned before how much I love libraries? If there&#8217;s a single scene that summarizes me as a person, it&#8217;s me walking a couple miles to a library to read about some stuff I don&#8217;t need to know.
I love the insider&#8217;s view of things. Even if I don&#8217;t want to be an insider in [...]]]></description>
			<content:encoded><![CDATA[<p>Have I mentioned before how much I love libraries? If there&#8217;s a single scene that summarizes me as a person, it&#8217;s me walking a couple miles to a library to read about some stuff I don&#8217;t need to know.</p>
<p>I love the insider&#8217;s view of things. Even if I don&#8217;t want to be an insider in a particular field, I really like to immerse myself in their views and language, when I have the time to, rather than sticking to the strictly outsider accounts (popularizations). So a library (especially a university library) is a perfect place for me: it&#8217;s mostly full of insider accounts of fields and topics within those fields. If I had to go out and spend $50-$100 per technical book, I wouldn&#8217;t be able to frequently dip my nose in a field for a few dozen or few hundred pages and then put it aside again.</p>
<p>I ran across an unexpectedly interesting book in the ISU library today. I did a search for &#8220;domain specific language&#8221; in the catalog. Since their computing collection is a little slow to catch up to the outside world, they didn&#8217;t have any of the several books on domain-specific computer languages published in the last few years. But they did have one on <a href="http://www.worldcat.org/title/domain-specific-english-textual-practices-across-communities-and-classrooms/oclc/231970578">&#8220;Domain-specific English&#8221;</a>, which turns out to be pretty cool for reasons that I won&#8217;t really go into too deeply here. Go find it at your library if you want to know more about that&#8230;</p>
<p>There&#8217;s a bit in here that was particularly relevant to me:</p>
<blockquote><p>I remember one winter afternoon, mothers chirping in a corner of the playground as they waited for the bell to announce the schoolday&#8217;s end. Their talk focussed on homework &#8211;  a subject of daily comments &#8211; but the conversation sounded more lively than usual. The topic of discussion, and of much stigmatizing, was the reading assignment for that day. Since my own child was in the class, I was aware that the purpose of the assignment had been to encourage children to read for global comprehension and to guess what unfamiliar words could mean. To my surprise, most mothers had missed this point entirely and were indignant. In their opinion, the assignment featured too many difficult words. Some complained about having to consult the dictionary to help clarify the precise meaning of the new words: wasn&#8217;t it too early to face such vocabulary? How surprising from an experienced teacher like our maestra!</p></blockquote>
<p>(And yeah, I know it&#8217;s pretty meta to be quoting that in this context.)</p>
<p>I was lucky enough to have parents that would have been among the dissenters in that conversation. They never acted like or told me that some particular text might be &#8216;too hard&#8217; for me, and they never would have recoiled in shock that some assignment had caused me to use a dictionary. I don&#8217;t know that they ever positively subscribed to a pedagogic theory that included the idea of reading for global comprehension and guessing, but the fact that they didn&#8217;t discourage it allowed me to develop my own unconscious theory of learning along those lines. If I had to guess, I&#8217;d say that children tend to want to explore the world according to those principles, and only discouraging them would stop that short.</p>
<p>Anyway, what was I saying? Oh, yeah: I had fun at the library today. That&#8217;s all.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/434/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Another reason that ad-supported == teh suck</title>
		<link>http://www.ourada.org/blog/archives/431</link>
		<comments>http://www.ourada.org/blog/archives/431#comments</comments>
		<pubDate>Sun, 07 Feb 2010 18:15:12 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=431</guid>
		<description><![CDATA[This article from &#8216;MicroISV on a shoestring&#8217; (which is a blog worth keeping up with, if you ask me) has an interesting insight. Patrick says that ad-supported sites are less likely to craft a good user experience, because if the site is better than the ads, the site doesn&#8217;t make money. Oversimplified, sure, but it [...]]]></description>
			<content:encoded><![CDATA[<p>This <a href="http://www.kalzumeus.com/2010/02/07/what-my-user-survey-taught-me/">article from &#8216;MicroISV on a shoestring&#8217;</a> (which is a blog worth keeping up with, if you ask me) has an interesting insight. Patrick says that ad-supported sites are less likely to craft a good user experience, because if the site is better than the ads, the site doesn&#8217;t make money. Oversimplified, sure, but it does point out one of the forces at play in the overall dynamic.</p>
<p>I guess that&#8217;s a variation on something I&#8217;ve been thinking about, that I should get paid for the value I bring, rather than for the value that my advertisers bring. Or my ability to get people to look at little come-ons that give them the perception that there is some value elsewhere, to be more precise.</p>
<p>&#8216;course, setting aside the absurd logic and perverse incentives, I&#8217;m glad that somehow ads occasionally work out such that people make good content and also make money from it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/431/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Worked up</title>
		<link>http://www.ourada.org/blog/archives/430</link>
		<comments>http://www.ourada.org/blog/archives/430#comments</comments>
		<pubDate>Sun, 07 Feb 2010 03:52:26 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/archives/430</guid>
		<description><![CDATA[Y&#8217;ever get worked up about how much you ought to get worked up about something? And then at some point you have to evaluate the inequality about whether the effort of evaluating how much to get worked up, plus the effort of getting worked up itself, is greater or less than the effort of just [...]]]></description>
			<content:encoded><![CDATA[<p>Y&#8217;ever get worked up about how much you ought to get worked up about something? And then at some point you have to evaluate the inequality about whether the effort of evaluating how much to get worked up, plus the effort of getting worked up itself, is greater or less than the effort of just getting maximally worked up about the original thing from the start. If you know what I mean.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/430/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>More evidence that &#8217;shopping is hard&#8217;</title>
		<link>http://www.ourada.org/blog/archives/427</link>
		<comments>http://www.ourada.org/blog/archives/427#comments</comments>
		<pubDate>Thu, 04 Feb 2010 07:16:52 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=427</guid>
		<description><![CDATA[Huh, I thought shopping for computer-telephony interfaces or scalable web-hosting infrastructure was hard. A little research lately has convinced me that shopping for any sort of insurance must be at least as difficult and probably more.
There is one inherent fact about insurance that seeds the complexity: you&#8217;re trying to predict complicated and rare events. The [...]]]></description>
			<content:encoded><![CDATA[<p>Huh, I thought shopping for computer-telephony interfaces or scalable web-hosting infrastructure was hard. A little research lately has convinced me that shopping for any sort of insurance must be at least as difficult and probably more.</p>
<p>There is one inherent fact about insurance that seeds the complexity: you&#8217;re trying to predict complicated and rare events. The more predictable an event is, actually, the less likely it&#8217;s going to be insurable, or insurable at a rate you&#8217;re willing to pay. I mean, if you can predict an event with some certainty, you should be using a bank account instead of an insurance policy.</p>
<p>There&#8217;s also the psychological twist that these are events that you just plain don&#8217;t want to happen. That probably tends to make you undervalue the little information you do have that helps you make your predictions, and causes you to want to just hurry up and get done making the decisions.</p>
<p>On top of all that is, I&#8217;m pretty sure, a general tendency for insurance companies to purposely make it harder to buy their products. A great tension exists between the generally communal idea of insurance (we all pool our money together to help whoever needs it) and the capitalist imperative to profit. Basically, insurance companies can only profit to the degree that they hide their actuarial knowledge from their customers.</p>
<p>I was looking at health insurance tonight and was presented with a painful interface to choose a policy. I specified a few parameters in very general terms, and they presented me with dozens of possible policies to choose from, with a &#8216;comparison&#8217; feature that did little to enlighten me about the differences. It kind of reminds me of that game <a href="http://en.wikipedia.org/wiki/Black_Box_%28game%29">Black Box</a> where you&#8217;re trying to discern what&#8217;s in the box by shooting a tiny number of rays into the darkness, though this particular game of black box is probably 80-dimensional instead of 2D. My choices would still not be easy even if I had a full view of the model(s) they use to design these policies, but&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/427/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Branching is hard</title>
		<link>http://www.ourada.org/blog/archives/423</link>
		<comments>http://www.ourada.org/blog/archives/423#comments</comments>
		<pubDate>Tue, 26 Jan 2010 23:53:00 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=423</guid>
		<description><![CDATA[Ya know, for all the conceptual elegance of the idea of branching/merging in software revision control, it sure can be a pain in practice. Just in the last while, I&#8217;ve run across the following situations:

someone mismerged my code because they merged based on files rather than revisions
had to decide whether to merge someone else&#8217;s code [...]]]></description>
			<content:encoded><![CDATA[<p>Ya know, for all the conceptual elegance of the idea of branching/merging in software revision control, it sure can be a pain in practice. Just in the last while, I&#8217;ve run across the following situations:</p>
<ul>
<li>someone mismerged my code because they merged based on files rather than revisions</li>
<li>had to decide whether to merge someone else&#8217;s code because mine was dependent on it, but they hadn&#8217;t merged theirs</li>
<li>had to decide when to merge my code, which was part of a larger feature and was not a complete feature in itself: do it now and possibly introduce instability, do it later and possibly have it get delayed in the shuffle</li>
<li>stuff I&#8217;d merged disappeared because the branch was remade after I merged</li>
<li>conflict while merging my code because the branch was based on a way older revision than I was informed (so other changes I&#8217;d made previously were not there to merge against)</li>
<li>not knowing whether my changes were to be merged because it wasn&#8217;t decided when the feature was to be released</li>
<li>a special case of the previous situation, when it was first decided the feature was for later, then it was moved earlier</li>
<li>work for a future feature ended up causing a conflict when trying to merge a current feature because the two changes were made in the other order on the same code</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/423/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Web Services interop</title>
		<link>http://www.ourada.org/blog/archives/422</link>
		<comments>http://www.ourada.org/blog/archives/422#comments</comments>
		<pubDate>Thu, 14 Jan 2010 22:31:43 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/archives/422</guid>
		<description><![CDATA[I wonder what the current status of Java < -> .Net Web Services interop is. A year-n-somethin&#8217; ago, it was a bit of a mess, and for the project I was working on we had to create a proxy running on a Windows box to make the calls. Ugh.
Actually, I don&#8217;t really wonder. I don&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<p>I wonder what the current status of Java < -> .Net Web Services interop is. A year-n-somethin&#8217; ago, it was a bit of a mess, and for the project I was working on we had to create a proxy running on a Windows box to make the calls. Ugh.</p>
<p>Actually, I don&#8217;t really wonder. I don&#8217;t care, because I&#8217;m not having to deal with such right now. Java/Python/Flex interop, yeah. Passin&#8217; them AMF packets around like a wild man&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/422/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Simplifying my mail management</title>
		<link>http://www.ourada.org/blog/archives/419</link>
		<comments>http://www.ourada.org/blog/archives/419#comments</comments>
		<pubDate>Wed, 13 Jan 2010 04:13:48 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=419</guid>
		<description><![CDATA[Here&#8217;s a simple thing I did today that will save me some annoyance when dealing with new mail.
I manage my mail in Thunderbird by the simple rule of: if it&#8217;s something I need to respond to or reread soon, it stays in the inbox. If it&#8217;s junk, junk it, if it&#8217;s totally ephemeral, trash it, [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a simple thing I did today that will save me some annoyance when dealing with new mail.</p>
<p>I manage my mail in Thunderbird by the simple rule of: if it&#8217;s something I need to respond to or reread soon, it stays in the inbox. If it&#8217;s junk, junk it, if it&#8217;s totally ephemeral, trash it, otherwise it goes to the &#8216;old&#8217; folder. There are already keyboard shortcuts for junk and trash, but I was still dragging and dropping to put stuff in the old folder. Until I installed <a href="http://forums.mozillazine.org/viewtopic.php?t=72994">keyconfig</a> (and yeah, that link is as close as there is to a project page for the thing, unless you count the <a href="http://mozilla.dorando.at/readme.html">author&#8217;s homepage</a>). I then installed a script on O that says<br />
MsgMoveMessage(&#8220;mailbox://nobody@Local%20Folders/old&#8221;)</p>
<p>No more drag-n-drop to manage my email. Nice.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/419/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Annals of weird little problems, part 12</title>
		<link>http://www.ourada.org/blog/archives/412</link>
		<comments>http://www.ourada.org/blog/archives/412#comments</comments>
		<pubDate>Sat, 09 Jan 2010 23:38:58 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=412</guid>
		<description><![CDATA[It&#8217;s fascinating to me sometimes to describe a problem that comes up in software development, outside its full context, just to remind myself of how weird and deep it sounds in isolation. Makes me feel a little better about how long it takes me to solve said problem, maybe.
In this case, in the full context [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s fascinating to me sometimes to describe a problem that comes up in software development, outside its full context, just to remind myself of how weird and deep it sounds in isolation. Makes me feel a little better about how long it takes me to solve said problem, maybe.</p>
<p>In this case, in the full context we just call it the &#8217;slicer&#8217;, but that one word hides a lot of complexity. What the slicer does is: given a document in XML format A and a set of start points and offsets of selected regions of formatted text (both specified by character counts as the user sees the document), extract the given regions from the document in XML format C, rebuilding any necessary start/end tags and preserving internal formatting. Another process does the translation from format A to B to C. (These translation layers can add extra characters that are not part of the document as the user sees it.)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/412/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>One cloud ain&#8217;t enough</title>
		<link>http://www.ourada.org/blog/archives/410</link>
		<comments>http://www.ourada.org/blog/archives/410#comments</comments>
		<pubDate>Fri, 08 Jan 2010 17:27:04 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=410</guid>
		<description><![CDATA[One thing I&#8217;ve been learning over the last few months is that if your app is pretty beefy, you might well need more than one cloud provider to deploy it. With the major differences in approach between Amazon EC2 and Google AppEngine, they each have a variety of strengths and weaknesses with respect to a [...]]]></description>
			<content:encoded><![CDATA[<p>One thing I&#8217;ve been learning over the last few months is that if your app is pretty beefy, you might well need more than one cloud provider to deploy it. With the major differences in approach between Amazon EC2 and Google AppEngine, they each have a variety of strengths and weaknesses with respect to a given application, and the weaknesses are such that you can&#8217;t really just live with them. So you partition the app into pieces and spread &#8216;em around&#8230;</p>
<p>I&#8217;d like to be able to claim that that gives you a more robust solution, but of course, if you require two clouds to be operational in order for your app to work, you&#8217;re less robust. Both EC2 and GAE have been OK, but not great, in terms of uptime. I expect both to get better over time, though.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/410/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Stupid, but effective, hack for dev_appserver task queues</title>
		<link>http://www.ourada.org/blog/archives/405</link>
		<comments>http://www.ourada.org/blog/archives/405#comments</comments>
		<pubDate>Fri, 18 Dec 2009 20:26:02 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=405</guid>
		<description><![CDATA[If you work with Google AppEngine and use task queues much, you know it can be annoying to have to press the &#8216;Run&#8217; button on each task to make it actually run. Here&#8217;s a Greasemonkey script to push the button for you. It mindlessly pushes the first Run button it finds immediately on page load. [...]]]></description>
			<content:encoded><![CDATA[<p>If you work with Google AppEngine and use task queues much, you know it can be annoying to have to press the &#8216;Run&#8217; button on each task to make it actually run. Here&#8217;s a Greasemonkey script to push the button for you. It mindlessly pushes the first Run button it finds immediately on page load. Since the page reloads, that should eventually press them all away.</p>
<p>Have fun, but there are no guarantees that this won&#8217;t run tasks you didn&#8217;t really want to run or somesuch.</p>
<p><a href="http://www.ourada.org/blog/wp-content/uploads/2009/12/press_run.user_.js">Dumb script</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/405/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Digit frequency in pi</title>
		<link>http://www.ourada.org/blog/archives/397</link>
		<comments>http://www.ourada.org/blog/archives/397#comments</comments>
		<pubDate>Sun, 13 Dec 2009 20:14:27 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=397</guid>
		<description><![CDATA[Hmmm, pi is a little bumpier than I thought. (It could just be that my statistical intuition is off, though.)
Each bar plot below represents the number of occurrences of a digit in the decimal expansion of pi. The y-axis is an index, and the frequency x is counted over the range of digits y*20 to [...]]]></description>
			<content:encoded><![CDATA[<p>Hmmm, pi is a little bumpier than I thought. (It could just be that my statistical intuition is off, though.)</p>
<p>Each bar plot below represents the number of occurrences of a digit in the decimal expansion of pi. The y-axis is an index, and the frequency x is counted over the range of digits y*20 to y*20+400. I thought 400 would be a long enough length to make these graphs pretty flat. Higher lengths make it flatter, of course, but still not to the degree that seems &#8216;right&#8217; to me.</p>
<p>I guess I could calibrate my perception by using a uniformly distributed sequence of digits&#8230;</p>
<p><a href="http://www.ourada.org/blog/wp-content/uploads/2009/12/pigraph.png">Pi digit frequencies</a></p>
<p><strong>Update</strong>: huh. I guess it is just me. Here&#8217;s the same sort of graph but with uniformly random digits (at least, assuming that <a href="http://en.wikipedia.org/wiki/A_Million_Random_Digits_with_100,000_Normal_Deviates">RAND&#8217;s book</a>, which I lazily selected as my source, is indeed uniform). Looks equally bumpy to me. Ah well, I&#8217;ll leave the post up as a reminder of my folly&#8230;</p>
<p><a href="http://www.ourada.org/blog/wp-content/uploads/2009/12/randgraph.png">Random digit frequencies</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/397/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>asc-gzip/.xfd decompression</title>
		<link>http://www.ourada.org/blog/archives/390</link>
		<comments>http://www.ourada.org/blog/archives/390#comments</comments>
		<pubDate>Thu, 10 Dec 2009 17:30:06 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=390</guid>
		<description><![CDATA[Scott Stafford was nice enough to post code for asc-gzip/.xfd decompression to go with my asc-gzip/.xfd compression code. See this comment. I&#8217;m also reposting it here because the comment formatting is a little more bad than the main-post formatting.

Thanks for your post.  Of course, I needed the opposite, I had one I needed to [...]]]></description>
			<content:encoded><![CDATA[<p>Scott Stafford was nice enough to post code for asc-gzip/.xfd decompression to go with my asc-gzip/.xfd compression code. See <a href="http://www.ourada.org/blog/archives/375#comment-25551">this comment</a>. I&#8217;m also reposting it here because the comment formatting is a little more bad than the main-post formatting.</p>
<hr />
Thanks for your post.  Of course, I needed the opposite, I had one I needed to decompress.  So I backwarded your algorithm and here is the result:</p>
<pre>
def decompress(fc):
    fc2 = fc.splitlines(True)
    fc3 = "".join(fc2[1:]) # could verify that it's asc-gzip here if we wanted to...
    unb64 = base64.standard_b64decode(fc3)

    ctr = 0
    ret = []
    while 1:
        if ctr == len(unb64): break

        ccltop = ord(unb64[ctr])
        ctr += 1
        cclbottom = ord(unb64[ctr])
        ctr += 1
        compressedchunklen = ccltop * 256 + cclbottom

        cltop = ord(unb64[ctr])
        ctr += 1
        clbottom = ord(unb64[ctr])
        ctr += 1
        chunklen = cltop * 256 + clbottom
        #~ print compressedchunklen, chunklen

        compressedchunk = unb64[ctr:ctr+compressedchunklen]
        ctr += compressedchunklen

        chunk = zlib.decompress(compressedchunk)
        assert(len(chunk) ==  chunklen)
        ret.append(chunk)

    return "".join(ret)
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/390/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XSLT and the wonders thereof</title>
		<link>http://www.ourada.org/blog/archives/388</link>
		<comments>http://www.ourada.org/blog/archives/388#comments</comments>
		<pubDate>Wed, 09 Dec 2009 21:45:12 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/archives/388</guid>
		<description><![CDATA[It&#8217;s always interesting for me to dig into XSLT. I don&#8217;t use it a whole lot, so when I do it&#8217;s all fun and new. This time around, I&#8217;m using 2.0, which wasn&#8217;t really implemented the last time I was doing anything much with the language. Loving the new features; so far I&#8217;ve used several [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s always interesting for me to dig into XSLT. I don&#8217;t use it a whole lot, so when I do it&#8217;s all fun and new. This time around, I&#8217;m using 2.0, which wasn&#8217;t really implemented the last time I was doing anything much with the language. Loving the new features; so far I&#8217;ve used several to good effect.</p>
<p>It occurred to me today that document conversion is an interesting niche wherein a &#8216;pure functional&#8217; paradigm is useful. I still can&#8217;t see myself using a pure functional approach in many other areas, but I do have to deal with document conversion often enough that I&#8217;m glad XSLT exists.</p>
<p>I find the tree-transformation model of computation is an interesting mind-bender, though when I think about it, it&#8217;s really only mind-bending in combination with the functional approach. And thinking further, I&#8217;d suppose that a functional program of any size would tend toward the nature of a tree transformation&#8230; Hmmm, something to ponder some more.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/388/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dumb ways to lose files, part 18</title>
		<link>http://www.ourada.org/blog/archives/386</link>
		<comments>http://www.ourada.org/blog/archives/386#comments</comments>
		<pubDate>Thu, 19 Nov 2009 18:36:32 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=386</guid>
		<description><![CDATA[Here&#8217;s a bizarre way to lose some files:
rm foo.x `
(didn&#8217;t notice I&#8217;d accidentally hit backtick)
ls
(always do this after file operations, it&#8217;s a weird little habit)
(oops, didn&#8217;t work. Oh, there&#8217;s a backtick in operation.)
`
(a bunch of errors about some files and directories that can&#8217;t be removed.)
(CRAP!)
Running a Bacula restore job as I type this&#8230;
]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a bizarre way to lose some files:<br />
<code>rm foo.x </code>`<br />
(didn&#8217;t notice I&#8217;d accidentally hit backtick)<br />
<code>ls</code><br />
(always do this after file operations, it&#8217;s a weird little habit)<br />
(oops, didn&#8217;t work. Oh, there&#8217;s a backtick in operation.)<br />
<code>`</code><br />
(a bunch of errors about some files and directories that can&#8217;t be removed.)<br />
(CRAP!)</p>
<p>Running a Bacula restore job as I type this&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/386/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lost clicks in Flash Player, Eclipse</title>
		<link>http://www.ourada.org/blog/archives/385</link>
		<comments>http://www.ourada.org/blog/archives/385#comments</comments>
		<pubDate>Wed, 11 Nov 2009 02:32:50 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/archives/385</guid>
		<description><![CDATA[I&#8217;ve been having some weirdness in Flash Player and Eclipse, where mouse clicks seem to get lost and so I can&#8217;t click certain buttons. Turns out it has something to do with the new GTK client-side windows. It can be fixed with GDK_NATIVE_WINDOWS=1. If you need more info, ask; I&#8217;m mainly posting this as a [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been having some weirdness in Flash Player and Eclipse, where mouse clicks seem to get lost and so I can&#8217;t click certain buttons. Turns out it has something to do with the new GTK client-side windows. It can be fixed with GDK_NATIVE_WINDOWS=1. If you need more info, ask; I&#8217;m mainly posting this as a reminder to myself, but maybe it&#8217;ll catch a few web searches&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/385/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dirt/hardwood/carpet</title>
		<link>http://www.ourada.org/blog/archives/383</link>
		<comments>http://www.ourada.org/blog/archives/383#comments</comments>
		<pubDate>Mon, 02 Nov 2009 08:09:42 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=383</guid>
		<description><![CDATA[Hmmm, one difference between hardwood floors (which I have now) and carpeted floors (which I&#8217;ve lived with most of my life) that I didn&#8217;t really anticipate: I tend to perceive hardwood floors as &#8216;dirtier&#8217;, in the sense that they&#8217;re more likely to give up their dirt to my sticky clothing and skin surfaces when I [...]]]></description>
			<content:encoded><![CDATA[<p>Hmmm, one difference between hardwood floors (which I have now) and carpeted floors (which I&#8217;ve lived with most of my life) that I didn&#8217;t really anticipate: I tend to perceive hardwood floors as &#8216;dirtier&#8217;, in the sense that they&#8217;re more likely to give up their dirt to my sticky clothing and skin surfaces when I touch them.</p>
<p>That, of course, is the flip side of the &#8216;easier to clean&#8217; thing, because they&#8217;ll give up their dirt to the sweeper, vacuum and dry mop more easily, too. I guess you could say it&#8217;s a more open relationship between me and housedirt. Weirder analogies are sitting in my brain, but aren&#8217;t going to get out.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/383/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>asc-gzip/.xfd compression</title>
		<link>http://www.ourada.org/blog/archives/375</link>
		<comments>http://www.ourada.org/blog/archives/375#comments</comments>
		<pubDate>Thu, 08 Oct 2009 22:24:07 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=375</guid>
		<description><![CDATA[If you should ever find yourself in the position of having to figure out how to compress XFDL files with the asc-gzip encoding, and I don&#8217;t wish it on you, here&#8217;s Python code to do it. Obviously, you&#8217;ll need some imports and error handling and optimization.
This thread gave me pointers to figure this out; Bryan [...]]]></description>
			<content:encoded><![CDATA[<p>If you should ever find yourself in the position of having to figure out how to compress XFDL files with the asc-gzip encoding, and I don&#8217;t wish it on you, here&#8217;s Python code to do it. Obviously, you&#8217;ll need some imports and error handling and optimization.</p>
<p><a href="http://groups.google.com/group/comp.mail.mime/browse_thread/thread/ecc256a241afe78a/c36e51d1f5641a32?lnk=st&#038;q=%22content-encoding%22+%22asc-gzip%22&#038;rnum=1#c36e51d1f5641a32">This thread</a> gave me pointers to figure this out; Bryan was just a little off because he was using a gzip library rather than a zlib one.</p>
<pre>
# compress according to wacky XFDL compression scheme
def compress(fc):
    CHUNK_SIZE = 60000
    out = ''
    for i in range(0, len(fc), CHUNK_SIZE):
        chunk = fc[i:i + CHUNK_SIZE]
        chunklen = len(chunk)
        compressedchunk = zlib.compress(chunk)
        compressedchunklen = len(compressedchunk)
        out += chr(compressedchunklen / 256)
        out += chr(compressedchunklen % 256)
        out += chr(chunklen / 256)
        out += chr(chunklen % 256)
        out += compressedchunk

    f = StringIO.StringIO()
    f.write('application/x-xfdl;content-encoding="asc-gzip"\n')
    b64 = base64.standard_b64encode(out)

    for i in range(0, len(b64), 76):
        f.write(b64[i:i+76])
        f.write('\r\n')
    ret = f.getvalue()
    f.close()
    return ret
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/375/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>&#8216;Parented to&#8217;</title>
		<link>http://www.ourada.org/blog/archives/370</link>
		<comments>http://www.ourada.org/blog/archives/370#comments</comments>
		<pubDate>Fri, 18 Sep 2009 07:02:34 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/?p=370</guid>
		<description><![CDATA[Language morphs in interesting ways. Fields of endeavor adopt various words from the general language as terms of art. But of course, the metaphors break down around the edges and the terms morph to reflect that.
In computer science, the terms &#8216;tree&#8217;, &#8216;parent&#8217; and &#8216;child&#8217; were taken to talk about a certain way of structuring data, [...]]]></description>
			<content:encoded><![CDATA[<p>Language morphs in interesting ways. Fields of endeavor adopt various words from the general language as terms of art. But of course, the metaphors break down around the edges and the terms morph to reflect that.</p>
<p>In computer science, the terms &#8216;tree&#8217;, &#8216;parent&#8217; and &#8216;child&#8217; were taken to talk about a certain way of structuring data, presumably because when you draw diagrams of this structure, it looks similar to a diagram of a family tree you might draw in genealogy. But often, when implementing this, it&#8217;s sensible for the node to have a &#8216;parent&#8217; property rather than just the parent having a &#8216;children&#8217; property. In those cases, it&#8217;s more natural, then, to English a line of code like &#8220;A.parent = B;&#8221; as &#8220;node A is parented to node B&#8221;, rather than &#8220;node A is made a child of node B&#8221;. They mean the same thing in the computer science nomenclature, but you&#8217;d probably never hear someone saying &#8220;Joe is parented to Jane&#8221; in genealogical terms.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/370/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>urllib2</title>
		<link>http://www.ourada.org/blog/archives/369</link>
		<comments>http://www.ourada.org/blog/archives/369#comments</comments>
		<pubDate>Fri, 18 Sep 2009 01:25:56 +0000</pubDate>
		<dc:creator>Steven</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ourada.org/blog/archives/369</guid>
		<description><![CDATA[It&#8217;s been quite a while since I&#8217;ve looked at the HTTP client libraries in Python. urllib2 has a pretty cool pluggable-pipeline architecture, with a bunch of standard handlers for things like cookies, redirects, basic auth, etc. Nice.
]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been quite a while since I&#8217;ve looked at the HTTP client libraries in Python. urllib2 has a pretty cool pluggable-pipeline architecture, with a bunch of standard handlers for things like cookies, redirects, basic auth, etc. Nice.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ourada.org/blog/archives/369/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
