<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-12729767</id><updated>2012-02-01T05:57:09.908-08:00</updated><title type='text'>One for the Morning Glory</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default?start-index=101&amp;max-results=100'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>120</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-12729767.post-5572687460947455615</id><published>2007-11-30T20:46:00.000-08:00</published><updated>2008-07-10T06:23:10.747-07:00</updated><title type='text'>My blog has moved.</title><content type='html'>My blog is now hosted over here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://algebraicthunk.net/~dburrows/blog"&gt;http://algebraicthunk.net/~dburrows/blog&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-5572687460947455615?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/5572687460947455615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/5572687460947455615'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/11/my-blog-has-moved.html' title='My blog has moved.'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-4989856010680867140</id><published>2007-11-21T18:31:00.001-08:00</published><updated>2009-12-11T03:28:11.001-08:00</updated><title type='text'>Facebook comments</title><content type='html'>My blog is syndicated on &lt;a href="http://planet.debian.org/"&gt;Planet Debian&lt;/a&gt;, &lt;a href="http://planet.gslug.org/"&gt;Planet GSLUG&lt;/a&gt;, and Facebook (through their "notes" system).  I occasionally get a comment about one of my posts over on Facebook, and every time I do I remember one of the reasons I avoid that site.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;[someone] made a comment about your note "note title".&lt;br /&gt;&lt;br /&gt;To see the comment, follow the link below:&lt;br /&gt;[link to Facebook]&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;What's missing here is of course the actual text of the comment.  Blogger does this right: the actual comment is emailed to me.  Not only does this impose the annoyance of having to click on the link, but I often read my email offline, and so a message like this is worse than useless for me.  (worse as I have to postpone it for later, which means I need to deal with it twice)  It would be even better if I didn't have to click to reply, but with a Web service you kind of expect that. (one of the reasons that I'll be setting up my own blog at some point: I can use software that actually allows me to compose replies offline)&lt;br /&gt;&lt;br /&gt;I don't know why Facebook does this, but my guess is that either (a) they haven't thought about it, or (b) they want to drive up page views and make it annoying for me to not use their site.  If it's (b), then that apparently works for a large swathe of the population, but it makes me want to avoid them like a bad cliche.&lt;br /&gt;&lt;br /&gt;[EDIT] This post is attracting spam; closing comments.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-4989856010680867140?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/4989856010680867140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=4989856010680867140' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/4989856010680867140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/4989856010680867140'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/11/facebook-comments.html' title='Facebook comments'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-6036714401167369559</id><published>2007-11-21T18:09:00.001-08:00</published><updated>2010-03-04T06:39:39.916-08:00</updated><title type='text'>Good ideas in customer service: kill the hold period</title><content type='html'>The lender for one of my student loans has apparently started using a rather cool system to manage incoming customer service calls.  If all the call-takers are busy, then instead of forcing you to sit there listening to a call telling you how important your business is to them, they let you request a call-back.  They ask you to enter a phone number where they can reach you, then give you a time window in which they'll be calling (in my case I think it was about two minutes wide).  When my turn came up, they called me and I was able to speak with a human immediately.&lt;br /&gt;&lt;br /&gt;This is such a huge improvement over the typical call center experience that I'm amazed it hasn't caught on more broadly.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;It's presumably good for them since they don't have to pay for a long incoming toll-free call, particularly when most of the call is just muzak.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;It's great for me, because instead of sitting by the phone like a hawk in case I miss the customer service rep, I can go do something useful for a few minutes until the time the call is scheduled for.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;I'm guessing that this option will be available in more and more places as companies computerize their telephone systems.  Another nice twist, if there are any telephony guys reading this, would be to allow me to request the customer service call from a Web page, eliminating the toll-free call altogether and presumably saving some expense for the company.&lt;br /&gt;&lt;br /&gt;An interesting question for me is how they generate those estimates of when they'll be able to help you.  I'm guessing that they use some &lt;a href="http://en.wikipedia.org/wiki/Queueing_Theory"&gt;queueing theory&lt;/a&gt; to estimate the most likely wait time for the next incoming customer, but this is something I have only a fuzzy awareness of.  However they did it, the estimate seemed accurate enough to me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-6036714401167369559?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/6036714401167369559/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=6036714401167369559' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/6036714401167369559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/6036714401167369559'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/11/good-ideas-in-customer-service-kill.html' title='Good ideas in customer service: kill the hold period'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-7386995056838124105</id><published>2007-11-20T21:28:00.000-08:00</published><updated>2009-12-11T03:31:53.714-08:00</updated><title type='text'>cwidget gets a Web page</title><content type='html'>I spent some time last weekend putting together the infrastructure to generate a basic &lt;a href="http://cwidget.alioth.debian.org/"&gt;Web page&lt;/a&gt; for cwidget.  The Web page is generated by &lt;a href="http://ikiwiki.info/"&gt;Ikiwiki&lt;/a&gt; (thanks to the incomparable Joey Hess for a really nice piece of code there) and doubles as the cwidget documentation; it will be included in the next upload of libcwidget-doc.  It can be found in the source tree under doc/ikiwiki.&lt;br /&gt;&lt;br /&gt;It's currently a bit skeletal: in particular, it really needs some tutorial/HOWTO material for new users.  But it at least has all the basic information that I personally expect from a project Web site.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I was playing with ikiwiki for a week or so prior to setting this Web site up, and the more I use it the more impressed I am.  When I get my new Slicehost instance set up (probably next weekend), this blog will probably migrate to an ikiwiki installation over there.  Being able to edit my posts offline (about half my hacking time is offline), being able to expose a change history for posts, and not having to maintain an installation of a monster PHP program (as the docs put it, if you don't run the CGI then ikiwiki has the security implications of cat(1)), are all absolutely killer features for me, and I look forward to expanding my use of this tool.  Joey has struck gold yet again.&lt;br /&gt;&lt;br /&gt;[UPDATE] This post is attracting spam and no real comments.  Closing comments.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-7386995056838124105?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/7386995056838124105/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=7386995056838124105' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/7386995056838124105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/7386995056838124105'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/11/cwidget-gets-web-page.html' title='cwidget gets a Web page'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-5215477727066947768</id><published>2007-11-11T18:41:00.000-08:00</published><updated>2007-11-11T19:10:08.171-08:00</updated><title type='text'>ANNOUNCE: cwidget</title><content type='html'>I've just uploaded the first release of libcwidget to Alioth and NEW.  libcwidget is a high-level C++ library for developing user interfaces that run in a terminal using curses as the display and input layer.  It uses widget abstractions similar (but of course not identical) to those found in GTK+ and Qt, with signals and slots provided by &lt;a href="http://libsigc.sourceforge.net"&gt;libsigc++&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Background&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;Back when I started writing aptitude, I had one general goal:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Just because it runs in a terminal doesn't mean it has to suck.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I tried to apply this in the user interface, but I also applied it internally.  The curses programs I looked at before writing aptitude all had very ad-hoc UIs.  In many cases the code was structured with each "view" that appeared mapped to a custom C function call; if the author was feeling ambitious, similar-looking screens might be abstracted into a single function call, but the basic structure of the interface still reflected the call graph of the program.&lt;br /&gt;&lt;br /&gt;aptitude had a primitive interface abstraction layer from the get-go; over the years, I borrowed ideas from GTK+ and restructured this layer into a full widget set.  libcwidget is this code, disentangled from the guts of aptitude and slightly cleaned up.  Because of its history, it is missing widgets that aptitude doesn't need (like a multi-line text editor), but it provides an extensible base that you can build upon.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Getting cwidget&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;The cwidget library is available (both as source and as an i386 .deb) from the &lt;a href="http://alioth.debian.org/frs/?group_id=100001"&gt;cwidget Alioth releases page&lt;/a&gt;.  There is also &lt;a href="http://alioth.debian.org/~dburrows/cwidget-docs/"&gt;API documentation automatically generated from the upstream repository&lt;/a&gt;, which, while it is woefully incomplete, should provide some information: I've tried to write Doxygen tags into most of the code I've added in the last 4 years or so.&lt;br /&gt;&lt;br /&gt;The upstream code repository is in git (because what fun is a new project if you don't learn a new VCS?) and available &lt;a href="http://git.debian.org/?p=cwidget/head/.git;a=summary"&gt;here&lt;/a&gt;.  To retrieve a copy of the repository for yourself, run this command:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;git clone git://git.debian.org/git/cwidget/head cwidget&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-5215477727066947768?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/5215477727066947768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=5215477727066947768' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/5215477727066947768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/5215477727066947768'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/11/announce-cwidget.html' title='ANNOUNCE: cwidget'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-6588239113641437338</id><published>2007-11-05T19:20:00.000-08:00</published><updated>2007-11-05T19:36:58.925-08:00</updated><title type='text'>Building rails</title><content type='html'>In the 1860s, in the middle of one of the largest wars America has ever been involved in, a 690-mile &lt;a href="http://en.wikipedia.org/wiki/First_Transcontinental_Railroad"&gt;railroad&lt;/a&gt; was built in a period of seven to nine years (depending on how you count), a rate of about five days per mile of track.  Now, it's certainly true that this was accomplished through labor practices that were, by today's standards, more than a little bit questionable.  However, I still am amazed that it's apparently going to take us &lt;a href="http://seattletimes.nwsource.com/html/opinion/2003905815_ronsims27.html"&gt;twenty years&lt;/a&gt; to construct &lt;a href="http://seattlepi.nwsource.com/opinion/335171_countycouncil12.html"&gt;fifty miles&lt;/a&gt; of track in the Seattle area.  By my count, that's &lt;b&gt;a hundred and forty six days per mile of track&lt;/b&gt;.  And I haven't even mentioned the harsh environmental conditions the transcontinental line faced, which a line in the Seattle metro area by and large does not.&lt;br /&gt;&lt;br /&gt;I haven't decided how or whether to vote in the election tomorrow, but the timescale they're projecting is ... astonishing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-6588239113641437338?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/6588239113641437338/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=6588239113641437338' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/6588239113641437338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/6588239113641437338'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/11/building-rails.html' title='Building rails'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-6652226576928876019</id><published>2007-11-04T11:58:00.000-08:00</published><updated>2007-11-04T12:54:35.879-08:00</updated><title type='text'>Lessig at the University of Washington</title><content type='html'>On Friday 2007-11-02, I watched &lt;a href="http://www.lessig.org"&gt;Larry Lessig&lt;/a&gt; give a presentation at the University of Washington entitled &lt;q&gt;Is Google (2008) Microsoft (1998)&lt;/q&gt;? Since it was Lessig, the talk was articulate and thought-provoking, and he used his slides very well (unlike many presenters who just read bullet points).&lt;br /&gt;&lt;br /&gt;The argument he made is that Google is like Microsoft in some ways (and so are other companies like Facebook).  In his analysis, the problem with Microsoft was that so many companies made themselves Microsoft-dependent, which both forced other companies to follow suit (due to network effects) and gave Microsoft leverage they could use against everyone in their ecosystem (e.g., Netscape).  According to Lessig, Microsoft was not evil to use this leverage, but you have to recognize that Microsoft will do what is best for Microsoft, and this may not be what is best for you.  He then suggested that we should be aware of the potential for the same thing to happen; in support of this point, he quoted excerpts from the terms of service from the APIs of Google and Facebook, which contain typical statements like &lt;q&gt;we reserve the right to terminate your use of this service for any reason or for no reason&lt;/q&gt;, and asked: &lt;q&gt;What if Microsoft had written this license agreement?&lt;/q&gt;&lt;br /&gt;&lt;br /&gt;But it seemed to me that this wasn't his main point.  He was using this observation as a springboard to talk about issues revolving around competition and public policy.  Specifically, he feels that we should work towards a more just model of interaction between companies and users whose work makes the company more valuable (by contributing to a software ecosystem, by posting content on the Web site, etc).  But the correct way to do this (he says) is not via competition, after-the-fact litigation, or voluntary codes of conduct: competition may not be around to enforce good behavior (as we've seen with Microsoft), litigation may be too late and ineffective (again, see Microsoft), and voluntary codes of conduct will disappear as soon as they get in the way of the bottom line.  The correct approach, he argued, is across-the-board regulation so that all the companies have to play by the same rules.&lt;br /&gt;&lt;br /&gt;From there he went on to talk about governmental corruption.  He said (quoting Robert Reich's book &lt;q&gt;Supercapitalism&lt;/q&gt;) that the reason we consistently look for solutions in the market and in voluntary compliance is that our governmental system is broken and does not effectively regulate corporations in the public interest.   But Lessig is optimistic that we can change things (he joked that his publisher was unhappy with this point of view, because his &lt;q&gt;brand&lt;/q&gt; has been built on pessimism).  In his view, the politicians in Washington, by and large, want to be honest and do good, but they aren't able to within the current political system.  For instance, on the few occassions that he managed to get access to lawmakers to discuss copyright issues, it was often the first time they had heard that there was more than one side to the argument.  He thinks we need a national political movement that will shame politicians into being less corrupt.&lt;br /&gt;&lt;br /&gt;This is all a simplification of what he said, of course; unfortunately, I wasn't able to find a recording of this talk on Lessig's &lt;a href="http://www.lessig.org"&gt;Web site&lt;/a&gt;, or I'd point you at primary source material.  I don't know if this is because he chose not to post it, or because it just hasn't been made available yet.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;My view&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;In general, I thought that the speech was very interesting and well thought out.  But as much as I'd like to buy into his optimism that we can fix our system, I don't think it's well-founded, for two reasons.&lt;br /&gt;&lt;br /&gt;First, he argued that competition will resolve some of these problems (that was before and after he said we can't rely on competition, which I found confusing and may indicate that I misunderstood something).  His evidence for this seemed to be that when Microsoft was dominating the world, users responded by reducing their dependence on Microsoft products and by switching to alternatives such as Linux.  But, in fact, although more people may be using Linux than in the past, virtually everyone is still only using Windows, it's still almost impossible to find a programming job that isn't Windows-only, and Microsoft is still raking in money hand over fist; indeed, they're doing so well that they're planning to &lt;a href="http://seattletimes.nwsource.com/html/microsoft/2002796093_microsoft10.html"&gt;expand their workforce by a third&lt;/a&gt;.  To take just one data point of many: I ride the bus to Seattle and back, and I regularly see other people using laptops as they commute.  Virtually all the laptops run Windows.  Occasionally I'll see a Mac, and every few months I'll see a guy running Linux on his laptop; I say "a guy" because it's the same guy every single time.  So by my estimation, use of Linux on laptops in buses on the 545 route from Redmond to Seattle is way below 1%, with Macintoshes somewhere around 5%.&lt;br /&gt;&lt;br /&gt;To broaden my point, I think Lessig has fallen into a trap that highly intelligent people, particularly those in academia, tend to fall into.  In academia, you are surrounded by people who value learning and thinking deeply about the world.  These are people who will give serious and unbiased consideration to questions like &lt;q&gt;what is the social effect of my acceptance of the Facebook Terms of Service?&lt;/q&gt; and &lt;q&gt;If I become dependent on this service, will that possibly affect me in five years if the company decides to act against my interests?&lt;/q&gt; The problem with this is that these people are not representative of the population at large.  The population at large thinks &lt;q&gt;why is this check-box getting in the way of me sending pictures to my friends?&lt;/q&gt; And I have no doubt that any kid who, e.g., refuses to sign up for Facebook as a protest against their TOS will be roundly mocked in their social circles for being a weird antisocial nonconformist.  (of course, this may not apply to the small minority of people like myself whose social circles consist of weird antisocial nonconformists)&lt;br /&gt;&lt;br /&gt;Second, Lessig's optimism about the political system seemed to be based on his observation that the people in government are, by and large, not venally corrupt: they want to do good, but the system is constructed in a way that makes this impossible.  To me, that's a tremendously &lt;i&gt;disheartening&lt;/i&gt; statement.  If our problem were simply a few, or even many, corrupt politicians, this would be a solvable problem: even nowadays, Americans have some ability to choose who gets elected, and I believe that a sufficiently well-coordinated campaign could replace bad politicians with good ones.&lt;br /&gt;&lt;br /&gt;But if the problem is that the system is corrupt even when the individuals are honest, it's a much deeper problem and frankly one that I don't know how to solve.  While individuals have some direct control over who gets elected, we have no way to directly change the system that produces the corruption; the levers to do this are in the hands of the politicians elected through that broken system.  It's unlikely that the politicians themselves will fix the problem, because they've benefited deeply from it: if the system is left as it is, well over 90% of Congress members will &lt;a href="http://en.wikipedia.org/wiki/Congressional_stagnation_in_the_United_States"&gt;keep&lt;br /&gt;their jobs&lt;/a&gt; in the next election cycle, and any &lt;b&gt;effective&lt;/b&gt; change seems likely (by definition) to disrupt this cushy arrangement.&lt;br /&gt;&lt;br /&gt;On the other hand, running new candidates for office will not fix the problem.  After all, if the problem is that the system is corrupt even when the participants are honest, then putting more honest people into government will have no effect.  In order to get elected, these new politicians will have to become just as corrupt as the old ones, because that's how the system is set up. So we might change the faces, but we'll have the same old problems.&lt;br /&gt;&lt;br /&gt;I recall two specific concrete proposals that Lessig made to make the system more responsive.  First, he suggested shaming politicians who engage in corrupt behavior -- presumably taking large donations from interested parties. I don't see how this will help.  Americans generally have a very low regard for the political class as it is; will pointing out particular examples of politicians taking money really make a difference when it comes to votes?  And if it doesn't, will it really produce any change in their behavior?  Politicians are motivated by votes the same way corporations are motivated by money; unless they stand a chance of losing their job (which is &lt;a href="http://en.wikipedia.org/wiki/Congressional_stagnation_in_the_United_States"&gt;virtually impossible&lt;/a&gt; in any event), there's no reason for them to change how they behave.&lt;br /&gt;&lt;br /&gt;His second proposal was for a system of contributions where it's impossible for any individual to prove they had donated a particular amount of money to a particular candidate.  Even assuming it could be implemented perfectly, I don't think this will really solve the problem, for two reasons.  First, it's not generally a secret what moneyed interests want.  Politicians who want to attract large &lt;q&gt;donations&lt;/q&gt; can just take positions that they know will appeal to donors of that sort.  The donors themselves can make this easier on the candidates by, e.g., posting public position statements on issues of the day.  Secondly, and this is far more insidious, &lt;i&gt;even if politicians honestly represent their positions&lt;/i&gt;, then because success in running for office is so tied to the amount of money the candidate can raise, only candidates who hold opinions favorable to large corporations and wealthy individuals will be able to get elected.  In fact, for all I know this is what happens already!&lt;br /&gt;&lt;br /&gt;But with all that said, it was a really interesting talk and Lessig tied together some things you might not think would go together.  If a video or Flash presentation becomes available, I would recommend watching through it.  And hopefully my pessimistic predictions will be wrong; it's certainly &lt;a href="http://arstechnica.com/journals/linux.ars/2007/09/05/amd-to-deliver-better-ati-drivers-open-specifications"&gt;happened before&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-6652226576928876019?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/6652226576928876019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=6652226576928876019' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/6652226576928876019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/6652226576928876019'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/11/lessig-at-university-of-washington.html' title='Lessig at the University of Washington'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-6659210223348682896</id><published>2007-10-31T05:57:00.000-07:00</published><updated>2007-10-31T20:08:33.251-07:00</updated><title type='text'>Mail</title><content type='html'>Amusing tidbits you pick up in the mailing industry...&lt;br /&gt;&lt;br /&gt;No, you can't &lt;a href="http://xkcd.com/96/"&gt;mail running chainsaws&lt;/a&gt;.  At least I'm pretty sure about that; I don't know a specific regulation against them, but USPS takes a dim view of anything that puts its employees and machinery at risk.&lt;br /&gt;&lt;br /&gt;On the other hand, you can mail live scorpions if you &lt;a href="http://pe.usps.gov/Archive/Html/DMMArchive1209/C022.htm"&gt;package them appropriately&lt;/a&gt;.  Note that, however, that this is limited to the US; apparently doing so in Australia is &lt;a href="http://www.abc.net.au/news/stories/2007/10/12/2058033.htm"&gt;not a good idea&lt;/a&gt;.  The &lt;a href="http://pe.usps.gov/Archive/Html/DMMArchive1209/C022.htm"&gt;same page&lt;/a&gt; also gives the rules for mailing baby chicks (which must be not more than 24 hours old) as well as adult chickens (Express Mail only, please; and no refund if the chicken dies in transit unless the container was damaged).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-6659210223348682896?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/6659210223348682896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=6659210223348682896' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/6659210223348682896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/6659210223348682896'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/10/mail.html' title='Mail'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-7088318780294228474</id><published>2007-10-30T21:02:00.000-07:00</published><updated>2007-10-30T21:07:30.506-07:00</updated><title type='text'>Here we go again...</title><content type='html'>&lt;pre&gt;&lt;br /&gt;[10/30/2007]&lt;br /&gt;Version 0.4.7                               "Where did all these&lt;br /&gt;                                             balloons come from?&lt;br /&gt;                                             And why am I wearing&lt;br /&gt;                                             a fake nose?"&lt;br /&gt;&lt;br /&gt;- New features:&lt;br /&gt;&lt;br /&gt;  * The options dialogs have been completely replaced by a new&lt;br /&gt;    interface, based on a top-level list view.  This fixes many&lt;br /&gt;    deficiencies of the old interface: it handles long strings more&lt;br /&gt;    gracefully, avoids many of the focus-handling bugs that the old&lt;br /&gt;    dialogs had, and should generally be better-behaved.&lt;br /&gt;     (Closes: #197976, #331200, #424708)&lt;br /&gt;&lt;br /&gt;  * Prompts that ask you to enter text will now wrap to multiple lines&lt;br /&gt;    when the text gets long, rather than hiding parts of the string.&lt;br /&gt;&lt;br /&gt;  * The online help and other Help-menu itmes are now top-level views,&lt;br /&gt;    which should make them somewhat more usable. (Closes: #434349)&lt;br /&gt;&lt;br /&gt;  * Support for the "Breaks" field and for trigger states (thanks to&lt;br /&gt;    Michael Vogt and Ian Jackson for patches and prodding).&lt;br /&gt;    (Closes: #438543)&lt;br /&gt;&lt;br /&gt;  * Two new styles, "PkgDowngraded" and "PkgDowngradedHighlighted",&lt;br /&gt;    are provided to control how downgraded packages look.  By default&lt;br /&gt;    these packages look like any other installed package.&lt;br /&gt;    (Closes: #434442)&lt;br /&gt;&lt;br /&gt;  * aptitude can now display homepage URLs stored in the Homepage&lt;br /&gt;    field of packages.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;There are bug-fixes too, but those aren't as fun.  So instead I think I'll include some diffstat output.  Everyone likes diffstat!&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;daniel@alpaca:~/programming/aptitude/head$ hg diff -r 0.4.6.1:0.4.7 | diffstat&lt;br /&gt; .hgtags                                       |    1 &lt;br /&gt; NEWS                                          |   92 +&lt;br /&gt; b/src/apt_config_treeitems.cc                 |  477 ++++++&lt;br /&gt; b/src/apt_config_treeitems.h                  |  156 ++&lt;br /&gt; b/src/generic/util/browser.h                  |   42 &lt;br /&gt; configure.ac                                  |   20 &lt;br /&gt; doc/en/aptitude.xml                           |  187 ++&lt;br /&gt; help-fr.txt                                   |   10 &lt;br /&gt; po/ChangeLog                                  |   24 &lt;br /&gt; po/dz.po                                      |  188 +-&lt;br /&gt; po/es.po                                      |   82 -&lt;br /&gt; po/gl.po                                      |   19 &lt;br /&gt; po/ne.po                                      | 1277 +++++++++--------&lt;br /&gt; po/pt.po                                      |   20 &lt;br /&gt; po/ru.po                                      |   97 -&lt;br /&gt; po/sv.po                                      | 1854 ++++++++++++--------------&lt;br /&gt; po/zh_CN.po                                   |   23 &lt;br /&gt; src/Makefile.am                               |    2 &lt;br /&gt; src/apt_info_tree.cc                          |    4 &lt;br /&gt; src/apt_options.cc                            |  598 +++++---&lt;br /&gt; src/apt_options.h                             |   12 &lt;br /&gt; src/cmdline/cmdline_action.cc                 |    6 &lt;br /&gt; src/cmdline/cmdline_check_resolver.cc         |    2 &lt;br /&gt; src/cmdline/cmdline_do_action.cc              |  134 +&lt;br /&gt; src/cmdline/cmdline_prompt.cc                 |  124 -&lt;br /&gt; src/cmdline/cmdline_search.cc                 |    4 &lt;br /&gt; src/cmdline/cmdline_show.cc                   |   20 &lt;br /&gt; src/cmdline/cmdline_why.cc                    |   64 &lt;br /&gt; src/defaults.cc                               |    4 &lt;br /&gt; src/dep_item.cc                               |    1 &lt;br /&gt; src/desc_parse.cc                             |    2 &lt;br /&gt; src/generic/apt/apt.cc                        |   32 &lt;br /&gt; src/generic/apt/apt.h                         |   30 &lt;br /&gt; src/generic/apt/aptcache.cc                   |   54 &lt;br /&gt; src/generic/apt/aptcache.h                    |   21 &lt;br /&gt; src/generic/apt/aptitude_resolver_universe.cc |   28 &lt;br /&gt; src/generic/apt/aptitude_resolver_universe.h  |   57 &lt;br /&gt; src/generic/apt/infer_reason.cc               |   22 &lt;br /&gt; src/generic/apt/log.cc                        |    8 &lt;br /&gt; src/generic/apt/matchers.cc                   |  531 +++++--&lt;br /&gt; src/generic/apt/matchers.h                    |   28 &lt;br /&gt; src/load_grouppolicy.cc                       |   25 &lt;br /&gt; src/menu_tree.cc                              |   12 &lt;br /&gt; src/pkg_columnizer.cc                         |   19 &lt;br /&gt; src/pkg_grouppolicy.cc                        |   27 &lt;br /&gt; src/pkg_grouppolicy.h                         |    9 &lt;br /&gt; src/pkg_info_screen.cc                        |   10 &lt;br /&gt; src/pkg_item.cc                               |   31 &lt;br /&gt; src/pkg_item.h                                |    7 &lt;br /&gt; src/pkg_subtree.cc                            |   22 &lt;br /&gt; src/pkg_subtree.h                             |   12 &lt;br /&gt; src/pkg_tree.cc                               |    4 &lt;br /&gt; src/pkg_tree.h                                |    1 &lt;br /&gt; src/pkg_ver_item.cc                           |   31 &lt;br /&gt; src/pkg_ver_item.h                            |    5 &lt;br /&gt; src/pkg_view.cc                               |   24 &lt;br /&gt; src/reason_fragment.cc                        |   10 &lt;br /&gt; src/solution_fragment.cc                      |    5 &lt;br /&gt; src/solution_item.cc                          |   76 -&lt;br /&gt; src/solution_item.h                           |   14 &lt;br /&gt; src/ui.cc                                     |  179 +-&lt;br /&gt; src/vscreen/fragment.cc                       |  140 +&lt;br /&gt; src/vscreen/fragment.h                        |   40 &lt;br /&gt; src/vscreen/ref_ptr.h                         |    5 &lt;br /&gt; src/vscreen/testvscreen.cc                    |   20 &lt;br /&gt; src/vscreen/vs_editline.cc                    |  310 +++-&lt;br /&gt; src/vscreen/vs_editline.h                     |   33 &lt;br /&gt; src/vscreen/vs_tree.cc                        |  113 +&lt;br /&gt; src/vscreen/vs_tree.h                         |   40 &lt;br /&gt; src/vscreen/vs_treeitem.cc                    |    4 &lt;br /&gt; src/vscreen/vs_treeitem.h                     |   21 &lt;br /&gt; src/vscreen/vs_util.cc                        |    1 &lt;br /&gt; 72 files changed, 4853 insertions(+), 2754 deletions(-)&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-7088318780294228474?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/7088318780294228474/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=7088318780294228474' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/7088318780294228474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/7088318780294228474'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/10/here-we-go-again.html' title='Here we go again...'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-8812325242959928954</id><published>2007-10-30T20:35:00.001-07:00</published><updated>2007-10-30T20:43:50.493-07:00</updated><title type='text'>Just rub it in, why don't you!</title><content type='html'>One of my co-workers told us about a message he saw posted on a British message board about Royal Mail.  For people whose job does not involve postal systems, Royal Mail is the semi-governmental semi-monopoly that handles mail in the UK; it's a little like the USPS in the States.&lt;br /&gt;&lt;br /&gt;The funny thing about the message had little to do with the mail: apparently the poster was saying that Royal Mail's standards have deteriorated because he can no longer pick up his mail at 9:30 AM, &lt;i&gt;before he goes to work&lt;/i&gt;.  Dude!  You don't even have to &lt;i&gt;leave&lt;/i&gt; for work until 9:30 and you're complaining about when your mail comes?&lt;br /&gt;&lt;br /&gt;I bet he gets four weeks of paid vacation, too, and then complains about how that isn't enough.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-8812325242959928954?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/8812325242959928954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=8812325242959928954' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/8812325242959928954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/8812325242959928954'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/10/just-rub-it-in-why-dont-you.html' title='Just rub it in, why don&apos;t you!'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-1797583514618354038</id><published>2007-10-13T19:50:00.001-07:00</published><updated>2007-10-13T20:04:22.537-07:00</updated><title type='text'>Mercurial repositories for the aptitude Debian tree now publically accessible</title><content type='html'>Since I switched the aptitude repositories over to Mercurial, I've been using &lt;a href="http://hg.complete.org/hg-buildpackage"&gt;hg-buildpackage&lt;/a&gt; to produce Debian packages.  I wasn't sure at first if it would work out, so I didn't publish the repositories, and then I got swamped with work.  But I've had good luck so far with hg-buildpackage, so I've uploaded the Mercurial trees to Alioth.  You can find the upstream branch here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://hg.debian.org/hg/aptitude/debian-upstream"&gt;http://hg.debian.org/hg/aptitude/debian-upstream&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and the Debian branch here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://hg.debian.org/hg/aptitude/debian"&gt;http://hg.debian.org/hg/aptitude/debian&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-1797583514618354038?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/1797583514618354038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=1797583514618354038' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/1797583514618354038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/1797583514618354038'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/10/mercurial-repositories-for-aptitude.html' title='Mercurial repositories for the aptitude Debian tree now publically accessible'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-5544202106895118699</id><published>2007-10-13T14:16:00.000-07:00</published><updated>2007-10-13T15:04:54.276-07:00</updated><title type='text'>Monad.Reader</title><content type='html'>The Reader monad is a simple and easy-to-use structure from the Haskell library that solves a common problem.&lt;br /&gt;&lt;br /&gt;Very often, it's the case that you have a lot of functions that all need to use the same values.  For instance, you might be laying out some text on a page, and you need to keep the details of the page size around in all your layout algorithms.  Typically, you handle this situation by adding a new parameter to all your functions which represents the state.  So,&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;layoutPage :: Text -&gt; Page&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;becomes&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;layoutPage :: PageLayoutParams -&gt; Text -&gt; Page&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;This works just fine, but it can get really ugly.  Every single function gets a new parameter, which must be threaded through to every related function that it ever calls.  This causes visual clutter, particularly for functions that don't actually use the parameter themselves but just pass it on.&lt;br /&gt;&lt;br /&gt;A function written in the Reader monad is augmented with a hidden parameter.  For the hypothetical example above, we would write:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import Control.Monad.Reader&lt;br /&gt;type LayoutFunc = Reader PageLayoutParams&lt;br /&gt;&lt;br /&gt;layoutPage :: Text -&gt; LayoutFunc Page&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Note that the Reader monad is partially applied here.  The result, LayoutFunc, is a new monad that adds a parameter of type PageLayoutParams to any code that runs inside it.&lt;br /&gt;&lt;br /&gt;So, now that we have this monad, how do we use it?  The "ask" operation retrieves the parameter that's hidden in the monad:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;ask :: Reader a a&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;or, specialized to LayoutFunc:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;ask :: LayoutFunc PageLayoutParams&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;In order to remain close to the example in question, I will provide specialized type signatures for the rest of the library functions.  You can find the generic type signatures in &lt;a href="http://www.haskell.org/ghc/docs/latest/html/libraries/mtl/Control-Monad-Reader-Class.html"&gt;the Haskell library documentation for Control.Monad.Reader&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Suppose that layoutPage started out like this before it was moved into the monad:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;layoutPage st txt =&lt;br /&gt;  let width = pageWidth st&lt;br /&gt;  ...&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;In the Reader monad, this becomes:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;layoutPage txt =&lt;br /&gt;  do st &lt;- ask&lt;br /&gt;     let width = pageWidth st&lt;br /&gt;     ...&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;As you can see, we've gone from one line of code to two.  As this is clearly unacceptable for a clutter-reducing device, the Reader module provides a convenience function encapsulating the above pattern:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;asks :: (PageLayoutParams -&gt; a) -&gt; PageLayoutFunc a&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;This allows us to simplify the monadic implementation to:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;layoutPage txt =&lt;br /&gt;  do width &lt;- asks pageWidth&lt;br /&gt;     ...&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;It's quite common, when multiple functions share context information, to invoke a function in an altered context.  For instance, we might have a layoutSubPage routine that changes the page width:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;layoutSubPage st newWidth txt =&lt;br /&gt;  doLayout (st {pageWidth = newWidth} txt)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The Reader equivalent of this idiom is the function "local":&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;local :: (PageLayoutParams -&gt; PageLayoutParams) -&gt; LayoutFunc a -&gt; LayoutFunc a&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;local executes an operation in a context modified by its first parameter.  For instance,&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;layoutSubPage newWidth txt =&lt;br /&gt;  local (\st -&gt; st { pageWidth = newWidth }) txt&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Finally, to actually invoke a computation in the Reader monad, use runReader:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;runReader :: LayoutFunc a -&gt; PageLayoutParams -&gt; a&lt;br /&gt;&lt;br /&gt;main = showPage (runReader defaultPageParams someText)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;For much more information on the Reader monad, see &lt;a href="http://www.haskell.org/all_about_monads/html/readermonad.html"&gt;All About Monads&lt;/a&gt;, or &lt;a href="http://www.haskell.org/ghc/docs/latest/html/libraries/mtl/Control-Monad-Reader.html"&gt;the Haskell library documentation&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-5544202106895118699?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/5544202106895118699/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=5544202106895118699' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/5544202106895118699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/5544202106895118699'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/10/monadreader.html' title='Monad.Reader'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-5584557301521056199</id><published>2007-10-10T18:37:00.000-07:00</published><updated>2007-10-10T18:44:33.919-07:00</updated><title type='text'>Science: who does it, why?</title><content type='html'>On the topic of "why so few scientists are women", I recently came across a rather thought-provoking &lt;a href="http://philip.greenspun.com/careers/women-in-science"&gt;article&lt;/a&gt; (thanks &lt;a href="http://erinn.org/itis/2007/10/09#random-links"&gt;Erinn&lt;/a&gt;).  It's worth a read, especially for anyone (man or woman) that's thinking about heading into academia.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-5584557301521056199?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/5584557301521056199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=5584557301521056199' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/5584557301521056199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/5584557301521056199'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/10/science-who-does-it-why.html' title='Science: who does it, why?'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-605760421144819265</id><published>2007-10-03T20:40:00.000-07:00</published><updated>2007-10-03T20:47:04.614-07:00</updated><title type='text'>Feline Love</title><content type='html'>Coding while a cat kneads your chest: awkward.&lt;br /&gt;&lt;br /&gt;Coding while a cat sleeps on your face: difficult.&lt;br /&gt;&lt;br /&gt;Coding while a cat nibbles on your fingers: painful.&lt;br /&gt;&lt;br /&gt;Coding with a cat snuggled up against your side: adorable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-605760421144819265?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/605760421144819265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=605760421144819265' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/605760421144819265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/605760421144819265'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/10/feline-love.html' title='Feline Love'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-201886125736207082</id><published>2007-09-04T07:46:00.000-07:00</published><updated>2007-09-04T07:55:25.199-07:00</updated><title type='text'>What were they thinking?</title><content type='html'>If you're going to build a computer case that looks like a media player ...&lt;br /&gt;&lt;br /&gt;and if you're going to include a big volume control and an LCD player on the front ...&lt;br /&gt;&lt;br /&gt;then aren't some buttons like "play", "next", and "pause" also a good idea?&lt;br /&gt;&lt;br /&gt;I ask because I was browsing computer cases at the store yesterday, and apparently no-one working for the companies that design these things has thought of including some control buttons on front.  To me, this seems like it would rank somewhere in the top 10 most obvious ideas ever, somewhere below "eat when you get hungry" and above "don't pick a fight with a grizzly bear", but clearly I'm missing something.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-201886125736207082?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/201886125736207082/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=201886125736207082' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/201886125736207082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/201886125736207082'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/09/what-were-they-thinking.html' title='What were they thinking?'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-742224033695122668</id><published>2007-08-30T20:31:00.000-07:00</published><updated>2007-08-30T20:42:05.340-07:00</updated><title type='text'>Seattle LUG meeting</title><content type='html'>The Seattle Linux user's group has been defunct for the last two years or so, but an effort is underway to renergize it.  This Saturday, the group will be &lt;a href="http://wiki.gslug.org/index.php/Meeting_2007-09-01"&gt;meeting&lt;/a&gt; for the first time in years.  The meeting will take place at the North Seattle Community College beginning at high noon -- check the &lt;a href="http://wiki.gslug.org/index.php/Meeting_2007-09-01#Who.27s_Coming.3F"&gt;official Web page&lt;/a&gt; for more details.  TBH, the presentations don't look that interesting to me, but it's always fascinating to meet people who actually &lt;i&gt;use&lt;/i&gt; Linux...&lt;br /&gt;&lt;br /&gt;Yes, I'll be there, but I'm not giving any of the presentations, so please don't let that keep you away. ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-742224033695122668?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/742224033695122668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=742224033695122668' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/742224033695122668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/742224033695122668'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/08/seattle-lug-meeting.html' title='Seattle LUG meeting'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-5031596628540379877</id><published>2007-07-01T18:12:00.000-07:00</published><updated>2007-07-26T06:33:07.450-07:00</updated><title type='text'>Do not install aptitude 0.4.4-4b+1!</title><content type='html'>Apparently someone decided to resolve the dependency problems with aptitude in unstable by doing a blind recompile and NMU of the package, presumably because of my horrible laziness in not doing an upload to unstable yet.  The problem, as I wrote in the bug reports regarding the need for a recompile, is that this produces a package that's totally unusable, which is why I didn't do it myself.  If you are running unstable, you should either not upgrade the apt system, or install the experimental aptitude (either using "apt-get install aptitude/experimental" or by going &lt;a href="http://packages.debian.org/experimental/admin/aptitude"&gt;here&lt;/a&gt;).  These packages are not perfectly stable, but they also aren't totally unusable.&lt;br /&gt;&lt;br /&gt;I apologize for the inconvenience -- if I can get some time this evening I'll rebuild the aptitude in experimental and throw it kicking and screaming into unstable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-5031596628540379877?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/5031596628540379877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=5031596628540379877' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/5031596628540379877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/5031596628540379877'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/07/do-not-install-aptitude-044-4b1.html' title='Do not install aptitude 0.4.4-4b+1!'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-7043354317493391491</id><published>2007-06-21T22:30:00.001-07:00</published><updated>2007-06-24T08:01:10.326-07:00</updated><title type='text'>Jealousy</title><content type='html'>I've been suffering for a while from mild jealousy of the people who have a spare week of vacation time to make it to Edinburgh for &lt;a href="http://www.debconf.org/"&gt;DebConf&lt;/a&gt;.  (is there a support group for this? :) )  But now I read that some people apparently have so much time off that they travelled to Edinburgh a full &lt;a href="http://layer-acht.org/blog/debian/#1-111"&gt;week&lt;/a&gt; ahead of time, just because, y'know, they could.  Darn Europeans.&lt;br /&gt;&lt;br /&gt;But then, I only have to work for another year and a half before I qualify for another whole week of vacation time, raising the total to three weeks off per year.  Maybe I can make DebConf 2009, assuming that President Hillary doesn't &lt;a href="http://techhouse.brown.edu/cgi-bin/fluble/vault.pl?date=19971023"&gt;invade Luxembourg&lt;/a&gt; or something...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-7043354317493391491?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/7043354317493391491/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=7043354317493391491' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/7043354317493391491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/7043354317493391491'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/06/jealousy.html' title='Jealousy'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-2696524421726078789</id><published>2007-06-19T20:31:00.001-07:00</published><updated>2007-06-19T21:45:57.034-07:00</updated><title type='text'>Fun with Functions</title><content type='html'>Pete Nuttall &lt;a href="http://www.lupin.org.uk/blog/computing/haskell/fnreduce.html"&gt;writes&lt;/a&gt; about the fnreduce function:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;fnreduce :: [(a-&gt;a)]-&gt;a-&gt;a&lt;br /&gt;fnreduce [] value = value&lt;br /&gt;fnreduce (a:as) value = freduce as $ a value&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A shorter, although not necessarily clearer, expression of this function would be&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;fnreduce as value = (foldr (flip (.)) id as) value&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This just says that to apply a list of functions to a value, we first compose all the functions by folding down the list, then apply the result to the value.  The important thing here is (flip (.)), which says to compose backwards; it means that fnreduce [f, g, h] returns (h . g . f . id) instead of (f . g . h . id).  An interesting side note is that it doesn't matter (from a semantic point of view) whether I use foldl or foldr, since function composition is associative:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;f . (g . (h . id)) = ((id . f) . g) . h&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;But "flip" here feels a little confusing.  A clearer approach would be to reverse the list instead of reversing the operator:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;fnreduce as value = foldr (.) id (reverse as) value&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This might be less efficient, but it says in a much clearer way what I'm doing.&lt;br /&gt;&lt;br /&gt;Yet another option is to eschew the use of function composition:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;fnreduce as value = foldl (flip ($)) value as&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Here ($) is the application function; (f$x) applies f to x.  So if we reverse it (call this $$), we get (x$$f) applies f to x.  Folding this from the left down the list [f, g, h] gives us (((value$$f)$$g)$$h), which is exactly what the original fnreduce did.&lt;br /&gt;&lt;br /&gt;I think this is maybe the best fold-based solution to the original problem, because it models what's happening (repeatedly transforming a value with a series of functions) directly.  To use a right-fold, you have to remove the flip and reverse as (the reason this is necessary is left as an exercise to the reader).&lt;br /&gt;&lt;br /&gt;&lt;hr/&gt;&lt;br /&gt;&lt;br /&gt;Pete also asks whether this can be done for heterogenous lists in a type-safe manner.  The core problem is, what is the type of our list?  It can't actually be a list: in order to check that it's OK to combine the output of one function with the input of another, we would need the elements of the list to have different types.  You can't do this in Haskell, even a crazy ghc-extended Haskell.&lt;br /&gt;&lt;br /&gt;So, we could try something like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;module Test where&lt;br /&gt;&lt;br /&gt;data TransformList a b where&lt;br /&gt;    Nil   :: TransformList a a&lt;br /&gt;    Cons  :: (a -&gt; b) -&gt; TransformList b c -&gt; TransformList a c&lt;br /&gt;&lt;br /&gt;apply :: TransformList a b -&gt; a -&gt; b&lt;br /&gt;apply Nil         = id&lt;br /&gt;apply (Cons f fs) = (apply fs) . f&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This lets us do stuff like&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;gt; apply (Cons (\x -&gt; x + 1) (Cons (\x -&gt; show x) Nil)) 5&lt;br /&gt;"6"&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This is cute, but I don't know that it's really that useful.  After all, how is it any better than the following?&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;gt; ((\x -&gt; show x) . (\x -&gt; x + 1)) 5&lt;br /&gt;"6"&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Everything the above code lets you do with TransformList could just as well be done with the humble compose operator.  The only benefit would be if we could somehow do "list-like" stuff with a transform list.  For instance, say we want to write the following function:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;traceIntermediates Nil        x = (x, [])&lt;br /&gt;traceIntermediates (Cons f l) x = let x'        = f x&lt;br /&gt;                                      (x'', ss) = traceIntermediates l x'&lt;br /&gt;                                  in&lt;br /&gt;                                    (x'', (show x'):ss)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This won't compile, because we don't know that x' is a member of the Show typeclass.  And &lt;i&gt;there is no way to fix this&lt;/i&gt; in a reusable way using any technique that relies on building a type parameterized on the input and output types: the problem is that we need to say something about the types of the intermediate values, but their type variables are inaccessible.&lt;br /&gt;&lt;br /&gt;In other words, there isn't any way to write down a constraint on the type "TransformList a b" that constrains the intermediates.  So I've just wasted a lot of typing duplicating the compose operator.  Yay.&lt;br /&gt;&lt;br /&gt;On the other hand, it's entirely possible to do this if you don't mind some boilerplate code.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;data ShowTransformList a b where&lt;br /&gt;    Nil   :: (Show a) =&gt; ShowTransformList a a&lt;br /&gt;    Cons  :: (Show a, Show b, Show c) =&gt; (a -&gt; b) -&gt; ShowTransformList b c -&gt; ShowTransformList a c&lt;br /&gt;&lt;br /&gt;traceIntermediates :: ShowTransformList a b -&gt; a -&gt; (b, [String])&lt;br /&gt;traceIntermediates Nil        x = (x, [])&lt;br /&gt;traceIntermediates (Cons f l) x = let x'        = f x&lt;br /&gt;                                      (x'', ss) = traceIntermediates l x'&lt;br /&gt;                                  in&lt;br /&gt;                                    (x'', (show x'):ss)&lt;br /&gt;&lt;br /&gt;apply :: ShowTransformList a b -&gt; a -&gt; b&lt;br /&gt;apply Nil         = id&lt;br /&gt;apply (Cons f fs) = (apply fs) . f&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now I can do this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;gt; traceIntermediates&lt;br /&gt;    (Cons (\x -&gt; x + 1)&lt;br /&gt;          (Cons (\x -&gt; x * 2)&lt;br /&gt;                (Cons (\x -&gt; x - 5)&lt;br /&gt;                      (Cons show&lt;br /&gt;                            (Cons (read :: String -&gt; Double)&lt;br /&gt;                                  Nil))))) 5&lt;br /&gt;(7.0,["6","12","7","\"7\"","7.0"])&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-2696524421726078789?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/2696524421726078789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=2696524421726078789' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/2696524421726078789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/2696524421726078789'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/06/fun-with-functions.html' title='Fun with Functions'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-610848330957505504</id><published>2007-06-17T21:53:00.000-07:00</published><updated>2007-06-17T21:54:02.792-07:00</updated><title type='text'>Freudian slips in commit messages</title><content type='html'>&lt;blockquote&gt;&lt;br /&gt;changeset:   700:d8308a89c519&lt;br /&gt;&lt;br /&gt;user:        Daniel Burrows &lt;dburrows@debian.org&gt;&lt;br /&gt;&lt;br /&gt;date:        Sun Jun 17 16:22:43 2007 -0700&lt;br /&gt;&lt;br /&gt;summary:     Call pre_package_state_changed() before undoing, to resent the dependency resolver; call package_state_changed() after an undo if necessary.&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-610848330957505504?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/610848330957505504/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=610848330957505504' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/610848330957505504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/610848330957505504'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/06/freudian-slips-in-commit-messages.html' title='Freudian slips in commit messages'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-3441031763586750401</id><published>2007-06-16T21:51:00.000-07:00</published><updated>2007-06-16T22:16:35.895-07:00</updated><title type='text'>aptitude development moves to Mercurial, back to Alioth</title><content type='html'>Short version: the aptitude development tree is now maintained using Mercurial, go &lt;a href="http://hg.debian.org/hg/aptitude/head"&gt;here&lt;/a&gt; to fetch it.&lt;br /&gt;&lt;br /&gt;aptitude development has been using darcs as a version control system for the last two years.  Darcs is a distributed version control system with many great concepts -- but it has one huge, glaring, enormous flaw, which is that innocuous operations, like merging one branch into another, can require practically unbounded amounts of time and space.  And once two branches get screwed up in this way, there is nothing, nothing at all, that you can do to get yourself unwedged; the cause is a design flaw in darcs that no-one seems to know how to fix or work around.&lt;br /&gt;&lt;br /&gt;Recently, I made the mistake of changing some files in both the Debian branch of aptitude and the head branch, and when I tried to merge the two branches to upload a new upstream release, darcs went off into la-la land.  So, I figured that it was probably time to switch version control systems.&lt;br /&gt;&lt;br /&gt;I'd like to say that I did extensive research on the matter, but the truth is that I chose Mercurial based on the fact that (A) a lot of ex-darcs users have written nice things about it, (B) git and arch-derived systems always feel ugly to me, and (C) John Goerzen implemented support for mercurial on Alioth.  Yes, I am so a follower.&lt;br /&gt;&lt;br /&gt;So if you want the up-to-date aptitude source, you should go to &lt;a href="http://hg.debian.org/hg/aptitude/head"&gt;http://hg.debian.org/hg/aptitude/head&lt;/a&gt;.  You can also fetch an RSS feed from http://hg.debian.org/hg/aptitude/head?style=rss.&lt;br /&gt;&lt;br /&gt;You can fetch a copy of the repository with "hg clone http://hg.debian.org/hg/aptitude/head aptitude-head".  To update, I recommend putting the following lines in ~/.hgrc to enable the "fetch" extension:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;[extensions]&lt;br /&gt;hgext.fetch =&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Once you've done this, just run "hg fetch" and it should download and merge the latest code.  You may want to install kdiff3 to get a better merge tool as well.&lt;br /&gt;&lt;br /&gt;To commit a patch locally, run "hg commit".  Unfortunately, there doesn't seem to be any easy way for people to send patches back within the VCS like there is for darcs (one of many nice features I had to give up in favor of being able to actually get work done -- what, me bitter?), but it looks like you can get somewhere with "hg bundle &amp;lt;file&amp;gt;", then mailing the resulting file off.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-3441031763586750401?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/3441031763586750401/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=3441031763586750401' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/3441031763586750401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/3441031763586750401'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/06/aptitude-development-moves-to-mercurial.html' title='aptitude development moves to Mercurial, back to Alioth'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-3147708632747811016</id><published>2007-06-10T21:33:00.000-07:00</published><updated>2007-06-10T21:42:31.452-07:00</updated><title type='text'>Dear Lazyweb: Mercurial Python API</title><content type='html'>So, in the midst of trying to convert some Darcs repositories to Mercurial repositories (see &lt;a href="http://www.darcs.net/DarcsWiki/ConflictMisery"&gt;here&lt;/a&gt; for the reason), I hit an "interesting" bug: tailor processes "rename" patches by deleting the renamed file.  A little debugging later, I get to this simulation of what tailor does:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt;&gt;&gt; from mercurial import hg,ui&lt;br /&gt;&gt;&gt;&gt; uio = ui.ui(debug=True,verbose=True)&lt;br /&gt;&gt;&gt;&gt; r = hg.repository(ui=uio, path='.', create=True)&lt;br /&gt;&gt;&gt;&gt; f = file('A', 'w')&lt;br /&gt;&gt;&gt;&gt; f.write('Some data\n')&lt;br /&gt;&gt;&gt;&gt; f.close()&lt;br /&gt;&gt;&gt;&gt; r.add('A')&lt;br /&gt;&gt;&gt;&gt; r.commit(text='Add A')&lt;br /&gt;A&lt;br /&gt;'i\xe9\xb4\xc8\x9d\xb8\xeb&lt;\xbe\xb1k\xae\xb1\x182\xa9ao\x80\xd0'&lt;br /&gt;&gt;&gt;&gt; r.copy('A', 'B')&lt;br /&gt;B does not exist!&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Huh?  Of course B doesn't exist, that's why I want to create it!  So, we look at the code in localrepo.py to handle copying...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    def copy(self, source, dest, wlock=None):&lt;br /&gt;        p = self.wjoin(dest)&lt;br /&gt;        if not os.path.exists(p):&lt;br /&gt;            self.ui.warn(_("%s does not exist!\n") % dest)&lt;br /&gt;        elif not os.path.isfile(p):&lt;br /&gt;            self.ui.warn(_("copy failed: %s is not a file\n") % dest)&lt;br /&gt;        else:&lt;br /&gt;            if not wlock:&lt;br /&gt;                wlock = self.wlock()&lt;br /&gt;            if self.dirstate.state(dest) == '?':&lt;br /&gt;                self.dirstate.update([dest], "a")&lt;br /&gt;            self.dirstate.copy(source, dest)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Double huh?&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Why is this method checking whether the destination exists before it does anything?  It appears to me that this is actually necessary; just disabling this test leads to a crash later.&lt;br /&gt;&lt;li&gt;How does mercurial work at all with such huge breakage in its core code?  Does /usr/bin/hg use a different implementation of the repository code than mercurial.hg?&lt;br /&gt;&lt;li&gt;Why, in the name of $DEITY, is this a warning and not a fatal exception?  One example of what happens when you don't signal to your users that you're ignoring them is this bug: tailor happily goes ahead and removes the original file, safe in the knowledge that mercurial has copied it to the new location.  Except, of course, that mercurial &lt;i&gt;hasn't&lt;/i&gt; actually copied it.  Whoops.&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;I'm hoping that someone will tell me that it's just too late at night for me and I'm being an idiot.  Please tell me this.  It would make me very sad if code like that was in my VCS.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   :-(   &lt;--- sad Daniel&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-3147708632747811016?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/3147708632747811016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=3147708632747811016' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/3147708632747811016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/3147708632747811016'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/06/dear-lazyweb-mercurial-python-api.html' title='Dear Lazyweb: Mercurial Python API'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-4965219876933876561</id><published>2007-06-10T11:11:00.000-07:00</published><updated>2007-06-10T11:32:23.867-07:00</updated><title type='text'>Closing bugs just because they're old is not cool</title><content type='html'>Two bug reports that I wrote were recently closed with the following explanation:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Last message was posted nearly three years ago. Considering abandoned and closing.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Whoops, I thought, I must have missed a request for more information.  So I went to the bug page and, nope, the only message on the bug was my initial report.&lt;br /&gt;&lt;br /&gt;Let me repeat that: the total sequence of interactions on these bugs was:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;I report a bug in 2004&lt;br /&gt;&lt;li&gt;Someone closes it in 2007 because it's "too old".&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Now, there are times when it's at least somewhat excusable to close old bugs without verifying that they're fixed (or even knowing that they might not be).  When a package has hundreds of bug reports, closing old bugs that can't be reproduced can be a good thing: even if the reports are valid, keeping reports that can't contribute towards a fix around is arguably less useful than cleaning out the bug list so it's usable.&lt;br /&gt;&lt;br /&gt;In my case, though, the package in question has only 20 or so bug reports, an easily managed number.  Worse, both bugs I reported could be trivially reproduced.  One of them was arguably not a bug, but the guy who closed my bugs did not argue that; as far as I can tell, he didn't even &lt;i&gt;look&lt;/i&gt; at my bug report.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Notice that I haven't mentioned the maintainer of the package?  That's because he didn't close the bug.  In fact, the person who closed the bug is not a member of Debian, nor is he in the NM process.  Evidently he's just a random user who decided that old bugs offend him, so they should be closed.&lt;br /&gt;&lt;br /&gt;So please, everyone, exercise a modicum of common sense when it comes to closing bug reports.  This will keep the BTS useful for all of us and keep blood pressures at a reasonable level. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-4965219876933876561?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/4965219876933876561/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=4965219876933876561' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/4965219876933876561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/4965219876933876561'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/06/closing-bugs-just-because-theyre-old-is.html' title='Closing bugs just because they&apos;re old is not cool'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-21087680254327248</id><published>2007-06-08T21:01:00.000-07:00</published><updated>2007-06-08T21:03:56.835-07:00</updated><title type='text'>Blogger annoyingness</title><content type='html'>Two days ago, I noticed that a post from last year about my wallet getting stolen had attracted over 60 spams.  So I went in, deleted all of them individually (because I can't select multiple comments to delete in Blogger), then closed comments on the post.&lt;br /&gt;&lt;br /&gt;This morning, I caught up on my Planet Debian email, and discovered that Blogger had decided to make that post "new", so it showed up on Planet again!  Argh!&lt;br /&gt;&lt;br /&gt;So don't worry, I didn't lose my wallet again.  Blogger is just nuts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-21087680254327248?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/21087680254327248/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=21087680254327248' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/21087680254327248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/21087680254327248'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/06/blogger-annoyingness.html' title='Blogger annoyingness'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-8905188396017127314</id><published>2007-05-23T20:41:00.000-07:00</published><updated>2011-06-19T12:05:34.726-07:00</updated><title type='text'>The virtues of limited terminal width</title><content type='html'>I've noticed that a great benefit of reading mail in an 80-column X terminal is that it acts as a simple filter: if a thread drifts so far to the right that I can no longer read the Subject: line, it's probably not worth my time to read it and I can kill the whole thing.&lt;br /&gt;&lt;br /&gt;I wonder what sorts of gains in free time and productivity I could realize by shrinking my terminals to widths of 70, 60, or even 40 characters wide?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-8905188396017127314?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/8905188396017127314/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=8905188396017127314' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/8905188396017127314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/8905188396017127314'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/05/virtues-of-limited-terminal-width.html' title='The virtues of limited terminal width'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-3239298877834356666</id><published>2007-05-15T21:49:00.000-07:00</published><updated>2007-05-20T14:19:26.925-07:00</updated><title type='text'>System 76</title><content type='html'>I've got a new desktop system, after going two years without a desktop at all.  My last desktop, which served me well for about five years, was one that I built myself from parts.  This time, though, I was feeling a little lazy, and I decided to order a computer from &lt;a href="http://www.system76.com"&gt;System 76&lt;/a&gt;, one of the few companies that will assemble and ship a computer to you with Linux (in this case, Ubuntu) preinstalled.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/76718669@N00/500391836/" title="Photo Sharing"&gt;&lt;img src="http://farm1.static.flickr.com/196/500391836_d738230e74_m.jpg" width="240" height="180" alt="DSC00497.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The cats were curious about something new appearing in our apartment.  They were even more excited when they found out it was full of cat toys!  Sadly for them, though, I confiscated all the styrofoam peanuts and stuck them in a cat-proof trash can.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/76718669@N00/500437005/" title="Photo Sharing"&gt;&lt;img src="http://farm1.static.flickr.com/198/500437005_558028627a_m.jpg" width="240" height="180" alt="DSC00499.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The usual box of random CDs still exists when you have preloaded Linux.  I was surprised to discover that it did not include an Ubuntu CD or five, which seems to me like a no-brainer.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/76718669@N00/500388938/" title="Photo Sharing"&gt;&lt;img src="http://farm1.static.flickr.com/199/500388938_62b0727109_m.jpg" width="240" height="180" alt="DSC00501.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Of course, this post wouldn't be complete without a picture of the actual box.  It looks just like it did on the system76 web site; no surprise there.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/76718669@N00/500433937/" title="Photo Sharing"&gt;&lt;img src="http://farm1.static.flickr.com/211/500433937_68cf934d9c_m.jpg" width="180" height="240" alt="DSC00504.JPG" /&gt;&lt;/a&gt; &lt;a href="http://www.flickr.com/photos/76718669@N00/500386194/" title="Photo Sharing"&gt;&lt;img src="http://farm1.static.flickr.com/198/500386194_401faae3c0_m.jpg" width="180" height="240" alt="DSC00505.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I used the included Ubuntu install for a little while, and it looked like everything was configured reasonably well.  The one piece of weirdness was that Ubuntu uses a program called &lt;q&gt;network-manager&lt;/q&gt; to configure the network; while it has some nice features (like doing network discovery for wireless, letting programs easily get notifications when network devices go down or come up, etc), these are offset, at least for me, by the fact that it likes to randomly break the computer's network access.  This isn't exclusively an Ubuntu problem, of course; etch also installs and configures network-manager by default, and I had the same problems on etch until I purged it.  I assume that network-manager works for someone, so probably something to do with the network environment here breaks it.&lt;br /&gt;&lt;br /&gt;The system is currently running Debian etch, with Xen domains booting testing and unstable that I use for development.  Even without the NVidia graphics drivers and with one of the Xen domains running a computationally intensive job, it's quite snappy; a lot snappier than any other desktop system I've owned recently.  And while it's doing this, it's one of the quietest computers I own.&lt;br /&gt;&lt;br /&gt;So, in summary, I'm quite happy with this system and I'd suggest System 76 as an option for anyone who wants a Windows-free computer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-3239298877834356666?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/3239298877834356666/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=3239298877834356666' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/3239298877834356666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/3239298877834356666'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/05/system-76.html' title='System 76'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm1.static.flickr.com/196/500391836_d738230e74_t.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-2915941939204026951</id><published>2007-04-21T11:59:00.000-07:00</published><updated>2007-04-21T12:15:38.530-07:00</updated><title type='text'>Wikified aptitude TODO list.</title><content type='html'>I've been able to crib more time lately for Debian, so I'm hoping that I can stop just keeping my head above water (barely) and start on the pile of new work that I'd like to do.  For a while I've been accumulating a mental list of stuff that sucks in aptitude, but mental lists have the drawbacks that no-one else knows about them and that they never seem to be available when I want them.&lt;br /&gt;&lt;br /&gt;I've now got a nice page in the Debian wiki holding &lt;a href="http://wiki.debian.org/AptitudeTodo"&gt;aptitude's current TODO list&lt;/a&gt;.  The entries range from changes that are trivial but will improve the user experience, to deep and difficult changes that no-one will notice.  Since I don't expect a team of magic pixies to do the coding for me, I figure I might have the majority of the design and coding done in a year or so.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-2915941939204026951?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/2915941939204026951/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=2915941939204026951' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/2915941939204026951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/2915941939204026951'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/04/wikified-aptitude-todo-list.html' title='Wikified aptitude TODO list.'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-7136720636082482739</id><published>2007-04-15T08:28:00.000-07:00</published><updated>2007-04-15T08:47:13.091-07:00</updated><title type='text'>How *not* to impress your customers.</title><content type='html'>So, today I tried to sign up for a service online (unidentified for reasons that will become obvious briefly).  This is a service that, had I successfully signed up, would be withdrawing monthly subscription fees from my bank account and handling some data that's fairly important to me.  But when I hit the button to start the registration process, I got back...&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;[TCX][MyODBC]You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near ''7GDiSp=E8-Mgvgo\', Now() )' at line 9&lt;br /&gt;&lt;br /&gt;SQL = "INSERT INTO [REDACTED] ([REDACTED], FieldName, FieldValue, update_dt ) VALUES ( 10724, 'PASSWORD', '7GDiSp=E8-Mgvgo\', Now() )"&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The password I tried to enter, for the record, was &lt;code&gt;7GDiSp=E8-Mgvgo\#dEwb8m7Ec_e~z0myAAj&lt;/code&gt;.  This is at best inexcusable sloppiness and at worst a security hole, and I don't want a company that does either anywhere near my money and data.  (sadly, there probably are already many such companies near my money and data, but I try to avoid the ones I know about)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-7136720636082482739?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/7136720636082482739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=7136720636082482739' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/7136720636082482739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/7136720636082482739'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/04/how-not-to-impress-your-customers.html' title='How *not* to impress your customers.'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-7010095672223080500</id><published>2007-04-12T20:33:00.000-07:00</published><updated>2007-04-13T06:16:45.339-07:00</updated><title type='text'>coq's -ness-nesses</title><content type='html'>In response to &lt;a href="http://www.bononia.it/~zack/blog//posts/2007/04/coq_as_a_geek_toy.html"&gt;Stefano&lt;/a&gt;'s reply to my post about Coq:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;toy-ness&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Usually such pieces of software are more seen as academic toys, seeing it promoted as a geeky software is a joy to me.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I really hate to detract from your happiness -- but I definitely had the word "math" implicitly stuck before "geek toy". :) Most coders that I've met are, at best, indifferent to mathematics, outright hostile at worst, so I doubt that coq will get far outside of small niches where the benefits are irresistable (security software, maybe? -- and of course pure math).  I read up on this stuff despite it being utterly useless for anything I'm likely to be paid to do (unless I return to academia) because I'm a hopeless weenie loser who likes math. :P&lt;br /&gt;&lt;br /&gt;&lt;b&gt;programming-language-ness&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Coq is not really a programming language (even if the CoqArt book says so, to attract the developer community), it is mainly a proof assistant; i.e. a software in which you give definitions, state theorems and prove them.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Well, this all depends on how you define &lt;a href="http://en.wikipedia.org/wiki/Programming_Language"&gt;programming language&lt;/a&gt;, which is one of those never-ending definitional questions.  But using my general conception of what a programming language is, I actually have noticed two programming languages inside Coq.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;The more interesting one (IMO) is the proof language they call "Gallina" and the "Vernacular", in which you construct proofs by reducing your goal to a tautology.  The goal here seems to be to compute a well-typed term in Coq's core calculus, and you generally construct programs interactively: Coq shows you the current program state (expressed as one or more goals and a set of local hypotheses) and you manipulate it by (e.g.) applying lemmas to yield new known facts.&lt;br /&gt;&lt;br /&gt;I think this language is fairly weak viewed as a programming language.  It's completely unreadable and the proofs generated don't correspond to the reasoning process one normally follows when working out a proof.  I am less annoyed by it now that I've learned how to do forward reasoning :), but it seems like backwards reasoning is really pushed, and that just seems .. well .. backwards to me.  There's also a strong tendency to use implicitly generated names for things and to just "know" what the state of the system after issuing a command will be; as far as I can tell, the only way to understand a Coq proof is to step through it in coqide.&lt;br /&gt;&lt;br /&gt;While it's nice to be able to "trust the kernel", it would also be nice to be able to "read a proof" directly.  Among other things, their inscrutability makes me think that Coq proofs would be annoying to maintain over time.  This is not necessary for stuff that's part of Principia Mathematica, but seems likely if you're developing a new theory -- in particular, I would shudder (theatrically) at the mere thought of including embedded Coq proofs in my programs.&lt;br /&gt;&lt;br /&gt;Some additional brief comments on this were written by Nick Benton and put on the Web under the title of &lt;a href="http://research.microsoft.com/~nick/mop.pdf"&gt;Machine Obstructed Proof&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;The other sense is that Coq directly embeds a strongly normalizing variant of System F (I think? -- at least the simply typed LC with some type parametricity) with primitive recursion over inductive structures.  This isn't Turing-complete (of course!), but I would certainly call it a real programming language.&lt;br /&gt;&lt;br /&gt;As you note, though, this is less interesting unless you want to prove facts about your programs.&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;OCaml-ness&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Regarding the synergy of Coq with OCaml: yes, you can prove in Coq the correctness of OCaml program, but actually not more than you can do with programs written in other programming languages&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I was specifically thinking about &lt;a href="http://www.metaocaml.org/concoqtion/"&gt;Concoqtion&lt;/a&gt;; I have no idea how other projects compare, and I apologize if I incorrectly summarized it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-7010095672223080500?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/7010095672223080500/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=7010095672223080500' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/7010095672223080500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/7010095672223080500'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/04/coqs-ness-nesses.html' title='coq&apos;s -ness-nesses'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-3236040191093686155</id><published>2007-04-11T21:28:00.000-07:00</published><updated>2011-06-18T14:34:08.451-07:00</updated><title type='text'>Wikipedia is case-sensitive, who'da thunk?</title><content type='html'>This is part of my ongoing series of posts wherein I am the last person on the planet to discover various things.  (this is not a planned series, it's just how life is. :) )&lt;br /&gt;&lt;br /&gt;If I ask Wikipedia about &lt;a href="http://en.wikipedia.org/wiki/Virtual_Server"&gt;Virtual Server&lt;/a&gt;, I get an article about a Microsoft Hproduct.  If I ask it about &lt;a href="http://en.wikipedia.org/wiki/Virtual_server"&gt;Virtual server&lt;/a&gt;, I get a page on server virtualization.  Presumably if you know enough Wiki-lore, this makes sense.&lt;br /&gt;&lt;br /&gt;Unsurprisingly, neither article gives me a clue about how I might go about renting a virtual server to avoid the hassle of maintaining hardware or which providers (if any) are reasonably trustworthy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-3236040191093686155?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/3236040191093686155/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=3236040191093686155' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/3236040191093686155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/3236040191093686155'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/04/wikipedia-is-case-sensitive-whoda-thunk.html' title='Wikipedia is case-sensitive, who&apos;da thunk?'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-2332063116790261684</id><published>2007-04-09T20:27:00.000-07:00</published><updated>2007-04-09T20:59:39.261-07:00</updated><title type='text'>Latest Shiny Geek Toy: coq</title><content type='html'>So, one of the reasons I've been a bit uncommunicative the last few weeks is that I've been getting my head around &lt;a href="http://coq.inria.fr/"&gt;Coq&lt;/a&gt;, maybe one of the most fascinating pieces of software I've played with in a long time.&lt;br /&gt;&lt;br /&gt;What is Coq?  I don't know if I understand it well enough yet to give a complete description (the Coq &lt;a href="http://www.labri.fr/Perso/~casteran/CoqArt"&gt;tome&lt;/a&gt; only arrived in the mail on Friday and I have yet to make it past the introduction, what with taxes and so on).  Here's my best shot:&lt;br /&gt;&lt;br /&gt;Coq is a programming language where you write proofs as functions taking proofs of their preconditions and producing proofs of their results.  That is, a proof that "If  X is an integer, then X-1 &lt; X" becomes a function that accepts a proof of "X is an integer" and produces a proof of "X-1 &lt; X".&lt;br /&gt;&lt;br /&gt;You can manipulate logical expressions more or less the way you expect.  For instance, if you have in your hands a set S of natural numbers and a proof that "forall nonempty sets T of naturals, T has a least element", then you can bang these together to produce the least element of S (or rather, a proof that it exists).&lt;br /&gt;&lt;br /&gt;I don't think this describes the theoretical underpinnings of Coq, but it does describe my experience of actually using it to prove stuff.&lt;br /&gt;&lt;br /&gt;To get the hang of Coq, I'm working my way through basic automata theory -- regexps are done, but I couldn't work out how to express some finiteness constraints on FSMs without generating a lot of extra typing; hopefully the Coq book will have some hints.  Once that's done, I'm actually tempted to try something more ambitious.  [snip long digression] We'll see ... watch this space :).&lt;br /&gt;&lt;br /&gt;It was a real rush, though, to code up these theorems and watch the computer verify them.  What really fascinated me was how close to being a practical tool this is.  Coq isn't at all a toy -- without quite getting all the theory yet, my intuition is that it can probably cover anything you can express in the predicate calculus (with sufficient amounts of typing, anyway), and while there are a few shortcomings, it's &lt;i&gt;almost&lt;/i&gt; (IMO) at the point where anyone who knows some formal logic and has a little patience can prove interesting stuff.  Even more suggestive of possibilities, there's a project (which I sadly haven't had time to look at) that integrates Coq with OCaml, so you can have proofs about your OCaml code verified at compile-time!&lt;br /&gt;&lt;br /&gt;I could go on and on ... anyway, this is a really cool tool and I'd encourage any mathematically-minded person to give it a spin.  The only sad thing is that I doubt I'll ever have the opportunity to explore this stuff in my day job unless/until I go back to school :-(.&lt;br /&gt;&lt;br /&gt;Shortcomings of Coq specifically and the whole concept of correctness proofs on programs generally have been moved to a future blog post that may never appear depending on how ambitious I'm feeling this week.  Rest assured that I'm aware of (some of) them, I just hit my self-imposed length limit.&lt;br /&gt;&lt;br /&gt;[0] the reason being that I could only prove correct the formal underpinnings of the resolver; in practice, a lot of the bugs are in the interface to apt, or in apt itself, and I can hardly prove that code correct.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-2332063116790261684?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/2332063116790261684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=2332063116790261684' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/2332063116790261684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/2332063116790261684'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/04/latest-shiny-geek-toy-coq.html' title='Latest Shiny Geek Toy: coq'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-8550194868667123249</id><published>2007-03-28T20:27:00.000-07:00</published><updated>2007-03-28T20:34:55.208-07:00</updated><title type='text'>On emailing me.</title><content type='html'>Verizon has apparently decided that BOTH of my forwarding addresses, dburrows@debian.org and Daniel_Burrows@alumni.brown.edu, are actually spammers, and is randomly rejecting some emails sent to them.  I have given Verizon as large a piece of my mind as they allow: they do not provide an email address, and instead put up a form where they graciously allow you to type a 70-character (!) message.  This will presumably go straight into the bitbucket, but we'll see.&lt;br /&gt;&lt;br /&gt;If you want to email me, please send mail directly to Daniel_Burrows@verizon.net.&lt;br /&gt;&lt;br /&gt;Does anyone know of a broadband ISP serving Redmond that doesn't suck?  As far as I know, my only alternative to the telephone monopoly is the cable monopoly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-8550194868667123249?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/8550194868667123249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/8550194868667123249'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/03/on-emailing-me.html' title='On emailing me.'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-5752460374534341463</id><published>2007-03-12T20:50:00.000-07:00</published><updated>2007-03-13T06:33:44.227-07:00</updated><title type='text'>Where have all the bytes gone?</title><content type='html'>Here's an "interesting" phenomenon I noticed on my new (not-Linux-hating) 4GB portable music player:&lt;br /&gt;&lt;br /&gt;daniel@jeeves:~$ df -h /media/IAUDIO&lt;br /&gt;Filesystem            Size  Used Avail Use% Mounted on&lt;br /&gt;/dev/sdb              3.8G  3.8G     0 100% /media/IAUDIO&lt;br /&gt;daniel@jeeves:~$ du -hcs /media/IAUDIO&lt;br /&gt;2.3G    /media/IAUDIO&lt;br /&gt;2.3G    total&lt;br /&gt;&lt;br /&gt;Just in case "df" and "du" had different notions of how large a gigabyte was, I asked them to tell me the number of bytes instead, with about the same result.&lt;br /&gt;&lt;br /&gt;I won't comment on the fact that I paid for 4GB but got 3.8GB; that's typical (whoops, I just did).  But where'd that extra 1.5GB go?  FAT can't seriously be imposing a &gt;50% overhead on file size, can it?&lt;br /&gt;&lt;br /&gt;The end result here is that on my 4GB music player, I can store only a little more than 2GB of music.  Boo. :-(&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[UPDATE]&lt;/b&gt;: running fsck revealed that I had 1.5 GB in lost clusters on this filesystem and gave me my space back.  Since this device is almost brand-new, I'm puzzled about how this happened...but oh well, it seems to be fixed easily enough.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-5752460374534341463?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/5752460374534341463/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=5752460374534341463' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/5752460374534341463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/5752460374534341463'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/03/where-have-all-bytes-gone.html' title='Where have all the bytes gone?'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-7761908937262623644</id><published>2007-02-04T20:07:00.000-08:00</published><updated>2007-02-04T20:17:09.019-08:00</updated><title type='text'>Project get-in-shape</title><content type='html'>My project the last few weeks has been to start exercising at a gym regularly.  While I could stand to lose a few pounds, I'm more interested in feeling less lousy than I have lately -- among other things, I've been feeling tired and having trouble concentrating, and my back has been hurting again.  I don't know for sure if getting into shape will fix these problems, but I figure being more healthy couldn't possibly make them worse.&lt;br /&gt;&lt;br /&gt;In other news, I've finally done what all the cool kids were doing in 2002 and started a &lt;a href="http://www.flickr.com/photos/76718669@N00/"&gt;Flickr album&lt;/a&gt;.  Right now it mainly contains cat pictures like this one:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/76718669@N00/379894434/" title="Photo Sharing"&gt;&lt;img src="http://farm1.static.flickr.com/131/379894434_6673b90c22_m.jpg" width="240" height="180" alt="DSC00118.JPG" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-7761908937262623644?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/7761908937262623644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/7761908937262623644'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/02/project-get-in-shape.html' title='Project get-in-shape'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm1.static.flickr.com/131/379894434_6673b90c22_t.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-2165639930952654088</id><published>2007-01-30T22:20:00.000-08:00</published><updated>2007-01-30T22:33:31.532-08:00</updated><title type='text'>I Sansa no more</title><content type='html'>Well, I did it.  My Sansa e280 is now once again the property of the Bellevue Circuit City.  The gadget had pretty sweet hardware (holding my entire music collection in the palm of my hand was a cool thing), but I have no real need for it -- certainly nothing that would be worth putting up with Sandisk's &lt;a href="http://lambdaman.blogspot.com/2007/01/sandisk-doesnt-want-your-money-unless.html"&gt;attitude&lt;/a&gt; regarding non-Windows computers.&lt;br /&gt;&lt;br /&gt;I'm currently trying to decide whether to remain portable-less for now (on the theory that portable media players are likely to advance ridiculously in the next few months), to buy a simple 4GB or 2GB Flash player, or to give up on Flash for the time being and get a hard disk-based player.  I'm leaning towards waiting until the 4GB model of the &lt;A href="http://www.cowonglobal.com/product/product_D2_feature.php"&gt;Cowon D2&lt;/a&gt; becomes available in the U.S., and then ordering it -- its feature set is pretty amazing, and hopefully 4GB will be enough storage capacity (especially considering that you can insert an SD flash card to get more storage space).  In the meantime, I can cover most of what I was using the player for with a combination of podcasts, .oggs of my music, and borrowing Kate's portable FM radio.  Less convenient, but entirely workable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-2165639930952654088?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/2165639930952654088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=2165639930952654088' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/2165639930952654088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/2165639930952654088'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/01/i-sansa-no-more.html' title='I Sansa no more'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-3605209245330616182</id><published>2007-01-29T20:32:00.000-08:00</published><updated>2007-01-29T20:49:02.302-08:00</updated><title type='text'>PR techniques</title><content type='html'>It was recently &lt;a href="http://www.nature.com/news/2007/070122/full/445347a.html"&gt;reported&lt;/a&gt; that the scientific publishing industry had hired a PR heavyweight to attack the movement for the free and unencumbered dissemination of scientific results.  I was especially struck by the slogan he supposedly recommended to the publishers:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Open access equals government censorship.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Just read that one a few times.  I've found it gets funnier every time you do.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-3605209245330616182?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/3605209245330616182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/3605209245330616182'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/01/pr-techniques.html' title='PR techniques'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-1662004419335199922</id><published>2007-01-29T20:28:00.000-08:00</published><updated>2007-01-29T20:29:56.780-08:00</updated><title type='text'>The Internet generation's lament</title><content type='html'>For people who read my blog and not Planet Debian, I have to quote this comment on one of &lt;a href="http://healthhacker.org/satoroams/?p=710"&gt;Biella's recent posts&lt;/a&gt;, by Luis Villa:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;The world is producing interesting things for me to read faster than I can read them.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;This is so, so, so true.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-1662004419335199922?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/1662004419335199922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/1662004419335199922'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/01/internet-generations-lament.html' title='The Internet generation&apos;s lament'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-5696408911070584233</id><published>2007-01-27T08:33:00.000-08:00</published><updated>2010-03-04T06:37:48.470-08:00</updated><title type='text'>Sandisk doesn't want your money for a music player unless you run Windows</title><content type='html'>I bought a Sansa e280 last weekend to replace my aging and bulky Neuros (the last straw was when I lost the charger for the Neuros).  It's nice to have such a small, light music player, and having 8GB of space is a big bonus.  But when I went to the Sandisk web site to get a new firmware, I discovered that they only provide a .exe of a magic firmware download program.  This is despite the fact that, as you can find by searching on the Web, the actual firmware upgrade procedure is just "copy the firmware file onto the device".&lt;br /&gt;&lt;br /&gt;So, I wrote to support, mentioning that I don't have a running Windows installation and asking if they could provide an alternate means of updating the firmware.  Here's the response:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Please be informed that your Sansa e280 is supported on Windows XP. If the operating system of your computer is not Windows XP, if you have just bought your Sansa e280, we do recommend that you contact the store where you purchased it and inquire about replacements that can be supported on your operating system or if that store honor refunds, please do ask for it. Please do provide the proof of purchase and packaging for verification purposes.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Now, I can work around this problem -- but after reading that brush-off I think I might just take their advice; as it happens, I saved the packaging just on the offchance something like this came up.  Can anyone recommend a decent, small, flash-based media player that works well with Linux?  Must-have features are:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;FM radio (this eliminates, e.g., the Archos).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Some support for non-encumbered file formats.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Support for installing firmware upgrades from Linux.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Support for syncing music from Linux.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Either .ogg support or a lively (even if unfinished) &lt;a href="http://www.rockbox.org/"&gt;Rockbox&lt;/a&gt; port.  (Rockbox is actually preferred, since I'll probably just switch over to it if possible; this was one of the deciding factors in my purchasing an e280)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;I still haven't made up my mind: I might hang onto the e280 out of inertia and wait for the Rockbox guys to figure it out (it looks like they're making pretty good progress).  But if there's a better vendor out there that actually wants my money, I'd love to hear about them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-5696408911070584233?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/5696408911070584233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=5696408911070584233' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/5696408911070584233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/5696408911070584233'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/01/sandisk-doesnt-want-your-money-unless.html' title='Sandisk doesn&apos;t want your money for a music player unless you run Windows'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-4047946894760966732</id><published>2007-01-23T21:46:00.000-08:00</published><updated>2007-03-17T06:46:39.252-07:00</updated><title type='text'>Package management usability</title><content type='html'>[&lt;b&gt;UPDATE&lt;/b&gt;: I'm closing comments on this post, because the spammers have discovered it -- dnb]&lt;br /&gt;&lt;br /&gt;&lt;a href="http://liw.iki.fi/liw/log/2007-01.html#20070124b"&gt;Lars says&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;   The uncomfortability of Synaptic may be partly due to the fact that it is&lt;br /&gt;   a different model from Windows: you get all your programs from one place,&lt;br /&gt;   instead of anywhere on the Internet, partly due to just not using Synaptic&lt;br /&gt;   much at all, and partly due to Synaptic not being perhaps as easy to&lt;br /&gt;   understand as possible. I personally find Synaptic to be very nice, and&lt;br /&gt;   use it regularly, but I am biased by having used Debian package managers&lt;br /&gt;   for over a decade.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Now, synaptic is a lot nicer for users than scary console frontends like aptitude.  But it's really a tool for "power users".  Here's a quick list just of what I see when I start it (bearing in mind that my UI design skills suck):&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;The "quick introduction" screen that pops up is way too long.  The fact that it needs to be so long is already bad.&lt;br /&gt;&lt;li&gt;There's a huge, and I mean HUGE list of sections down the left.  What are these?  Which one do I look in?  For that matter, what is "gnome", and are "shells" programs for the seashore?&lt;br /&gt;If I want to find software for processing video, do I look in "graphics" or "multimedia"? (and what are these funny "(contrib)" markers?)  Which of the huge number of packages in each section do I want?  From the point of view of a new user (especially), this categorization is useless, not to mention often wrong or misleading.&lt;br /&gt;&lt;li&gt;The four buttons in the lower-left, which change the display, are a good idea, but they don't say what they do.  A label saying something like "Group By" would go a long way here.&lt;br /&gt;&lt;li&gt;I think the version numbers in the main display probably provide too much information for a novice user.  They won't really know what to make of them, and if they need the information it can be provided on demand; as it is, it's just one more distraction to sort through while looking for what they really want.  The extra space could, e.g., be used to provide more room for the status column (currently labeled "S").&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;So much for superficial observations.  There are a few more things that I see that are worth more discussion.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Mechanics of selecting packages&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;To change the state of a package, you click on the unlabeled little box to its left, then select the correct option from a list containing "Unmark", "Mark for Installation", "Mark for Upgrade", "Mark for Reinstall"...you get the idea.  Even if only one option is valid, the menu still appears with all but one option grayed out, and you have to select the one you want.&lt;br /&gt;&lt;br /&gt;This is complicated, cumbersome, and surprising.  It also introduces terminological confusion, since "Unmark" isn't really what you think of when you go to cancel an installation or whatever.&lt;br /&gt;&lt;br /&gt;The best option I can think of here is a pulldown menu (which I believe the GTK+ list widget (god, I almost wrote "control") supports).  The menu should default to the current state, e.g., "not installed", and should have options that describe what will be done with the package, e.g., "install", and so on.  Only valid actions should appear on the menu.  The Package menu should probably adapt in the same way as you select packages.  I don't recall offhand how GTK+ menus work, but if possible commonly used commands like "remove" should be closer to the mouse when the menu appears than uncommon commands like "reinstall".&lt;br /&gt;&lt;br /&gt;Another choice I can see, if you want to avoid menus, would be something like this: have two checkboxes, one for "install" and one for "upgrade".  "install" would be checked for installed packages and not checked for not-installed packages.  Checking or clearing it would mark packages for installation or deletion.  "upgrade" would mark or unmark packages that were installed for upgrade.  Of course, this introduces a redundant column for not-installed packages, which I don't like.  It also seems to me that it would be less obvious what's going on for new users.  But it would be more efficient for power users (who should all be using aptitude anyway ;-) ).&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Progress bar madness&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;I haven't extensively used synaptic, but several core misfeatures of apt and our archive pretty much guarantee that if it displays progress bars for key operations like loading the cache or updating the package lists, the progress bars either run multiple times (i.e., don't actually tell you how close to finishing you are) or actually go BACKWARDS -- yes, BACKWARDS.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The great package hunt&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;Maybe the biggest problem is that unless you know what package you're looking for, basically all our package interfaces are useless.  There are lots of fancy searching features you could add, but actually a quick test in synaptic suggests to me that this would be going in the wrong direction.  Unlike aptitude, synaptic includes descriptions, and searches for stuff users might actually want (like, say, "burn CD") seem to turn up relevant results (i.e., software that burns CDs).&lt;br /&gt;&lt;br /&gt;I'm sure the search algorithm could be improved (with inexact matching, better indexing (a package description suffix tree?), etc), but the big problem I see is that you tend to get back several dozen results, many of which are libraries, development packages, command-line software or software that doesn't work; some of the other software is software that can burn CDs but whose purpose is not to burn CDs (e.g., backup software).&lt;br /&gt;&lt;br /&gt;How can we solve this?  The first thing that springs to mind for me is to use popularity-contest data to weight the list.  I know it's not terribly accurate, and it has some skewing problems (stuff in the default install will be favored), but I suspect it would greatly bias the results in terms of software that's useful to many people (using the "recently used" tallies might especially help here).&lt;br /&gt;&lt;br /&gt;I don't have many other good ideas on the searching problem; I've seen vague suggestions of counting reverse dependencies, but this doesn't seem like a good metric of useful software to me; trying to extract more information from the short and sometimes inaccurate package descriptions seems like a really hard problem to me.  (Google can do cool statistical analysis partly because it has so much data to work with AIUI; even a single Web page typically has orders of magnitude more information than a package description)&lt;br /&gt;&lt;br /&gt;Another issue is the problem of finding related software once you've installed one piece.  We have "suggests" and "enhances", but they aren't exactly displayed in a prominent or easy-to-understand way by any frontend.  I think it might be good to display a clickable list of suggested packages somewhere visible (e.g., at the top of the description box) when the user has selected a package for installation.  We could even display a little bar, like on (eg) Amazon: "Debian suggests installing these packages..." ;-)&lt;br /&gt;&lt;br /&gt;It might also be interesting (if this is considered acceptable; since the data is anonymous I don't see a problem) to analyze the popcon data to find out what packages are being installed in tandem.  I don't know if we have enough information to do it, but it could turn out to be really useful to be able to click on a package and see other packages that are popular &lt;i&gt;with users who installed that package&lt;/i&gt;.  Going back to online stores again, those "other people who bought 'Types and Programming Languages' also bought 'Introduction to Category Theory'" links are amazingly useful, and something similar would probably be a big help in Debian.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-4047946894760966732?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/4047946894760966732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=4047946894760966732' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/4047946894760966732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/4047946894760966732'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/01/package-management-usability.html' title='Package management usability'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-8925403046685584121</id><published>2007-01-21T09:20:00.000-08:00</published><updated>2007-01-21T10:47:39.560-08:00</updated><title type='text'>How to Breathe, Functionally (part 2)</title><content type='html'>In a previous &lt;a href="http://lambdaman.blogspot.com/2007/01/how-to-breathe-functionally-part-1.html"&gt;post&lt;/a&gt;, I pointed out some ways that you can acheive the "compute this, now save it and compute this, ..." style of coding in a functional language such as Haskell without going mad.  This is a continuation of that post.&lt;br /&gt;&lt;br /&gt;There's one other purely syntactic feature of Haskell that I rather like for readability: Haskell lets you define variables &lt;i&gt;after&lt;/i&gt; you use them.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;GoToTheNextTrickyBit someVal&lt;br /&gt;   where someVal = DoThisAndThisAndThat...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Although it isn't always appropriate to do this, there are times when I find it extremely intuitive to define my variables after they're used.  For instance, to take a "practical" example, compare&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mailTo customer =&lt;br /&gt;   let customerName = getCustomerName customer&lt;br /&gt;       customerAddr = getCustomerAddr customer&lt;br /&gt;   in&lt;br /&gt;       makeMailingTo customerName customerAddr&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;with&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mailTo customer = makeMailingTo customerName customerAddr&lt;br /&gt;   where&lt;br /&gt;      customerName = getCustomerName customer&lt;br /&gt;      customerAddr = getCustomerAddr customer&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I don't know about anyone else, but when I read the first definition I mentally go "huh.  Why are we extracting the customer name?", then skip down to where the name gets used, and finally re-parse the name in that context.  The "where" form lets me write the code in the same order that I would read it, giving the code a natural flow.  It's very important, of course, to keep the number of auxiliary definitions small; otherwise you leave too many "open questions" for the reader of your code to carry around as she works her way down to the definitions.&lt;br /&gt;&lt;br /&gt;But it isn't all roses at the low syntactic level.  IMO, the biggest practical problem with writing Haskell code is the &lt;a href="http://haskell.org/onlinereport/lexemes.html#lexemes-layout"&gt;syntactically significant indentation&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Python, of course, also has significant whitespace -- but it works mainly because it's extremely simple.  Any line ending in a ":" introduces a new block, and statements within a block have the same amount of indentation.  In contrast, Haskell's rule...well, just read that link above.  You can write code that has the same meaning under any indentation, but it's not idiomatic to do so -- and worse, since the statement terminators are not obligatory, a missed terminator might work fine, might change the meaning of your code, or might fail to compile in an obscure way.&lt;br /&gt;&lt;br /&gt;A side effect of the complicated indentation rules in Haskell is that the Emacs Haskell mode doesn't work very well at indenting my code.  It usually chooses an indentation that I don't want, and often one that doesn't even compile.  I'm sure Emacs could do better, but I would be willing to live with a little more punctuation if it meant that the code was easier for programming tools to process correctly.  Functional coding advocates assert, correctly IMO, that side-effects are problematic because even smart programmers will write more bugs in their presence.  I think the same logic should apply to syntax: making the language harder for humans and machines to parse has negative overall effects, even if it is &lt;i&gt;possible&lt;/i&gt; with sufficient effort to parse it correctly.&lt;br /&gt;&lt;br /&gt;I think that conceptually, Haskell is a great language -- the problems I see with it are issues of syntax, tool support, libraries and speed (laziness has a high price).  Oh, and also the fact that, as with most programming languages that are pleasant to use, you can't get a real paying job writing in it unless you have a PhD. :-(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-8925403046685584121?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/8925403046685584121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/8925403046685584121'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/01/how-to-breathe-functionally-part-2.html' title='How to Breathe, Functionally (part 2)'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-1616278141090618544</id><published>2007-01-21T08:44:00.000-08:00</published><updated>2007-01-21T10:05:17.830-08:00</updated><title type='text'>How to Breathe, Functionally (part 1)</title><content type='html'>David Welton &lt;a href="http://journal.dedasys.com/"&gt;writes&lt;/a&gt; that the problem with functional languages is that you don't get to mentally "catch your breath" between computations; piling function invocations on function invocations makes it hard to understand what's actually being calculated.  He has an amusing summary of how functional code can become unreadable:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Do this with the result of this with what this produces when given this input that is derived from this function which takes the result of this other thing after calculating the result of something that is derived from the output of a function that ...&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Indeed, I've seen functional code like this (much of it written by myself).  Here's a particular gem:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;f splitPoints = map fst $ tail $ scanl (flip ($) . snd) ([], toSplit) $&lt;br /&gt;          map splitAt splitPoints&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I wrote this code a year ago, and I don't know what it does!  It's hard to read and hard to understand.  So, however, is imperative code that says&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Add 5 to A, now if B is not zero we jump to where we subtract one from B and if C is less than 3 we add 4 to C otherwise we divide C by 2 and then add it to A, then we ...&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The reason both pieces of pseudocode are hard to understand is that they don't use the abstraction features built into the language.  Good imperative code uses meaningful variable names, uses the structured-programming primitives the language provides, and abstracts complex operations into functions.&lt;br /&gt;&lt;br /&gt;My rule of thumb (which is, heh, not always religiously followed) is that a piece of program structure that does more than about 3-6 things is probably too complicated; it seems like that's about as much local context as I can hold in my head comfortably (and the number is more 3 than 6 these days, if you get my drift).  As David puts it,&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;If you'll bear with a poor comparison, sometimes programming is like a song. You do the tricky section, then you go back to an easier section and catch your breath for a bit.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The problem seems to be that people trained on imperative languages, when they're tossed into the ocean of functional coding, can't find the guideposts and landmarks that would help them impose some structure on the water.  Should I put this complicated expression inside a "let", or break it out into another function?  When do I use a higher-order function to unify two dissimilar pieces of code?  Should I write this code in terms of higher-order library functions or directly?  It's easy to wander off down a chain of nested invocations of anonymous higher-order functions, or composed partially applied library functions, just "because you can" and end up forgetting what you were trying to do in the first place.&lt;br /&gt;&lt;br /&gt;Luckily, some of the basic rules of keeping your code readable remain more or less the same: assign intermediate results to variables with meaningful names, and abstract complicated operations into separate functions.  To tackle David's example:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;You get sections with DoThisAndThisAndThatWithTheResultsOfSelectThisFromTableXYZ that you have to slow down to think through.&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;GoToTheNextTrickyBit where ManyThingsHappen.&lt;br /&gt;&lt;br /&gt;All in all, you wind up with a sort of ebb and flow that works out pretty well if you're in tune with the code being written, going from intense calculations, to a line or two where you do no more than store things in a variable, take a breather, and prepare for the next important stanza.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The way to "take a breath" in a functional language is generally to assign an intermediate result to a variable, or to extract a complicated operation into a function and give it a meaningful name.  One Haskell approximation to David's example is&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;do DoThis&lt;br /&gt;   AndThis &lt;br /&gt;   results &lt;- SelectThisFromTableXYZ&lt;br /&gt;   someVal &lt;- AndThat results&lt;br /&gt;   GoToTheNextTrickyBit someval&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;If you're writing pure functional code, you might write&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;let&lt;br /&gt;   results = SelectThisFromTableXYZ&lt;br /&gt;   someVal = AndThat results&lt;br /&gt;in&lt;br /&gt;   GoToTheNextTrickyBit someVal&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Of course, this will become unreadable if you write a huge complicated nested "let" expression in place of "AndThat".  For a truly dreadful example of this kind of coding, check out the Gnucash Scheme &lt;a href="http://svn.gnucash.org/trac/browser/gnucash/trunk/src/report/standard-reports/cash-flow.scm?rev=15061"&gt;code&lt;/a&gt; that generates the "Cash Flow" report (&lt;b&gt;warning&lt;/b&gt;: read this in short bursts, or you WILL go blind).  This is exactly analogous to writing too many nested loops and conditionals in imperative code, and the fix is the same: find logically distinct bits of code and extract them into separate functions.&lt;br /&gt;&lt;br /&gt;I have a few more thoughts, but this post is getting too long, so I'll inflict them on the world in another post.  The rule that short things are easier to understand applies to blog posts as well as code.  :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-1616278141090618544?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/1616278141090618544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/1616278141090618544'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/01/how-to-breathe-functionally-part-1.html' title='How to Breathe, Functionally (part 1)'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-8037790624110502751</id><published>2007-01-18T08:09:00.000-08:00</published><updated>2007-01-21T08:41:32.800-08:00</updated><title type='text'>Via C7: it goes fast AND slow!</title><content type='html'>The low-powered system I assembled recently is based on a Via Epia board and a C7 CPU. I spent quite a bit of time when I was setting it up trying to get the C7's speed stepping to work.  I loaded a number of cpufreq modules without luck; crawling around on the Web only led me to discussions about how the C7 couldn't be speed-stepped in Linux and maybe the centrino cpufreq driver would work.&lt;br /&gt;&lt;br /&gt;Well, yesterday I randomly searched again -- and poof!  There was a discussion from early January about how maybe the ACPI cpufreq driver would work.  I loaded it, set up powernowd, and was rewarded with&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;daniel@jeeves:~$ cat /proc/cpuinfo &lt;br /&gt;processor       : 0&lt;br /&gt;vendor_id       : CentaurHauls&lt;br /&gt;cpu family      : 6&lt;br /&gt;model           : 10&lt;br /&gt;model name      : VIA Esther processor 1200MHz&lt;br /&gt;stepping        : 9&lt;br /&gt;cpu MHz         : 400.000&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Sweet.  Now all I need is for the Debian kernel folks to package a version with a vt1211 lmsensors driver so I can shut down or slow the fans, and I'll be all set. (I could probably hack it in myself, but according to what I've read on the Web, the next kernel release will have a working driver)&lt;br /&gt;&lt;br /&gt;[&lt;b&gt;UPDATE&lt;/b&gt;: I disabled cpufreq after only a day or so, because Linux got horribly crashy with CPU scaling turned on.  Hopefully the kernel will be fixed sometime in the future :-/ ]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-8037790624110502751?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/8037790624110502751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/8037790624110502751'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/01/via-c7-it-goes-fast-and-slow.html' title='Via C7: it goes fast AND slow!'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-3308126154330516233</id><published>2007-01-17T20:35:00.000-08:00</published><updated>2007-01-17T20:42:01.454-08:00</updated><title type='text'>Cuckoo!</title><content type='html'>The most unique Christmas present I got this year was the cuckoo clock from my father's parents.  There's something very cool about mechanical clocks that work by means of weights and gears instead of electronics: when the cuckoo goes off, you can actually watch energy being transferred from the weight to the cuckoo device, as the weight that powers it drops precipitously!&lt;br /&gt;&lt;br /&gt;Unfortunately, the clock seems to lose about half an hour every twelve hours.  Does the Lazyweb know any techniques for getting mechanical cuckoo clocks to keep better time?  I don't mind resetting it once a week or so, but twice a day is a little excessive.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-3308126154330516233?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/3308126154330516233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=3308126154330516233' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/3308126154330516233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/3308126154330516233'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/01/cuckoo.html' title='Cuckoo!'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-7042554857878336776</id><published>2007-01-17T20:11:00.000-08:00</published><updated>2007-01-17T20:34:54.436-08:00</updated><title type='text'>Mini-Review: mythtv for non-TV viewers</title><content type='html'>Several months ago, I set up a low-powered box to act as a fileserver and media center.    I don't get cable TV and I have no interest in doing so, so I don't need a PVR.  However, I do have a rather large music collection (and new speakers to play it on); I want to be able to put Internet radio on in the background (since we can't get NPR over the air), and a quick-and-dirty slideshow program for my digital camera photos could be nice too.  So, I decided to try out the free media center, mythtv.  I've summarized the notes I took here for the benefit of other people who don't watch TV.&lt;br /&gt;&lt;br /&gt;Setup was fairly straightforward -- I installed the packages from debian-multimedia.org and configured them.  I had a bit of trouble getting myth to actually start, but looking over the documentation apparently resolved it (my notes contain no details).&lt;br /&gt;&lt;br /&gt;Mythtv has some very well-thought-out aspects.  By all accounts, it makes an excellent PVR; since I don't watch TV, this is the last time I'll mention PVRs in this post. :)  The interface looks exactly the way you want a TV-based system to look, with bright colors, big fonts and big interface elements.  There's even a cute OpenGL mode with fancy screen transitions (I left them disabled because my video driver is unstable even without 3d effects running -- thank Via).&lt;br /&gt;&lt;br /&gt;However, it became painfully obvious after a bit of use that MythTV is really meant as a TV program, with everything else being an afterthought.  Here are just a few of the problems I noted:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;MythTV can't play internet radio; the functionality simply doesn't exist.&lt;br /&gt;&lt;li&gt;You can do only one thing at once.  Perhaps this is fine for TV, but given that it is not uncommon that I want to, say, play music while reading the news, or while ripping another CD, this is a gaping hole in functionality for me.&lt;br /&gt;&lt;li&gt;MythTV can display news (RSS) feeds.  However, the news feeds aren't in alphabetical order in either the viewer or the setup screen (where you pick what to see).  This makes it rather painful to pick the feeds you want out of the dozens of presets.&lt;br /&gt;&lt;li&gt;The built-in browser crashes with SIGABRT on startup, making the news feeds useless anyway.&lt;br /&gt;&lt;li&gt;The built-in support for ripping flac files is confusing to activate (you have to pretend you're making an Ogg and choose "Perfect" quality!) and doesn't give you control over the process (for instance, replaygain can't be added to the ripped files).&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;That's just a small sampling of the problems I ran into.  I ended up just setting up a normal desktop system with a wireless keyboard/mouse, and I'd recommend the same thing for anyone else who doesn't need a PVR.  The non-TV features in Myth have a strong smell of being extras for people who occasionally switch away from the TV, rather than a well-integrated media system in their own right.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-7042554857878336776?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/7042554857878336776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/7042554857878336776'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/01/mini-review-mythtv-for-non-tv-viewers.html' title='Mini-Review: mythtv for non-TV viewers'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-2121896199452041882</id><published>2007-01-10T06:07:00.000-08:00</published><updated>2007-01-10T22:35:51.162-08:00</updated><title type='text'>The US isn't the only country with crazy politicians</title><content type='html'>&lt;b&gt;[UPDATE 2007-10-01 22:43: It appears that Erich wrote an expanded and better-translated &lt;a href="http://blog.drinsama.de/erich/en/politics/2007011002-linux-distributions-to-be-illegal"&gt;post&lt;/a&gt; while I was at work]&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Erich Schubert &lt;a href="http://blog.drinsama.de/erich/en/linux/debian/2007011001-csu-macht-debian-illegal"&gt;writes&lt;/a&gt; that&lt;br /&gt;&lt;blockquote&gt;Nach aktuellen Plänen der CSU wäre der Vertrieb von Debian GNU/Linux illegal.&lt;br /&gt;&lt;br /&gt;Auch zahlreiche andere Distributionen währen wohl davon betroffen: Alle, die sogenannte "Killerspiele" &lt;i&gt;vertreiben&lt;/i&gt;...&lt;/blockquote&gt;&lt;br /&gt;For non-German speakers, I provide the following approximate translation:&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;CSU wants to make Debian illegal&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The current plans of the CSU [Christian Social Union] will make the distribution of Debian GNU/Linux illegal.&lt;br /&gt;&lt;br /&gt;In addition, many other distributions will be affected: specifically, those that &lt;i&gt;distribute&lt;/i&gt; so-called "killer games"...&lt;br /&gt;&lt;br /&gt;For instance, &lt;a href="http://artax.karlin.mff.cuni.cz/~brain/0verkill/"&gt;Overkill&lt;/a&gt; (Debian also includes, e.g., Tremulous and OpenArena, which are based on the Quake3 engine and have 3d graphics...)&lt;/blockquote&gt;&lt;br /&gt;(hopefully I got the gist of Erich's post without mangling it too badly!)&lt;br /&gt;&lt;br /&gt;What I don't know is how serious this is.  The C&lt;b&gt;D&lt;/b&gt;U (Christian Democratic Union) is IIRC the current ruling party in Germany; however, according to Wikipedia, the CSU is some sort of local affiliate in Bavaria.  Does it have the clout to get this proposal made into law?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-2121896199452041882?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/2121896199452041882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/2121896199452041882'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2007/01/us-isnt-only-country-with-crazy.html' title='The US isn&apos;t the only country with crazy politicians'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-5544029902909454202</id><published>2006-12-28T10:06:00.000-08:00</published><updated>2006-12-28T10:23:06.710-08:00</updated><title type='text'>Why comments are closed on my blog.</title><content type='html'>This is belated...anyway, I'm taking a day off work to get ready for our vacation this weekend, and I remembered (after writing some other blog posts) that I meant to chime in on a Planet Debian discussion about closed vs not-closed blogs.&lt;br /&gt;&lt;br /&gt;My reason for closing comments was quite simple: blogs are spam-magnets.  While I was a student and/or unemployed, I didn't mind spending a few minutes a day purging spam messages from my blog.  But when I started working full-time, it became a real chore, especially since the amount of spam I got increased with the number of posts on the blog.&lt;br /&gt;&lt;br /&gt;One thing that would change my point of view here would be the option to automatically close comments on posts that are more than (say) 60 days old, or perhaps that haven't got a (non-deleted) post newer than 60 days.  This would keep the spam problem down, since my biggest problem was ancient blog posts that no-one had commented on (at least for months or years), but that suddenly got picked up by spammers.  This might be available if I ran my own blog, but I don't have the time at the moment to administrate a home server, so I'm stuck using someone else's software.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-5544029902909454202?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/5544029902909454202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/5544029902909454202'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/12/why-comments-are-closed-on-my-blog.html' title='Why comments are closed on my blog.'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-1508462661151696906</id><published>2006-12-28T10:01:00.000-08:00</published><updated>2006-12-28T10:06:32.067-08:00</updated><title type='text'>I'm a top contributor too!</title><content type='html'>Adrian von Bidder &lt;a href="http://fortytwo.ch/blog/archives/2006/12/#e2006-12-28T17_20_53.txt"&gt;notes&lt;/a&gt; that he got a message from a random survey group asking for feedback.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;    [...] we analysed the debian mailing list archives, especially the debian-devel mailing list, as it is a good representation of the whole network. [...] we identified the 100 main actors and therefor came across your email address.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;So, somebody who talks quite a bit on the mailing lists, but really only maintains one package is already one of the top 100 "actors" in Debian? I seriously doubt it.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;It gets better.  In the last couple years I've barely posted on any public Debian mailing lists at all.  And yet I'm apparently also in the top 100 "actors".  Say what?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-1508462661151696906?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/1508462661151696906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/1508462661151696906'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/12/im-top-contributor-too.html' title='I&apos;m a top contributor too!'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-2039732387408404790</id><published>2006-12-28T08:33:00.000-08:00</published><updated>2006-12-28T08:51:55.810-08:00</updated><title type='text'>Microsoft: Copyright law is for other people?</title><content type='html'>Unsurprising, sad, but still amusing: &lt;a href="http://www.niallkennedy.com/blog/archives/2006/12/microsoft-copyright-photograph.html"&gt;this guy&lt;/a&gt; photographed talks given at a computer conference and released them under the Creative Commons Non-Commercial Attribution license.  A Microsoft senior program manager copied his work as part of an advertisement, without attribution.&lt;br /&gt;&lt;br /&gt;Try violating Microsoft's copyrights and they'll bury you under lawyers and moral outrage.  But catch them violating yours and it's laughed off as no big deal (some of the huffy responses from Softies on the blog post I referenced are pretty funny).&lt;br /&gt;&lt;br /&gt;Of course, in a real sense, it isn't a big deal: "might makes right" is a dreadful moral principle but a largely accurate summary of how the world actually works.  But exposing the hypocrisy of the powerful at least forces them stop pretending that they are anything but overgrown, sanctified, self-righteous bullies.  (this doesn't actually make anything better (even if you get rid of one bully, he'll just be replaced by another one), but at least it means you don't have to gag on hypocrisy every time they open their mouth)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-2039732387408404790?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/2039732387408404790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/2039732387408404790'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/12/microsoft-copyright-law-is-for-other.html' title='Microsoft: Copyright law is for other people?'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-2518177751544958724</id><published>2006-12-16T11:33:00.000-08:00</published><updated>2006-12-16T11:45:31.839-08:00</updated><title type='text'>urlscan 0.5</title><content type='html'>If, like me, you use the &lt;a href="http://www.mutt.org/"&gt;mutt&lt;/a&gt; mailreader, you may at some point have tried out the &lt;a href="http://packages.debian.org/stable/misc/urlview"&gt;urlview&lt;/a&gt; program to quickly jump to URLs in emails.  urlview is a nice concept, but it has a few limitations, the worst of which is it doesn't decode quoted-printable emails (so, e.g., CGI urls containing equal signs get escaped and become useless).&lt;br /&gt;&lt;br /&gt;With the increasing number of dynamic URLs and quoted-printable emails out there, this has rendered urlview more or less useless for me.  A couple weekends ago, I got annoyed enough to do something: I wrote a quick-and-dirty Python replacement for urlview, called &lt;a href="http://packages.debian.org/unstable/mail/urlscan"&gt;urlscan&lt;/a&gt;.  I'm not proud of all the code, but thanks to Python's great standard library, it can decode just about anything you throw at it; it also extracts some context around each URL, so there's less guesswork involved in picking URLs.&lt;br /&gt;&lt;br /&gt;I've uploaded urlscan to unstable (it just went in today), in the hopes that someone out there will find it useful.  Enjoy. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-2518177751544958724?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/2518177751544958724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/2518177751544958724'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/12/urlscan-05.html' title='urlscan 0.5'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-4849322086435748456</id><published>2006-12-09T14:02:00.000-08:00</published><updated>2006-12-09T14:22:01.141-08:00</updated><title type='text'>DRM: "If there is hope, it lies in the proles^H^H^H^H^Hpols"?</title><content type='html'>In response to my recent mistaken post about Samsung and DRM, Adrian von Bidder wrote that&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;I think this battle will have to be fought in politics7. Battling the vendors is fine, but will be endless, the real goal should be to anchor a broad [4]right to tinker in the bill of rights which also extends to non-commercially used information.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;On one level, this is probably true.  But this amounts to the government passing laws that increase the liberty of its citizens and decrease its own control over them, while at the same time exposing the corporate interests that sponsor the government to increased competition.  Governments almost never do this, for obvious reasons -- probably the only example in recent American history that I can think of is the &lt;a href="http://en.wikipedia.org/wiki/Civil_Rights_Act_of_1964"&gt;Civil Rights Act of 1964&lt;/a&gt;, over forty years old now, which addressed inequalities that the average person could understand easily and was preceded by significant popular unrest (much more than a few guys dressing up like hazardous-waste-disposal crews and walking around outside computer conferences).&lt;br /&gt;&lt;br /&gt;In fact, the most likely outcome of the government getting involved in the DRM situation, in my opinion, is a bill making DRM mandatory for all hardware devices and requiring software (or at least software that can run on mass-market computers) to go through a process of certification that attests that it respects DRM.  This will be the final nail in the coffin for the free software movement, and I don't think we want to hasten its arrival.&lt;br /&gt;&lt;br /&gt;I think the best we can hope for in this context is the prayer from "Fiddler on the Roof":&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Lord, bless and keep the Congress&lt;br /&gt;&lt;br /&gt;... far away from us!&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-4849322086435748456?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/4849322086435748456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/4849322086435748456'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/12/drm-if-there-is-hope-it-lies-in.html' title='DRM: &quot;If there is hope, it lies in the proles^H^H^H^H^Hpols&quot;?'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-5724673727558666626</id><published>2006-12-09T13:50:00.000-08:00</published><updated>2006-12-09T13:55:09.186-08:00</updated><title type='text'>Apologies to Samsung</title><content type='html'>I need to learn not to write blog posts after 9pm, given that my brain starts fogging up around 8:30pm.&lt;br /&gt;&lt;br /&gt;Apparently the only reason I couldn't play DVDs is that I had forgotten to install the DVD decoder library.  Doh.  And apparently the reason the DVD wouldn't play yesterday is that the video program was trying to get the drive to decode the DVD for it -- which I can understand Samsung not wanting to do, since it would get them in legal hot water. (what ticked me off was that it looked like they were going beyond the minimum and keeping me from even reading the encrypted DVD data)&lt;br /&gt;&lt;br /&gt;So, the problem is that Daniel is a doofus.  I want to apologize again for being a little trigger-happy last night -- especially since this is syndicated, it sucks to have put incorrect information out there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-5724673727558666626?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/5724673727558666626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/5724673727558666626'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/12/apologies-to-samsung.html' title='Apologies to Samsung'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-8348428178520521911</id><published>2006-12-09T11:21:00.000-08:00</published><updated>2006-12-09T11:54:35.770-08:00</updated><title type='text'>Hungarian notation is a human-checked type system, redux</title><content type='html'>A while ago, I read an article that advocated the use of Hungraian Notation for purposes that can easily be folded into the type system and automatically checked.  I wrote a &lt;a href="http://lambdaman.blogspot.com/2005/11/type-system-hack.html"&gt;blog post&lt;/a&gt; in reply that gave a rough sketch of a solution to the fundamental problem in Haskell.  Well, someone else apparently read the same article and had the same idea; the only difference is that the solution he produced is infinitely superior to mine and everyone should &lt;a href="http://blog.moertel.com/articles/2006/10/18/a-type-based-solution-to-the-strings-problem"&gt;go read it instead&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-8348428178520521911?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/8348428178520521911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/8348428178520521911'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/12/hungarian-notation-is-human-checked.html' title='Hungarian notation is a human-checked type system, redux'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-116564156424685278</id><published>2006-12-08T20:43:00.000-08:00</published><updated>2006-12-09T13:56:24.760-08:00</updated><title type='text'>Hardware manufacturers to avoid: Samsung</title><content type='html'>[&lt;b&gt;UPDATE 2&lt;/b&gt;: the problem is of the form "Daniel is an idiot".  See &lt;a href="http://lambdaman.blogspot.com/2006/12/apologies-to-samsung.html"&gt;this post&lt;/a&gt; for details.  DRM is still evil, though.]&lt;br /&gt;&lt;br /&gt;I recently assembled a little Mini-ITX system, mainly for use as a file server/desktop replacement/music server.  However, it has a DVD drive, and it has a hardware MPEG2 decoder.  So today, feeling a bit lazy, I decided to try displaying a DVD on the box instead of using the DVD player.  This is when I discovered that my computer's new DVD drive is &lt;a href="http://www.defectivebydesign.org"&gt;defective&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;hdc: command error: status=0x51 { DriveReady SeekComplete Error }&lt;br /&gt;hdc: command error: error=0x54 { AbortedCommand LastFailedSense=0x0&lt;br /&gt;5 }&lt;br /&gt;ide: failed opcode was: unknown&lt;br /&gt;ATAPI device hdc:&lt;br /&gt;  Error: Illegal request -- (Sense key=0x05)&lt;br /&gt;  Read of scrambled sector without authentication -- (asc=0x6f, asc&lt;br /&gt;q=0x03)&lt;br /&gt;  The failed "Read 10" packet command was: &lt;br /&gt;  "28 00 00 00 01 c0 00 00 02 00 00 00 00 00 00 00 "&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Yes, you read that right.&lt;br /&gt;&lt;br /&gt;So, I won't be buying any more Samsung hardware until they figure out that &lt;b&gt;I&lt;/b&gt; am their customer, not the MPAA.  I realize this is an utterly futile gesture, that Samsung won't even notice my lack of custom, that this will make not even a dent on the juggernaut of DRMed/TPMed/locked-down hardware/software systems that are coming in the future, and that the end result is that I quit using computers entirely and go raise chickens...but you know, right now I think I'm mad enough not to care.&lt;br /&gt;&lt;br /&gt;PS: Even worse: based on some discussions I found online, I ran a quick check of the &lt;i&gt;CD reading&lt;/i&gt; speed -- and it appears that the drive now refuses to read CDs any faster than 2-3X!  This is absolutely the last dollar that Samsung is getting from me, and if the store's return policy allows it, this sucker is getting RMAed tomorrow.&lt;br /&gt;&lt;br /&gt;[&lt;b&gt;UPDATE&lt;/b&gt;: the store I bought the drive from in October has a 30-day return policy, so I'm stuck with the one I've got.  Probably I won't bother with getting DVD functionality on my next optical drive, it's not worth the obnoxiousness.]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-116564156424685278?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/116564156424685278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/116564156424685278'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/12/hardware-manufacturers-to-avoid.html' title='Hardware manufacturers to avoid: Samsung'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-116538258550901459</id><published>2006-12-05T20:41:00.000-08:00</published><updated>2006-12-05T21:23:05.623-08:00</updated><title type='text'>Things I miss about being an Undergrad.</title><content type='html'>So, it's been about 4.5 years since I got my ScB, 1.5 years since I got my MSc, and 1 year since I started working at Satori.  Seems like an ideal time to look back on the halcyon simplicity of college, right?  Here are a few things that I really wish I had appreciated more in 2000.&lt;br /&gt;&lt;br /&gt;(1) Getting enough sleep.&lt;br /&gt;&lt;br /&gt;  I was just about the only well-rested student I knew in college.  When other people (who stayed up past midnight regularly) would complain that they seemed to spend lots of time working withotu getting anything done, I occasionally suggested that they try getting more sleep.  Hah.&lt;br /&gt;&lt;br /&gt;  So, in grad school I developed some bad, bad habits -- staying up past midnight, sleeping in erratically, etc.  (I like to blame my girlfriend, who refused to get up before 9-10am when she was a student ;-) )  I started to sort of get a handle on that, and then I got a full-time job.&lt;br /&gt;&lt;br /&gt;  The problem here is this: you know how they say that to figure out how much sleep you need, you should sleep until you wake up naturally and feel rested?  If I go to bed at 9PM, I wake up naturally at 7-8AM or so.  That's -- count it -- 10-11 HOURS OF SLEEP.  As a student, I had the luxury of sleeping 11 hours straight (since I had no social life).  As a working drone with an hour-plus commute, that would leave me with 3-4 hours to fit in all my non-work activities (like, say, eating; personal hygeine; etc).  The fact that I tend to get heartburn if I lie down within 2-3 hours of a meal, and that I usually have to cook my meal before I can eat it ... well, this just isn't gonna work.&lt;br /&gt;&lt;br /&gt;  So, to get enough time to actually live a bit outside work, I end up curtailing my sleep schedule to "only" about 7-8 hours.  I know that's enough for some people.  I wish I was one of them.  The result for me, though, is that I go through most days feeling dazed, tired, sleepy, and with an on-and-off headache.  I can generally hold it together well enough to get through the work day (although yesterday I collapsed on the couch halfway through), but once I get home I lack the energy to do anything but feed myself and idly browse the Web.  Trying to do anything intellectually challenging (hence interesting), like say learn Cantonese or category theory, is right out.  (I can just about say I want to eat, and I got as far as power categories before getting horribly tired and confused)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(2) Breaks.&lt;br /&gt;&lt;br /&gt;  One great feature of college is that you &lt;i&gt;get time off of it&lt;/i&gt;.  In addition to some random vacations during the semester, you usually break for several whole weeks between semesters, and then break again in the summer.  Even if you have a summer job, this is a great way to recharge the batteries.&lt;br /&gt;&lt;br /&gt;  In the working world, I get exactly 1 day off per month -- if I want a decent-sized break, I have to go several months with no days off at all (except the paid holiday day every other month or so that the company gives us in its beneficience).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(3) The cafeteria.&lt;br /&gt;&lt;br /&gt;  College students like to make fun of cafeteria food.  They don't know how good they have it.  You get three hot meals a day, plus you don't have to do ANY cooking or cleaning up?  Sign me up!&lt;br /&gt;&lt;br /&gt;  When I get home at 6:30 PM and I'm starving, the first thing I have to do is get out the raw ingredients for my dinner and toss them in a pot, then gnaw on some cheese or something to take away the hunger pains until they're done.  By 7:30, I might have some food in me, hopefully.  I'm thinking about switching to a frozen-food diet (ew), although that doesn't help clean the dishes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(4) There's no commute in college.&lt;br /&gt;&lt;br /&gt;  To get to work, I have to walk 10 minutes, ride the bus for about 30-40 minutes, then walk another 20 minutes or so.  In the evening I have to do the reverse.  That's 2-3 hours of my life sucked up by just getting to work and back.  If my brain wasn't too fried to study any of the interesting books I've optimistically purchased (see (1) and (2)), it might be bearable...but when I just want to get some food and rest, it really sucks.  And it sucks especially when I have no good alternative (living in Seattle is EXPENSIVE, and it would give Kate an even worse commute in the other direction).&lt;br /&gt;&lt;br /&gt;(5) Having the time and energy to study topics or write software just for the heck of it.&lt;br /&gt;&lt;br /&gt;This really incorporates all of the above.  It seems like all these factors conspire to suck my time up, then suck up the energy I have in the little time left to me.  Meh.  For instance, right now (at 9PM) I am getting very sleepy and should get to bed, yet I've done nothing since I finished eating (at 7:30PM) but skim &lt;a href="http://lambda-the-ultimate.org"&gt;Lambda the Ultimate&lt;/a&gt; and a few linked articles sites (slowly) and write this blog post.  Blah.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Lest I give the impression that I completely hate work, let me add that there is one very, very important thing that I enjoy about it relative to my student, free-software-hacking days.&lt;br /&gt;&lt;br /&gt;  (1) &lt;b&gt;NOT BEING FLAT BROKE.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;  I believe this one is self-explanatory; and so far it still makes up for the rest (I wonder how long this will continue).  It's too bad I can't get paid to just sit around doing whatever I feel like and then giving it away, but then it's also too bad I can't wave a magic wand to get a pony and a few dozen acres to keep it on.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-116538258550901459?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/116538258550901459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/116538258550901459'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/12/things-i-miss-about-being-undergrad.html' title='Things I miss about being an Undergrad.'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-116472814185126493</id><published>2006-11-28T06:46:00.000-08:00</published><updated>2006-11-28T07:35:46.020-08:00</updated><title type='text'>Digging for Conspiracies?</title><content type='html'>While I appreciate the research and legal commentary over at &lt;a href="http://groklaw.net"&gt;Groklaw&lt;/a&gt;, the tendency of PJ and the regular posters to imagine vast conspiracies makes me more than a little uneasy.  Yesterday I came across a truly jaw-dropping &lt;a href="http://www.groklaw.net/comment.php?mode=display&amp;sid=20061122235224396&amp;title=Nice%20article%20on%20the%20Novel-Microsoft%20deal%20-%20maybe%20not&amp;type=article&amp;order=&amp;hideanonymous=0&amp;pid=509111"&gt;example&lt;/a&gt; that would be offensive if it wasn't so laughable; and since I happen to know more about the situation, I felt I should comment on it:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;I have some questions about this group, BELUG, who did the article, I gather. There is no info on the site to be more informed. Anyone in the Seattle LUG know anything about this new group in Bellevue, 5 mins. from Bill Gates' house?&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;I don't like to be a cynic, and maybe they are a Linux user group, but if so, maybe the Seattle LUG can give them a hand.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Of course, we all know that the Microsoft corporate campus has an enormous mind-control ray mounted on Building 1 that turns everyone living on the Eastside of Seattle into mindless Gates-worshipping zombies.  Part of Bill's personal security plan, dontchaknow.  That's why BELUG starts every meeting with a round of "All Hail Gates, Lord of All That Is Electrified".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;She goes on to complain about "major confusion" in their &lt;a href="http://www.bellevuelinux.org/about_belug.html"&gt;description&lt;/a&gt; of free software.  At a quick read, I can only see two glaring problems with this page: first, they describe free software as being both "free in a monetary sense" and able to be sold (which is actually true but sounds like a contradiction without more explanation that they don't provide); later, there's some weird wooly-headed stuff about revolutionizing entire economies and societies.  I don't know what they're talking about, but they certainly can't be accused of lacking enthusiasm.&lt;br /&gt;&lt;br /&gt;Finally, she quotes a section of the FAQ that suggests that Microsoft professionals should learn Linux and vice versa, since the world is heterogenous and getting more so.  I don't think that's controversial, so I think she must be referring to this question:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Q: Why does BELUG dislike Microsoft?&lt;br /&gt;&lt;br /&gt;A: That is a complete misunderstanding. BELUG does not dislike Microsoft. Microsoft is our neighbor, and many of our friends and relatives work there. Both Microsoft's headquarters and Bill Gates' house are located just minutes away, and Microsoft's world sales headquarters is currently under construction nearly adjacent to BELUG's meeting location. BELUG merely believes in friendly competition and that competition can benefit everyone, including Microsoft. This is what a free market economy and the American system is (supposed to be) all about, and this is what has helped make the U.S. a great country. &lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The statement that Microsoft is nearby is nothing but geographical fact (I could walk about fifteen minutes from my apartment and be on the MS campus; does that make me an MS mole?).&lt;br /&gt;&lt;br /&gt;As for the rest, I really don't see anything to complain about.  I know some people like to rhetorically shred Microsoft at every opportunity, but if you're trying to attract members in Microsoft's hometown, it's wise to keep your comments polite.  It's also true that Microsoft benefits from competition (even if they don't see it that way); I don't think it's a coincidence that their products started sucking drastically less as OSX and Linux became reasonable alternatives to Windows.  And the fact that we can have friendly competition (as opposed to the cut-throat, take-no-prisoners style that's popular in some quarters) is exactly one of things I like about Linux.  You will notice, however, that the Q&amp;A carefully doesn't mention what sort of competition Microsoft engages in.  I think anyone who knows anything about the company knows the answer to that one.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here's the kicker, though: I actually attended a BELUG meeting a few months ago.  It seemed pretty much like what I'd expect from a small group of volunteers: one guy gave a talk about hooking ALSA up to a digital audio receiver, another guy showed off a Unix kernel he had written for classic MacOS (it ran as a user process and presented a Unix-like interface to the Mac), someone passed around cookies, and people talked a bit about using Linux and so on.&lt;br /&gt;&lt;br /&gt;The poor quality of the Web site and the lack of a mailing list probably reflect the fact that there are a handful of people organizing the thing who all have day jobs and other committments, not some vast Microsoft conspiracy to undermine Linux from the inside by setting up fake LUGs.  PJ never said they were fakes outright, but it was a clear subtext of her comment, and the Groklaw regulars who replied knew exactly what she was getting at.  If she really thinks they might be fakes, then I think she needs to take a break from watching SCO (which could make anyone paranoid and suspicious) and enjoy the holiday season instead.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-116472814185126493?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/116472814185126493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/116472814185126493'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/11/digging-for-conspiracies.html' title='Digging for Conspiracies?'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-116335721820066529</id><published>2006-11-12T10:21:00.000-08:00</published><updated>2006-11-12T10:46:58.340-08:00</updated><title type='text'>Close Encounters of the Automotive Kind</title><content type='html'>I got run over by a car on Wednesday.&lt;br /&gt;&lt;br /&gt;Well, that's an exaggeration.  My &lt;i&gt;foot&lt;/i&gt; got run over by a car on Wednesday.  I was trying to cross, in a crosswalk, in front of a red SUV that was stopped at a stop sign (my first mistake), when the driver suddenly decided to make a quick right turn.  Luckily, I saw him start to do it and was able to jump out of the way of his vehicle -- except that I couldn't get my left foot out of the way in time.  THUMP.  And a few seconds later there was a SMACK as his passenger-side mirror creamed me, snapped off, and fell into the road.&lt;br /&gt;&lt;br /&gt;The driver immediately realized what had happened and stopped to apologize.  He offered me a ride; after quickly checking that my foot was NOT a mess of broken bones or a bloody pulp, I asked him to drive me to the bus stop.  I was pretty shaken up from having just escaped death or major bodily injury by a matter of inches, so I didn't get his insurance information, name, phone number, or even license plate.  Second mistake.&lt;br /&gt;&lt;br /&gt;So, I got on the bus, flipped open my laptop to see if I could play a video game or something to calm down, and discovered that the screen of my practically new laptop was smashed.  Probably it got hit by the passenger mirror -- and since I have no idea who hit me, I can't even politely ask him to pay for replacing it, let alone demand.&lt;br /&gt;&lt;br /&gt;That's the bad news.  The good news is that I went to a doctor and got a confirmation (with xrays) that no bones are broken in my foot.  My foot and back are sore, but they're already quite a bit better than they were (I'm barely limping at all now) and the doctor said they should be fine in a week or two if I take it easy.&lt;br /&gt;&lt;br /&gt;I suppose the whole thing was my fault, really; yeah, I had the &lt;q&gt;legal&lt;/q&gt; right-of-way, but I should know by now that this is a meaningless concept; a driver who isn't signalling to you is &lt;i&gt;always&lt;/i&gt; a potential hazard, especially in Seattle at rush hour.&lt;br /&gt;&lt;br /&gt;The upshot of this, for people seeing this on Planet Debian, is that I probably won't be doing as much Debian work in the near future.  I was using my laptop on the bus to catch up on emails and work on "easy" bugs, and I don't have the money to replace it right now (I probably won't until at least January, according to my back-of-the-envelope figuring).  I can get some work done on weekends, but at an even more reduced pace than I've been able to since I got a paying job. :-(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-116335721820066529?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/116335721820066529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/116335721820066529'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/11/close-encounters-of-automotive-kind.html' title='Close Encounters of the Automotive Kind'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-116200238595245729</id><published>2006-10-27T18:52:00.000-07:00</published><updated>2006-10-27T20:09:33.046-07:00</updated><title type='text'>Things that Don't Suck and Things that Do</title><content type='html'>Since I sometimes worry that my blog is turning into a gripelog, I'd like to highlight a very positive experience I recently had with a company.  I wanted to buy some decent desk chairs for my apartment, and due to getting a higher-than-average computer desk, I needed chairs that were fairly tall (seats around 30" from the floor).&lt;br /&gt;&lt;br /&gt;I finally converged on a lab-stool that I found at &lt;a href="http://www.office-chairs-discount.com/"&gt;office-chairs-discount.com&lt;/a&gt; and placed an order for two instances of it.  They arrived a few weeks later in boxes with fairly simple assembly instructions.  Unfortunately, and here's where it gets interesting, one of the chairs was broken -- the ring of plastic that was supposed to secure the foot-rest to the chair's main support was broken.  After I sent an email describing the problem to their support address, they said that all I needed to do was take a picture of the broken part and they'd mail out a replacement.  A few weeks later, the replacement arrived and I was able to assemble the second chair.  They even were very polite when I bugged them about why the part hadn't arrived when it already had (UPS apparently didn't leave a notice for me).  All in all, I was quite impressed with this company and I'd definitely buy from them again if I needed more chairs.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, now on to less happy things.  People with a mathematical background are familiar with the principle of transitivity; basically, this says that if A is less than B and B is less than C, then A is less than C.  This isn't just an arcane mathematical property, though; it has important practical consequences.  For instance, if you want to quickly find a word in a list of words, having the words in sorted order is a huge benefit.  You can do this because, among other things, the "less-than" relationship between words is transitive (without transitivity, even the idea of a "sorted order" is somewhat peculiar).&lt;br /&gt;&lt;br /&gt;Why do I mention this?  Well, because in C#, the following inequality holds:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;"Y-" &amp;lt; "Y'" &amp;lt; "-Y-" &amp;lt; "Y-"&lt;/pre&gt;&lt;br /&gt;That's right: by default, &lt;i&gt;Microsoft's C# implementation compares strings in a non-transitive manner&lt;/i&gt;, contrary to all expectations that any sane programmer would have.  This bit me yesterday, when I was trying to sort a rather large array of strings and then perform searches in the array.  Words that I knew perfectly well were in the array (I could even see them in the debugger!) weren't being found by the search.  Why?  Because the list wasn't in sorted order, even after calling Array.Sort() on it.  Why?  Because (see above) there is no such thing as a sorted order using the default C# comparator!&lt;br /&gt;&lt;br /&gt;At first, I hoped this might just be a bug.  But in the manual, I found a nice little explanation that the default sort doesn't perform a standard lexicographic comparison, in an attempt to provide a more "human-friendly" sorting.  (they give the example of sorting "coop" next to "co-op", which confuses me since those two sort next to each other in any even.  But whatever.)  Instead, you have to use a method which is confusingly called "CompareOrdinal" instead of "DontSuckCompare".&lt;br /&gt;&lt;br /&gt;Of course, after reading &lt;a href="http://www.robweir.com/blog/2006/10/leap-back.html"&gt;this&lt;/a&gt;, I guess nothing Microsoft does can really surprise me any more.  Interestingly, Mono doesn't seem to have copied this particular "bug" (although I only tested one case with it).  I don't know if this is good or bad: after all, it's probably only a matter of time before a piece of software that unintentionally depends on .NET's weird string comparisons comes into being.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-116200238595245729?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/116200238595245729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/116200238595245729'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/10/things-that-dont-suck-and-things-that.html' title='Things that Don&apos;t Suck and Things that Do'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-116113643484462567</id><published>2006-10-17T18:16:00.000-07:00</published><updated>2006-10-17T19:50:53.166-07:00</updated><title type='text'>ACLU &amp; tagged-URL emails</title><content type='html'>I recently got on an ACLU mailing list that they use to send out requests to sign on-line petitions and so on.  Today, while skimming over another one of these "alerts", I noticed something amusing.  The email contains several links to the ACLU site, requesting that users sign a petition opposing a recent nasty piece of legislation; for instance,&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Please help broadcast our message across the nation: Sign our "This&lt;br /&gt;November, I'm Voting My Values" pledge:&lt;br /&gt;http://action.aclu.org/site/R?i=5dopkpJQPaNbn4A_kyuMzA..&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;and&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;To do that we must make civil liberties one of the top issues as&lt;br /&gt;people head to the polls next month. Sign our "This November, I'm&lt;br /&gt;Voting My Values" pledge.&lt;br /&gt;http://action.aclu.org/site/R?i=ByYHnSn7ZbByadWPVPRB0X..&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note that these are from the textual version of the email; in the HTML version, the URLs are linked from the "Sign our ... pledge" text.&lt;br /&gt;&lt;br /&gt;See anything there?  That's right: each of the "sign the pledge" links goes to a different URL!  Since someone had to go to the effort of making all these links go different places, I have to wonder whether an ACLU server is collecting statistics on  how many paragraphs each user read before they clicked the link, and analyzing these stats to target and refine their marketing campaigns.  I suppose this sort of thing is standard practice these days, but it's still a bit ... odd ... to see one of the main organizations that advocates for privacy perhaps engaging in this sort of clandestine information-gathering.&lt;br /&gt;&lt;br /&gt;[EDIT: In case it's not clear from the above, I don't know and I'm not suggesting that anything nefarious is going on; I just thought this was a funny idea and wanted to share it with people.  My brain is weird that way, but sometimes not everyone gets the joke, so I thought I'd add this postscript here to make it clear. :-) ]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-116113643484462567?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/116113643484462567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/116113643484462567'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/10/aclu-tagged-url-emails.html' title='ACLU &amp; tagged-URL emails'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-115967547988377575</id><published>2006-09-30T21:02:00.000-07:00</published><updated>2006-09-30T21:04:39.886-07:00</updated><title type='text'>When good spamfilters go bad.</title><content type='html'>&lt;pre&gt;From: secretary@debian.org&lt;br /&gt;To: Daniel Burrows &lt;dburrows@debian.org&gt;&lt;br /&gt;Subject: Acknowledgement for your vote&lt;br /&gt;&lt;br /&gt;Spam detection software, running on the system "jester", has&lt;br /&gt;identified this incoming email as possible spam.  The original message&lt;br /&gt;has been attached to this so you can view it (if it isn't spam) or label&lt;br /&gt;similar future email.  If you have any questions, see&lt;br /&gt;the administrator of that system for details.&lt;br /&gt;&lt;br /&gt;Content analysis details:   (5.8 points, 5.0 required)&lt;br /&gt;&lt;br /&gt; pts rule name              description&lt;br /&gt;---- ---------------------- --------------------------------------------------&lt;br /&gt; 1.0 NO_REAL_NAME           From: does not include a real name&lt;br /&gt; 1.5 RCVD_NUMERIC_HELO      Received: contains an IP address used for HELO&lt;br /&gt; 1.0 BAYES_60               BODY: Bayesian spam probability is 60 to 80%&lt;br /&gt;                            [score: 0.7536]&lt;br /&gt; 2.3 EMPTY_MESSAGE          Message appears to be empty with no Subject: text&lt;br /&gt;&lt;br /&gt;The original message was not completely plain text, and may be unsafe to&lt;br /&gt;open with some email clients; in particular, it may contain a virus,&lt;br /&gt;or confirm that your address can receive spam.  If you wish to view&lt;br /&gt;it, it may be safer to save it to a file and open it with an editor.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;(but what if the editor is Emacs and it has a Lisp virus?? ;-) )&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-115967547988377575?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/115967547988377575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/115967547988377575'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/09/when-good-spamfilters-go-bad.html' title='When good spamfilters go bad.'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-115722153443858588</id><published>2006-09-02T11:12:00.000-07:00</published><updated>2007-04-25T06:59:14.184-07:00</updated><title type='text'>Kitties</title><content type='html'>Kate and I have been thinking for a while now about maybe adopting cats once we were settled into our new apartment.  Two weekends ago, we went to a &lt;a href="http://www.meowcatrescue.org/"&gt;local cat shelter&lt;/a&gt; and adopted a pair of kittens.  Photos below; the brown one is a female named Diana, and the orangish one is a male named Mars.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://photos-667.facebook.com/ip006/v39/18/40/1014384/s1014384_30643667_1222.jpg"/&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://photos-671.facebook.com/ip006/v39/18/40/1014384/s1014384_30643671_146.jpg"/&gt;&lt;br /&gt;&lt;br /&gt;Not only are they INCREDIBLY CUTE, but they're very sweet-tempered and affectionate, at least when they can spare the time from chasing cat toys and play-fighting with each other.  There's really nothing like having a pair of purring cats curled up on your lap together.&lt;br /&gt;&lt;br /&gt;Kittens make everything better. :-)&lt;br /&gt;&lt;br /&gt;(PS: more kitty pictures are available &lt;a href="http://brown.facebook.com/album.php?aid=2022637&amp;l=379f0&amp;id=1014384"&gt;here&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-115722153443858588?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/115722153443858588/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=115722153443858588' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/115722153443858588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/115722153443858588'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/09/kitties.html' title='Kitties'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-115542088536975707</id><published>2006-08-12T15:12:00.000-07:00</published><updated>2006-08-12T15:14:45.370-07:00</updated><title type='text'>Dynamic typing strikes again.</title><content type='html'>&lt;pre&gt;Traceback (most recent call last):&lt;br /&gt;  File "/usr/bin/reportbug", line 1731, in ?&lt;br /&gt;    main()&lt;br /&gt;  File "/usr/bin/reportbug", line 1471, in main&lt;br /&gt;    listcc += ui.get_multiline('Enter any additional addresses this report should be sent to; press ENTER after each address.')&lt;br /&gt;TypeError: argument to += must be iterable&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;BTW, for anyone who reads my blog and not Planet, this has a &lt;a href="http://blog.philkern.de/archives/204-Broken-reportbug.html"&gt;simple fix&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-115542088536975707?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/115542088536975707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/115542088536975707'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/08/dynamic-typing-strikes-again.html' title='Dynamic typing strikes again.'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-115542014734865306</id><published>2006-08-12T14:47:00.000-07:00</published><updated>2006-08-12T15:33:16.846-07:00</updated><title type='text'>Giving away secrets</title><content type='html'>Erich Schubert &lt;a href="http://blog.drinsama.de/erich/en/2006081202-onboard-graphis"&gt;writes&lt;/a&gt; that&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Oh, and I actually doubt that ATI would give away much secrets if it would allow distributing the existing opensource X drivers. It's not as if the specs of their CPU would be a huge surprise to Nvidia. Some actually say nvidia builds the better graphics cards. And Intel does even give away source code. We're not talking about chip design here, or driver optimizations. Just the plain registers and ports.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt; -- note: what follows is just my opinion and I'm wrong on a regular basis, so take it with a grain of salt --&lt;br /&gt;&lt;br /&gt;The problem here is you aren't thinking like a corporation.  As far as I can figure, the corporate view here is that you have two options:&lt;br /&gt;&lt;br /&gt;(a) Keep the secrets you have.  This is the status quo, you know how to make money here, and no-one else can benefit from your secrets even if you yourself can't.&lt;br /&gt;&lt;br /&gt;(b) Give away your secrets.  This always carries a risk that someone else will find a more clever (=profitable) way to use your secrets than you; thus, companies try to avoid this unless they absolutely have to.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I personally agree that the risk to ATI appears small.  However, just to throw out a hypothetical, giving away their register specs would allow other companies to build cards that are register-compatible with ATI's.  (Remember the &lt;a href="http://www.everything2.com/index.pl?node_id=790249"&gt;ne2000&lt;/a&gt;?)  Obviously this would be good for you and me -- but it's almost certain to drive down ATI's profits at least a little by providing more direct competition in the market for graphics cards; thus it's not good for ATI.  This may be a far-fetched or overblown concern, but ATI will need a reason to "go uphill" against it when their current strategy seems to be doing just fine.&lt;br /&gt;&lt;br /&gt;Intel, on the other hand, is in a different situation; as far as I know, they generally are playing catchup in the graphics area to NVIDIA and ATI, and as a result, they have more to gain and less to lose by opening their specs.  [&lt;b&gt;UPDATE&lt;/b&gt;] And as I mentioned in my previous post on this topic, the types of cards Intel sells are probably more interesting to free software users than the cards ATI sells.  (I'm sorry you don't have any Intel cards -- they seem to have come automatically with most of the new computers I've seen lately, so I assumed it was a trend!)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-115542014734865306?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/115542014734865306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/115542014734865306'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/08/giving-away-secrets.html' title='Giving away secrets'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-115540640452191379</id><published>2006-08-12T11:07:00.000-07:00</published><updated>2006-08-12T11:13:24.666-07:00</updated><title type='text'>Explaining Network Neutrality</title><content type='html'>One of the problems with network neutrality is that people outside the technology industry often can't follow the arguments back and forth because of the complexity of the terms involved.  On my vacation last week, I found myself discussing this topic with my ~80-year-old grandparents.  Now, Grandpa and Grandma have no clue about technology, but they aren't dumb; they are both retired educators and follow current events (especially politics) with a strong interest.  In my effort to explain just what the fuss is about, I had a sudden brainstorm and came up with the following analogy, which I post here for anyone who cares to use it:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Imagine that your power company decides that it wanted to open a line of supermarkets.  At the same time, it sends out an announcement that supermarkets (due to their refrigeration requirements) are particularly heavy users of the electrical system, and as a result, the power company will add a 15% surcharge to the power bills of any building that it deems to be a supermarket.  Of course, the power company's own supermarkets are exempt from this fee.  When the existing supermarkets complain, the power company says that they're asking for special treatment and trying to get electricity "for free" and that if they don't like its terms, they should buy their power from someone else.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Obviously this greatly simplifies the technical issues involved, but it's the best illustration of at least one aspect of the problem that I've been able to come up with.  I've enabled comments for this post, so feel free to add your own suggestions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-115540640452191379?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/115540640452191379/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=115540640452191379' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/115540640452191379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/115540640452191379'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/08/explaining-network-neutrality.html' title='Explaining Network Neutrality'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-115540035003106300</id><published>2006-08-12T09:14:00.000-07:00</published><updated>2007-11-20T20:51:46.726-08:00</updated><title type='text'>We aren't ATI's market.</title><content type='html'>Erich Schubert &lt;a href="http://blog.drinsama.de/erich/en/linux/2006081201-ati-linkes-closed-drivers"&gt;noted&lt;/a&gt;  that ATI is holding onto their closed drivers.  While it's unfortunate, I don't think this should be surprising to anyone.  NVIDIA and ATI make their money by selling cards for gamer types, who make an art out of trying to get the latest super hardware to play the newest snazzy games on.  They don't give a hoot about source code access -- after all, they're probably running proprietary games on a proprietary operating system anyway.&lt;br /&gt;&lt;br /&gt;Free software enthusiasts, on the other hand, spend their free time hacking code and so don't have time to play the massive productions the game industry puts out nowadays; frozen-bubble or Wesnoth are about as much gaming as we have time for.  As a result, we can do just fine with a video card capable of displaying Emacs, a couple xterms, and maybe a graphical Web browser -- and the built-in graphics card (usually Intel) on the motherboard is just fine for that.  We also tend not to run Windows or OSX, where 99% or so of graphically intensive games come out, so even if we HAD free time for gaming we wouldn't be able to do it on a free system.&lt;br /&gt;&lt;br /&gt;As a result, while I'd certainly like to have free ATI drivers, I think it's unrealistic to expect them anytime soon.  ATI is a company, not a charity, and they will not provide source code or specs until it will clearly benefit them more than it hurts.  If you don't believe me, try walking into your manager's office and saying "hey, I have a great idea!  Let's give away all our secrets without any clear way to make money off it!" and see how he reacts.  (note that this experiment may not apply to the 1-5% [0] of readers lucky enough to work in academia)&lt;br /&gt;&lt;br /&gt;[0] this statistic determined by the HIGHLY SCIENTIFIC method of picking a small number at random.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-115540035003106300?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/115540035003106300/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=115540035003106300' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/115540035003106300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/115540035003106300'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/08/we-arent-atis-market.html' title='We aren&apos;t ATI&apos;s market.'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-115450136677024136</id><published>2006-08-01T23:43:00.000-07:00</published><updated>2006-08-01T23:49:26.783-07:00</updated><title type='text'>Amazing the things you learn when you fiddle</title><content type='html'>I recently bought a new laptop, specifically a Fujitsu P7120 (based in large part on &lt;a href="http://kitenet.net/~joey/blog/entry/new_laptop.html"&gt;Joey's plug&lt;/a&gt; for it).  I'm generally happy with it, but I haven't been able to get the headphone jack to work.&lt;br /&gt;&lt;br /&gt;Today I had a few minutes and was fiddling around with it, when I noticed that there was an extra column in alsamixer labelled "headphone jack mode".  This isn't a volume bar; it just displayed the text "50".  Just on a whim, I tried hitting "up" on it, and quickly cycled through "80", "Line In", and then "Line Out".  Jackpot!  All of a sudden, sound started piping out of the headphones.&lt;br /&gt;&lt;br /&gt;So, just in case anyone else is puzzling over this problem, make sure you've checked ALL the knobs alsa lets you turn!&lt;br /&gt;&lt;br /&gt;I still wonder why alsa is defaulting to using a headphone jack as a microphone input...but I'm not so curious to, say, stay up even later trying to figure it out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-115450136677024136?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/115450136677024136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/115450136677024136'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/08/amazing-things-you-learn-when-you.html' title='Amazing the things you learn when you fiddle'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-115429116402077385</id><published>2006-07-30T13:12:00.000-07:00</published><updated>2006-07-30T13:26:04.046-07:00</updated><title type='text'>People suck, news at 11</title><content type='html'>Continuing the &lt;a href="http://www.blogger.com/comment.g?blogID=12729767&amp;postID=115397382446371031"&gt;saga of the lost wallet&lt;/a&gt;, it turns out that my uneasy premonitions about "Sidney"'s phone message were entirely correct.&lt;br /&gt;&lt;br /&gt;He called me up &lt;i&gt;at work&lt;/i&gt;, gave me a long spiel about how I should be glad he came from such a "respectful" family, mentioned that "someone" had gone through the wallet and taken the cash, and then asked again if there was a reward.  Rude, I thought, but hey, rewards for wallets aren't unheard-of and he is doing me a favor...so I said, sure, I'll give you $20.  There was a long pause, and then he said "that's really insulting, you know?"  Taken aback, I asked what he was thinking of, and he said that he was thinking of more like a few &lt;b&gt;hundred&lt;/b&gt; dollars.&lt;br /&gt;&lt;br /&gt;A FEW F**ING HUNDRED DOLLARS?&lt;br /&gt;&lt;br /&gt;That isn't quite what I said, I just said "No" and "I don't know what makes you think that's a reasonable amount."  At this point he started asking again about "don't you want your wallet back?" and making vague threats about what would happen if it got into the "wrong" hands.  I made one mistake, raising my bid to $40 (I shoulda just cut him off there), but finally told him I had to get off and get to work.  He wouldn't give me a number to contact him at but said he'd call me later.&lt;br /&gt;&lt;br /&gt;So, at this point it was obvious that a pretty nasty character had my wallet, so I double-checked that all my important cards were cancelled and started ordering duplicates of the remaining ones.  I called my apartment manager (since my provisional license had my home address on it) and warned them to keep an eye out for suspicious people hanging around my apartment, just in case.&lt;br /&gt;&lt;br /&gt;I did try calling the police; however, they were just as useless as you'd expect (considering I didn't know how to get in touch with the wannabe extortionist).  The only thing they could suggest was that I try making arrangements to collect the wallet, then arrange to have a police officer arrest the guy when he showed up.  Given the fact that I have no actual evidence of the extortion, though, I figured the main result would be to leave someone that I already know is a bad character, and who has my personal information and address, a grudge to hold against me.  Not a good long-term move.&lt;br /&gt;&lt;br /&gt;What depresses me most about all this is that "Sidney" is far more representative of the average person than I am, or (I assume) most readers of my blog; and he may very well be better adapted to the world than I am.  People suck, life sucks, and the world sucks; I should be grown-up enough at age 25 to not care by now, but I still do. :-(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-115429116402077385?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/115429116402077385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/115429116402077385'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/07/people-suck-news-at-11.html' title='People suck, news at 11'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-115397382446371031</id><published>2006-07-26T20:53:00.000-07:00</published><updated>2007-06-07T06:08:09.972-07:00</updated><title type='text'>Wallet arghness</title><content type='html'>This morning, when I got up, I couldn't find my wallet.  I had it yesterday when I got on the bus (I pulled it out to pay my fare), and I went straight home from the bus, so I figured I might have left it on the bus.  I called the lost &amp; found office, and they said nothing with my name on it had been turned in to them.&lt;br /&gt;&lt;br /&gt;When I got home I had a message on my answering machine from a guy named "Sidney":&lt;br /&gt;&lt;br /&gt;"Hi, Daniel, my name is Sidney, and I, uh, found your wallet here, and just want to know ... is there a reward for it, or, uh ... you can reach me at (206)*BEEP*"&lt;br /&gt;&lt;br /&gt;So, yay, I get to change my bank card number while hoping that the question above was intended more innocently than it sounded.  And the new card won't arrive until after I leave town for a week, so this should be an interesting vacation (luckily I'm staying with family the whole time so money shouldn't be too much of a problem outside the airports).  Meanwhile, I can see if I need to replace all the less important cards that I didn't get back, or if I can retrieve them from the guy who has the wallet.  Obviously that last bit will require him calling me back and giving his entire phone number.&lt;br /&gt;&lt;br /&gt;The one bright spot is that I just got an official Washington driver's license on Saturday, so my "real" license will hopefully arrive in the mail in the near future...that would be the most painful thing to be missing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-115397382446371031?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/115397382446371031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=115397382446371031' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/115397382446371031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/115397382446371031'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/07/wallet-arghness.html' title='Wallet arghness'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-115206202059321045</id><published>2006-07-16T09:26:00.000-07:00</published><updated>2006-07-16T09:31:06.770-07:00</updated><title type='text'>Meeting the Wisconsin state bird in Washington</title><content type='html'>&lt;big&gt;&lt;b&gt;In Which&lt;/b&gt;&lt;/big&gt; our Intrepid Heroes Scale &lt;i&gt;(or trudge along)&lt;/i&gt; Mountains While Defending Their Precious Bodily Fluids From The Local Fauna.&lt;br /&gt;&lt;br /&gt;This is a continuation of my &lt;a href="http://lambdaman.blogspot.com/2006/07/not-bavaria-but-still-fun.html"&gt;previous post&lt;/a&gt; about how I spent my holiday weekend.  Yes, it took my a while to get around to it, why do you ask?&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;Day 1&lt;/h1&gt;&lt;br /&gt;&lt;br /&gt;On our second day in Leavenworth, we decided to hike up to &lt;a href="http://www.leavenworth.org/trails/hiking/stuartlake.html"&gt;Stuart Lake&lt;/a&gt;.  This is a nine-mile round trip up the side of a mountain, culminating at an alpine lake; we figured it would make a nice site for a picnic.&lt;br /&gt;&lt;br /&gt;The trip up was fairly smooth for about two-thirds of the way, at which point we discovered what we had forgotten in our preparations.  Somehow, the fact that &lt;a href="http://en.wikipedia.org/Mosquito"&gt;mosquitos&lt;/a&gt; can live on a mountain had escaped both of us, and we'd left the bug repellant at home!&lt;br /&gt;&lt;br /&gt;The next couple hours were a nightmare of swatting, itching, and trying to move fast enough to leave the horde of bloodsuckers behind.  We did make it to the lake, but only stayed long enough to take a picture and gobble down a sandwich while doing the Mosquito Dance (where you run in circles while flailing one arm wildly to repel the little nasties).  As soon as we were done, we conceded the field and fled back down the mountain to less infested areas.&lt;br /&gt;&lt;br /&gt;We got back at about 5, ate the remaining sandwich for dinner, and nursed our wounds until we fell asleep.  The whole thing wasn't so bad for me, but Kate seems to be particularly sensitive to mosquitos, and by the time we made it back her whole arm looked like one big bite.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-115206202059321045?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/115206202059321045/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=115206202059321045' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/115206202059321045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/115206202059321045'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/07/meeting-wisconsin-state-bird-in.html' title='Meeting the Wisconsin state bird in Washington'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-115205761768471063</id><published>2006-07-04T16:30:00.000-07:00</published><updated>2006-07-04T17:07:04.953-07:00</updated><title type='text'>Paintings make the room pretty.</title><content type='html'>&amp;lt;rant&amp;gt;&lt;br /&gt;In my last post, I linked to the Wikipedia &lt;a href="http://en.wikipedia.org/wiki/Kitsch"&gt;article&lt;/a&gt; on "kitsch".  I generally use this to describe art that's in egregiously bad taste -- plaster sculptures of women with exaggerated breasts holding beer bottles, animal-shaped clocks whose eyes wobble with the pendulum, etc.  I want to make this clear, because the Kitsch entry in Wikipedia suffers from a case of advanced artistic pinheadism.  In short, their definition of Kitsch reduces to&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;It's pretty and people buy it.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;For instance, Thomas Kinkade (the self-styled "painter of light") is disposed of with the offhand comment that his pictures are&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;scenes of stone cottages, lighthouses, cobble stone streets, rustic villages, and other vistas, with emphasis on the glittery ornamentation in the play of light and natural foliage. His work is meant to be sentimental, patriotic, quaint, spiritual, and inspirational.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;While I'm a bit put-off by Mr. Kinkade's aggressive marketing, the quote above could only be considered a serious insult by people who describe the origins of the scourge of kitsch as follows:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Kitsch appealed to the crass tastes of the newly moneyed Munich bourgeoisie who, like most nouveau riche, thought they could achieve the status they envied in the traditional class of cultural elites by aping, however clumsily, the most apparent features of their cultural habits. ...&lt;br /&gt;&lt;br /&gt;... in being “too beautiful” and democratic it made art look easy, non-involving and superficial. ...&lt;br /&gt;&lt;br /&gt;In some sense the goals of democratization succeeded, and the society was flooded with Academic art, the public lining up to see art exhibitions as they do to see movies today. Literacy in art became widespread, as did the practice of art making, and there was a blurring between high and low culture. ...&lt;br /&gt;&lt;br /&gt;The subjects and images presented in academic art, though original in their first expression, were disseminated to the public in the form of prints and postcards.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;In short, "wasn't art great back when the only folks who could have it were rich aristocrats, back before those grubby &lt;i&gt;ungewisserei&lt;/i&gt; [0] got their grubby hands on it and grubbied it up?"&lt;br /&gt;&lt;br /&gt;I am reminded once more why I never took a single art course in college, and took only one English course (and that to fulfill a degree requirement).  The worlds of "serious" art and literature seem to be about standing around in a circle telling all the other people in the circle how cultured and sophisticated you are, and how intellectually impoverished and shallow all the people &lt;i&gt;outside&lt;/i&gt; the circle are.&lt;br /&gt;&lt;br /&gt;Why are you sophisticated?  Because you said so, and you ought to know.  And be forwarned: any attempt to invoke logic will be refuted with an assertion that our thought systems are inherently socially constructed and there is no absolute truth anyway, except that &lt;i&gt;we&lt;/i&gt; are far more intellectual and sophisticated than &lt;i&gt;you&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;This has gotten a bit long -- but in short, anyone who looks down on another human being because they would rather have &lt;a href="http://www.thomaskinkade.com/magi/servlet/com.asucon.ebiz.catalog.web.tk.CatalogServlet?catalogAction=Product&amp;productId=204279"&gt;this&lt;/a&gt; hanging on their wall than &lt;a href="http://en.wikipedia.org/wiki/Image:PollockTela.jpg" target="_new"&gt;this&lt;/a&gt; has frankly given up any right to be offended by the term "self-important pinhead".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[0] This may not be proper German, but as I am apparently an inferior man-child for not seeing instantly how awful kitsch is, how can I possibly be expected to get any language but my own right anyway?&lt;br /&gt;&amp;lt;/rant&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-115205761768471063?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/115205761768471063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/115205761768471063'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/07/paintings-make-room-pretty.html' title='Paintings make the room pretty.'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-115205362337529953</id><published>2006-07-04T15:15:00.000-07:00</published><updated>2006-07-04T16:12:58.823-07:00</updated><title type='text'>Not Bavaria, but still fun.</title><content type='html'>With today being a federal holiday, Kate and I decided to take a four-day weekend and head to &lt;a href="http://www.leavenworth.org"&gt;Leavenworth&lt;/a&gt;.  This is a little town up in the Cascades that calls itself &lt;q&gt;Washington's Bavarian village&lt;/q&gt;, and seems to be part of the complete Seattle experience -- everyone around here has visited it at least once.  The short description is that while the Bavarian theme is a bit of a gimmick, there's good hiking in the area and some good food (if you don't mind the touristy atmosphere).&lt;br /&gt;&lt;br /&gt;NOTE 1:&lt;br /&gt;&lt;br /&gt;Why is this post written in the present tense?  'cos I felt like it.&lt;br /&gt;&lt;br /&gt;NOTE 2:&lt;br /&gt;&lt;br /&gt;For the convenience and sanity of people reading this on aggregators like Planet Debian, this saga is broken into segments.&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;Day 0&lt;/h1&gt;&lt;br /&gt;&lt;br /&gt;We get a late start leaving Redmond and drive along some pretty spectacular scenery on Highway 2 East ... although after living here for a while, I've become somewhat inured to spectacular scenery.  &lt;q&gt;Another craggy mountain with snow-spotted alpine meadows, thousand-foot waterfalls, and blankets of pine forest?  You woke me up for &lt;i&gt;THAT?&lt;/i&gt;&lt;/q&gt;  But even by the standards of the Pacific Northwest, this is a scenic drive.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Kate has picked out a short hike about halfway to our destination, but when we pull up to the trailhead we learn that a Northwest Forest Pass is required to park.  We decide to cut out that hike and make a note to buy a pass when we get a chance.  Probably they're sold in Leavenworth.  Further on we see a little picnic area with a path going back into the woods.  We decide to stop there for lunch and follow the trail, which turns out to be a pleasant loop through a patch of forest and up to a decent-sized waterfall.&lt;br /&gt;&lt;br /&gt;We arrive in Leavenworth in the afternoon.  The town has done an impressive job of building a city center of &lt;a href="http://en.wikipedia.org/wiki/Half-timbering"&gt;half-timbered&lt;/a&gt; buildings in what looks to me like a reasonably German style (bearing in mind that my last visit to Germany was about ten years ago when I was in high school).  They even have a two- or three-story clock tower.  After checking into the bed-and-breakfast where we're staying, we head downtown to explore.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Leavenworth, at least in the city center, looks very Bavarian from the outside.  It's a little less impressive when you actually go in the buildings.  Most of the shops sell generic American tourist junk -- shirts that say &lt;q&gt;I can only please one person per day.  Today is not your day.  Tomorrow doesn't look good either.&lt;/q&gt;, &lt;a href="http://en.wikipedia.org/wiki/Kitsch"&gt;kitschy&lt;/a&gt; statues (women holding beer tables on their breasts), etc.  However, while I see very little that's recognizably Bavarian in town, there are some stores with nice selections of work by local craftsmen and artists.&lt;br /&gt;&lt;br /&gt;After looking around a bit, we head to the &lt;a href="http://www.andreaskellerrestaurant.com/"&gt;Andreas Keller Restaurant&lt;/a&gt; for dinner.  We have a nice meal of jägerschnitzel, spätzle, red cabbage and knackwurst while listening to (live!) accordian oom-pah.  I am surprised to see the &lt;a href="http://en.wikipedia.org/wiki/Chicken_Dance"&gt;Chicken Dance&lt;/a&gt; mixed in with the rest of the performance, but Wikipedia says that this was composed in Switzerland in 1950s for the accordion under the name &lt;i&gt;Der Ententanz&lt;/i&gt;.  Live and learn.&lt;br /&gt;&lt;br /&gt;After finishing dinner, we walk back to the bed-and-breakfast and get an early sleep.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-115205362337529953?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/115205362337529953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/115205362337529953'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/07/not-bavaria-but-still-fun.html' title='Not Bavaria, but still fun.'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-115119392606277528</id><published>2006-06-24T16:48:00.000-07:00</published><updated>2006-06-24T17:05:26.073-07:00</updated><title type='text'>Seth Crosson, are you out there?  Your mother would like to speak with you.</title><content type='html'>Ever since I hooked up my phone line, I've been getting calls for someone named "Seth Crosson".  The first call was fielded by my answering machine, and I figured it was a wrong number.  The first two calls were from schools, and I figured maybe they just had an old number.  But a few weeks later, I started getting calls from this guy's friends and family, wondering where he had gotten to.  &lt;br /&gt;&lt;br /&gt;Seth, whoever you are, if you by any chance happen to read this, &lt;i&gt;please&lt;/i&gt; call your mother and let her know where you are.  Also, please tell your family what your new number is so they stop calling me and asking for you.  If you give me your new phone number (preferably by calling your old Redmond number), I'll be happy to redirect people to it.&lt;br /&gt;&lt;br /&gt;And, next time that you move, please tell people that you are moving and where you're moving to, so they don't have to call the poor guy who gets assigned your old number.&lt;br /&gt;&lt;br /&gt;Thanks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-115119392606277528?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/115119392606277528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/115119392606277528'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/06/seth-crosson-are-you-out-there-your.html' title='Seth Crosson, are you out there?  Your mother would like to speak with you.'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-115064843947182588</id><published>2006-06-18T09:06:00.000-07:00</published><updated>2006-06-18T09:33:59.503-07:00</updated><title type='text'>Unsubscribing from most Debian lists.</title><content type='html'>After six (seven?) years of being almost continuously subscribed, I have decided to finally remove myself from most Debian mailing lists.  While I don't intend to actually unsubscribe, I even doubt I will continue reading -private.  No, strike that.  I &lt;i&gt;especially&lt;/i&gt; doubt I will continue reading debian-private.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This is not a decision that I wanted to make or took lightly, but two ongoing problems, combined with my own lack of free time, have convinced me that it is the best route:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  (a) Virtually all the traffic on the lists is useless.  I don't think this was the case when I subscribed, but it certainly is now.  The few interesting technical or procedural tidbits that I can find are buried under (and within) piles of messages that are useless flames, off-topic discussions, kooky threads, or mails that combine two or more of the above.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  (b) The tone and content of the lists is increasingly hostile, personal, and aggressive.  Based on what I see on the lists, Debian is not a friendly project these days.  I'm sad to say it, but being able to block the rest of the Project (except bug reports, of course :) ) out will not only increase the time I have for Debian, it will increase my motivation to work on it.  A lot.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  The straw that broke the camel's back here was that after finally getting my Internet access back a couple weeks ago, I decided to catch up on Debian list mail this weekend.  After spending a significant fraction of my free time just wading through the sludge and reading the most useful and interesting-looking of the mail that people had spewed onto the lists, I realized that I would have been far better off doing something more useful, enjoyable, and productive with my time ... like, say, picking lint out of my carpet by hand, or committing Postal Service regulations to memory.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  I'm still of two minds about the whole issue: while I blamed the lists above, there are plenty of major contributors to Debian who have full-time jobs and &lt;i&gt;still&lt;/i&gt; manage to not just read all the garbage on the lists, but actually reply to a lot of it.  So I can't help feeling this is partly due to my own inadequacy or advancing decrepitude (I turn 26 in just a few months; isn't that about when your brain atrophies? ;-) ) -- but regardless, I think that I personally can't justify the "expense" of staying on the lists in terms of the benefits I get from doing so.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-115064843947182588?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/115064843947182588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/115064843947182588'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/06/unsubscribing-from-most-debian-lists.html' title='Unsubscribing from most Debian lists.'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-114792476968504522</id><published>2006-05-17T20:30:00.000-07:00</published><updated>2006-05-17T20:59:29.696-07:00</updated><title type='text'>Still Not Dead Yet</title><content type='html'>If it looks like I've fallen off the 'Net recently, it's because I have.  In addition to the usual problem of having relatively little free time since I started working, I've been spending the last month or so moving into a new apartment.  Much of my free time has been occupied by either planning what to buy and put in my apartment, shopping for stuff to buy and put in my apartment, hauling stuff home from stores into my apartment, and (in the case of &lt;a href="http://www.ikea.com"&gt;IKEA&lt;/a&gt;) assembling the stuff I just bought in my apartment.&lt;br /&gt;&lt;br /&gt;  On top of that, I haven't hooked up an Internet connection yet.  This is partly because I'm dissatisfied with all the available options -- which, in my area, seem to be Verizon and Comcast.  Since I'm not interested in cable TV, the cheapest choice is Verizon, and I just finally got them to officially hook my phone line up.  This was a more complicated process than you might think; they require you to fax them both sides of your driver's license before they'll activate a phone service (presumably to make the NSA's job a bit easier as they snoop on your traffic).  It also looks like I probably can't get DSL service until I receive my first phone bill and get a phone number I can enter into the DSL request form on Verizon's website, so I won't be properly connected for another few weeks.&lt;br /&gt;&lt;br /&gt;  I think that Kate wants me to get off the computer so she can use the internet, so I'll cut off here.  More later, maybe.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-114792476968504522?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/114792476968504522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/114792476968504522'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/05/still-not-dead-yet.html' title='Still Not Dead Yet'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-114332414919212949</id><published>2006-03-25T13:45:00.000-08:00</published><updated>2006-06-05T20:40:21.236-07:00</updated><title type='text'>No More Retail Electronics Stores</title><content type='html'>So, to wrap up the hardware saga I posted in the last few weeks, my memory chips finally arrived yesterday (after being delayed in Oregon for three days by "inclement weather").  I swapped them for the bad ones in about ten minutes, turned the computer on, and it worked.  After I played a couple missions in Homeworld 2, I rebooted and let the memory test run all night, just to be totally sure.  No problems :-).&lt;br /&gt;&lt;br /&gt;Sadly, we seem to have lost the receipt from when we returned the first bad batch of RAM, so Fry's may get to keep Kate's money.  Regardless, they've certainly managed to lose one or two customers, at least when it comes to computer hardware.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-114332414919212949?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/114332414919212949/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=114332414919212949' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/114332414919212949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/114332414919212949'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/03/no-more-retail-electronics-stores.html' title='No More Retail Electronics Stores'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-114274706702996793</id><published>2006-03-18T21:15:00.000-08:00</published><updated>2006-03-18T22:15:48.446-08:00</updated><title type='text'>Memcheck good; Fry's not so good</title><content type='html'>So, after finding a CD that had memcheck on it, I ran a memory test on the new system I had assembled but couldn't get working.  Unsurprisingly, it produced a bunch of errors, especially in test 8.  I tested the memory modules one at a time, and confirmed that one of them reliably failed test 8 with, while the other survived multiple passes of memcheck's whole arsenal of tests without skipping a beat.&lt;br /&gt;&lt;br /&gt;OK, no biggie; I got a bad RAM chip, I'll return it.  So we take it back to Fry's, I explain that I ran a memory checker on one of the chips and it came up bad (I even helpfully gave them a note indicating which of the two seemed to be the problem), and asked to exchange it for a new chip.  The customer service guy vanishes, then comes back a while later with a different chip in a box.  As we're preparing to leave, Kate notices that the "new" box is opened.  "Why's that?" she asks.  "Oh, testing," the customer service guy says.&lt;br /&gt;&lt;br /&gt;Testing.  That's good, right?  So we shop a little, take the chips back, and I plug them in.  I figure, hey, never hurts to be too careful, and boot up memcheck.  BAM!  Within half a second the screen turns red with errors.  In comparison, with the first set of chips I had to run the tester for up to fifteen minutes before I got a test failure.  Trying the chips individually, I discover that 300MB on one is just (as far as I could tell) gone.  It fails every single test.  The other one survives the first few checks, but fails test 8 just like the other bad chip I had.  [&lt;b&gt;UPDATE&lt;/b&gt;: it's actually not that bad; it does seem to have problems, but it doesn't fail on every single run of test 8, and it was able to run the Kororaa live CD]&lt;br /&gt;&lt;br /&gt;Now, as I see it, we have the following possibilities:&lt;br /&gt;&lt;br /&gt;  (a) My luck sucks and I just got three bad chips in a row.&lt;br /&gt;&lt;br /&gt;    Possible, but I've bought at least a half dozen memory chips in the past (not counting ones that came in preassembled systems) and I'm pretty sure this is the first, maybe second time I've seen a bad one.  Three in a row?  That's ridiculous.&lt;br /&gt;&lt;br /&gt;  (b) I screwed up and blew out the chips while installing them.&lt;br /&gt;&lt;br /&gt;    Unlikely for the same reason as (a).  I may be shaky on some hardware stuff, but I know how to install DIMM chips.  Killing one might be in the realm of possibility; killing three out of four?  Don't think so.&lt;br /&gt;&lt;br /&gt;  (c) The chips aren't compatible with my motherboard.&lt;br /&gt;&lt;br /&gt;    The chips are listed as being DDR400, which ought to be perfectly compatible with the motherboard.  They are installed in the proper configuration (according to the motherboard's manual); besides, one memory chip worked just fine.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  Assume that (b) and (c) are indeed false: the chips are really bad and I didn't destroy them.  This, combined with the fact that Fry's "testing" didn't catch the blatantly obvious problems with one of the new chips, make me wonder if&lt;br /&gt;&lt;br /&gt;  (d) Fry's decided to save costs by handing me a pair (maybe even two pairs) of chips that another customer had returned, on the theory that returns are on average spurious.&lt;br /&gt;&lt;br /&gt;  The main problem with this theory is that I don't see why they wouldn't have resealed the package; maybe they just suck at testing memory or didn't bother to.  On the other hand, I have seen a number of complaints online about Fry's and other big retailers engaging in this practice. (e.g., Google for "Fry's restock")&lt;br /&gt;&lt;br /&gt;Either way, whether it's deceptive practices or just plain incompetence, I'm afraid this hasn't left a particularly good taste in my mouth about Fry's, and I'll probably just try to get a refund and buy the memory elsewhere.  The only downside is that "elsewhere" more or less means "online", which means no instant gratification.  However, since "instant gratification" in this case has been more like "instant non-gratification", I'm willing to live with that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-114274706702996793?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/114274706702996793/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=114274706702996793' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/114274706702996793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/114274706702996793'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/03/memcheck-good-frys-not-so-good.html' title='Memcheck good; Fry&apos;s not so good'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-114270593731561372</id><published>2006-03-18T10:05:00.000-08:00</published><updated>2006-05-17T22:01:17.766-07:00</updated><title type='text'>Windows stupidities</title><content type='html'>As I've had to use Windows on a daily basis, I've found that I am no longer able to maintain my air of detached tolerance for the foibles of the system.  In fact, I'm starting to get really infuriated with the utter boneheadedness of so many facets of it.  Not so much things that are broken, as things that are done badly, and done so in the face of widespread examples of how to do it right.&lt;br /&gt;&lt;br /&gt;Here are two simple examples that are emblematic of what Windows users have to suffer through.&lt;br /&gt;&lt;br /&gt;(a) Mandatory file locks.&lt;br /&gt;&lt;br /&gt;On Windows, &lt;i&gt;every&lt;/i&gt; access to a file, by default, acquires a mandatory lock on it.  Want to recompile the program you're working on?  Sorry, you have to track down and kill all its running instances.  Want to read that file on the network server?  Sorry, you'll have to run around the office and ask all the people using it to close it.&lt;br /&gt;&lt;br /&gt;Last week I got an email asking me to unlock a directory on our local fileserver so it could be renamed.  It turned out that I was running an acroread process to view a PDF file...and that locked the directory from being renamed.  Because, of course, the universe would implode if someone were to rename a file I had already loaded into memory.  This is, however, better than how shared libraries are treated; trying to register a new version of a shared library with the system (the Windows version of ldconfig) will &lt;i&gt;silently fail&lt;/i&gt; if programs have the old version mapped into memory.  WTF?  No, really, WTF?&lt;br /&gt;&lt;br /&gt;Windows users get around this by having tools to find out which processes have a file open so they can terminate them with extreme prejudice.  This is considered normal and acceptable behavior for a computer in the Windows universe.  After all, in the real world two people can't use the same document at once, so why should they be able to do so on a computer?&lt;br /&gt;&lt;br /&gt;(b) C# events.&lt;br /&gt;&lt;br /&gt;They've been invented many times.  Signals, events, hooks, whatever you want to call them, they're collections of function objects that are invoked when some particular condition occurs.  It's a great way to make it easy to connect together objects that don't know about each other, they're simple enough that your average CS sophomore could implement them in a half hour, and the concept is so obvious (besides having dozens of examples of working and deployed implementations) that there's no way to screw it up, right?&lt;br /&gt;&lt;br /&gt;Wrong.&lt;br /&gt;&lt;br /&gt;Now, C# is generally a somewhat clunky language, but this is nothing to do with that (I am not, for instance, surprised that it's cumbersome to bind extra parameters to an event in a language that has little support for higher-order programming anyway).  No, this is one of those utter idiocies that just make you scratch your head and go &lt;i&gt;what the *@&amp;# were they on when they did that&lt;/i&gt;?  You see, when you call an event with no attached listeners, C# &lt;b&gt;throws an exception&lt;/b&gt;.  Just, you know, as a friendly way of letting you know that you didn't connect to that event.&lt;br /&gt;&lt;br /&gt;But wait!  It gets better!  In order to test whether the event has any connected delegates (the Microsoft term for a function object), you ... &lt;i&gt;compare it to the null pointer&lt;/i&gt;.  Yes, that's right.  Every time you call an event, you have to do this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;if(Event != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Event();&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;...because, of course, an empty collection of events is &lt;i&gt;clearly&lt;/i&gt; the same thing as a nonexistant object.&lt;br /&gt;&lt;br /&gt;I really wish I could be a fly on the wall at the meeting where this was decided.  My imagination supplies a scene along these lines:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;b&gt;Scene:&lt;/b&gt; &lt;i&gt;A smoke-free office somewhere deep in the sterile labyrinth of the Microsoft campus&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Programmer 1:&lt;/b&gt; "...and we call this bold new innovation '&lt;i&gt;events&lt;/i&gt;'!  It's a way for you to perform method calls without knowing which method you're calling.  We've found that it's amazingly useful when doing UI programming.  I'm sure that introducing this new idea to the world will be yet another chapter in the Microsoft story of advancing technology!"&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Programmer 2:&lt;/b&gt; "Have you checked the corner cases?  What happens if there is no method available to call?"&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Programmer 1:&lt;/b&gt; "Oh, of course!  In that case, the list of methods is null, so we throw a NullPointerException.  We thought about adding an IsEmpty property, but who would want to look up properties on the null pointer?  Besides, hardly anyone will ever want to create an event that might not get connected to."&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Programmer 2:&lt;/b&gt; "Uhhh, sure, that makes sense to me."&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;...!!!?!?!?!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-114270593731561372?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/114270593731561372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=114270593731561372' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/114270593731561372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/114270593731561372'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/03/windows-stupidities.html' title='Windows stupidities'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-114266706352208349</id><published>2006-03-17T22:58:00.000-08:00</published><updated>2006-06-24T11:03:21.210-07:00</updated><title type='text'>So close, yet so far away...</title><content type='html'>So, thanks to Marc's helpful advice &lt;a href="http://lambdaman.blogspot.com/2006/03/i-hate-hardware-redux.html"&gt;yesterday&lt;/a&gt;, I took another look at my power supply, and lo and behold, there was a &lt;i&gt;second&lt;/i&gt; four-pin power cord that I hadn't seen!&lt;br /&gt;&lt;br /&gt;Allow me to explain.  In my previous post, I mentioned that I had been doing something "wrong" with the power cable.  You see, the case we picked out (an Antec Sonata) has a 24-pin power cable of which 4 pins can detach for older systems.  At first, I misread the manual and thought this was for &lt;i&gt;newer&lt;/i&gt; systems, so I detached it and plugged it into the handy 4-pin plug next to the CPU.  Doh.  Having corrected that (without the extra 4 pins in the main plug, not even the fans turned on), I was under the further mistaken impression that the 4-pin plug on the motherboard was the backwards-compatibility plug.  I did actually check for an extra 4-pin PSU connector, but I must have overlooked the one that existed.&lt;br /&gt;&lt;br /&gt;In my defense, here's what the manual states about the power connector:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;This motherboard provides two power connectors to connect ATX12V power supplier.&lt;br /&gt;&lt;br /&gt;NOTE: This 24-pin power connector "ATXPWR1" is compliant to the former 20-pin type.  Pay attention to the orientation when attaching the power cord.  (Pin-11, 12, 23, and 24 should be left un-connected).&lt;br /&gt;&lt;br /&gt;Note: It is recommended to connect to a power with 350W, 20A +5VDC capacity at least for heavily loaded system, and a 2A +5VSB capacity for supporting wake-up features.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Not exactly crystal-clear on what needs to be connected under what circumstances.  The case manual is at least correct if you follow along carefully, and they even found someone who can speak the language.  Unfortunately, this section is phrased in a way that's highly prone to misunderstandings, particularly if you have an incorrect idea lodged in your head to start with:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Connect the 24-pin Main Power Connector and the 4-pin +12V connector to your motherboard as needed.  If your motherboard uses a 20-pin connector, detach the 4-pin attachment on the 24-pin power connector.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;You have to read that quite closely to realize that there are &lt;i&gt;two&lt;/i&gt; 4-pin connectors involved!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Anyway, so I can actually get the machine to post and boot.  Unfortunately, it's highly unstable once it does boot.  It runs for up to several minutes, but then exhibits various sorts of erratic behavior: freezing, spontaneous reboots, random error messages, that sort of thing.  I've made sure all the cords are plugged in tightly and reseated a couple components (particularly the memory); about the only thing I haven't checked is the CPU+heatsink mess, which would be a real pain to disassemble and re-assemble.&lt;br /&gt;&lt;br /&gt;Still, it's nice to make some progress.  Maybe tomorrow I'll discover some other cable I forgot to plug in that will make everything work (hey, I can dream).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-114266706352208349?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/114266706352208349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=114266706352208349' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/114266706352208349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/114266706352208349'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/03/so-close-yet-so-far-away.html' title='So close, yet so far away...'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-114257654640465080</id><published>2006-03-16T21:54:00.000-08:00</published><updated>2006-03-16T22:30:45.636-08:00</updated><title type='text'>I Hate Hardware Redux</title><content type='html'>After my &lt;a href="http://www.blogger.com/comment.g?blogID=12729767&amp;postID=112831483885829615"&gt;last experience&lt;/a&gt;, you'd think I'd have learned.  But nope, when my girlfriend needed a new desktop system, I enthusiastically offered to build one for her.  Hey, this time it's desktop hardware, and I know desktop hardware, right?  I built my last machine myself, and I've replaced a couple motherboards and done various other work on computers since then.&lt;br /&gt;&lt;br /&gt;Well, it seems there were a few changes since my last computer.  First of all, there's the whole business of heatsinks.  I don't remember spending any time on the heatsink last time around.  I suppose this is because it was pre-attached to the chip or because the assembly process was "place the heatsink on top of the CPU", but I don't remember which.  For the Athlon 64s, the heatsinks are so ginormous that you couldn't place the CPU into its slot if it was attached to the heatsink.  So there's no option but for them to ship the two separately and have the user assemble them.&lt;br /&gt;&lt;br /&gt;Problems?  Well, consider the documentation.  The store sold us a supposedly complete CPU box packaged by AMD which, when I opened it, contained a stern warning not to attach the heatsink without first applying a thermal material.  Contradicting this, though, was the fact that there was something that looked suspiciously like thermal material already on the heatsink, and after quite a bit of research I decided that the warning was for people who want to overclock their systems or replace the stock thermal compound.  Nowhere in the documentation does it say whether the heatsink comes pre-treated with thermal compound, though, and since I have no desire to let the magic smoke out, I wasted a lot of time checking up on this.&lt;br /&gt;&lt;br /&gt;A second problem with the documentation is that it suffers from severe Lowest Common Denominator syndrome: the installation instructions are entirely word-free.  For simple purposes this might suffice, but it took me a lot of squinting and several incorrect tries to figure out WTF the diagrams were telling me to do; in fact, I didn't really figure out what to do until I found an annotated version online with actual words.  AMD, there's a reason we quit using cave paintings and invented written language.  Please use the stuff, it'll make the rest of us much happier.&lt;br /&gt;&lt;br /&gt;On to the practical problems: it's apparently necessary to attach the heatsink so tightly that you need a latching mechanism the size of Wyoming to hold it onto the motherboard, and actually activating it seems to take several metric tons of force.  OK, I exaggerate, but just this step (attaching the heatsink assembly to the CPU) took me at least an hour of prying at the latch mechanism to lock it down.  In fact, I didn't finish until I finally gave up using my fingers and used a screwdriver to apply a good portion of my weight.  Predictably, of course, the screwdriver slipped as I secured the latch, bouncing off the motherboard.  More on that in a moment.&lt;br /&gt;&lt;br /&gt;The motherboard (an Abit K8N) had better documentation than the CPU, but not by much (this is apparently a pattern with computer components that most consumers never mess with).  I had to make educated guesses about the orientation of several connectors, especially some of the case connectors, and it took me at least a dozen reads to understand what I was doing wrong with the power cable.&lt;br /&gt;&lt;br /&gt;Once I got all my initial stupidity worked out, I flipped the switch and watched some of the fans turn on and the hard drive spin up...and that was it.  Nothing.  Nada.  No beeps.  No POST.  Not even a blank video signal (although the video card's fan runs just fine).&lt;br /&gt;&lt;br /&gt;So, my best guess is that I killed the motherboard dead with my screwdriver, which means I get to go buy a replacement and install &lt;i&gt;it&lt;/i&gt;.  And, of course, disassemble all the stuff I carefully assembled already.  Including the CPU assembly.  And the thermal material on that probably won't be good any more, so I'll have to replace it with what's left over from when I rebuilt my laptop.  And there's always the possibility that it's actually the CPU that's dead (although I can't imagine why)...in which case I could waste a lot of time and effort replacing the motherboard needlessly.  Blah.&lt;br /&gt;&lt;br /&gt;I begin to think that it might be worthwhile to pay the store to install the critical components for me, or even just buy from a real PC vendor.  At least then I'd avoid wasting my time and (presumably) get my money back if they screwed up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-114257654640465080?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/114257654640465080/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=114257654640465080' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/114257654640465080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/114257654640465080'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/03/i-hate-hardware-redux.html' title='I Hate Hardware Redux'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-114028320252916117</id><published>2006-02-18T09:08:00.000-08:00</published><updated>2006-02-18T09:20:02.550-08:00</updated><title type='text'>Windows in 1998</title><content type='html'>In response to &lt;a href="http://www.raspberryginger.com/jbailey/weblog/index//foryourgood-2006-02-18-10-45.html"&gt;Jeff Bailey's blog post&lt;/a&gt;, "David" wrote:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Surely the answer is in the question. Linux is at the state of Windows in 1997 or 1998. So why would users go back almost a decade?&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The last time I used Windows for much was in 1998.  Of course, to actually get paid for my work I had to agree to work on Windows again, full-time.  After a month and a half it seems to me that aside from crashing less, &lt;i&gt;Windows&lt;/i&gt; is at the state of Windows in 1998.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-114028320252916117?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/114028320252916117/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=114028320252916117' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/114028320252916117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/114028320252916117'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/02/windows-in-1998.html' title='Windows in 1998'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-114028253035623522</id><published>2006-02-18T09:04:00.000-08:00</published><updated>2006-02-18T09:08:50.426-08:00</updated><title type='text'>Arguments that are difficult to refute.</title><content type='html'>I was recently discussing the merits of free vs not-free software with one of my coworkers, when he pointed out that my position was self-defeating, since without non-free software programmers like us would be unemployed and broke in Greenland.  Well, he didn't add "in Greenland", but it did a pretty good job of shutting me up anyway.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-114028253035623522?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/114028253035623522/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=114028253035623522' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/114028253035623522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/114028253035623522'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/02/arguments-that-are-difficult-to-refute.html' title='Arguments that are difficult to refute.'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-113858231214714903</id><published>2006-01-29T12:24:00.000-08:00</published><updated>2006-03-09T20:15:26.893-08:00</updated><title type='text'>How much speed are you willing to give up for pretty code?</title><content type='html'>After experimenting a bit with Haskell and using it for some toy projects, I decided to see if there was any chance it could be used for a non-toy task; i.e., one where it might one day be necessary to actually have fast code. As a proxy for this, I decided to try a very simple task: counting the number of lines in a file. As input, I generated a file with a million lines of random data and an average of 40 bytes per line; all the Haskell programs were compiled with the current GHC in Debian unstable and with optimizations enabled.&lt;br /&gt;&lt;br /&gt;The baseline is, of course, our friend "wc":&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;real    0m0.084s&lt;br /&gt;user    0m0.043s&lt;br /&gt;sys     0m0.040s&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;(this and all other timing data was taken after "cat /tmp/testwc.txt &gt; /dev/null" to ensure that the file was cached) Now, it's probably too much to hope that a Haskell program will run as fast as a C program does, since the C program can run in a tight loop. But it seems reasonable that it should be possible for Haskell to be competitive with the trivial Python implementation of this program -- after all, Python is interpreted and Haskell is compiled.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;import sys&lt;br /&gt;n = 0&lt;br /&gt;for line in sys.stdin:&lt;br /&gt;   n += 1&lt;br /&gt;print n&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Running this simple Python program under "time" produces the following statistics, a bit less than 10 times slower than the C version:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;real    0m0.698s&lt;br /&gt;user    0m0.643s&lt;br /&gt;sys     0m0.050s&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The trivial Haskell program to count the lines of its input is:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;main = do c &lt;- getContents ; print $ length $ lines c&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note that this is basically identical to the Python program, but expressed in a functional style.  Pretty, but how does it stack up?&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;real    0m6.744s&lt;br /&gt;user    0m6.426s&lt;br /&gt;sys     0m0.213s&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;OW! Ten times slower than the Python code, and a good 80 times faster than "wc"! The gap can be lowered to "only" 50 times with the following program --&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;do c &lt;- getContents; print $ length $ elemIndices '\n' c&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;-- but surely it's possible to do better. I'd expect that the expense here is in the use of lazy streams for IO; eliminating them gives us the following code:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;wc :: Handle -&gt; IO Int&lt;br /&gt;wc h = do a &lt;- mallocArray bufSize :: IO (Ptr Word8)&lt;br /&gt;          loop a 0&lt;br /&gt;    where loop a n = do amt  &lt;- hGetBuf h a bufSize&lt;br /&gt;                        elts &lt;- peekArray amt  a&lt;br /&gt;                        (if amt == 0&lt;br /&gt;                         then return n&lt;br /&gt;                         else loop a $! n + nlCount elts)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;At this point, we're basically using Haskell as a (bad) imperative language. This function allocates a buffer, repeatedly reads into it, and counts the number of newlines in the buffer (I dropped some auxillary code to keep the post short). The $! is important; without it, even though this routine is tail-recursive, Haskell will still allocate an unbounded amount of memory to store the return value. (because, of course, it's terribly important to remember that you're &lt;i&gt;actually&lt;/i&gt; returning "1+2+3", not "6")&lt;br /&gt;&lt;br /&gt;So, how does this unreadable, hand-optimized version of the code perform?&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;real    0m1.980s&lt;br /&gt;user    0m1.757s&lt;br /&gt;sys     0m0.094s&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That's right -- I've eliminated most uses of higher-level functional techniques, and the Haskell version is &lt;i&gt;still&lt;/i&gt; two times slower than an ultra-high-level interpreted language, while also being uglier and harder to read!  Ouch.  It appears the old performance albatross of functional languages is not quite dead yet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-113858231214714903?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/113858231214714903/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=113858231214714903' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/113858231214714903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/113858231214714903'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/01/how-much-speed-are-you-willing-to-give.html' title='How much speed are you willing to give up for pretty code?'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-113652127163713122</id><published>2006-01-05T20:11:00.000-08:00</published><updated>2006-01-05T20:22:50.180-08:00</updated><title type='text'>Gainful employment rules</title><content type='html'>In December or so, I finally got offered a job with a small software company based in Seattle, starting on January 3rd (Tuesday). This means that I have income again (yay) and I have health insurance for the first time since September (more yay), but it does also mean that my time to work on free software, and Debian, and my blog, will be pretty limited, especially for the next few months.&lt;br /&gt;&lt;br /&gt;Speaking of which, I am still looking for someone else to work with me on &lt;a href="http://people.debian.org/%7Edburrows/aptitude.html"&gt;aptitude&lt;/a&gt;, particularly as I'd like to spend my no-longer-copious free time working on other stuff in a language that doesn't suck (probably &lt;a href="http://www.haskell.org"&gt;Haskell&lt;/a&gt;).  Any vic^H^H^Hvolunteers?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-113652127163713122?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/113652127163713122/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=113652127163713122' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/113652127163713122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/113652127163713122'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2006/01/gainful-employment-rules.html' title='Gainful employment rules'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-113419612848777120</id><published>2005-12-09T22:28:00.000-08:00</published><updated>2005-12-09T22:28:48.496-08:00</updated><title type='text'>Legibility, A Brief Thought Regarding</title><content type='html'>On a lot of web sites, the &lt;q&gt;printable version&lt;/q&gt; link should be relabeled &lt;q&gt;legible version&lt;/q&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-113419612848777120?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/113419612848777120/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=113419612848777120' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/113419612848777120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/113419612848777120'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2005/12/legibility-brief-thought-regarding.html' title='Legibility, A Brief Thought Regarding'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-113347087022055877</id><published>2005-12-01T12:43:00.000-08:00</published><updated>2005-12-01T13:02:30.710-08:00</updated><title type='text'>Linguistic Contortions</title><content type='html'>I thought I had seen everything when it came to ways of resolving the problem of gender-specific pronouns in English.  But on the way back from Wisconsin yesterday, I read a copy of David Brin's &lt;i&gt;Sundiver&lt;/i&gt; (otherwise an interesting story) and was proved wrong.&lt;br /&gt;&lt;br /&gt;Usually the problems you run into with English revolve around the pronoun &lt;q&gt;he&lt;/q&gt;: its use in a gender-ambiguous context is disputed and there are various ways of avoiding it.  The word &lt;q&gt;man&lt;/q&gt; has similar problems, although it's a lot easier to find acceptable gender-neutral replacements.  But in this story, Brin actually used &lt;q&gt;man&lt;/q&gt; in situations where the person indicated was &lt;i&gt;known&lt;/i&gt; to be female!  This leads to such eye-popping lines as: &lt;blockquote&gt;He took her arm and introduced her to Fagin and Jacob.&lt;br /&gt;&lt;br /&gt;&lt;q&gt;Sophonts, this is Helene deSilva, Confederacy Commandant here on Mercury, and my right-hand man. ...&lt;/q&gt;&lt;/blockquote&gt;And if that doesn't strike you as odd, here's my personal favorite: &lt;blockquote&gt;Occasionally a man, male or female, would lean forward and peer at some detail on a screen, ...&lt;/blockquote&gt;Ow!  I had to read that sentence three times before I was sure I hadn't mistaken the words.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-113347087022055877?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/113347087022055877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=113347087022055877' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/113347087022055877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/113347087022055877'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2005/12/linguistic-contortions.html' title='Linguistic Contortions'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-113289095045670721</id><published>2005-11-24T19:21:00.000-08:00</published><updated>2005-11-24T19:55:50.476-08:00</updated><title type='text'>Music for everyone</title><content type='html'>Several years ago (it seems like more than three) I was a student at Brown University.  In addition to studying computer science and mathematics, I also took a bunch of courses in the music program, including three years of piano lessons.  When I graduated, I gave a recital for friends and family, plus any members of the public who happened to wander in (not many did).  And, this being the 21st century, we recorded it and I got a CD of the recording.  I edited it, split it into tracks, and handed some copies out to my friends and professors as a going-away present.&lt;br /&gt;&lt;br /&gt;Now I'm no longer a student of any sort, and Brown seems a lifetime away, but the music is still sitting on my hard drive.  I've always meant to make it available for download, but I couldn't figure out how to get past technical issues of space or bandwidth.  A few days ago, though, I had a rather belated bright idea: maybe the Creative Commons project would have links to places where you can host your music for free.  Lo and behold, it turns out that the Internet Archive lets anyone upload audio to their server!  Better yet, they're even willing to store lossless encodings -- more than willing, actually; FLAC is the preferred encoding of uploads.&lt;br /&gt;&lt;br /&gt;So, to make a long story short, click &lt;a href="http://www.archive.org/audio/audio-details-db.php?collection=opensource_audio&amp;collectionid=senior-recital"&gt;here&lt;/a&gt; to hear my bad piano playing. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-113289095045670721?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/113289095045670721/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=113289095045670721' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/113289095045670721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/113289095045670721'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2005/11/music-for-everyone.html' title='Music for everyone'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-113288515362179433</id><published>2005-11-24T18:15:00.000-08:00</published><updated>2006-06-05T20:47:37.966-07:00</updated><title type='text'>Lentil-based protesters</title><content type='html'>NPR just mentioned that some protesters camped outside Bush's ranch are having lentil soup and rice for Thanksgiving &lt;q&gt;to show their solidarity with the Iraqi people&lt;/q&gt;.  Which I found amusing to listen to while eating my evening ration of lentil soup.  Here I thought I was just a cheapskate, when all along I've been participating in superficial solidarity with the bombed-out people of Iraq! :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-113288515362179433?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/113288515362179433/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=113288515362179433' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/113288515362179433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/113288515362179433'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2005/11/lentil-based-protesters.html' title='Lentil-based protesters'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-113281689514862479</id><published>2005-11-23T23:19:00.000-08:00</published><updated>2006-07-16T09:00:54.253-07:00</updated><title type='text'>Thread pattern recognition</title><content type='html'>After reading the dpkg-sig thread, I finally realized that I could have saved a lot of my time by I taking Joey Hess's advice on &lt;a href="http://kitenet.net/~joey/blog/entry/thread_patterns-2005-10-27-00-53.html"&gt;thread patterns&lt;/a&gt; and deleting or at least ignoring most of its subthreads.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-113281689514862479?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/113281689514862479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=113281689514862479' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/113281689514862479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/113281689514862479'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2005/11/thread-pattern-recognition.html' title='Thread pattern recognition'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-113256103375600999</id><published>2005-11-21T09:15:00.000-08:00</published><updated>2006-11-16T18:08:09.826-08:00</updated><title type='text'>A type-system hack</title><content type='html'>&lt;b&gt;WARNING&lt;/b&gt;: nothing in this post has been implemented or tested, except &lt;i&gt;maybe&lt;/i&gt; at a minimal proof-of-concept level ("it compiles!").  It's just some musings on how you can make the computer do your work for you.&lt;br /&gt;&lt;br /&gt;I was reading a &lt;a href="http://www.joelonsoftware.com/articles/Wrong.html"&gt;defense of Hungarian notation&lt;/a&gt; when I started to get a familiar notion tickling the back of my brain.  The author was explaining that the original idea behind Hungarian was not to replicate type information in variable names, but rather to include some sort of &lt;i&gt;usage&lt;/i&gt; information: one example would be giving a string value holding a value that is untrusted the name &lt;tt&gt;utName&lt;/tt&gt;.  While it's more reasonable than &lt;tt&gt;lpschwzMyVariable&lt;/tt&gt;, this suggesion made me suspicious that the author was really hacking around suckiness in the C language.&lt;br /&gt;&lt;br /&gt;Tagging values with usWhatever and then verifying that you never mix usBlah with Blah isn't just tedious and error-prone, it smells a lot like doing work by hand that the computer ought to do for you.  It seemed to me that it ought to be possible to "tag" unsafe values at the type level and let the language's type-checker sort things out.  The simple approach is of course to define something like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;newtype Unsafe t = Unsafe t&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;NB: I'm using Haskell because it was the first language that sprang to mind when I thought "type system hack".&lt;br /&gt;&lt;br /&gt;This &lt;tt&gt;newtype&lt;/tt&gt; declaration lets you attach an &lt;tt&gt;Unsafe&lt;/tt&gt; tag to any type.  Presumably the type signatures of routines that return untrusted data (such as a hypothetical &lt;tt&gt;getHTMLFormValue&lt;/tt&gt; or a routine to retrieve previously entered form values from a database, if they aren't sanitized first) should be modified; for instance, if the signature of &lt;tt&gt;getHTMLFormValue&lt;/tt&gt; was&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;getHTMLFormValue :: HTMLForm -&gt; String -&gt; String&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;it should instead read&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;getHTMLFormValue :: HTMLForm -&gt; String -&gt; Unsafe String&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;To create a new &lt;tt&gt;Unsafe&lt;/tt&gt; value you simply apply the &lt;tt&gt;Unsafe&lt;/tt&gt; constructor to the value:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;getHTMLFormValue = Unsafe (oldGetHTMLFormValue)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;To unwrap &lt;tt&gt;Unsafe&lt;/tt&gt;s you use pattern-matching:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;let (Unsafe unwrapped) = wrapped in ...&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So, this sort of works, but it's unsatisfying on several levels:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;It allows the creation of types such as &lt;tt&gt;Unsafe Unsafe Integer&lt;/tt&gt; and even &lt;tt&gt;Unsafe [Unsafe Integer]&lt;/tt&gt;.  If a value is already unsafe, how can it be "more unsafe"?  And what in the world is an unsafe list, or an unsafe list of unsafe values?&lt;br /&gt;&lt;br /&gt;Unfortunately, this is probably a limitation that any scheme that relies on type-tagging will have.  You can get around it by either explicitly defining each new unsafe type:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;newtype UnsafeString = Unsafe String&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This is arguably a good idea anyway, since virtually all unsafe values (in the sense the previously linked article mentiones) are likely to be strings, and as I note later, it's not clear how to "sanitize" a non-string.  OTOH, placing unnecessary type restrictions feels un-Haskellish to me, and it seems likely that you can trust the programmer not to pile up &lt;tt&gt;Unsafe&lt;/tt&gt;s.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;This scheme makes it very tempting to strip off the &lt;q&gt;unsafeness&lt;/q&gt; of a value and lose the fact that you did so.&lt;br /&gt;&lt;br /&gt;Since the only way to strip off unsafeness is via pattern-matching, it seems to me that it would be tempting to pattern-match away the unsafeness in function declarations:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;foo (Unsafe x) = ...&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This may be just fine, but my preference would be to forbid pattern-matching altogether (by not exporting the constructor directly to other modules; just export a normal function that constructs an &lt;tt&gt;Unsafe&lt;/tt&gt; value) and instead providing two routines to remove unsafety:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;escapeData :: Unsafe t -&gt; t&lt;br /&gt;unsafeExtractRawData :: Unsafe t -&gt; t&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The first routine encodes the data into a "safe" form, while the second simply fetches the wrapped value:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;unsafeExtractRawData (Unsafe x) = x&lt;br /&gt;&lt;br /&gt;foo x = doSomeStuffWith (unsafeExtractRawData x)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The rationale here is twofold: first, by giving the dangerous extraction routine a scary and hard-to-type name, you remind yourself to think twice before invoking it (cf &lt;tt&gt;unsafePerformIO&lt;/tt&gt;); second, you can easily audit all the locations where the unsafety is "stripped away" with a textual search.&lt;br /&gt;&lt;br /&gt;There are some issues involving the safe encoding -- you probably ought to make a typeclass of things that can be safely encoded from an Unsafe value; not too hard and this entry is already too long.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;The final issue involves manipulation of Unsafe values.  So far you can pack and unpack &lt;tt&gt;Unsafe&lt;/tt&gt;s; however, this seems like it would get a bit annoying if you had to do any significant operations on them.  For instance, searching in an unsafe string for a substring seems like it would be a pain and a bit error-prone (since you'd have to remember to wrap the string back up in an &lt;tt&gt;Unsafe&lt;/tt&gt;).  You might think that ideally, all normal &lt;tt&gt;String&lt;/tt&gt; operations should work directly on an &lt;tt&gt;Unsafe String&lt;/tt&gt; or pairs of &lt;tt&gt;Unsafe String&lt;/tt&gt;s -- you just shouldn't be able to convert between the two.&lt;br /&gt;&lt;br /&gt;Unfortunately, I can't see any way of doing everything that you'd want to here.  For some types you can.  For instance, the following definitions let you compare values wrapped in Unsafe in the usual way:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;instance (Eq t) =&gt; Eq (Unsafe t) where&lt;br /&gt;    (==) (Unsafe v1) (Unsafe v2)   = v1 == v2&lt;br /&gt;    (/=) (Unsafe v1) (Unsafe v2)   = v1 /= v2&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This admits &lt;tt&gt;(Unsafe t)&lt;/tt&gt; to the &lt;tt&gt;Eq&lt;/tt&gt; class, and looks reasonable enough (assuming that it's safe to compare &lt;q&gt;unsafe&lt;/q&gt; values, of course).  However, for probably the most important &lt;tt&gt;Unsafe&lt;/tt&gt; values -- &lt;tt&gt;Unsafe String&lt;/tt&gt;s -- I can't see how to do this.  The problem is that String is not a typeclass, it's a synonym for &lt;tt&gt;[Char]&lt;/tt&gt;, a list of characters.  The important string operations are either defined directly on the &lt;tt&gt;String&lt;/tt&gt; type, or generically on &lt;tt&gt;[t]&lt;/tt&gt;; i.e., "a list of anything".  Because there is no typeclass, you simply can't overload these operations to apply to unsafe strings as well as regular strings.&lt;br /&gt;&lt;br /&gt;One way around this is to provide an "unwrapping combinator":&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;liftUnsafe :: (t -&gt; t) -&gt; Unsafe t -&gt; Unsafe t&lt;br /&gt;liftUnsafe f (Unsafe v) = Unsafe (f v)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This would automatically convert string operations to unsafe-string operations; not ideal, but reasonable enough.  Operators are still a little annoying, but you can mangle their names:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;(++u) :: Unsafe [t] -&gt; Unsafe [t] -&gt; Unsafe [t]&lt;br /&gt;(++u) = liftUnsafe (++)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So you have to use ++u instead of ++ to concatenate unsafe lists; not too bad.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;While it may not be perfect -- it only makes sure that you don't accidentally violate safety, and doesn't stop you from deliberately doing something dumb -- this approach feels a lot safer to me than ad-hoc mangling of variable names.  I used Haskell because you can do type hacks fairly easily in it, but I don't see why you couldn't play a similar game (albeit much less conveniently) in C++, or even in a dynamic language like Python.  Of course, Python would give you runtime errors about safety violations instead of static ones, but that still beats getting runtime security holes.&lt;br /&gt;&lt;br /&gt;I would add as a hypothesis that it should be possible to express just about any variable-name-mangling technique whose goal is to "make wrong code look wrong" in the type system, provided your type system doesn't suck; and that doing so is preferable to doing it manually, since it means that a lot of repetitive error-checking can be handled by the computer.  And since the computer is better than you are at verifying formal invariants, forcing it to handle them whenever possible is always a good idea.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-113256103375600999?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/113256103375600999/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=113256103375600999' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/113256103375600999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/113256103375600999'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2005/11/type-system-hack.html' title='A type-system hack'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-112923211060184885</id><published>2005-10-13T12:19:00.000-07:00</published><updated>2005-10-13T18:21:11.583-07:00</updated><title type='text'>On the usefulness of advice.</title><content type='html'>A few of the points stressed by sites that peddle advice on finding a job include things like "never send a resume without a cover letter" and "avoid the one-liner cover letter that says 'please consider my application for this position'".&lt;br /&gt;&lt;br /&gt;Oddly enough, of the three employers that have actually responded to my applications, I didn't send any cover letter at all to one, and I sent the Forbidden One-Liner to another.  Nearly every application that I've slaved over to produce a well-written cover letter (going by the common wisdom I get from just about everyone) has apparently gone straight to /dev/null.  I'm beginning to think I should just quit wasting my time on these things and aim for quantity rather than quality.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-112923211060184885?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/112923211060184885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=112923211060184885' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/112923211060184885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/112923211060184885'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2005/10/on-usefulness-of-advice.html' title='On the usefulness of advice.'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-112909693372609265</id><published>2005-10-11T22:26:00.000-07:00</published><updated>2005-10-11T23:02:13.733-07:00</updated><title type='text'>Announce: leafsmtp</title><content type='html'>I recently redid my whole mail setup to use mutt and modular programs for sending/receiving mail.  Since I've generally found a full-fledged MTA to be overkill and an unnecessary pain to configure for a personal system, I tried out a "simple" SMTP relayer called esmtp.  It was OK (aside from my configuration confusion), but it has a few small deficiencies, esp. the fact that it doesn't manage a queue, thus forcing all deliveries to run in the foreground.  Having determined that Python modules exist to run the client (and, in fact, the server) end of an SMTP session, I decided that it can't be that hard to write my own implementation of these programs with just a bit more oomph.&lt;br /&gt;&lt;br /&gt;Happily, I turned out to be right.  After three days of hacking, I now have a fully-functional...or at least functional enough to relay my email around...email system in a mere 736 lines of Python.  It can put messages into an on-disk queue directory (~/MailQueue by default); the benefit here is that it makes it totally safe to background the delivery process, which is nice if you happen to have a slow SMTP server or (when using it as a delivery backend for getmail/fetchmail) run a lot of time-consuming spam checks.  Without sticking the mail on the disk while it's being delivered, there is a chance that you'll lose mail if the delivery fails, especially if the delivery process has forked into the background.  And unlike complete MTAs such as exim, this all works without needing anything to run as root (unless you want to deliver to the mail spools of other users).&lt;br /&gt;&lt;br /&gt;There is no Debian package.  In fact, there isn't a proper source package, but you can pull down the upstream repository with&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;darcs get &lt;a href="http://people.debian.org/~dburrows/darcs/leafsmtp"&gt;http://people.debian.org/~dburrows/darcs/leafsmtp&lt;/a&gt;&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;You'll have to either pass the &lt;tt&gt;--set-scripts-executable&lt;/tt&gt; parameter to darcs, or run "chmod +x" on the leafsmtp executable once it downloads.  There's only a little documentation, but hopefully it's enough to get you going.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Oh, and the name: it is, of course, indicative of the fact that this is meant to be a reasonable mail system for leaf nodes on the Internet.  It's a little inaccurate, since a leaf node could receive mail directly, but it sounds a lot nicer than most of the other things I thought of :-).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-112909693372609265?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/112909693372609265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=112909693372609265' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/112909693372609265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/112909693372609265'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2005/10/announce-leafsmtp.html' title='Announce: leafsmtp'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-112872805351523737</id><published>2005-10-07T16:18:00.000-07:00</published><updated>2005-10-07T17:00:00.636-07:00</updated><title type='text'>More lines-of-code nonsense</title><content type='html'>After my last post about lines of code in aptitude, I was wondering how the program has grown over time.  Plus, someone pointed out that I ought to be using sloccount to get a more accurate picture, since it ignores blank lines and comments.  So, with a bit of hacking around to extract information about past aptitude versions, I present the aptitude-over-time graph:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://people.debian.org/~dburrows/aptitude-version-graph.png"&gt;&lt;br /&gt;&lt;br /&gt;The "zigs" in this graph represent overlapping development cycles of the program.  It's interesting to note that about 1/3 of the source lines in 0.3.4 are ignored by sloccount because they contain only comments or whitespace.&lt;br /&gt;&lt;br /&gt;A &lt;a href="http://people.debian.org/~dburrows/aptitude-version-graph.ps"&gt;PostScript&lt;/a&gt; version and the &lt;a href="http://people.debian.org/~dburrows/aptitude-version-graph.txt"&gt;raw data&lt;/a&gt; are also available (the last column is the supposed number of person-years it would take to produce the program according to a formula which, in the words of an IRC denizen, "is useful to convince your boss you need a pay raise").&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-112872805351523737?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/112872805351523737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=112872805351523737' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/112872805351523737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/112872805351523737'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2005/10/more-lines-of-code-nonsense.html' title='More lines-of-code nonsense'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-112864603637287784</id><published>2005-10-06T17:43:00.000-07:00</published><updated>2005-10-06T17:47:16.380-07:00</updated><title type='text'>P-E-B-C-A-K</title><content type='html'>If you want to set up your email so that you send it using &lt;a href="http://packages.debian.org/esmtp"&gt;esmtp&lt;/a&gt; and &lt;a href="http://packages.debian.org/mutt"&gt;mutt&lt;/a&gt;, be sure to put "set use_envelope_from=yes" in your mutt configuration, or dreadful things will happen and your mail will end up in the ether between the worlds.  Really.&lt;br /&gt;&lt;br /&gt;Actually, I wonder how many of my problems with using "real" mail transport agents and mutt would have been avoided had I known about the existence of this simple option.  Oh well, live and learn.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-112864603637287784?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/112864603637287784/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=112864603637287784' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/112864603637287784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/112864603637287784'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2005/10/p-e-b-c-k.html' title='P-E-B-C-A-K'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-112862358919171950</id><published>2005-10-06T10:43:00.000-07:00</published><updated>2005-10-06T11:33:12.596-07:00</updated><title type='text'>A cry from the bitbucket</title><content type='html'>Well, I've pretty much come to the conclusion that I cannot send mail to many important @debian.org addresses.  I know my mail is working because I can email myself (including @debian.org), and mail I've sent to anywhere except @debian.org works.  However, since a few days ago, all my mails to bugs.debian.org, whether bug submissions or additional information on bug reports, just vanish (other people's mails are going through, so the system isn't broken); repeated (GPG-signed) requests to changes@db.debian.org to update my SSH keys have gone unanswered and un-acted-upon; and several mails to the lists have vanished into the ether.  I've emailed a few role addresses about the issue, but I wouldn't be surprised if those emails get dropped on the floor as well.&lt;br /&gt;&lt;br /&gt;Since it appears this is about the only way I can contact Debian people, could someone with admin access to our mail system please tell me why I'm shut out?  This started when I changed how I send mail, so it's possible I misconfigured something (although I'm just forwarding through my smarthost using &lt;a href="http://esmtp.sourceforge.net"&gt;ESMTP&lt;/a&gt;), but I need to know what it is in order to fix it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-112862358919171950?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/112862358919171950/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=112862358919171950' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/112862358919171950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/112862358919171950'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2005/10/cry-from-bitbucket.html' title='A cry from the bitbucket'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-112849725242621327</id><published>2005-10-05T00:17:00.000-07:00</published><updated>2005-10-05T10:35:32.233-07:00</updated><title type='text'>aptitude goes distributed</title><content type='html'>As I've hinted at in a few recent emails to the BTS, I've moved the HEAD of aptitude development to the distributed revision control system &lt;a href="http://www.darcs.net"&gt;darcs&lt;/a&gt;.  In my case, the draw is not so much being able to coordinate a large developer pool; the main advantages of darcs are that (a) it has sane branching and merging (as opposed to, say, SVN), and (b) I get disconnected operation for free (highly useful when your main development machine is a laptop).&lt;br /&gt;&lt;br /&gt;Oh, and distributed revision control is New And Shiny[tm].  That too.&lt;br /&gt;&lt;br /&gt;The new repository can be fetched with the following command:&lt;br /&gt;&lt;pre&gt;darcs get http://people.debian.org/~dburrows/darcs/aptitude&lt;/pre&gt;&lt;br /&gt;Once you've checked out the source, you can use it the same way you'd use the Subversion source tree.  To merge any new patches from my public tree into your local tree, run:&lt;br /&gt;&lt;pre&gt;darcs pull&lt;/pre&gt;&lt;br /&gt;Now, the fun thing about darcs is that the checkout you just made is also a perfectly fine repository.  So, for instance, if you make some changes, you can run&lt;br /&gt;&lt;pre&gt;darcs record&lt;/pre&gt;&lt;br /&gt;in your copy of the repository.  When you finish answering the prompts, your repository will now have an extra patch committed.  You can now push it to other repositories, let other people pull it (if your repository is public), or email it using&lt;br /&gt;&lt;pre&gt;darcs send&lt;/pre&gt;&lt;br /&gt;If you have a working sendmail setup, this will use it to send me a patch.  If not, you can either pass --sendmail-command to "send", or use&lt;br /&gt;&lt;pre&gt;darcs whatsnew&lt;/pre&gt;&lt;br /&gt;to see what you've changed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-112849725242621327?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/112849725242621327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=112849725242621327' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/112849725242621327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/112849725242621327'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2005/10/aptitude-goes-distributed.html' title='aptitude goes distributed'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-112849654354237369</id><published>2005-10-05T00:07:00.000-07:00</published><updated>2006-07-16T09:02:07.166-07:00</updated><title type='text'>The Operation Was A Success (and the patient lived!)</title><content type='html'>Well, I've done it.  I took a laptop apart, reassembled it, and not only did I live to tell the tale but (more importantly) so did the laptop!  Even better, as soon as I turned it on, I could tell that the fans were working far more effectively -- the noise level is so much lower it's ridiculous.  I haven't run any games....umm, I mean tests yet to see if the performance is better, but I'd be happy even if I could just cut down on the noise pollution around here.&lt;br /&gt;&lt;br /&gt;The only slightly worrying thing is that I have one more screw than I did before I started all this madness.  However, the laptop appears to be not falling apart.  Hence, I conclude that the screw can't be that important ;-).  (and certainly not worth tearing the whole thing apart to replace!)&lt;br /&gt;&lt;br /&gt;Hopefully this will last for at least a few months -- by a few months after I first bought this, I was already noticing severe performance problems that in retrospect were the first onset of the dust-clogging-the-fans issue.  Maybe if I keep the environment more dust-free (i.e., clean and vacuum more regularly) I can delay a recurrence, though.&lt;br /&gt;&lt;br /&gt;I'd like to thank everyone who emailed me with stuff to try or handed out helpful advice on IRC.  It was immensely helpful to be able to pick the brains of people who are a bit more conversant with hardware hacking than I am.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-112849654354237369?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/112849654354237369/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=112849654354237369' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/112849654354237369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/112849654354237369'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2005/10/operation-was-success-and-patient.html' title='The Operation Was A Success (and the patient lived!)'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-112846873344570986</id><published>2005-10-04T16:22:00.000-07:00</published><updated>2005-10-04T17:27:20.530-07:00</updated><title type='text'>Did I just do that?</title><content type='html'>So, back around the beginning of August, I decided that since I was temporarily (hopefully :) ) unemployed anyway and I wasn't in immediate financial peril, I'd spend some weeks working on aptitude full-time, so I could shift some of the ideas in the "things I'd like to do but that take too much effort" pile into the "things I've done" pile.  I had already done a bit of work right around graduation, and another good chunk in June.  But I didn't expect what I just discovered when I went to bring my resume up to date.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;daniel@sleepingbeauty:~/stuff/txt$ darcs whatsnew&lt;br /&gt;{&lt;br /&gt;hunk ./resume.tex 42&lt;br /&gt;-  47,000 lines of C++ code and 9000 lines of DocBook XML&lt;br /&gt;-  documentation)\footnote{Statistics refer to version 0.3.2, released&lt;br /&gt;-    May 1 2005.}.&lt;br /&gt;+  70,000 lines of C++ code and 10,000 lines of DocBook XML&lt;br /&gt;+  documentation)\footnote{Statistics refer to version 0.3.4, released&lt;br /&gt;+    September 30 2005.}.&lt;br /&gt;hunk ./resume.txt 26&lt;br /&gt;-   47,000 lines of C++ code and 9,000 lines of DocBook XML&lt;br /&gt;-   documentation -- statistics taken from version 0.3.2).&lt;br /&gt;+   70,000 lines of C++ code and 10,000 lines of DocBook XML&lt;br /&gt;+   documentation -- statistics taken from version 0.3.4).&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now, a certain amount of that was adding GPL copyright boilerplate to files that lacked it.  A lot of files already had it, but still at 20 lines per file for 282 files, that comes to about 5,000 lines.  Some more can be credited to whitespace and ritualistic C++ syntax that was introduced when I broke some of the more horrible and grotty pieces of source into bite-sized pieces.  Still, that's a lot of lines of bloa^H^H^H^Hcode.&lt;br /&gt;&lt;br /&gt;[UPDATE] and I apparently hit "publish" instead of "save as draft".  Whoops!  Enjoy, world :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-112846873344570986?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/112846873344570986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=112846873344570986' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/112846873344570986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/112846873344570986'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2005/10/did-i-just-do-that.html' title='Did I just do that?'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-112840851354129307</id><published>2005-10-03T23:43:00.000-07:00</published><updated>2005-10-03T23:48:33.550-07:00</updated><title type='text'>Give me a lever of 6" length and a place to sit...</title><content type='html'>Well, I finally got the CPU off the heatsink.  The solvent didn't do it (it might have helped, but it wasn't critical); neither did freezing the CPU or heating it or even just Yanking Really Hard.  I finally managed to separate the two things by wedging the tip of a screwdriver under the CPU and gently applying pressure until it separated from the cooling apparatus.&lt;br /&gt;&lt;br /&gt;Queued up for tomorrow: get the right thermal material (the stuff I have is very prominently labelled "&lt;a href="http://www.arcticsilver.com/arctic_silver_thermal_adhesive.htm"&gt;not for attaching CPUs to heatsinks&lt;/a&gt;"...whoops) and put the laptop back together.  I halfway expect that it'll fail to boot once it's reassembled, after what I've put the poor thing through, but nothing ventured nothing gained.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-112840851354129307?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/112840851354129307/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=112840851354129307' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/112840851354129307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/112840851354129307'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2005/10/give-me-lever-of-6-length-and-place-to.html' title='Give me a lever of 6&quot; length and a place to sit...'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-112831483885829615</id><published>2005-10-02T21:09:00.000-07:00</published><updated>2005-10-31T19:42:09.680-08:00</updated><title type='text'>I Hate Hardware</title><content type='html'>About a year and a half ago, I bought a laptop.  While it isn't the greatest computer ever, it has generally served my needs.  However, I've been having more and more trouble with it lately.  The first sign of serious trouble was when the computer shut itself down while I was playing bzflag, leaving a message in the system log about the temperature exceeding 90 degrees Celcius.  After that, I of course took precautions to ensure that it was well-ventilated, even to the point of buying a special laptop cooling device (basically an elevated stand with two enormous fans mounted in the bottom).  However, the condition of the system has continued to deteriorate.  I felt pretty confident that I knew the cause -- dust buildup in the ventilation system, and so yesterday I pulled out a set of screwdrivers and set out to clean every last dust bunny out of the system.  Sure, I said to myself, I've never opened a laptop before, but I've assembled a desktop, so I'm totally qualified!&lt;br /&gt;&lt;br /&gt;Ha.&lt;br /&gt;&lt;br /&gt;My laptop is currently in pieces all over the floor of the apartment.  Taking it apart wasn't too bad, aside from the fact that you have to remove about 20 tiny screws, most of them totally inaccessible.  Even getting the CPU out wasn't too bad, and when I did I found (as predicted) a huge wad of dust wedged between the heatsink and the fan.&lt;br /&gt;&lt;br /&gt;But here's the fun part: &lt;i&gt;there is no way to reattach the CPU to the motherboard!&lt;/i&gt;  The problem is that the fan/heatsink assembly on this thing is &lt;b&gt;huge&lt;/b&gt; -- it covers almost a quarter of the area of the case.  To reassemble everything, I need to open the socket, insert the CPU, and close the socket again -- however, if I insert the CPU while it's attached to the assembly, it blocks access to the socket's open/close control.  So it appears that the only way to put the CPU back onto the motherboard is to remove it from the heatsink, stick it into the slot, and then reattach the heatsink.&lt;br /&gt;&lt;br /&gt;And (joy) I can't get the heatsink off the CPU or out of the fan assembly; they all seem to be practically welded together.  When pulling didn't work, I headed to Fry's and bought some nasty-smelling solvent that's supposed to dissolve the thermal adhesive holding the CPU to the motherboard.  All it did was give me about a half hour of ventilating the area while I waited for the lightheadedness to wear off.  I'm currently seeing what happens if I leave the whole mess in the freezer for a while; several people have told me that might work (presumably because the various components shrink away from each other as they cool).&lt;br /&gt;&lt;br /&gt;Once I get the CPU back in, all I have to do is reapply thermal adhesive, attach the heatsink+fan assembly to it, then find all 30 or so screws I took out and figure out where each one goes.  At this rate, I'll be amazed if the whole thing works even if I do get it all back together in one piece.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-112831483885829615?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/112831483885829615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=112831483885829615' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/112831483885829615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/112831483885829615'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2005/10/i-hate-hardware.html' title='I Hate Hardware'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-112821412780616480</id><published>2005-10-01T17:36:00.000-07:00</published><updated>2005-10-01T18:57:52.510-07:00</updated><title type='text'>aptitude 0.3.4 uploaded to experimental</title><content type='html'>I've just uploaded aptitude 0.3.4 to experimental.  At this point all of the destabilizing changes I wanted to squeeze into 0.4 have made it into the source tree and seem to work, so this is a release candidate for 0.4 once the translators catch up.     Please go test it!&lt;br /&gt;&lt;br /&gt;Relative to the version in unstable, this version has UTF-8 support, a new dependency resolution algorithm, threading (e.g., the program is responsive while a download is going on), and a whole bunch of smaller bugfixes and new features (including some of the &lt;A HREF="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=137311"&gt;most&lt;/A&gt; &lt;A HREF="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=272409"&gt;annoying&lt;/A&gt; &lt;A HREF="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=245348"&gt;bugs&lt;/A&gt; in previous versions).&lt;br /&gt;&lt;br /&gt;[UPDATE] I was just reminded that not everyone is familiar with how packages get into our archive.  Packages don't go into the archive immediately upon being uploaded (which is why installing aptitude directly from experimental doesn't work yet); they first have to sit in an &lt;A HREF="http://incoming.debian.org"&gt;"incoming"&lt;/A&gt; queue until the once-a-day archive maintenance script runs and moves them into the archive.&lt;br /&gt;&lt;br /&gt;In brief, aptitude will be available in the usual way at around 4-5PM EDT tomorrow, or you can get it from the following URLs (which will be removed around 3PM EDT tomorrow):&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;A HREF="http://incoming.debian.org/aptitude_0.3.4-1_i386.deb"&gt;aptitude&lt;/A&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://incoming.debian.org/aptitude-doc-cs_0.3.4-1_all.deb"&gt;aptitude-doc-cs&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://incoming.debian.org/aptitude-doc-en_0.3.4-1_all.deb"&gt;aptitude-doc-en&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://incoming.debian.org/aptitude-doc-fr_0.3.4-1_all.deb"&gt;aptitude-doc-fr&lt;/a&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-112821412780616480?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/112821412780616480/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=112821412780616480' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/112821412780616480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/112821412780616480'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2005/10/aptitude-034-uploaded-to-experimental.html' title='aptitude 0.3.4 uploaded to experimental'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12729767.post-112769534128333656</id><published>2005-09-25T17:16:00.000-07:00</published><updated>2005-09-25T18:24:30.936-07:00</updated><title type='text'>Usertags fun</title><content type='html'>I just spent the afternoon playing around with usertags and the other recent BTS changes.  It looks like a really useful addition to debbugs, and I'm sure we'll see a lot of interesing uses pop up.  I immediately went and used it to mark bugs that have been fixed in the aptitude SVN by using a quick-and-dirty Python script to extract them from the ChangeLog; with some help from AJ, I even came up with a &lt;a href="http://bugs.debian.org/cgi-bin/pkgreport.cgi?pkg=aptitude;users=aptitude@packages.debian.org;nam0=Status;pri0=tag=fixed-in-svn,tag=fixed-in-experimental,pending=pending,pending=forwarded,pending=pending-fixed,pending=fixed,pending=done,pending=absent;ttl0=Fixed%20in%20SVN,Fixed%20in%20Experimental,Outstanding,Forwarded,Pending%20Upload,Fixed%20in%20NMU,Resolved,From%20Other%20Branch,Unknown%20Pending%20Status;ord0=2,3,4,0,1,5,6,7,8;nam1=Severity;pri1=severity:critical,grave,serious,important,normal,minor,wishlist;ttl1=Critical,Grave,Serious,Important,Normal,Minor,Wishlist,Unknown%20Severity;ord1=0,1,2,3,4,5,6,7;nam2=Classification;pri2=pending=pending%2Btag=wontfix,pending=pending%2Btag=moreinfo,pending=pending%2Btag=patch,pending=pending%2Btag=confirmed,pending=pending;ttl2=Will%20Not%20Fix,More%20information%20needed,Patch%20Available,Confirmed,Unclassified;ord2=2,3,4,1,0,5"&gt;URL&lt;/a&gt; that separates these bugs out from the completely unresolved ones.&lt;br /&gt;&lt;br /&gt;So that was pretty easy.  Having done this, the next logical thought was, of course, "if I can extract bug numbers from the ChangeLog on my computer, couldn't an SVN hook script do the same thing?"  A bit of hacking around later, I now have a &lt;a href="http://people.debian.org/~dburrows/svntag.py"&gt;script&lt;/a&gt; that does exactly this.  To use it, download it and (optionally) the sample &lt;a href="http://people.debian.org/~dburrows/svntag.conf"&gt;configuration file&lt;/a&gt;, and then add the following line to your post-commit hook:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;path-to-svntag.py&lt;/i&gt; "$1" "$2" &lt;i&gt;path-to-svntag.conf&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;The script looks for text like "Closes: #nnnnnn" in a file called "changelog" and sends appropriate tagging messages to the BTS when it's spotted.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12729767-112769534128333656?l=lambdaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lambdaman.blogspot.com/feeds/112769534128333656/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12729767&amp;postID=112769534128333656' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/112769534128333656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12729767/posts/default/112769534128333656'/><link rel='alternate' type='text/html' href='http://lambdaman.blogspot.com/2005/09/usertags-fun.html' title='Usertags fun'/><author><name>dburrows</name><uri>http://www.blogger.com/profile/16310501949675761069</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry></feed>
