<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Posts on teideal glic deisbhéalach</title><link>https://www.serpentine.com/posts/</link><description>Recent content in Posts on teideal glic deisbhéalach</description><generator>Hugo -- 0.165.0</generator><language>en-ie</language><copyright>2003&amp;ndash;2026 Bryan O&amp;rsquo;Sullivan</copyright><lastBuildDate>Mon, 14 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.serpentine.com/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>Announcing jj-stack: stacked GitHub pull requests for Jujutsu</title><link>https://www.serpentine.com/posts/2026/announcing-jj-stack/</link><pubDate>Mon, 14 Sep 2026 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/posts/2026/announcing-jj-stack/</guid><description>&lt;p&gt;I’m pleased to announce &lt;code&gt;jj-stack&lt;/code&gt;, a new tool for managing stacked GitHub pull requests quickly
and safely with &lt;a href="https://www.jj-vcs.dev/"&gt;Jujutsu&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Stacked changes let you (or your agent) split a large body of work into small, independently
reviewable changes without waiting for each one to be reviewed or merged.&lt;/p&gt;
&lt;p&gt;I built this because I wanted the stacked-review workflow I&amp;rsquo;d grown used to, with the local
editing experience I&amp;rsquo;ve found so delightful in Jujutsu.&lt;/p&gt;</description></item><item><title>How my e-reader lost its stripes</title><link>https://www.serpentine.com/posts/2026/x3-stripes/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/posts/2026/x3-stripes/</guid><description>&lt;p&gt;I&amp;rsquo;ve been a lifelong reader, which has proved a fragile habit in our era of endless trivial
distraction. While books and e-ink readers solve the problem of competition for attention, they
can&amp;rsquo;t compete with a phone for convenience. That tiny device in my pocket has made reading both
easier and more vulnerable to displacement whenever a notification pops up.&lt;/p&gt;
&lt;p&gt;A few days ago, I learned for the first time about a recent generation of &lt;em&gt;tiny&lt;/em&gt; e-ink readers.
Since they&amp;rsquo;re cheap, it was easy to give into curiosity: I bought an &lt;a href="https://crosspointreader.com/"&gt;Xteink
X3&lt;/a&gt;. Not only is it astonishingly tiny, I could immediately
install the delightful open-source
&lt;a href="https://github.com/crosspoint-reader/crosspoint-reader"&gt;CrossPoint&lt;/a&gt; firmware. I was very
quickly able to install a few books. I also appreciated being able to install custom fonts,
though I was a little surprised by their indifferent rendering (&lt;em&gt;foreshadowing&amp;hellip;&lt;/em&gt;).&lt;/p&gt;</description></item><item><title>Sometimes, the old ways are the best</title><link>https://www.serpentine.com/2015/05/13/sometimes-the-old-ways-are-the-best/</link><pubDate>Wed, 13 May 2015 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2015/05/13/sometimes-the-old-ways-are-the-best/</guid><description>&lt;p&gt;Over the past few months, the Sigma engineering team at Facebook has rolled out a major Haskell project: a &lt;a href="https://code.facebook.com/posts/302060973291128/open-sourcing-haxl-a-library-for-haskell/"&gt;rewrite of Sigma&lt;/a&gt;, an important weapon in our armory for fighting spam and malware.&lt;/p&gt;
&lt;p&gt;Sigma has a mission-critical job, and it needs to scale: its growing workload currently sees it handling tens of millions of requests per minute.&lt;/p&gt;
&lt;p&gt;The rewrite of Sigma in Haskell, using the &lt;a href="http://hackage.haskell.org/package/haxl"&gt;Haxl library&lt;/a&gt; that Simon Marlow developed, has been a success. Throughput is higher than under its predecessor, and CPU usage is lower. Sweet!&lt;/p&gt;</description></item><item><title>criterion 1.0</title><link>https://www.serpentine.com/2014/08/08/criterion-1-0/</link><pubDate>Fri, 08 Aug 2014 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2014/08/08/criterion-1-0/</guid><description>&lt;p&gt;Almost five years after I initially released criterion, I&amp;rsquo;m delighted to announce a major
release with a large number of appealing new features.&lt;/p&gt;
&lt;p&gt;As always, you can install the latest goodness using &lt;code&gt;cabal install criterion&lt;/code&gt;, or fetch the
source &lt;a href="https://github.com/bos/criterion"&gt;from github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://haskell.github.io/criterion/"&gt;&lt;img alt="Screenshot of the Fibber benchmark report" loading="lazy" src="https://www.serpentine.com/criterion/fibber-screenshot.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Please let me know if you find criterion useful!&lt;/p&gt;
&lt;h2 id="new-documentation"&gt;New documentation&lt;/h2&gt;
&lt;p&gt;I built both a &lt;a href="https://www.serpentine.com/software/criterion/"&gt;home page&lt;/a&gt; and a thorough
&lt;a href="https://github.com/haskell/criterion/blob/master/README.markdown#tutorial"&gt;tutorial&lt;/a&gt; for
criterion. I&amp;rsquo;ve also extended the inline documentation and added a number of new examples.&lt;/p&gt;</description></item><item><title>Win bigger statistical fights with a better jackknife</title><link>https://www.serpentine.com/2014/06/10/win-bigger-statistical-fights-with-a-better-jackknife/</link><pubDate>Wed, 11 Jun 2014 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2014/06/10/win-bigger-statistical-fights-with-a-better-jackknife/</guid><description>&lt;p&gt;(Summary: I&amp;rsquo;ve developed some algorithms for a statistical technique called the jackknife that
run in &lt;em&gt;O&lt;/em&gt;(&lt;em&gt;n&lt;/em&gt;) time instead of &lt;em&gt;O&lt;/em&gt;(&lt;em&gt;n&lt;/em&gt;²).)&lt;/p&gt;
&lt;p&gt;In statistics, an estimation technique called &amp;ldquo;the jackknife&amp;rdquo; has been widely used for over half
a century. It&amp;rsquo;s a mainstay for taking a quick look at the quality of an estimator of a sample.
(An estimator is a summary function over a sample, such as its mean or variance.)&lt;/p&gt;
&lt;p&gt;Suppose we have a noisy sample. Our first stopping point might be to look at the variance of the
sample, to get a sense of how much the values in the sample &amp;ldquo;spread out&amp;rdquo; around the average.&lt;/p&gt;</description></item><item><title>A major upgrade to attoparsec: more speed, more power</title><link>https://www.serpentine.com/2014/05/31/attoparsec/</link><pubDate>Sat, 31 May 2014 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2014/05/31/attoparsec/</guid><description>&lt;p&gt;I&amp;rsquo;m pleased to introduce the third generation of my &lt;a href="https://github.com/bos/attoparsec"&gt;attoparsec parsing
library&lt;/a&gt;. With a major change to its internals, it is both
faster and more powerful than previous versions, while remaining backwards compatible.&lt;/p&gt;
&lt;h2 id="comparing-to-c"&gt;Comparing to C&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s start with a speed comparison between the &lt;a href="https://github.com/joyent/http-parser/blob/master/http_parser.c"&gt;hand-written C
code&lt;/a&gt; that powers Node.js&amp;rsquo;s
HTTP parser and an &lt;a href="https://github.com/bos/attoparsec/blob/master/examples/RFC2616.hs"&gt;idiomatic Haskell
parser&lt;/a&gt; that uses attoparsec.
There are good reasons to take these numbers with a fistful of salt, so imagine huge error bars,
warning signs, and whatnot-but they&amp;rsquo;re still interesting.&lt;/p&gt;</description></item><item><title>Top Haskell packages seen through graph centrality beer goggles</title><link>https://www.serpentine.com/2014/05/18/top-haskell-packages-a-graph-centrality-perspective/</link><pubDate>Sun, 18 May 2014 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2014/05/18/top-haskell-packages-a-graph-centrality-perspective/</guid><description>&lt;p&gt;I threw together a little code tonight to calculate the &lt;a href="https://en.wikipedia.org/wiki/Katz_centrality"&gt;Katz
centrality&lt;/a&gt; of packages on Hackage. This is a
measure that states that a package is important if an important package depends on it. The
definition is recursive, as is the matrix computation that converges towards a fixpoint to
calculate it.&lt;/p&gt;
&lt;p&gt;Here are the top hundred Hackage packages as calculated by this method, along with their numeric
measures of centrality, to which I&amp;rsquo;ve given the slightly catchier name &amp;ldquo;mojo&amp;rdquo; here.&lt;/p&gt;</description></item><item><title>Once more into the teach, dear friends</title><link>https://www.serpentine.com/2014/05/13/once-more-into-the-teach-dear-friends/</link><pubDate>Wed, 14 May 2014 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2014/05/13/once-more-into-the-teach-dear-friends/</guid><description>&lt;p&gt;Since the beginning of April, &lt;a href="http://www.scs.stanford.edu/~dm/"&gt;David Mazières&lt;/a&gt; and I have been back in the saddle &lt;a href="http://www.scs.stanford.edu/14sp-cs240h/"&gt;teaching CS240H at Stanford&lt;/a&gt; again.&lt;/p&gt;
&lt;p&gt;If you’re tuning in recently, David and I both love systems programming, and we particularly get a kick out of doing it in Haskell. Let me state this more plainly: Haskell is an &lt;em&gt;excellent&lt;/em&gt; systems programming language.&lt;/p&gt;
&lt;p&gt;Our aim with this class is to teach both enough advanced Haskell that students really get a feel for how different it is from other programming languages, and to apply this leverage to the kinds of problems that people typically think of as “systemsy”: How do I write solid concurrent software? How do I design it cleanly? What do I do to make it fast? How do I talk to other stuff, like databases and web servers?&lt;/p&gt;</description></item><item><title>Where credit belongs for Hack</title><link>https://www.serpentine.com/2014/03/28/where-credit-belongs-for-hack/</link><pubDate>Fri, 28 Mar 2014 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2014/03/28/where-credit-belongs-for-hack/</guid><description>&lt;p&gt;It&amp;rsquo;s been exciting to see the positive reception in the tech press and the open source community to &lt;a href="http://hacklang.org/"&gt;Hack&lt;/a&gt;, the new programming language that my team at Facebook released last week.&lt;/p&gt;
&lt;p&gt;At the same time, one part of that coverage has made me wince: a couple of articles give the impression that I created Hack, but I didn&amp;rsquo;t. What I do is manage the Hack team, and since I&amp;rsquo;m incredibly proud of the work they do, I&amp;rsquo;d like to shine a little light on the people who really deserve the credit.&lt;/p&gt;</description></item><item><title>Book review: Parallel and Concurrent Programming in Haskell</title><link>https://www.serpentine.com/2014/03/18/book-review-parallel-and-concurrent-programming-in-haskell/</link><pubDate>Wed, 19 Mar 2014 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2014/03/18/book-review-parallel-and-concurrent-programming-in-haskell/</guid><description>&lt;p&gt;It&amp;rsquo;s time someone finally wrote a proper review of Simon Marlow&amp;rsquo;s amazing book, &lt;a href="http://chimera.labs.oreilly.com/books/1230000000929"&gt;Parallel and
Concurrent Programming in Haskell&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I am really not the right person to tackle this job objectively, because I have known Simon for
20 years and I currently happen to be his boss at Facebook. Nevertheless, I fly my flag of
editorial bias proudly, and in any case a moment&amp;rsquo;s glance at Simon&amp;rsquo;s book will convince you that
the absurdly purple review I am about to write is entirely justified.&lt;/p&gt;</description></item><item><title>New year, new library releases, new levels of speed</title><link>https://www.serpentine.com/2014/01/09/new-year-new-library-releases-new-levels-of-speed/</link><pubDate>Thu, 09 Jan 2014 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2014/01/09/new-year-new-library-releases-new-levels-of-speed/</guid><description>&lt;p&gt;I just released new versions of the Haskell &lt;a href="http://hackage.haskell.org/package/text"&gt;&lt;code&gt;text&lt;/code&gt;&lt;/a&gt;, &lt;a href="http://hackage.haskell.org/package/attoparsec"&gt;&lt;code&gt;attoparsec&lt;/code&gt;&lt;/a&gt;, and &lt;a href="http://hackage.haskell.org/package/aeson"&gt;&lt;code&gt;aeson&lt;/code&gt;&lt;/a&gt; libraries on Hackage, and there’s a surprising amount to look forward to in them.&lt;/p&gt;
&lt;p&gt;The summary for the impatient: some core operations in &lt;code&gt;text&lt;/code&gt; and &lt;code&gt;aeson&lt;/code&gt; are now much more efficient. With &lt;code&gt;text&lt;/code&gt;, UTF-8 encoding is up to &lt;em&gt;four times faster&lt;/em&gt;, while with &lt;code&gt;aeson&lt;/code&gt;, encoding and decoding of JSON bytestrings are both up to &lt;em&gt;twice as fast&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id="attoparsec-0.11.1.0"&gt;attoparsec 0.11.1.0&lt;/h2&gt;
&lt;p&gt;Perhaps the least interesting release is &lt;code&gt;attoparsec&lt;/code&gt;. It adds a new dependency on Bas Van Dijk’s &lt;a href="http://hackage.haskell.org/package/scientific"&gt;&lt;code&gt;scientific&lt;/code&gt;&lt;/a&gt; package to allow efficient and more accurate parsing of floating point numbers, a longstanding minor weakness. It also introduces two new functions for single-token lookahead, which are used by the new release of &lt;code&gt;aeson&lt;/code&gt;; read on for more details.&lt;/p&gt;</description></item><item><title>Testing a UTF-8 decoder with vigour</title><link>https://www.serpentine.com/2013/12/30/testing-a-utf-8-decoder-with-vigour/</link><pubDate>Tue, 31 Dec 2013 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2013/12/30/testing-a-utf-8-decoder-with-vigour/</guid><description>&lt;p&gt;Yesterday, Michael Snoyman reported a surprising regression in version 1.0 of my Haskell &lt;code&gt;text&lt;/code&gt;
library: for some invalid inputs, the UTF-8 decoder was truncating the invalid data instead of
throwing an exception.&lt;/p&gt;
&lt;p&gt;Thanks to Michael providing an easy repro, I quickly bisected the origin of the regression to a
commit from September that added support for incremental decoding of UTF-8. That work was
motivated by applications that need to be able to consume incomplete input (e.g. a network
packet containing possibly truncated data) as early as possible.&lt;/p&gt;</description></item><item><title>Open question: help me design a new encoding API for aeson</title><link>https://www.serpentine.com/2013/10/14/open-question-help-me-design-a-new-encoding-api-for-aeson/</link><pubDate>Tue, 15 Oct 2013 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2013/10/14/open-question-help-me-design-a-new-encoding-api-for-aeson/</guid><description>&lt;p&gt;For a while now, I&amp;rsquo;ve had it in mind to improve the encoding performance of my Haskell JSON
package, &lt;a href="https://github.com/bos/aeson"&gt;aeson&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Over the weekend, I went from hazy notion to a proof of concept for what I think could be a
reasonable approach.&lt;/p&gt;
&lt;p&gt;This post is a case of me &amp;ldquo;thinking out loud&amp;rdquo; about the initial design I came up with. I&amp;rsquo;m very
interested in hearing if you have a cleaner idea.&lt;/p&gt;</description></item><item><title>Big fucking deal</title><link>https://www.serpentine.com/2013/04/30/big-fucking-deal/</link><pubDate>Wed, 01 May 2013 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2013/04/30/big-fucking-deal/</guid><description>&lt;p&gt;Quoth Wikipedia:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Big data[1][2] is a collection of data sets so large and complex that it becomes difficult to process using on-hand database management tools or traditional data processing applications. The challenges include capture, curation, storage,[3] search, sharing, transfer, analysis,[4] and visualization. The trend to larger data sets is due to the additional information derivable from analysis of a single large set of related data, as compared to separate smaller sets with the same total amount of data, allowing correlations to be found to &amp;ldquo;spot business trends, determine quality of research, prevent diseases, link legal citations, combat crime, and determine real-time roadway traffic conditions.&amp;rdquo;
Now what if we get tired of the current hype cycle?&lt;/p&gt;</description></item><item><title>What’s in a number? criterion edition</title><link>https://www.serpentine.com/2013/04/13/whats-in-a-number-criterion-edition/</link><pubDate>Sun, 14 Apr 2013 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2013/04/13/whats-in-a-number-criterion-edition/</guid><description>&lt;p&gt;&lt;em&gt;[Edit: a few hours after I wrote this post, I wrote some code to get rid of the inflation
phenomenon it describes, and I&amp;rsquo;ll publish a corresponding update to criterion shortly. See below
for details, and the bottom for a &lt;a href="#bottom"&gt;new chart&lt;/a&gt; that shows the effect of the fix.]&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A couple of days ago, Alexey Khudyakov did a little &lt;a href="https://web.archive.org/web/20130528104141/http://sepulcarium.org:80/blog/posts/2013-04-07-criterion.html"&gt;digging into the accuracy of criterion&amp;rsquo;s
measurements&lt;/a&gt;. I thought his
results were interesting enough to be worth some deeper analysis.&lt;/p&gt;</description></item><item><title>What’s good for C++ is good for … Haskell!?</title><link>https://www.serpentine.com/2013/03/20/whats-good-for-c-is-good-for-haskell/</link><pubDate>Wed, 20 Mar 2013 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2013/03/20/whats-good-for-c-is-good-for-haskell/</guid><description>&lt;p&gt;A few days ago, my Facebook colleague &lt;a href="http://erdani.com/"&gt;Andrei Alexandrescu&lt;/a&gt; posted a note
entitled &lt;a href="https://www.facebook.com/notes/facebook-engineering/three-optimization-tips-for-c/10151361643253920"&gt;Three Optimization Tips for
C++&lt;/a&gt;,
which reminded me that I had unfinished business with Haskell&amp;rsquo;s &lt;a href="http://hackage.haskell.org/package/text"&gt;&lt;code&gt;text&lt;/code&gt;
package&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I took his code, applied it to the &lt;code&gt;text&lt;/code&gt; package, and this is the story of what happened.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;text&lt;/code&gt; package provides a &lt;a href="http://hackage.haskell.org/packages/archive/text/latest/doc/html/Data-Text-Lazy-Builder.html"&gt;type named
&lt;code&gt;Builder&lt;/code&gt;&lt;/a&gt;
for efficiently constructing Unicode strings from smaller fragments. A couple of years after
&lt;a href="http://blog.johantibell.com/"&gt;Johan&lt;/a&gt; contributed the initial &lt;code&gt;Builder&lt;/code&gt; implementation, I wrote
some helper functions to perform recurring tasks, such as rendering numbers.&lt;/p&gt;</description></item><item><title>A major new release of the Haskell hashable library</title><link>https://www.serpentine.com/2012/12/13/a-major-new-release-of-the-haskell-hashable-library/</link><pubDate>Fri, 14 Dec 2012 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2012/12/13/a-major-new-release-of-the-haskell-hashable-library/</guid><description>&lt;p&gt;I have spent quite some time over the last couple of months improving the Haskell
&lt;a href="http://hackage.haskell.org/package/hashable"&gt;hashable&lt;/a&gt; library, and all of my efforts
eventually turned into a near-complete rewrite of the library.&lt;/p&gt;
&lt;p&gt;The 1.2 release of hashable is not backwards compatible, and for several good reasons. Read on
for the details.&lt;/p&gt;
&lt;h2 id="hash-flooding"&gt;Hash flooding&lt;/h2&gt;
&lt;p&gt;The threat landscape faced by applications that use hash-based data structures has shifted
radically this year, with hash flooding emerging as an attack vector after a long period of
obscurity (the earliest publication I know of on the subject dates back to 1998, but I doubt
that it was new even then).&lt;/p&gt;</description></item><item><title>A fast new SipHash implementation in Haskell</title><link>https://www.serpentine.com/2012/10/02/a-fast-new-siphash-implementation-in-haskell/</link><pubDate>Tue, 02 Oct 2012 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2012/10/02/a-fast-new-siphash-implementation-in-haskell/</guid><description>&lt;p&gt;I&amp;rsquo;ve recently been talking with Johan Tibell about submitting his
&lt;a href="http://hackage.haskell.org/package/hashable"&gt;hashable&lt;/a&gt; package to become a part of the Haskell
Platform.&lt;/p&gt;
&lt;p&gt;Once we get that submission accepted, we can fold Johan&amp;rsquo;s excellent hash-based data structures
from his &lt;a href="http://hackage.haskell.org/package/unordered-containers"&gt;unordered-containers&lt;/a&gt; package
into the standard containers package. For many applications, the hash array mapped tries in
unordered-containers offer a decent performance advantage over the current standard of ordered
search trees.&lt;/p&gt;
&lt;p&gt;Prior to making the submission, I found myself wanting to spring clean the hashable package.
Although it is simple and well put together, it has some robustness problems that are important
in practice.&lt;/p&gt;</description></item><item><title>The case of the mysterious explosion in space</title><link>https://www.serpentine.com/2012/09/12/the-case-of-the-mysterious-explosion-in-space/</link><pubDate>Wed, 12 Sep 2012 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2012/09/12/the-case-of-the-mysterious-explosion-in-space/</guid><description>&lt;p&gt;The case of the mysterious explosion in space&lt;/p&gt;
&lt;p&gt;A few months ago, reports began to filter in of an unhappy problem with the Haskell &lt;code&gt;text&lt;/code&gt;
package: it was &lt;a href="http://www.haskell.org/pipermail/haskell-cafe/2012-March/100162.html"&gt;causing huge object files to be generated when a file contained lots of string
literals&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t notice the initial report (it was posted to a busy mailing list that I don&amp;rsquo;t try to
keep up with), but Michael Snoyman was kind enough to take that message and &lt;a href="https://github.com/haskell/text/issues/19"&gt;file a
bug&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Performance: yes, it’s worth looking at the small stuff</title><link>https://www.serpentine.com/2012/06/25/yes-its-worth-looking-at-the-small-stuff/</link><pubDate>Mon, 25 Jun 2012 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2012/06/25/yes-its-worth-looking-at-the-small-stuff/</guid><description>&lt;p&gt;While I was in New York for QCon last week, the temperatures started out quite mild, but soared
back to their usual sweltering summertime levels by midweek. I thus found myself confined to my
hotel room for a few hours one afternoon, feeling grateful for the air conditioning.&lt;/p&gt;
&lt;p&gt;As I waited for the sun to go down so that I might venture out in the heat without being cooked
by both air and glare, I decided to return my attention to the Haskell &lt;code&gt;text&lt;/code&gt; library for the
first time in a while.&lt;/p&gt;</description></item><item><title>(re)announcing statprof, a statistical profiler for Python</title><link>https://www.serpentine.com/2012/04/09/reannouncing-statprof-a-statistical-profiler-for-python/</link><pubDate>Mon, 09 Apr 2012 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2012/04/09/reannouncing-statprof-a-statistical-profiler-for-python/</guid><description>&lt;p&gt;Back in 2005, Andy Wingo &lt;a href="http://wingolog.org/archives/2005/10/28/profiling"&gt;wrote a neat little statistical
profiler&lt;/a&gt; named &lt;code&gt;statprof&lt;/code&gt; that promptly
disappeared into obscurity. It has since languished almost unknown, with a handful of people
writing semi-private forks that themselves seem to be dead.&lt;/p&gt;
&lt;p&gt;Statistical profiling (also known as sampling profiling) is simple and sweet: the profiler
periodically wakes up and samples the stack, then when all is done, it prints a simple report of
which lines showed up most often in the profile.&lt;/p&gt;</description></item><item><title>github is making me feel stupid(er)</title><link>https://www.serpentine.com/2012/04/08/github-is-making-me-feel-stupider/</link><pubDate>Sun, 08 Apr 2012 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2012/04/08/github-is-making-me-feel-stupider/</guid><description>&lt;p&gt;I&amp;rsquo;m approaching my fourth anniversary of using github. I should hardly have to state that it&amp;rsquo;s a
wonderful service, and especially so for being kept freely available to the open source
community. At the same time, I&amp;rsquo;ve noticed over the past year or so that in many ways I feel less
efficient using it now than I used to, even though the github team continues to roll out new
features that make me shout &amp;ldquo;hooray!&amp;rdquo;&lt;/p&gt;</description></item><item><title>aeson 0.4: easier, faster, better</title><link>https://www.serpentine.com/2011/11/30/893/</link><pubDate>Thu, 01 Dec 2011 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2011/11/30/893/</guid><description>&lt;p&gt;After months of work, and a number of great contributions from other developers, I just released version 0.4 of &lt;a href="http://hackage.haskell.org/package/aeson"&gt;aeson&lt;/a&gt;, the de facto standard Haskell JSON library. This is a major release, with a number of improvements. Enjoy!&lt;/p&gt;
&lt;h2 id="ease-of-use"&gt;Ease of use&lt;/h2&gt;
&lt;p&gt;The new &lt;a href="http://hackage.haskell.org/packages/archive/aeson/latest/doc/html/Data-Aeson.html#v:decode"&gt;&lt;code&gt;decode&lt;/code&gt; function&lt;/a&gt; complements the longstanding &lt;code&gt;encode&lt;/code&gt; function, and makes the API simpler.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/bos/aeson/tree/master/examples"&gt;New examples&lt;/a&gt; make it easier to learn to use the package.&lt;/p&gt;
&lt;h2 id="generics-support"&gt;Generics support&lt;/h2&gt;
&lt;p&gt;aeson&amp;rsquo;s support for data-type generic programming makes it possible to use JSON encodings of most data types without writing any boilerplate instances.&lt;/p&gt;</description></item><item><title>The future of MailRank’s open source technologies</title><link>https://www.serpentine.com/2011/11/15/the-future-of-mailranks-open-source-technologies/</link><pubDate>Tue, 15 Nov 2011 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2011/11/15/the-future-of-mailranks-open-source-technologies/</guid><description>&lt;p&gt;(Cross-posted from the &lt;a href="http://engineering.mailrank.com/the-future-of-mailranks-open-source-technolog"&gt;MailRank engineering blog&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;You may have seen my &lt;a href="http://blog.mailrank.com/the-mailrank-team-is-joining-facebook"&gt;exciting news about our upcoming move to Facebook&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s been a total blast working on our product, and of course as we did so we released a number of open source libraries and tools. It only added to our pleasure to see so much of that code used outside of our own domain. I will continue to develop and maintain the code that we have released.&lt;/p&gt;</description></item><item><title>A major new release of the Haskell statistics library</title><link>https://www.serpentine.com/2011/11/10/a-major-new-release-of-the-haskell-statistics-library/</link><pubDate>Fri, 11 Nov 2011 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2011/11/10/a-major-new-release-of-the-haskell-statistics-library/</guid><description>&lt;p&gt;I&amp;rsquo;m pleased to announce a major release of of the Haskell &lt;a href="http://hackage.haskell.org/package/statistics"&gt;statistics&lt;/a&gt; library, version 0.10.0.0.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d particularly like to thank Alexey Khudyakov for his wonderful work on this release.&lt;/p&gt;
&lt;p&gt;New features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Student-T, Fisher-Snedecor, F-distribution, and Cauchy-Lorentz distributions are added.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Histogram computation is added, in &lt;code&gt;Sample.Histogram&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Forward and inverse discrete Fourier and cosine transforms are added, in &lt;code&gt;Transform&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Root finding is added, in &lt;code&gt;Math.RootFinding&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Major changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The &lt;code&gt;Sample.KernelDensity&lt;/code&gt; module has been renamed, and completely rewritten to be much more robust. The older module oversmoothed multi-modal data. (The older module is still available under the name &lt;code&gt;Sample.KernelDensity.Simple&lt;/code&gt;).&lt;/p&gt;</description></item><item><title>The Strange Loop conference was a blast</title><link>https://www.serpentine.com/2011/09/27/the-strange-loop-conference-was-a-blast/</link><pubDate>Wed, 28 Sep 2011 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2011/09/27/the-strange-loop-conference-was-a-blast/</guid><description>&lt;p&gt;Last week, I flew to St Louis for the excellent &lt;a href="https://thestrangeloop.com/"&gt;Strange Loop&lt;/a&gt; conference, where I gave a 3-hour Haskell tutorial and a talk on how we use Haskell at my startup company, MailRank.&lt;/p&gt;
&lt;p&gt;Strange Loop is a pretty good approximation to my ideal conference, covering a narrow family of topics I&amp;rsquo;m interested in, mainly leading-edge matters in programming languages and distributed systems. The focus is not at all academic, instead being on open source software that you can download and get to work with. I have to strongly commend the organizers for finding a great venue, excellent speakers, and running a fabulous show at an impressively low price.&lt;/p&gt;</description></item><item><title>Fitter, happier, more productive UTF-8 decoding</title><link>https://www.serpentine.com/2011/07/11/fitter-happier-more-productive-utf-8-decoding/</link><pubDate>Mon, 11 Jul 2011 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2011/07/11/fitter-happier-more-productive-utf-8-decoding/</guid><description>&lt;p&gt;The other night, I had a random whim to spend a couple of minutes looking at the performance of
UTF-8 decoding in the Haskell &lt;a href="http://hackage.haskell.org/package/text"&gt;Unicode text package&lt;/a&gt;.
Actually, rather than look at the actual performance, what I did was use Don Stewart&amp;rsquo;s excellent
&lt;a href="http://hackage.haskell.org/package/ghc-core"&gt;&lt;code&gt;ghc-core&lt;/code&gt;&lt;/a&gt; tool to inspect the high-level &amp;ldquo;Core&amp;rdquo;
code generated by the compiler. Core is the last layer at which Haskell code is still somewhat
intelligible, and although it takes quite a bit of practice to interpret, the effort is often
worth it.&lt;/p&gt;</description></item><item><title>Here be dragons: advances in problems you didn’t even know you had</title><link>https://www.serpentine.com/2011/06/29/here-be-dragons-advances-in-problems-you-didnt-even-know-you-had/</link><pubDate>Wed, 29 Jun 2011 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2011/06/29/here-be-dragons-advances-in-problems-you-didnt-even-know-you-had/</guid><description>&lt;p&gt;Here&amp;rsquo;s something I bet you never think about, and for good reason: how are floating-point
numbers rendered as text strings? This is a surprisingly tough problem, but it&amp;rsquo;s been regarded
as essentially solved since about 1990.&lt;/p&gt;
&lt;p&gt;Prior to Steele and White&amp;rsquo;s &amp;ldquo;&lt;a href="https://web.archive.org/web/20001018135207/http://portal.acm.org/citation.cfm?id=93559"&gt;How to print floating-point numbers
accurately&lt;/a&gt;&amp;rdquo;, implementations of &lt;code&gt;printf&lt;/code&gt; and
similar rendering functions did their best to render floating point numbers, but there was wide
variation in how well they behaved. A number such as 1.3 might be rendered as 1.29999999, for
instance, or if a number was put through a feedback loop of being written out and its written
representation read back, each successive result could drift further and further away from the
original.&lt;/p&gt;</description></item><item><title>attoparsec 0.9, a major (and abortive) release [updated]</title><link>https://www.serpentine.com/2011/06/03/attoparsec-0-9-a-major-release/</link><pubDate>Fri, 03 Jun 2011 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2011/06/03/attoparsec-0-9-a-major-release/</guid><description>&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: I just released attoparsec 0.9.1.0, which &lt;em&gt;undoes&lt;/em&gt; all of the changes described below. The problem? While removing backtracking, I accidentally changed the semantics of the &lt;code&gt;&amp;lt;|&amp;gt;&lt;/code&gt; operator in an unforeseen and unfortunate way. The bug I introduced was that a parser of the form &lt;code&gt;(char 'a' *&amp;gt; char 'b') &amp;lt;|&amp;gt; char 'c'&lt;/code&gt; would now accept as valid the input &lt;code&gt;&amp;quot;ac&amp;quot;&lt;/code&gt;, which is clearly highly undesirable. Once my error was pointed out (see the comments at the end of this post), I quickly &lt;a href="https://github.com/bos/attoparsec/commit/c2ec0a4fd956a8629327dbc7bbb924de45efe78e"&gt;came up with a fix&lt;/a&gt;, but the fix itself had a problem: it regressed performance to being &lt;em&gt;slower&lt;/em&gt; than when attoparsec performed backtracking! So now attoparsec backtracks in &lt;code&gt;&amp;lt;|&amp;gt;&lt;/code&gt; again, until such time as I can come up with an approach that I&amp;rsquo;m happier with (and who knows when that will be). Whew.&lt;/p&gt;</description></item><item><title>Exciting teaching news</title><link>https://www.serpentine.com/2011/05/11/exciting-teaching-news/</link><pubDate>Wed, 11 May 2011 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2011/05/11/exciting-teaching-news/</guid><description>&lt;p&gt;Looks like I&amp;rsquo;ve got a busy autumn ahead! Read on for two pieces of news that I&amp;rsquo;m very happy about.&lt;/p&gt;
&lt;p&gt;In September, I&amp;rsquo;ll be teaching a Haskell workshop at the &lt;a href="http://thestrangeloop.com/"&gt;Strange Loop Conference&lt;/a&gt; in St Louis. Here&amp;rsquo;s the abstract:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Modern programming presents a daunting array of challenges: proliferating technologies, messy inputs, unreliable networks, huge volumes of data, how to verify that results are correct, making it all fast enough. The Haskell programming language is well suited to addressing this broad range of needs, as it uniquely combines conciseness, safety, and high performance.&lt;/p&gt;</description></item><item><title>A new week, a new JSON performance improvement</title><link>https://www.serpentine.com/2011/03/22/a-new-week-a-new-json-performance-improvement/</link><pubDate>Tue, 22 Mar 2011 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2011/03/22/a-new-week-a-new-json-performance-improvement/</guid><description>&lt;p&gt;It&amp;rsquo;s been a few weeks since I last wrote about the &lt;a href="http://hackage.haskell.org/package/aeson"&gt;aeson
library&lt;/a&gt; for working with JSON in Haskell, but this
isn&amp;rsquo;t because I&amp;rsquo;ve been idle. In fact, just tonight I put out a new release. Where the previous
releases focused on parsing performance, this one focuses on encoding performance.&lt;/p&gt;
&lt;p&gt;And the performance news is good: on real-world data, I&amp;rsquo;ve improved encoding performance by
about a factor of 4. Why don&amp;rsquo;t we let the graphs do the talking.&lt;/p&gt;</description></item><item><title>A little care and feeding can go a long way</title><link>https://www.serpentine.com/2011/03/18/a-little-care-and-feeding-can-go-a-long-way/</link><pubDate>Fri, 18 Mar 2011 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2011/03/18/a-little-care-and-feeding-can-go-a-long-way/</guid><description>&lt;p&gt;Sometimes, when a software package meets a certain level of maturity (or the desire to hack on
it fades sufficiently), it&amp;rsquo;s tempting to consider it &amp;ldquo;done&amp;rdquo;. Here&amp;rsquo;s a little tale of when done
isn&amp;rsquo;t really done.&lt;/p&gt;
&lt;p&gt;About a week ago, I received a message from Finlay Thompson asking about my Haskell
&lt;a href="http://hackage.haskell.org/package/statistics"&gt;statistics&lt;/a&gt; package: he wanted to know how to
generate pseudo-random variables using it. I redirected him from that to my
&lt;a href="http://hackage.haskell.org/package/mwc-random"&gt;mwc-random&lt;/a&gt; package, where my pseudo-random
number generation code lives.&lt;/p&gt;</description></item><item><title>CPS is great! CPS is terrible!</title><link>https://www.serpentine.com/2011/02/25/cps-is-great-cps-is-terrible/</link><pubDate>Fri, 25 Feb 2011 20:29:27 +0000</pubDate><guid>https://www.serpentine.com/2011/02/25/cps-is-great-cps-is-terrible/</guid><description>&lt;p&gt;Every functional programmer worth their salt seems to end up with at least a few stories to tell
about programming in CPS, also known as &lt;a href="http://en.wikipedia.org/wiki/Continuation-passing_style"&gt;continuation passing
style&lt;/a&gt;. Here&amp;rsquo;s my latest one.&lt;/p&gt;
&lt;p&gt;As a user of it, you can&amp;rsquo;t tell that my
&lt;a href="http://hackage.haskell.org/package/attoparsec"&gt;attoparsec&lt;/a&gt; parsing library is implemented
almost entirely using explicit continuations. Every combinator accepts two continuations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;the &lt;em&gt;failure&lt;/em&gt; continuation is invoked if the current function fails&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;the &lt;em&gt;success&lt;/em&gt; continuation is invoked if the current function succeeds&lt;/p&gt;</description></item><item><title>Faster, better, cleaner: new aeson and attoparsec releases</title><link>https://www.serpentine.com/2011/02/25/faster-better-cleaner-new-aeson-and-attoparsec-releases/</link><pubDate>Fri, 25 Feb 2011 19:24:51 +0000</pubDate><guid>https://www.serpentine.com/2011/02/25/faster-better-cleaner-new-aeson-and-attoparsec-releases/</guid><description>&lt;p&gt;I&amp;rsquo;ve spent some time over the past few weeks improving the performance of the
&lt;a href="http://hackage.haskell.org/package/attoparsec"&gt;attoparsec&lt;/a&gt; parsing library, and of the
&lt;a href="http://hackage.haskell.org/package/aeson"&gt;aeson&lt;/a&gt; JSON library. Since they&amp;rsquo;ve now reached a new
plateau of performance and stability, I thought this would be a good time to release new
versions.&lt;/p&gt;
&lt;p&gt;The major advance in the new version of aeson is a considerable speed improvement.&lt;/p&gt;
&lt;p&gt;[!&lt;a href="https://web.archive.org/web/20110807204254/http://www.serpentine.com/wordpress/wp-content/uploads/2011/02/flump.png"&gt;Performance
improvement&lt;/a&gt;](&lt;a href="https://web.archive.org/web/20110807204254/http://www.serpentine.com/wordpress/wp-content/uploads/2011/02/flump.png"&gt;https://web.archive.org/web/20110807204254/http://www.serpentine.com/wordpress/wp-content/uploads/2011/02/flump.png&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;The datasets I&amp;rsquo;m using are Twitter search results, from the Twitter JSON search API. For
mostly-English results, 0.2.0.0 is up to 30% faster than before, while on Japanese data (which
makes heavy use of Unicode escapes), I&amp;rsquo;ve bumped performance by more than 50%.&lt;/p&gt;</description></item><item><title>So I went and started a company</title><link>https://www.serpentine.com/2011/01/28/so-i-went-and-started-a-company/</link><pubDate>Fri, 28 Jan 2011 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2011/01/28/so-i-went-and-started-a-company/</guid><description>&lt;p&gt;I&amp;rsquo;m delighted to say that after a couple of years of a break from the startup world (which I&amp;rsquo;ve inhabited for most of the past decade), I&amp;rsquo;ve decided to throw my hat back into the ring. Together with Bethanye Blount, I&amp;rsquo;ve started a company named MailRank. We&amp;rsquo;re working on helping people to manage the all-too-common problem of email overload. You can read a little more about what we&amp;rsquo;re up to in our &lt;a href="http://blog.mailrank.com/hello-world"&gt;initial announcement&lt;/a&gt;, and we&amp;rsquo;ll have more details to share soon.&lt;/p&gt;</description></item><item><title>A small matter of illegal characters</title><link>https://www.serpentine.com/2010/11/29/a-small-matter-of-illegal-characters/</link><pubDate>Mon, 29 Nov 2010 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2010/11/29/a-small-matter-of-illegal-characters/</guid><description/></item><item><title>GHC 7 I/O manager status update</title><link>https://www.serpentine.com/2010/11/27/ghc-7-io-manager-status/</link><pubDate>Sat, 27 Nov 2010 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2010/11/27/ghc-7-io-manager-status/</guid><description/></item><item><title>text 0.10.0.0 is here</title><link>https://www.serpentine.com/2010/10/22/text-0-10-0-0-is-here/</link><pubDate>Fri, 22 Oct 2010 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2010/10/22/text-0-10-0-0-is-here/</guid><description/></item><item><title>How to migrate from darcs to Mercurial or git</title><link>https://www.serpentine.com/2010/10/21/how-to-migrate-from-darcs-to-mercurial-or-git/</link><pubDate>Thu, 21 Oct 2010 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2010/10/21/how-to-migrate-from-darcs-to-mercurial-or-git/</guid><description/></item><item><title>A brief tale of faster equality</title><link>https://www.serpentine.com/2010/10/19/a-brief-tale-of-faster-equality/</link><pubDate>Tue, 19 Oct 2010 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2010/10/19/a-brief-tale-of-faster-equality/</guid><description/></item><item><title>Unicode text performance improvements</title><link>https://www.serpentine.com/2010/10/15/unicode-text-performance-improvements/</link><pubDate>Fri, 15 Oct 2010 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2010/10/15/unicode-text-performance-improvements/</guid><description/></item><item><title>Like a coding challenge? Check out Code Quarterly</title><link>https://www.serpentine.com/2010/10/11/like-a-coding-challenge-check-out-code-quarterly/</link><pubDate>Mon, 11 Oct 2010 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2010/10/11/like-a-coding-challenge-check-out-code-quarterly/</guid><description>&lt;p&gt;Peter Seibel (the man behind &lt;a href="http://www.gigamonkeys.com/book/"&gt;Practical Common Lisp&lt;/a&gt;) is launching a new publication, &lt;a href="https://web.archive.org/web/20221027163937/http://www.codequarterly.com/"&gt;Code Quarterly&lt;/a&gt;, which looks intriguing to me. He&amp;rsquo;s hoping to run a coding challenge in each issue, and I know this is the sort of fun dear to many a coder&amp;rsquo;s heart. The &lt;a href="https://web.archive.org/web/https://web.archive.org/web/20221027163937/http://www.codequarterly.com/code-challenges/markup/"&gt;first coding challenge&lt;/a&gt; has been up for a couple of weeks, and it involves implementing a parser for Markup, a lightweight markup language similar to Markdown and reStructuredText.&lt;/p&gt;</description></item><item><title>Dual bitbucket/github citizenship</title><link>https://www.serpentine.com/2010/10/10/dual-bitbucketgithub-citizenship/</link><pubDate>Sun, 10 Oct 2010 22:56:02 +0000</pubDate><guid>https://www.serpentine.com/2010/10/10/dual-bitbucketgithub-citizenship/</guid><description>&lt;p&gt;One of the particularly nice things about working with a distributed revision control tool these
days is that I can sidestep the choice of winning tool. Thanks to Scott Chacon and Augie
Fackler&amp;rsquo;s excellent &lt;a href="https://web.archive.org/web/20130316153035/http://hg-git.github.com/"&gt;hg-git extension&lt;/a&gt;, I can use Mercurial and
collaborate almost seamlessly with git users. This is exactly what I did when working with Johan
on the new I/O manager subsystem in GHC 7, and the experience was generally very smooth.&lt;/p&gt;</description></item><item><title>Why I don’t use darcs any more (much)</title><link>https://www.serpentine.com/2010/10/10/why-i-dont-use-darcs-any-more-much/</link><pubDate>Sun, 10 Oct 2010 05:20:48 +0000</pubDate><guid>https://www.serpentine.com/2010/10/10/why-i-dont-use-darcs-any-more-much/</guid><description>&lt;p&gt;Over the past couple of years, since David Roundy handed over control of the darcs revision
control system to a talented team of developers, it has come a long way in stability and
performance.&lt;/p&gt;
&lt;p&gt;I began using darcs essentially out of necessity, simply because it was the revision control
system of choice for much of the Haskell community. I have always found my use of it to be
somewhat clunky, and lately I&amp;rsquo;ve been migrating most of my remaining Haskell projects away from
it.&lt;/p&gt;</description></item><item><title>A tiny example of clean Unicode handling in Haskell</title><link>https://www.serpentine.com/2010/09/27/a-tiny-example-of-clean-unicode-handling-in-haskell/</link><pubDate>Mon, 27 Sep 2010 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2010/09/27/a-tiny-example-of-clean-unicode-handling-in-haskell/</guid><description>&lt;p&gt;Ersin Er wrote a brief blog post about &lt;a href="https://web.archive.org/web/20110101182458/http://ersiner.net:80/2010/09/27/case-mapping-for-turkish-in-haskell/"&gt;handling the Turkish language in
Haskell&lt;/a&gt;. Because Turkish
uses a character set that mostly looks familiar to Westerners, it is notorious for its ability
to trip up the unwary programmer (see examples in &lt;a href="http://bugs.php.net/bug.php?id=35050"&gt;PHP&lt;/a&gt;
and &lt;a href="http://archives.postgresql.org/pgsql-bugs/2001-02/msg00135.php"&gt;PostgreSQL&lt;/a&gt;).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-haskell" data-lang="haskell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;Data.Text&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;unpack&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;Data.Text.ICU&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;LocaleName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Locale&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nf"&gt;toLower&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;main&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;trLocale&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Locale&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;tr-TR&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;upStr&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;ÇIİĞÖŞÜ&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;lowStr&lt;/span&gt; &lt;span class="ow"&gt;=&lt;/span&gt; &lt;span class="n"&gt;unpack&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="n"&gt;toLower&lt;/span&gt; &lt;span class="n"&gt;trLocale&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="n"&gt;pack&lt;/span&gt; &lt;span class="n"&gt;upStr&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;putStrLn&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;toLower &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="n"&gt;upStr&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="s"&gt;&amp;#34; gives &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="n"&gt;lowStr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;His example is quite nice, but we can write more compact version of his code using a few handy
features of the &lt;a href="http://hackage.haskell.org/package/text"&gt;text&lt;/a&gt; and
&lt;a href="http://hackage.haskell.org/package/text-icu"&gt;text-icu&lt;/a&gt; packages:&lt;/p&gt;</description></item><item><title>Haskell-related job opening at Stanford University</title><link>https://www.serpentine.com/2010/09/22/haskell-related-job-opening-at-stanford-university/</link><pubDate>Wed, 22 Sep 2010 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2010/09/22/haskell-related-job-opening-at-stanford-university/</guid><description/></item><item><title>Updated ICU bindings for Haskell: 0.4.0.0</title><link>https://www.serpentine.com/2010/09/10/updated-icu-bindings-for-haskell-0-4-0-0/</link><pubDate>Fri, 10 Sep 2010 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2010/09/10/updated-icu-bindings-for-haskell-0-4-0-0/</guid><description/></item><item><title>Dealing with fragile C libraries (e.g. MySQL) from Haskell</title><link>https://www.serpentine.com/2010/09/04/dealing-with-fragile-c-libraries-e-g-mysql-from-haskell/</link><pubDate>Sat, 04 Sep 2010 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2010/09/04/dealing-with-fragile-c-libraries-e-g-mysql-from-haskell/</guid><description>&lt;p&gt;I spent some time today trying to talk to a MySQL database server from a piece of middleware I&amp;rsquo;m
writing in Haskell. You might think that talking to a database server would be easy, but it
turned out to be quite a bother.&lt;/p&gt;
&lt;p&gt;Both of the major MySQL bindings, &lt;a href="http://hackage.haskell.org/package/HDBC-mysql"&gt;HDBC-mysql&lt;/a&gt;
and &lt;a href="http://hackage.haskell.org/package/HDBC-odbc"&gt;HDBC-odbc&lt;/a&gt;, use the &lt;code&gt;libmysqlclient&lt;/code&gt; C
library behind the scenes. With GHC&amp;rsquo;s unthreaded runtime, which is still the default, an
application using either will work fine. However, my middleware app is highly concurrent and
uses software transactional memory (STM) to manage some shared state, and I have to use the
threaded runtime. This is where my troubles began.&lt;/p&gt;</description></item><item><title>Fast base64 encoding and decoding in Haskell</title><link>https://www.serpentine.com/2010/09/02/fast-base64-encoding-and-decoding-in-haskell/</link><pubDate>Thu, 02 Sep 2010 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2010/09/02/fast-base64-encoding-and-decoding-in-haskell/</guid><description/></item><item><title>Major version of the Haskell text library, 0.8.0.0</title><link>https://www.serpentine.com/2010/09/01/major-version-of-the-haskell-text-library-0-8-0-0/</link><pubDate>Wed, 01 Sep 2010 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2010/09/01/major-version-of-the-haskell-text-library-0-8-0-0/</guid><description/></item><item><title>Haskell in the Real World discussion at CUFP</title><link>https://www.serpentine.com/2010/08/25/haskell-in-the-real-world-discussion-at-cufp/</link><pubDate>Wed, 25 Aug 2010 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2010/08/25/haskell-in-the-real-world-discussion-at-cufp/</guid><description/></item><item><title>Converting a Mercurial tree repeatedly with files removed</title><link>https://www.serpentine.com/2010/08/10/converting-a-mercurial-tree-repeatedly-with-files-removed/</link><pubDate>Tue, 10 Aug 2010 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2010/08/10/converting-a-mercurial-tree-repeatedly-with-files-removed/</guid><description>&lt;p&gt;Here&amp;rsquo;s a useful little tip if you need to use
&lt;a href="https://web.archive.org/web/https://web.archive.org/web/20250925153024/https://mercurial.selenic.com/wiki/ConvertExtension"&gt;&lt;code&gt;hg convert&lt;/code&gt;&lt;/a&gt; to generate a stripped-down
copy of a &lt;a href="https://web.archive.org/web/20250925153024/https://mercurial.selenic.com/"&gt;Mercurial&lt;/a&gt; repository. For instance, maybe we have a
tree that someone committed a large file to by accident, or perhaps someone accidentally checked
some closed source code into an open source tree. If such a commit makes it into a busy
repository, it can be a while before anyone notices. Worse, we can&amp;rsquo;t necessarily expect everyone
who&amp;rsquo;s downstream of that repository to immediately drop everything they&amp;rsquo;re doing and find a way
to switch over to the freshly-scrubbed tree you want to publish.&lt;/p&gt;</description></item><item><title>Budding Aspen, Sierra Palisades</title><link>https://www.serpentine.com/2010/08/05/budding-aspen-sierra-palisades/</link><pubDate>Thu, 05 Aug 2010 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2010/08/05/budding-aspen-sierra-palisades/</guid><description>&lt;p&gt;[!&lt;a href="http://farm2.static.flickr.com/1345/4729810316_6eb557da72.jpg"&gt;DSC_0243&lt;/a&gt;](&lt;a href="http://www.flickr.com/photos/bosu/4729810316/"&gt;http://www.flickr.com/photos/bosu/4729810316/&lt;/a&gt;)&lt;/p&gt;</description></item><item><title>PADL ’11 call for papers</title><link>https://www.serpentine.com/2010/07/22/padl-11-call-for-papers/</link><pubDate>Thu, 22 Jul 2010 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2010/07/22/padl-11-call-for-papers/</guid><description/></item><item><title>GHC I/O manager progress: ready to merge, and paper accepted!</title><link>https://www.serpentine.com/2010/07/13/ghc-io-manager-progress-ready-to-merge-and-paper-accepted/</link><pubDate>Tue, 13 Jul 2010 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2010/07/13/ghc-io-manager-progress-ready-to-merge-and-paper-accepted/</guid><description>&lt;p&gt;Thanks to diligent work by Johan, our new I/O manager is ready to merge into the main GHC tree. All the tests pass, and it&amp;rsquo;s performing well. I&amp;rsquo;ll post an update when it gets merged into HEAD.&lt;/p&gt;
&lt;p&gt;We also heard back from the peer reviewers for this year&amp;rsquo;s Haskell Symposium that our paper describing the new I/O manager has been accepted. The reviewers had some very helpful suggestions for how we can clarify the paper and improve its presentation, so I&amp;rsquo;ll be working on a final draft over the next couple of weeks (I&amp;rsquo;m currently on vacation in Ireland, so paper revisions aren&amp;rsquo;t yet at the top of my priority list).&lt;/p&gt;</description></item><item><title>What’s in a find function?</title><link>https://www.serpentine.com/2010/07/02/whats-in-a-find-function/</link><pubDate>Fri, 02 Jul 2010 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2010/07/02/whats-in-a-find-function/</guid><description/></item><item><title>Sightings of the GHC event manager in the wild</title><link>https://www.serpentine.com/2010/06/14/sightings-of-the-ghc-event-manager-in-the-wild/</link><pubDate>Mon, 14 Jun 2010 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2010/06/14/sightings-of-the-ghc-event-manager-in-the-wild/</guid><description>&lt;p&gt;&lt;a href="http://www.flickr.com/photos/bosu/4697646728/"&gt;&lt;img alt="Evening view of a California hillside" loading="lazy" src="http://farm5.static.flickr.com/4023/4697646728_936fca2993.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;After a few months of blissfully doing precious little hacking in our spare time, Johan and I
have returned to work on the new event manager for GHC.&lt;/p&gt;
&lt;p&gt;I spent the past few days writing a paper about the &lt;a href="https://www.serpentine.com/docs/ghc-event-manager.pdf"&gt;motivation, design, and
internals&lt;/a&gt; of the new event manager,
which I submitted to this year&amp;rsquo;s &lt;a href="http://www.haskell.org/haskell-symposium/2010/"&gt;Haskell
Symposium&lt;/a&gt; at about 2am this morning.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/bosu/4697648858/"&gt;&lt;img alt="Dinner on the patio with friends" loading="lazy" src="http://farm5.static.flickr.com/4007/4697648858_30f7377c41.jpg"&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>What’s in a parser? Attoparsec rewired (2/2)</title><link>https://www.serpentine.com/2010/03/03/whats-in-a-parser-attoparsec-rewired-2/</link><pubDate>Wed, 03 Mar 2010 18:03:27 +0000</pubDate><guid>https://www.serpentine.com/2010/03/03/whats-in-a-parser-attoparsec-rewired-2/</guid><description>&lt;p&gt;In my &lt;a href="https://www.serpentine.com/2010/03/03/whats-in-a-parsing-library-1/"&gt;first of this pair of articles&lt;/a&gt;, I laid out
some of the qualities I&amp;rsquo;ve been looking for in a parsing library.&lt;/p&gt;
&lt;p&gt;Before I dive back into detail, I want to show off some numbers. The new Attoparsec code is
&lt;em&gt;fast&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;!&lt;a href="https://web.archive.org/web/20230531024950/http://chart.apis.google.com/chart?cht=bvs&amp;amp;chs=340x200&amp;amp;chd=t:260,0,0,0,0%7C0,471,0,0,0%7C0,0,17037,0,0%7C0,0,0,23753,0%7C0,0,0,0,36753&amp;amp;chds=0,40000&amp;amp;chco=4D89F9%7C894DF9%7CF94D89%7C4DB989%7C1969FD&amp;amp;chdl=260&amp;#43;ms:&amp;#43;http_parser%7C471&amp;#43;ms:&amp;#43;Attoparsec%7C17037&amp;#43;ms:&amp;#43;Parsec&amp;#43;3&amp;#43;CPS%7C23753&amp;#43;ms:&amp;#43;Lazy&amp;#43;Parsec&amp;#43;3&amp;#43;CPS%7C36753&amp;#43;ms:&amp;#43;Parsec&amp;#43;3&amp;amp;chxt=y&amp;amp;chxl=0:%7C%7C10%7C20%7C30%7C40&amp;amp;chtt=Time&amp;#43;to&amp;#43;parse&amp;#43;45,668%7CHTTP&amp;#43;GET&amp;#43;requests"&gt;Performance&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What did I benchmark? I captured some real HTTP GET requests from a live public web server,
averaging 431 bytes per request. I chucked them into a file, and measured the time needed to
parse the entire contents of the file with the following libraries:&lt;/p&gt;</description></item><item><title>What’s in a parsing library? (1/2)</title><link>https://www.serpentine.com/2010/03/03/whats-in-a-parsing-library-1/</link><pubDate>Wed, 03 Mar 2010 07:12:28 +0000</pubDate><guid>https://www.serpentine.com/2010/03/03/whats-in-a-parsing-library-1/</guid><description>&lt;p&gt;My goal in working on the &lt;a href="https://www.serpentine.com/2010/01/22/new-ghc-io-manager-first-benchmark-numbers/"&gt;new GHC I/O
manager&lt;/a&gt;
has been to get the Haskell network stack into a state where it could be used to attack
high-performance and scalable networking problems, domains in which it has historically been
weak.&lt;/p&gt;
&lt;p&gt;While it&amp;rsquo;s encouraging to have an excellent networking stack (Johan and I now have this
thoroughly in hand), the next thing I&amp;rsquo;d look for is libraries to help build networked
applications. One of the fundamental things that such apps need to do well is parse data, be it
received from the network or read from files.&lt;/p&gt;</description></item><item><title>Minuscule linkscrape of mischief</title><link>https://www.serpentine.com/2010/01/30/massive-linkscrape-of-mischievous-doom/</link><pubDate>Sat, 30 Jan 2010 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2010/01/30/massive-linkscrape-of-mischievous-doom/</guid><description>&lt;p&gt;While I&amp;rsquo;ve been in my corner hacking on low-level Haskell nonsense, apparently someone figured out how to make the internets more better.&lt;/p&gt;
&lt;p&gt;To wit, a few judiciously curated sources of visual edification:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://forgreatjustice.tumblr.com/post/359166403/dont-worry-im-from-the-internet"&gt;&lt;img alt="I&amp;rsquo;m from the internet" loading="lazy" src="http://27.media.tumblr.com/tumblr_kwz785G6N01qalbabo1_500.jpg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="http://forgreatjustice.tumblr.com/"&gt;for great justice&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://web.archive.org/web/20240806163640/https://unhappyhipsters.com/post/354725045/the-octopus-was-full-of-judgment-dwell-october"&gt;&lt;img alt="The octopus was full of judgment" loading="lazy" src="http://27.media.tumblr.com/tumblr_kwvcm5BExl1qam6ylo1_500.jpg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="http://unhappyhipsters.com/"&gt;unhappy hipsters&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://riotclitshave.livejournal.com/1693322.html"&gt;&lt;img alt="Ooooooh" loading="lazy" src="https://web.archive.org/web/20100721211222/http://riotclitshave.com/2010.01/megan-dscf2656jpg.jpeg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="http://riotclitshave.livejournal.com/"&gt;riot right click&lt;/a&gt;&lt;/p&gt;</description></item><item><title>New GHC I/O manager, first sets of benchmark numbers</title><link>https://www.serpentine.com/2010/01/22/new-ghc-io-manager-first-benchmark-numbers/</link><pubDate>Fri, 22 Jan 2010 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2010/01/22/new-ghc-io-manager-first-benchmark-numbers/</guid><description/></item><item><title>Progress on GHC’s I/O manager</title><link>https://www.serpentine.com/2010/01/11/progress-on-ghcs-io-manager/</link><pubDate>Mon, 11 Jan 2010 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2010/01/11/progress-on-ghcs-io-manager/</guid><description>&lt;p&gt;Over the past couple of weeks, I have been working with Johan Tibbell on an event library to use
for replacing &lt;a href="https://www.serpentine.com/2009/12/17/making-ghcs-io-manager-more-scalable/"&gt;GHC&amp;rsquo;s existing I/O
manager&lt;/a&gt;. The
work has been progressing rather nicely: I now have both the epoll and kqueue back ends working,
while Johan has been focusing on a fast priority queue data structure for managing timeouts.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve been working from a pair of git repositories:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Johan&amp;rsquo;s is at &lt;a href="http://github.com/tibbe/event"&gt;http://github.com/tibbe/event&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Mine is at &lt;a href="http://github.com/bos/event"&gt;http://github.com/bos/event&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(Incidentally, I&amp;rsquo;m using the excellent &lt;a href="https://web.archive.org/web/20130316153035/http://hg-git.github.com/"&gt;hg-git plugin for Mercurial&lt;/a&gt;,
which has allowed me to continue to avoid using git. It&amp;rsquo;s been working very well. Many thanks to
Scott Chacon and Augie Fackler for their work on it!)&lt;/p&gt;</description></item><item><title>Making GHC’s I/O manager more scalable</title><link>https://www.serpentine.com/2009/12/17/making-ghcs-io-manager-more-scalable/</link><pubDate>Thu, 17 Dec 2009 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2009/12/17/making-ghcs-io-manager-more-scalable/</guid><description/></item><item><title>Data.Text 0.7 gains I/O support</title><link>https://www.serpentine.com/2009/12/15/data-text-0-7-gains-io-support/</link><pubDate>Tue, 15 Dec 2009 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2009/12/15/data-text-0-7-gains-io-support/</guid><description/></item><item><title>The performance of Data.Text</title><link>https://www.serpentine.com/2009/12/10/the-performance-of-data-text/</link><pubDate>Fri, 11 Dec 2009 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2009/12/10/the-performance-of-data-text/</guid><description/></item><item><title>Wouldn’t it be nice…</title><link>https://www.serpentine.com/2009/12/02/wouldnt-it-be-nice/</link><pubDate>Wed, 02 Dec 2009 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2009/12/02/wouldnt-it-be-nice/</guid><description>&lt;p&gt;&amp;hellip;if the world of blogging about software had by now developed some kind of a tradition of critical analysis?&lt;/p&gt;
&lt;p&gt;Over at &lt;em&gt;Inside Higher Ed&lt;/em&gt;, Scott McLemee writes a &lt;a href="https://web.archive.org/web/20230320222644/https://www.insidehighered.com/views/mclemee/mclemee267"&gt;careful and thoughtful review of Cornel West&amp;rsquo;s new book&lt;/a&gt;. It performs the delicate feat of being at once both generous to its subject and devastating in its analysis:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Legend has it that the blues guitarist Robert Johnson acquired his haunting style by selling his soul to the devil at a crossroads. West, as a &amp;ldquo;bluesman of the life of the mind,&amp;rdquo; has clearly also been to the crossroads. The devil gave him a team of publicists. I don&amp;rsquo;t think this was a good bargain on West&amp;rsquo;s part. It left him unable to recognize that self-respect is often the enemy of self-esteem.
Although his prose style is impeccable, what I like even more about McLemee&amp;rsquo;s piece is the way in which he expresses hope that West might return to fulfilling his early promise. (I suspect that this expression of hope is mainly a form of rhetorical charity, but it&amp;rsquo;s stylish nonetheless.) This led me to wondering whether it&amp;rsquo;s even achievable to foster a similar style among people who write about code.&lt;/p&gt;</description></item><item><title>Dense? Dense, you say?</title><link>https://www.serpentine.com/2009/12/01/dense-dense-you-say/</link><pubDate>Tue, 01 Dec 2009 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2009/12/01/dense-dense-you-say/</guid><description/></item><item><title>Criterion 0.2, an improved Haskell benchmarking library</title><link>https://www.serpentine.com/2009/11/06/criterion-0-2-an-improved-haskell-benchmarking-library/</link><pubDate>Fri, 06 Nov 2009 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2009/11/06/criterion-0-2-an-improved-haskell-benchmarking-library/</guid><description>&lt;p&gt;I&amp;rsquo;m pleased to announce the availability of version 0.2 of my &lt;a href="http://hackage.haskell.org/package/criterion"&gt;criterion
library&lt;/a&gt; for Haskell performance evaluation.&lt;/p&gt;
&lt;p&gt;Compared to version 0.1, this version has some significant changes.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The benchmarking API has been improved! If you&amp;rsquo;re benchmarking a pure function, you no longer
need to feed it an &lt;code&gt;Int&lt;/code&gt; to ensure that it won&amp;rsquo;t get thunked or let-floated. Instead, Use the
&lt;code&gt;B&lt;/code&gt; data type (see the &lt;code&gt;examples/&lt;/code&gt; directory) to specify an unsaturated function that you want
to benchmark, along with its last argument. Many thanks to Daniel Peebles for suggesting this
approach, which makes the use of criterion considerably more pleasant.&lt;/li&gt;
&lt;li&gt;Neil Brown added a &lt;code&gt;-kde-same-axis&lt;/code&gt; command-line option to allow plotting the KDEs for all the
benchmarks with the same X axis. I&amp;rsquo;d like to thank Neil for his helpful work on some other
code cleanup issues, too.&lt;/li&gt;
&lt;li&gt;There are some more, and better quality, examples in the &lt;code&gt;examples/&lt;/code&gt; directory.&lt;/li&gt;
&lt;li&gt;Tim Docker contributed a patch that improves graph rendering.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As the changes above suggest, several people have been actively contributing to the improvement
of criterion, and I&amp;rsquo;m delighted by this. Please feel welcome to get involved; there are many
improvements I&amp;rsquo;d like to make, but of course I have limited time to work on them. I&amp;rsquo;ll be happy
to talk with you about other potentially useful changes.&lt;/p&gt;</description></item><item><title>Announcing a major revision of the Haskell text library</title><link>https://www.serpentine.com/2009/10/09/announcing-a-major-revision-of-the-haskell-text-library/</link><pubDate>Fri, 09 Oct 2009 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2009/10/09/announcing-a-major-revision-of-the-haskell-text-library/</guid><description>&lt;p&gt;I&amp;rsquo;m pleased to announce the availability of version 0.5 of
&lt;a href="http://hackage.haskell.org/package/text"&gt;text&lt;/a&gt;, a library that provides fast Unicode text
handling for Haskell.&lt;/p&gt;
&lt;p&gt;This version contains numerous changes compared to version 0.4, in three broad categories:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I made improvements to the performance of some common functions by, in many cases, more than
10x.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I have substantially refined the API.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Many bugs fixed, almost all of them subtle, thanks to the ever-astounding QuickCheck library.&lt;/p&gt;</description></item><item><title>New criterion release works on Macs</title><link>https://www.serpentine.com/2009/09/30/new-criterion-release-works-on-macs/</link><pubDate>Wed, 30 Sep 2009 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2009/09/30/new-criterion-release-works-on-macs/</guid><description>&lt;p&gt;And has prettier charts, too, thanks to a patch from Tim Docker.&lt;/p&gt;
&lt;p&gt;If you already have criterion installed:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cabal update
$ cabal install --reinstall criterion
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you want to use criterion on a Mac:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cabal update
$ cabal install criterion -f-chart
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Alas, on OS X, you&amp;rsquo;ll lack the ability to directly generate pretty chart images, but criterion
will still output CSV files for you. You can import these into gnuplot or your favourite
spreadsheet with ease, and chart away from there.&lt;/p&gt;</description></item><item><title>Criterion, a new benchmarking library for Haskell</title><link>https://www.serpentine.com/2009/09/29/criterion-a-new-benchmarking-library-for-haskell/</link><pubDate>Tue, 29 Sep 2009 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2009/09/29/criterion-a-new-benchmarking-library-for-haskell/</guid><description>&lt;p&gt;I&amp;rsquo;m pleased to announce the availability of
&lt;a href="http://hackage.haskell.org/package/criterion"&gt;criterion&lt;/a&gt;, a new library for measuring the
performance of Haskell code.&lt;/p&gt;
&lt;p&gt;Compared to most other benchmarking frameworks (for any programming language, not just Haskell),
criterion focuses on being easy to use, informative, and robust.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a canonical benchmark-worthy function, which has the desirable properties of being both
small and slow:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-haskell" data-lang="haskell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- Save this as a file named &amp;#34;Fibber.hs&amp;#34;.import Criterion.Main (defaultMain)fib :: Int -&amp;gt; Intfib 0 = 0fib 1 = 1fib n = fib (n-1) + fib (n-2)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To compile a program that will benchmark our &lt;code&gt;fib&lt;/code&gt; function, we write a trivial &lt;code&gt;main&lt;/code&gt; entry
point:&lt;/p&gt;</description></item><item><title>Riddle me this</title><link>https://www.serpentine.com/2009/09/25/riddle-me-this/</link><pubDate>Fri, 25 Sep 2009 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2009/09/25/riddle-me-this/</guid><description/></item><item><title>Video of my CUFP keynote</title><link>https://www.serpentine.com/2009/09/23/video-of-my-cufp-keynote/</link><pubDate>Wed, 23 Sep 2009 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2009/09/23/video-of-my-cufp-keynote/</guid><description>&lt;p&gt;Thanks to the tireless work of Malcolm Wallace, all of the video from CUFP now appears to be up up Vimeo, including the keynote talk I gave.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://vimeo.com/6703480"&gt;Keynote: Real world Haskell.&lt;/a&gt; from &lt;a href="http://vimeo.com/user2191865"&gt;Malcolm Wallace&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>A new pseudo-random number generator for Haskell</title><link>https://www.serpentine.com/2009/09/19/a-new-pseudo-random-number-generator-for-haskell/</link><pubDate>Sat, 19 Sep 2009 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2009/09/19/a-new-pseudo-random-number-generator-for-haskell/</guid><description>&lt;p&gt;I just released version 0.3.3 of the Haskell &lt;a href="http://hackage.haskell.org/package/statistics"&gt;statistics
library&lt;/a&gt;, which contains a very fast
pseudo-random number generator.&lt;/p&gt;
&lt;p&gt;The generator is an implementation of George Marsaglia&amp;rsquo;s MWC256 multiply-with-carry PRNG, which
has a period of 2^8222 (for this reason, it&amp;rsquo;s sometimes referred to as MWC8222). It produces
high-quality uniformly distributed pseudo-random numbers extremely quickly.&lt;/p&gt;
&lt;p&gt;Here is a brief performance comparison between the statistics library, the &lt;a href="http://hackage.haskell.org/package/mersenne-random"&gt;mersenne-random
library&lt;/a&gt;, the &lt;a href="https://web.archive.org/web/20090417005524/http://www.haskell.org:80/ghc/docs/latest/html/libraries/random/System-Random.html"&gt;normal Haskell
PRNG&lt;/a&gt;, and a &lt;a href="https://www.serpentine.com/code/mwc.c"&gt;C
implementation&lt;/a&gt; of MWC256. The numbers
represent millions of variates generated and summed per second, so higher is better. (Measured
on a 64-bit Core2 Duo laptop running Fedora 11.)&lt;/p&gt;</description></item><item><title>A video demo of my Haskell benchmarking framework</title><link>https://www.serpentine.com/2009/09/14/a-video-demo-of-my-haskell-benchmarking-framework/</link><pubDate>Mon, 14 Sep 2009 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2009/09/14/a-video-demo-of-my-haskell-benchmarking-framework/</guid><description>&lt;p&gt;Malcolm Wallace has very kindly put a lot of work into publishing &lt;a href="http://www.vimeo.com/album/126462"&gt;video footage from all of the talks&lt;/a&gt; at last week&amp;rsquo;s Haskell Implementor&amp;rsquo;s Workshop. I gave a very brief, and completely unscripted, demo of the benchmarking framework that I&amp;rsquo;ve been hacking on. This was code that I&amp;rsquo;d literally gotten working about 45 minutes before I started speaking, so it was quite the seat-of-my-pants experience. Lots of fun!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://vimeo.com/6574557"&gt;Statistical benchmarking in Haskell&lt;/a&gt; from &lt;a href="http://vimeo.com/user2191865"&gt;Malcolm Wallace&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Lazy functional yak shaving in Haskell</title><link>https://www.serpentine.com/2009/09/12/lazy-functional-yak-shaving-in-haskell/</link><pubDate>Sun, 13 Sep 2009 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2009/09/12/lazy-functional-yak-shaving-in-haskell/</guid><description>&lt;p&gt;A few weeks ago, I decided that I&amp;rsquo;d like to focus for a while on getting a 1.0 release of the
&lt;a href="http://hackage.haskell.org/package/text"&gt;Haskell text library&lt;/a&gt; ready. That work has gone fairly
well so far. I&amp;rsquo;ve focused on making sure that I like the API, and that a few key functions have
good performance characteristics.&lt;/p&gt;
&lt;p&gt;One such function is substring search, which is the underpinning for a number of useful
functions (split a string on a delimiter, find all substrings, etc). My initial cut at that
function had an obvious API, but ran in O(&lt;em&gt;nm&lt;/em&gt;) time, which complexity measure I found mildly
embarrassing. So I looked around for an alternative that would be faster, but still simple to
implement, and settled upon Fredrik Lundh&amp;rsquo;s &lt;a href="https://web.archive.org/web/20200801194620/http://effbot.org:80/zone/stringlib.htm"&gt;elegant and trim
adaptation&lt;/a&gt; of Boyer-Moore-Sunday-Horspool, which has
O(&lt;em&gt;n&lt;/em&gt;+&lt;em&gt;m&lt;/em&gt;) complexity in the typical case.&lt;/p&gt;</description></item><item><title>In which I write again about revision control</title><link>https://www.serpentine.com/2009/09/10/in-which-i-write-again-about-revision-control/</link><pubDate>Thu, 10 Sep 2009 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2009/09/10/in-which-i-write-again-about-revision-control/</guid><description>&lt;p&gt;Several months ago, I wrote an article on evaluating revision control systems. It was initially published in &lt;a href="https://web.archive.org/web/20241122005204/https://queue.acm.org/detail.cfm?id=1595636"&gt;ACM Queue&lt;/a&gt; a few weeks ago, and the article has now made its way (unchanged) to &lt;a href="https://web.archive.org/web/20231105014956/https://cacm.acm.org/magazines/2009/9/38901-making-sense-of-revision-control-systems/fulltext"&gt;Communications of the ACM&lt;/a&gt;. I&amp;rsquo;m quite happy with how it turned out, and I hope that people will find it useful in figuring out what&amp;rsquo;s important to them.&lt;/p&gt;
&lt;p&gt;Since the publication of the article, a few people have asked why I didn&amp;rsquo;t write about their favourite revision control system. The simple answer is that I was already about 50% over my initial word budget by the time I finished up what I &lt;em&gt;did&lt;/em&gt; write. (I&amp;rsquo;ll confess that I was thoroughly charmed by a conspiratorial suggestion that I was editing some beloved tool out of history by not mentioning it.)&lt;/p&gt;</description></item><item><title>Slides from my CUFP 2009 keynote talk</title><link>https://www.serpentine.com/2009/09/04/slides-from-my-cufp-2009-keynote-talk/</link><pubDate>Fri, 04 Sep 2009 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2009/09/04/slides-from-my-cufp-2009-keynote-talk/</guid><description>&lt;p&gt;I was delighted to be invited to give the keynote talk at this year&amp;rsquo;s CUFP workshop in
Edinburgh. My talk was this morning, and &lt;a href="https://web.archive.org/web/20090920182314/http://www.serpentine.com:80/bos/files/cufp.pdf"&gt;these are the slides I
presented&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.slideshare.net/bos31337/cufp-2009-keynote-real-world-haskell" title="CUFP 2009 Keynote - Real World Haskell"&gt;CUFP 2009 Keynote - Real World
Haskell&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;View more documents from Bryan O'Sullivan.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The video should be online some time next week, with any luck, but I hope that the slides tell a
coherent story by themselves. Many thanks to Francesco Cesarini and Jim Grundy for organising
such a fun day!&lt;/p&gt;</description></item><item><title>Haskell Platform support for Fedora: we’re almost there</title><link>https://www.serpentine.com/2009/08/12/haskell-platform-support-for-fedora-were-almost-there/</link><pubDate>Thu, 13 Aug 2009 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2009/08/12/haskell-platform-support-for-fedora-were-almost-there/</guid><description>&lt;p&gt;I spent a little time earlier today clarifying the &lt;a href="http://fedoraproject.org/"&gt;Fedora project&lt;/a&gt;&amp;rsquo;s support for the &lt;a href="http://hackage.haskell.org/platform/"&gt;Haskell Platform&lt;/a&gt;. You can &lt;a href="https://fedoraproject.org/wiki/SIGs/Haskell#Haskell_Platform_support"&gt;read the details here&lt;/a&gt;; the summary is that we&amp;rsquo;re currently four packages short of complete support for the current release of the Haskell Platform. You can install the whole lot with a single copy-and-paste to your command line, no manual build or dependency installation required.&lt;/p&gt;
&lt;p&gt;With any luck, if we can get things complete, this will spur the Debian (and by extension, Ubuntu) Haskell team into finishing off &lt;em&gt;their&lt;/em&gt; support for the Platform, in the spirit of friendly competition. That would leave us in the delicious situation of being able to tell curious people that almost any major Linux distro will make a good basis for developing and deploying Haskell applications. Sweet!&lt;/p&gt;</description></item><item><title>First steps with Haskell text API improvement</title><link>https://www.serpentine.com/2009/07/06/first-steps-with-haskell-text-api-improvement/</link><pubDate>Mon, 06 Jul 2009 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2009/07/06/first-steps-with-haskell-text-api-improvement/</guid><description/></item><item><title>What’s in a text API?</title><link>https://www.serpentine.com/2009/06/30/python-and-haskell-text-apis-compare/</link><pubDate>Tue, 30 Jun 2009 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2009/06/30/python-and-haskell-text-apis-compare/</guid><description>&lt;p&gt;Now that I&amp;rsquo;ve got the &lt;a href="https://web.archive.org/web/20110926163059/http://www.defun2009.info:80/blog/tutorial-schedule/"&gt;DEFUN 2009 schedule&lt;/a&gt;
sorted out (you &lt;em&gt;are&lt;/em&gt; coming, aren&amp;rsquo;t you?), I&amp;rsquo;ve had time to take a breath and think about the
&lt;a href="http://hackage.haskell.org/package/text"&gt;Haskell text library&lt;/a&gt; again. Its API is currently a
clone of the ancient and venerable Haskell list API. If you&amp;rsquo;ve used the list API to do much text
processing, you&amp;rsquo;ve probably spilled more than a few tears into your whiskey. The &lt;a href="http://hackage.haskell.org/package/bytestring"&gt;bytestring
library&lt;/a&gt; also mostly clones the list API, albeit
with a few improvements. This state of affairs makes me somewhat sad: here we are with a
fabulous language, but a 1991-era API for mangling text.&lt;/p&gt;</description></item><item><title>Case conversion and text 0.3</title><link>https://www.serpentine.com/2009/06/07/case-conversion-and-text-03/</link><pubDate>Sun, 07 Jun 2009 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2009/06/07/case-conversion-and-text-03/</guid><description/></item><item><title>Dealing with encoding errors in Data.Text</title><link>https://www.serpentine.com/2009/06/05/dealing-with-encoding-errors-in-datatext/</link><pubDate>Fri, 05 Jun 2009 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2009/06/05/dealing-with-encoding-errors-in-datatext/</guid><description/></item><item><title>I put a pidgit in your widget so you can fidget while you calculate pi</title><link>https://www.serpentine.com/2009/05/27/i-put-a-pidgit-in-your-widget-so-you-can-fidget-while-you-calculate-pi/</link><pubDate>Thu, 28 May 2009 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2009/05/27/i-put-a-pidgit-in-your-widget-so-you-can-fidget-while-you-calculate-pi/</guid><description/></item><item><title>Streaming Unicode support for Haskell: text 0.2</title><link>https://www.serpentine.com/2009/05/22/streaming-unicode-support-for-haskell-text-02/</link><pubDate>Sat, 23 May 2009 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2009/05/22/streaming-unicode-support-for-haskell-text-02/</guid><description>&lt;p&gt;I just released version 0.2 of the &lt;a href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/text"&gt;Haskell text library&lt;/a&gt; that I &lt;a href="https://www.serpentine.com/2009/02/27/finally-fast-unicode-support-for-haskell/"&gt;announced back in February&lt;/a&gt;. This version fixes a number of bugs, but much more significantly, it adds a streaming mode: you can process a huge amount of text lazily using a small, fixed amount of memory, while maintaining high performance.&lt;/p&gt;
&lt;p&gt;In case you need to report problems or suggest improvements, there&amp;rsquo;s now a &lt;a href="https://web.archive.org/web/20140625092916/http://trac.haskell.org/text/"&gt;Trac instance&lt;/a&gt; for the text and text-icu libraries.&lt;/p&gt;</description></item><item><title>Mercurial book is now in production, and a little gift</title><link>https://www.serpentine.com/2009/05/15/mercurial-book-is-now-in-production-and-a-little-gift/</link><pubDate>Fri, 15 May 2009 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2009/05/15/mercurial-book-is-now-in-production-and-a-little-gift/</guid><description/></item><item><title>Slides from my Erlang Factory talk this morning</title><link>https://www.serpentine.com/2009/05/01/slides-from-my-erlang-factory-talk-this-morning/</link><pubDate>Fri, 01 May 2009 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2009/05/01/slides-from-my-erlang-factory-talk-this-morning/</guid><description>&lt;p&gt;I had a wonderful time at the Bay Area Erlang Factory this morning, speaking to an Erlang
audience about the different perspective that Haskell brings to functional programming. It was a
relaxed and friendly crowd, and speaking to a receptive audience is always a thrill.&lt;/p&gt;
&lt;p&gt;Here are the slides from my talk.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.slideshare.net/bos31337/the-other-side-of-functional-programming-haskell-for-erlang-people?type=presentation" title="The other side of functional programming: Haskell for Erlang people"&gt;The other side of functional programming: Haskell for Erlang
people&lt;/a&gt;&lt;/p&gt;</description></item><item><title>DEFUN 2009 call for talks and tutorials</title><link>https://www.serpentine.com/2009/03/31/defun-2009-call-for-talks-and-tutorials/</link><pubDate>Tue, 31 Mar 2009 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2009/03/31/defun-2009-call-for-talks-and-tutorials/</guid><description>&lt;p&gt;ACM SIGPLAN 2009 Developer Tracks on Functional Programming
&lt;a href="https://web.archive.org/web/20091020194518/http://www.defun-2009.info/"&gt;http://www.defun2009.info/&lt;/a&gt; Edinburgh, Scotland, September 3 and
5, 2009 The workshop will be held in conjunction with ICFP 2009
&lt;a href="http://www.cs.nott.ac.uk/%7Egmh/icfp09.html"&gt;http://www.cs.nott.ac.uk/~gmh/icfp09.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Important dates&lt;/p&gt;
&lt;p&gt;Proposal Deadline: June 5, 2009, 0:00 UTC Notification: June 19, 2009&lt;/p&gt;
&lt;p&gt;DEFUN 2009 invites functional programmers and researchers who know how to solve problems with
functional progamming to give talks and lead tutorials at the The ICFP Developer Tracks.&lt;/p&gt;
&lt;p&gt;We want to know about your favorite programming techniques, powerful libraries, and engineering
approaches you&amp;rsquo;ve used that the world should know about and apply to other projects. We want to
know how to be productive using functional programming, write better code, and avoid common
pitfalls.&lt;/p&gt;</description></item><item><title>Mercurial: The Definitive Guide</title><link>https://www.serpentine.com/2009/03/27/mercurial-the-definitive-guide/</link><pubDate>Fri, 27 Mar 2009 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2009/03/27/mercurial-the-definitive-guide/</guid><description>&lt;p&gt;If you&amp;rsquo;ve looked at the &lt;a href="http://hgbook.red-bean.com/"&gt;Mercurial book&lt;/a&gt; site in the past 24 hours, you&amp;rsquo;ll have noticed that both its look and the name of the book have changed.&lt;/p&gt;
&lt;p&gt;First, the cosmetic news. The change in appearance is due to my switching over to the system I used to publish &lt;a href="http://book.realworldhaskell.org/"&gt;Real World Haskell&lt;/a&gt;. I&amp;rsquo;ve always made the &lt;a href="https://hgbook.red-bean.com/"&gt;source code to the Mercurial book&lt;/a&gt; available, but now it includes the source of the Django app and jQuery code that drives the comment system. So if you&amp;rsquo;re writing an online book, have at it!&lt;/p&gt;</description></item><item><title>Scintillation</title><link>https://www.serpentine.com/2009/03/01/scintillation/</link><pubDate>Sun, 01 Mar 2009 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2009/03/01/scintillation/</guid><description>&lt;p&gt;I think that this video is remarkably beautiful.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://vimeo.com/3114617"&gt;SCINTILLATION&lt;/a&gt;, by &lt;a href="http://vimeo.com/chassaingxavier"&gt;Xavier Chassaing&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Finally! Fast Unicode support for Haskell</title><link>https://www.serpentine.com/2009/02/27/finally-fast-unicode-support-for-haskell/</link><pubDate>Fri, 27 Feb 2009 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2009/02/27/finally-fast-unicode-support-for-haskell/</guid><description>&lt;p&gt;On behalf of the Data.Text team, I am delighted to announce the release of preview versions of
two new packages:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/text"&gt;text 0.1&lt;/a&gt; Fast, packed Unicode
text support, using a modern stream fusion framework.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/text-icu"&gt;text-icu 0.1&lt;/a&gt; Augments the
text package with comprehensive character set conversion support and normalization (and soon
more), via bindings to the ICU library.&lt;/p&gt;
&lt;p&gt;These packages fill out critical pieces of functionality for the Haskell platform, without
compromising on either performance or safety. Stream fusion offers the possibility of writing
text manipulation code in a clean, high-level way, with intermediate allocations and traversals
being fused away.&lt;/p&gt;</description></item><item><title>Speaking at Bay Area Erlang Factory in April</title><link>https://www.serpentine.com/2009/02/22/speaking-at-bay-area-erlang-factory-in-april/</link><pubDate>Sun, 22 Feb 2009 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2009/02/22/speaking-at-bay-area-erlang-factory-in-april/</guid><description>&lt;p&gt;My friends at &lt;a href="http://www.erlang-consulting.com/"&gt;Erlang Training and Consulting&lt;/a&gt; are running an organising an event in Palo Alto at the end of April: &lt;a href="http://www.erlang-factory.com/"&gt;Erlang Factory&lt;/a&gt;. If you&amp;rsquo;re interested in the ferment of ideas and activity around functional programming, this promises to be an exciting occasion.&lt;/p&gt;
&lt;p&gt;To me, one of the great attractions of the functional programming world is that our cousin communities are friendly to each other, and we&amp;rsquo;re eager to transfer the most exciting ideas back and forth. In that spirit, I&amp;rsquo;ll be &lt;a href="http://www.erlang-factory.com/conference/SFBayAreaErlangFactory2009/speakers/BryanOSullivan"&gt;speaking about Haskell&lt;/a&gt; at Erlang Factory:&lt;/p&gt;</description></item><item><title>Fun with Haskell view patterns</title><link>https://www.serpentine.com/2009/01/11/fun-with-haskell-view-patterns/</link><pubDate>Sun, 11 Jan 2009 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2009/01/11/fun-with-haskell-view-patterns/</guid><description/></item><item><title>The 12 Days of EFF</title><link>https://www.serpentine.com/2008/12/16/the-12-days-of-eff/</link><pubDate>Tue, 16 Dec 2008 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2008/12/16/the-12-days-of-eff/</guid><description>&lt;p&gt;Via the ever industrious &lt;a href="http://www.oblomovka.com/"&gt;Danny O&amp;rsquo;Brien&lt;/a&gt;, we bring to you the &lt;a href="http://www.eff.org/"&gt;Electronic Frontier Foundation&lt;/a&gt;&amp;rsquo;s end-of-year animation.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://web.archive.org/web/20071206195027/https://secure.eff.org/happyholidays"&gt;Learn more about this video and support EFF!&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Functional programmers on Twitter</title><link>https://www.serpentine.com/2008/12/05/functional-programmers-on-twitter/</link><pubDate>Fri, 05 Dec 2008 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2008/12/05/functional-programmers-on-twitter/</guid><description>&lt;p&gt;Twitter has become quite the hotbed of chatter about functional programming over the past few months, as a substantial number of pretty well known FP people have either been present all along or have signed up recently and started following each other.&lt;/p&gt;
&lt;p&gt;Here is a list of people I know about who tweet about FP on a semi-regular basis, along with what I think are their main interests. If you want to see the list extended or modified, let me know.&lt;/p&gt;</description></item><item><title>Recovering from hand surgery</title><link>https://www.serpentine.com/2008/10/08/recovering-from-hand-surgery/</link><pubDate>Thu, 09 Oct 2008 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2008/10/08/recovering-from-hand-surgery/</guid><description>&lt;p&gt;A few months ago, I tore the A4 pulley tendon in my right ring finger in a climbing accident. Yesterday, I had it reconstructed (completely ruptured tendons don&amp;rsquo;t heal) with a graft of tendon from my forearm. I can currently only type with one hand, so if I owe you an email, please be patient.&lt;/p&gt;
&lt;p&gt;I should get the finger brace off in about 6 weeks, and ought to have somewhat decent use of that finger once more by the spring. I&amp;rsquo;m looking forward to being able to catch a thrown ball again!&lt;/p&gt;</description></item><item><title>Unix hacking in Haskell: better pseudoterminal support</title><link>https://www.serpentine.com/2008/09/30/unix-hacking-in-haskell-better-pseudoterminal-support/</link><pubDate>Tue, 30 Sep 2008 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2008/09/30/unix-hacking-in-haskell-better-pseudoterminal-support/</guid><description/></item><item><title>Using Bloom filters for large scale gene sequence analysis in Haskell</title><link>https://www.serpentine.com/2008/09/28/using-bloom-filters-for-large-scale-gene-sequence-analysis-in-haskell/</link><pubDate>Sun, 28 Sep 2008 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2008/09/28/using-bloom-filters-for-large-scale-gene-sequence-analysis-in-haskell/</guid><description>&lt;p&gt;&lt;a href="http://malde.org/~ketil/"&gt;Ketil Malde&lt;/a&gt; and I submitted this paper to &lt;a href="https://web.archive.org/web/20141107203604/http://cs.utdallas.edu:80/padl09/"&gt;PADL 09&lt;/a&gt;. &lt;strong&gt;Updated 2008-10-13&lt;/strong&gt;: the paper was accepted!&lt;/p&gt;
&lt;p&gt;Here is &lt;a href="https://web.archive.org/web/20081119034612/http://www.serpentine.com/bos/files/padl09.pdf"&gt;the PDF copy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And for the impatient, here is the abstract.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Analysis of biological data often involves large data sets and computationally expensive algorithms. Databases of biological data continue to grow, leading to an increasing demand for improved algorithms and data structures. Despite having many advantages over more traditional indexing structures, the Bloom filter is almost unused in bioinformatics. Here we present a robust and efficient Bloom filter implementation in Haskell, and implement a simple bioinformatics application for indexing and matching sequence data. We use this to index the chromosomes that make up the human genome, and map all available gene sequences to it. Our experiences with developing and tuning our application suggest that for bioinformatics applications, Haskell offers a compelling combination of rapid development, quality assurance, and high performance.&lt;/p&gt;</description></item><item><title>Slides from my DEFUN 2008 Haskell tutorial</title><link>https://www.serpentine.com/2008/09/27/slides-from-my-defun-2008-haskell-tutorial/</link><pubDate>Sat, 27 Sep 2008 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2008/09/27/slides-from-my-defun-2008-haskell-tutorial/</guid><description>&lt;p&gt;I&amp;rsquo;ve posted my slides from &lt;a href="http://www.slideshare.net/bos31337/defun-2008-real-world-haskell-presentation"&gt;tomorrow morning&amp;rsquo;s Haskell tutorial&lt;/a&gt; on Slideshare. (There&amp;rsquo;s a &lt;a href="http://www.slideshare.net/bos31337/defun-2008-real-world-haskell-presentation/download"&gt;downloadable PDF version&lt;/a&gt;, too, if you find that an easier format to deal with.)&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve also posted a Mercurial repository of the &lt;a href="https://web.archive.org/web/20090303170429/http://hg.serpentine.com:80/defun-2008"&gt;slide source code&lt;/a&gt;, in case anyone would like to cannibalise the slides for their own purposes. Enjoy!&lt;/p&gt;</description></item><item><title>Some notes on the future of Haskell and FP</title><link>https://www.serpentine.com/2008/09/26/some-notes-on-the-future-of-haskell-and-fp/</link><pubDate>Fri, 26 Sep 2008 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2008/09/26/some-notes-on-the-future-of-haskell-and-fp/</guid><description>&lt;p&gt;Don Stewart, Duncan Coutts and Simon Marlow ended the Haskell Symposium yesterday with a wonderful session about the future of Haskell.&lt;/p&gt;
&lt;p&gt;Don and Duncan began with an acknowledgement of the importance of libraries to the health and future of the Haskell language community. A long-standing need for a central source of good libraries was met about 18 months ago with the development of the &lt;a href="http://hackage.haskell.org/"&gt;Hackage&lt;/a&gt; package database. Since its introduction, we have already seen roughly 750 open source Haskell packages published.&lt;/p&gt;</description></item><item><title>Twittering from ICFP / Haskell symposium / CUFP</title><link>https://www.serpentine.com/2008/09/25/twittering-from-icfp-haskell-symposium-cufp/</link><pubDate>Thu, 25 Sep 2008 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2008/09/25/twittering-from-icfp-haskell-symposium-cufp/</guid><description>&lt;p&gt;I&amp;rsquo;m in Victoria, BC this week, at &lt;a href="http://www.icfpconference.org/icfp2008/"&gt;ICFP&lt;/a&gt;. I&amp;rsquo;ve been writing a few notes about the talks that have been taking place in my &lt;a href="https://web.archive.org/web/20230815135712/https://twitter.com/bos31337/"&gt;Twitter stream&lt;/a&gt;. Also Twittering from the conference is &lt;a href="https://web.archive.org/web/20151102024152/https://twitter.com/galoisinc"&gt;Don Stewart&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The Haskell symposium has gotten off to a great start, with very good talks that have blended practicality and theory.&lt;/p&gt;
&lt;p&gt;Since &lt;a href="https://web.archive.org/web/20241212092048/https://cufp.galois.com/"&gt;CUFP&lt;/a&gt; (Commercial Users of Functional Programming) is the most externally visible part of the conference, I&amp;rsquo;ll attempt to do some more extensive writeups tomorrow.&lt;/p&gt;</description></item><item><title>Sorely disappointed by the revamped delicious</title><link>https://www.serpentine.com/2008/08/06/sorely-disappointed-by-the-revamped-delicious/</link><pubDate>Wed, 06 Aug 2008 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2008/08/06/sorely-disappointed-by-the-revamped-delicious/</guid><description>&lt;p&gt;In April last year, I visited Yahoo HQ to take a look at what was then their in-progress redesign of del.icio.us. It took me no more than a few minutes to decide that I hated it: it fit much less information on each page, it introduced big bars of colour to no apparent purpose, and little meaningless bits of text would flicker in and out of existence as I moved the mouse around.&lt;/p&gt;</description></item><item><title>Disappointed by Thinkpad X60 thermal problems</title><link>https://www.serpentine.com/2008/06/21/disappointed-by-thinkpad-x60-thermal-problems/</link><pubDate>Sat, 21 Jun 2008 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2008/06/21/disappointed-by-thinkpad-x60-thermal-problems/</guid><description>&lt;p&gt;I&amp;rsquo;ve had a Lenovo X60 for about 18 months. For almost a year, I was well pleased with its combination of light weight and decent performance, but then it developed a nasty thermal problem. Its idle temperature suddenly went from 45C to 55C, and any time I tried to do anything demanding, it would go into thermal shutdown after a minute or two.&lt;/p&gt;
&lt;p&gt;Since the machine was still under warranty, Lenovo repaired it, and I was very pleased by their responsiveness at the time. I sent the machine off on a Tuesday, and got it back on a Thursday.&lt;/p&gt;</description></item><item><title>Hoisted from someone else’s comments</title><link>https://www.serpentine.com/2008/04/10/hoisted-from-someone-elses-comments/</link><pubDate>Fri, 11 Apr 2008 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2008/04/10/hoisted-from-someone-elses-comments/</guid><description>&lt;p&gt;Marc Ambinder comments on the &lt;a href="http://marcambinder.theatlantic.com/archives/2008/04/advance_praise_for_war_and_dec.php"&gt;peculiar cadence of the jacket blurbs&lt;/a&gt; for Douglas Feith&amp;rsquo;s new book, to which some wag responds with a suggestion for a similar endorsement.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Feith&amp;rsquo;s book is perfectly rectangular. Its page numbers progress in a pleasing upward sequence. Its evident shortcomings in terms of accuracy are offset by its usefulness in balancing wobbly furniture.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>The moral of this story holds in so many contexts</title><link>https://www.serpentine.com/2008/04/07/the-moral-of-the-story-holds-in-so-many-contexts/</link><pubDate>Mon, 07 Apr 2008 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2008/04/07/the-moral-of-the-story-holds-in-so-many-contexts/</guid><description>&lt;p&gt;Snipped from a small mailing list.&lt;/p&gt;
&lt;blockquote&gt;&lt;blockquote&gt;&lt;p&gt;You can use fruit and vegetables&amp;rsquo; as a voltaic battery but they could only power something like a small LED bulb, no way would there be enough power to charge an iPod 🙂
Depends on how many you use&amp;hellip; you need to have enough in series to give a high enough voltage, and then a heap in parallel for more current.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;This reminds me my &amp;ldquo;electric snail fence&amp;rdquo; when I was a child&amp;hellip; I was making batteries using lemons, brass screws, and nails to power a small electric fence using a pair of copper wires wrapped around matchstick &amp;ldquo;fenceposts&amp;rdquo; to keep snails in an enclosure (I was studying them).&lt;/p&gt;</description></item><item><title>What to expect from the new binutils linker</title><link>https://www.serpentine.com/2008/03/24/what-to-expect-from-the-new-binutils-linker/</link><pubDate>Tue, 25 Mar 2008 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2008/03/24/what-to-expect-from-the-new-binutils-linker/</guid><description>&lt;p&gt;I&amp;rsquo;ve been following Ian Lance Taylor&amp;rsquo;s updates on the status of gold, the new binutils linker,
for a while, so when he announced that he&amp;rsquo;d &lt;a href="http://www.airs.com/blog/archives/164"&gt;added it to the binutils
tree&lt;/a&gt;, I decided to make a little time to try it out.&lt;/p&gt;
&lt;p&gt;I have a fairly large C++ application handy, so I tried linking it on my dual core Thinkpad with
2GB of memory, running Fedora 8.&lt;/p&gt;
&lt;p&gt;When I compile this application with debugging symbols enabled, it&amp;rsquo;s not exactly fast to link:
it takes about a minute. Because the amount of data the linker has to chew through is
impressively large, the actual time varies by up to 20% from one run to the next: all of those
object files don&amp;rsquo;t fit into memory at once. This also has the unpleasant effect of paging out
parts of apps I&amp;rsquo;m trying to use, such as Emacs and Firefox. Hmph.&lt;/p&gt;</description></item><item><title>Peruse popular Perl packages</title><link>https://www.serpentine.com/2008/02/19/peruse-popular-perl-packages/</link><pubDate>Tue, 19 Feb 2008 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2008/02/19/peruse-popular-perl-packages/</guid><description>&lt;p&gt;For a little while, I&amp;rsquo;ve been curious about which of the packages people in the vast wasteland
of CPAN actually use and care about. Here&amp;rsquo;s an attempt to answer that question with fifty
popular Perl packages for your entertainment.&lt;/p&gt;
&lt;p&gt;Before we begin, a brief overview of the column layout.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The mean vote from &lt;a href="http://cpanratings.perl.org/"&gt;CPAN ratings&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The number of votes for that package registered at CPAN ratings.&lt;/li&gt;
&lt;li&gt;The number of &amp;ldquo;vote&amp;rdquo; entries registered at the &lt;a href="http://popcon.debian.org/"&gt;Debian popularity
contest&lt;/a&gt;. This is approximately the number of people who currently
use a package.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My ranking attempts to balance people&amp;rsquo;s votes against a package&amp;rsquo;s practical utility using a
metric composed of equal parts baffling complexity and utter nonsense.&lt;/p&gt;</description></item><item><title>GHC’s performance with threads is impressive</title><link>https://www.serpentine.com/2008/02/06/ghcs-performance-with-threads-is-impressive/</link><pubDate>Thu, 07 Feb 2008 07:45:31 +0000</pubDate><guid>https://www.serpentine.com/2008/02/06/ghcs-performance-with-threads-is-impressive/</guid><description>&lt;p&gt;Here&amp;rsquo;s a simple program I wrote on a whim tonight, to take a very basic look at GHC&amp;rsquo;s low-level
threading performance.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;module Main where&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;import Control.Applicative import Control.Concurrent.MVar import Control.Concurrent import
Data.Time import System.Environment&lt;/p&gt;
&lt;p&gt;main = do mv &amp;lt;- newEmptyMVar start &amp;lt;- getCurrentTime loop mv =&amp;lt;&amp;lt; read . head &amp;lt;$&amp;gt; getArgs
end &amp;lt;- getCurrentTime putStrLn $ &amp;ldquo;creation time:&amp;rdquo; ++ show (diffUTCTime end start) putMVar mv 0
takeMVar mv fin &amp;lt;- getCurrentTime putStrLn $ &amp;ldquo;message time:&amp;rdquo; ++ show (diffUTCTime fin end)&lt;/p&gt;</description></item><item><title>The basics of applicative functors, put to practical work</title><link>https://www.serpentine.com/2008/02/06/the-basics-of-applicative-functors-put-to-practical-work/</link><pubDate>Thu, 07 Feb 2008 00:20:07 +0000</pubDate><guid>https://www.serpentine.com/2008/02/06/the-basics-of-applicative-functors-put-to-practical-work/</guid><description>&lt;p&gt;Applicative functors are gorgeous and versatile creatures, but as is common in Haskell, they
lack a little in documentation. The &lt;a href="https://web.archive.org/web/20141012073114/http://www.soi.city.ac.uk:80/~ross/papers/Applicative.html"&gt;paper that Conor and Ross
wrote&lt;/a&gt; introducing them is good, but
dense. What if we were to skip all the scene-setting kerfuffle, and plunge into using them by
example?&lt;/p&gt;
&lt;p&gt;I won&amp;rsquo;t attempt to describe what applicative functors actually are, because the idea is easy to
absorb: we&amp;rsquo;ll pick it up as an incidental product of figuring out how to use them. Bear with me.&lt;/p&gt;</description></item><item><title>LLVM for Fedora</title><link>https://www.serpentine.com/2008/01/21/llvm-for-fedora/</link><pubDate>Tue, 22 Jan 2008 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2008/01/21/llvm-for-fedora/</guid><description>&lt;p&gt;I&amp;rsquo;ve just packaged up &lt;a href="http://llvm.org/"&gt;LLVM&lt;/a&gt; 2.1 for Fedora. It hasn&amp;rsquo;t hit the testing repository yet, but when it does, you&amp;rsquo;ll be able to install it in straightforward fashion:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;code&gt;yum --enablerepo=testing install llvm llvm-devel llvm-docs&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;Until the packages are pushed out (within a few days), you can &lt;a href="https://web.archive.org/web/20211202014807/https://koji.fedoraproject.org/koji/buildinfo?buildID=32344"&gt;download them directly&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>The Monad Squad</title><link>https://www.serpentine.com/2008/01/17/the-monad-squad/</link><pubDate>Fri, 18 Jan 2008 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2008/01/17/the-monad-squad/</guid><description>&lt;p&gt;Tired of imperative programmers kicking sand in your face? Send some cut-out lambdas and a postal order for 5 frobs to haskell.org, and we&amp;rsquo;ll send you a handy-dandy poster of those famous superheroes, the Monad Squad!&lt;/p&gt;
&lt;p&gt;State helps functional programmers cross the imperative street!&lt;/p&gt;
&lt;p&gt;Identity can blend in anywhere!&lt;/p&gt;
&lt;p&gt;Writer never forgets a detail!&lt;/p&gt;
&lt;p&gt;Cont can travel through time!&lt;/p&gt;
&lt;p&gt;List can do many things at once!&lt;/p&gt;
&lt;p&gt;Reader can tell what you&amp;rsquo;re thinking!&lt;/p&gt;</description></item><item><title>A new (well, to me) spam vector: google.com</title><link>https://www.serpentine.com/2008/01/10/a-new-well-to-me-spam-vector-googlecom/</link><pubDate>Fri, 11 Jan 2008 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2008/01/10/a-new-well-to-me-spam-vector-googlecom/</guid><description>&lt;p&gt;This is, I must say, very clever. In my latest round of inbound spam, I&amp;rsquo;ve noticed that some senders have begun sending valid links to &lt;a href="http://google.com/"&gt;http://google.com/&lt;/a&gt; in their messages. The technique they&amp;rsquo;re using is to obfuscate a target URL inside a Google &amp;ldquo;I&amp;rsquo;m feeling lucky&amp;rdquo; query: this means that the domain near the left of the URL really is google.com and doesn&amp;rsquo;t need to be faked, but it immediately reroutes a click to the spammer&amp;rsquo;s target, which is difficult to read due to some escaping. This is a cute social engineering attack, riding on Google&amp;rsquo;s brand and domain name to gull the unwary into clicking.&lt;/p&gt;</description></item><item><title>Phil Wadler to talk in San Francisco next week</title><link>https://www.serpentine.com/2008/01/06/phil-wadler-to-talk-in-san-francisco-next-week/</link><pubDate>Mon, 07 Jan 2008 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2008/01/06/phil-wadler-to-talk-in-san-francisco-next-week/</guid><description>&lt;p&gt;&lt;a href="http://www.cs.ucsd.edu/popl/08/"&gt;POPL 08&lt;/a&gt; takes place next week, so San Francisco will be flooded with an army of burly and menacing programming language researchers and type theorists. Kids, don&amp;rsquo;t say you haven&amp;rsquo;t been warned.&lt;/p&gt;
&lt;p&gt;On Wednesday evening, January 9, &lt;a href="http://homepages.inf.ed.ac.uk/wadler/"&gt;Phil Wadler&lt;/a&gt; will be repeating for the public his talk &amp;ldquo;Well-typed programs can&amp;rsquo;t be blamed&amp;rdquo;, based on &lt;a href="https://web.archive.org/web/https://web.archive.org/web/20090627083823/http://people.cs.uchicago.edu:80/~robby/pubs/papers/scheme2007-wf.pdf"&gt;joint work&lt;/a&gt; with &lt;a href="https://web.archive.org/web/20090627083823/http://people.cs.uchicago.edu:80/~robby/"&gt;Robby Findler&lt;/a&gt;. Here&amp;rsquo;s the abstract from their eponymous paper.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;We show how contracts with blame fit naturally with recent work on hybrid types and gradual types. Unlike hybrid types or gradual types, we require casts in the source code, in order to indicate where type errors may occur. Two (perhaps surprising) aspects of our approach are that refined types can provide useful static guarantees even in the absence of a theorem prover, and that type &lt;em&gt;dynamic&lt;/em&gt; should not be regarded as a supertype of all other types. We factor the well-known notion of subtyping into new notions of positive and negative subtyping, and use these to characterise where positive and negative blame may arise. Our approach sharpens and clarifies some recent results in the literature.&lt;/p&gt;</description></item><item><title>Why you should not use pyinotify</title><link>https://www.serpentine.com/2008/01/04/why-you-should-not-use-pyinotify/</link><pubDate>Sat, 05 Jan 2008 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2008/01/04/why-you-should-not-use-pyinotify/</guid><description>&lt;p&gt;A while ago, I had a need to monitor filesystem modifications, and I looked around for Python bindings for the Linux kernel&amp;rsquo;s &lt;a href="http://en.wikipedia.org/wiki/Inotify"&gt;inotify&lt;/a&gt; subsystem. At the time, the only existing library was &lt;a href="http://pyinotify.sourceforge.net/"&gt;pyinotify&lt;/a&gt;, so being a lazy sort, I naturally tried to use it.&lt;/p&gt;
&lt;p&gt;On first glance, the documentation seems impressive, and the API looks reasonable. Effective use of inotify is a subtle affair, however, and pyinotify is not, shall we say, the best tool for the job. It&amp;rsquo;s difficult to tell what those problems might be from external inspection, though, so here are a few notes from my experience.&lt;/p&gt;</description></item><item><title>LLVM bindings for Haskell</title><link>https://www.serpentine.com/2008/01/03/llvm-bindings-for-haskell/</link><pubDate>Thu, 03 Jan 2008 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2008/01/03/llvm-bindings-for-haskell/</guid><description>&lt;p&gt;I&amp;rsquo;ve spent a bit of time over the past few days putting together some &lt;a href="http://llvm.org/"&gt;LLVM&lt;/a&gt;
bindings for Haskell, based on Gordon Henriksen&amp;rsquo;s C bindings.&lt;/p&gt;
&lt;p&gt;(If you don&amp;rsquo;t know what LLVM is, it&amp;rsquo;s a wonderful toybox of compiler components, from a complete
toolchain supporting multiple architectures through a set of well-defined APIs and intermediate
representation file formats that are designed for building interesting software.)&lt;/p&gt;
&lt;p&gt;The C bindings are almost untyped, but the Haskell bindings re-add type safety to prevent
runtime crashes and general badness.&lt;/p&gt;</description></item><item><title>Design your functions for partial application</title><link>https://www.serpentine.com/2007/12/26/design-your-functions-for-partial-application/</link><pubDate>Wed, 26 Dec 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/12/26/design-your-functions-for-partial-application/</guid><description>&lt;p&gt;Every language&amp;rsquo;s standard library has its weak spots. In C, for example, the &lt;code&gt;stdio&lt;/code&gt; functions
don&amp;rsquo;t have a consistent notion of where the &lt;code&gt;FILE *&lt;/code&gt; belongs in the argument list. For &lt;code&gt;fwrite&lt;/code&gt;,
it goes at the end; for &lt;code&gt;fseek&lt;/code&gt;, it&amp;rsquo;s at the beginning. This makes it harder to abstract away
the details of the API. Instead of remembering &amp;ldquo;the &lt;code&gt;FILE *&lt;/code&gt; always goes at the front&amp;rdquo;, I have
to memorise the order in which each specific function takes its arguments. Of such niggles are
programmer annoyance born.&lt;/p&gt;</description></item><item><title>BLDGBLOG interviews Kim Stanley Robinson</title><link>https://www.serpentine.com/2007/12/20/bldgblog-interviews-kim-stanley-robinson/</link><pubDate>Fri, 21 Dec 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/12/20/bldgblog-interviews-kim-stanley-robinson/</guid><description>&lt;p&gt;Here is an absolute treat: a long, lively &lt;a href="http://bldgblog.blogspot.com/2007/12/comparative-planetology-interview-with.html"&gt;interview with Kim Stanley Robinson&lt;/a&gt;, conducted on one of my favourite blogs, &lt;a href="http://bldgblog.blogspot.com/"&gt;BLDGBLOG&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;At its best (the &lt;em&gt;Three Californias&lt;/em&gt; trilogy, &lt;em&gt;Antarctica&lt;/em&gt;), Robinson&amp;rsquo;s writing is at once haunting and beautifully evocative of a sense of place.&lt;/p&gt;</description></item><item><title>GHC 6.8.1, gtk2hs 0.9.12.1 now available for Fedora 8</title><link>https://www.serpentine.com/2007/11/26/ghc-681-gtk2hs-09121-now-available-for-fedora-8/</link><pubDate>Mon, 26 Nov 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/11/26/ghc-681-gtk2hs-09121-now-available-for-fedora-8/</guid><description>&lt;p&gt;If you use Fedora 8, GHC 6.8.1 will be in the stable repository within 24 hours or so. I&amp;rsquo;ve also pushed a compatible build of gtk2hs 0.9.12.1 to the stable repository.&lt;/p&gt;</description></item><item><title>GHC 6.8.1 pushed to Fedora 8 testing</title><link>https://www.serpentine.com/2007/11/09/ghc-681-pushed-to-fedora-8-testing/</link><pubDate>Fri, 09 Nov 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/11/09/ghc-681-pushed-to-fedora-8-testing/</guid><description>&lt;p&gt;Upgrading my laptop from F-7 to F-8 yesterday was painless, so I&amp;rsquo;ve been able to verify that the latest version of GHC works smoothly. I&amp;rsquo;ve pushed the built packages to the F-8 testing repository, and will bump them to release in about a week.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re feeling impatient, you can download the final RPMs from &lt;a href="https://web.archive.org/web/20071113121238/https://web.archive.org/web/20071113121238/https://koji.fedoraproject.org/koji/buildinfo?buildID=23739"&gt;the koji build page&lt;/a&gt;. I&amp;rsquo;ve got a build of Gtk2Hs pending, too, so I&amp;rsquo;ll be releasing that at the same time as the bump of GHC itself.&lt;/p&gt;</description></item><item><title>See me speak at Ignite SF tonight</title><link>https://www.serpentine.com/2007/10/16/see-me-speak-at-ignite-sf-tonight/</link><pubDate>Tue, 16 Oct 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/10/16/see-me-speak-at-ignite-sf-tonight/</guid><description>&lt;p&gt;This evening, I&amp;rsquo;ll be speaking at the peculiar but fun &lt;a href="http://upcoming.yahoo.com/event/263028/"&gt;Ignite SF&lt;/a&gt;. My talk is notionally about functional programming, but it&amp;rsquo;s really about imposing constraints on yourself, and what you can get out of it.&lt;/p&gt;</description></item><item><title>Using Emacs to insert SCC annotations in Haskell code</title><link>https://www.serpentine.com/2007/10/09/using-emacs-to-insert-scc-annotations-in-haskell-code/</link><pubDate>Wed, 10 Oct 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/10/09/using-emacs-to-insert-scc-annotations-in-haskell-code/</guid><description>&lt;p&gt;When debugging or profiling Haskell code, it&amp;rsquo;s common practice to pepper it with cost centre
annotations, often called SCC (for &lt;del&gt;&lt;em&gt;strongly connected component&lt;/em&gt;&lt;/del&gt; &lt;em&gt;set cost centre&lt;/em&gt;)
annotations. If you compile a program using &lt;code&gt;ghc -prof -auto-all&lt;/code&gt;, this causes all of the
top-level names in every module you compile to automatically be annotated with their names,
which will show up in a profile file later on when you run your program with &lt;code&gt;+RTS -P -RTS&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>What the heck is a Wide Finder, anyway?</title><link>https://www.serpentine.com/2007/09/25/what-the-heck-is-a-wide-finder-anyway/</link><pubDate>Tue, 25 Sep 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/09/25/what-the-heck-is-a-wide-finder-anyway/</guid><description>&lt;p&gt;Tim Bray has recently been writing about a simple log file processing task, giving his efforts the (decidedly peculiar) name of &lt;a href="http://www.tbray.org/ongoing/When/200x/2007/09/20/Wide-Finder"&gt;Wide Finder&lt;/a&gt;. The task at hand is to count popular links in an Apache log file.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s my two minutes&amp;rsquo; worth of hat in the ring, in Haskell.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; main = do
&amp;gt; args &amp;lt;- getArgs
&amp;gt; forM_ args $ \name -&amp;gt; do
&amp;gt; m &amp;lt;- (foldl' count M.empty . LB.lines) `fmap` LB.readFile name
&amp;gt; mapM_ print ((take 10 . sortBy (flip compare `on` snd) . M.toList) m)
&amp;gt; where on f g x y = g x `f` (g y)
&amp;gt; count m line = case line =~ &amp;quot;\&amp;quot;GET /en/([^ ]+\\.html)&amp;quot; of
&amp;gt; ((_:g:_):_) -&amp;gt; M.insertWith' (+) g 1 m
&amp;gt; _ -&amp;gt; m :: M.Map LB.ByteString Int
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here&amp;rsquo;s some comparable Python:&lt;/p&gt;</description></item><item><title>Pure Haskell MySQL bindings in the works</title><link>https://www.serpentine.com/2007/09/05/pure-haskell-mysql-bindings-in-the-works/</link><pubDate>Thu, 06 Sep 2007 05:45:58 +0000</pubDate><guid>https://www.serpentine.com/2007/09/05/pure-haskell-mysql-bindings-in-the-works/</guid><description>&lt;p&gt;I&amp;rsquo;ve spent a few spare hours here and there working on a pure &lt;a href="https://www.serpentine.com/software/mysql/"&gt;Haskell interface to MySQL&lt;/a&gt; recently. On the principle that perhaps someone else might want to join in the fun, I&amp;rsquo;ve published a darcs repository already (see the link above for more details):&lt;br&gt;
&lt;code&gt;&amp;lt;br /&amp;gt; darcs get http://darcs.serpentine.com/mysql&amp;lt;br /&amp;gt; &lt;/code&gt;&lt;br&gt;
There are a few reasons I&amp;rsquo;m doing this. One is licensing-related: the existing hsql-mysql bindings claim to be BSD-licensed, but they&amp;rsquo;re just an FFI wrapper around the MySQL client library, so they (and any program that uses them) are subject to the GPL. My library speaks the MySQL wire protocol in pure Haskell, and I&amp;rsquo;ve BSD-licensed it.&lt;/p&gt;</description></item><item><title>Weighted Slope One in Haskell: collaborative filtering in 29 lines of code</title><link>https://www.serpentine.com/2007/08/27/weighted-slope-one-in-haskell-collaborative-filtering-in-29-lines-of-code/</link><pubDate>Tue, 28 Aug 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/08/27/weighted-slope-one-in-haskell-collaborative-filtering-in-29-lines-of-code/</guid><description>&lt;p&gt;Some months ago, I wrote a &lt;a href="https://www.serpentine.com/2006/12/12/collaborative-filtering-made-easy/"&gt;Python
implementation&lt;/a&gt; of
&lt;a href="http://www.daniel-lemire.com/en/"&gt;Daniel Lemire&lt;/a&gt;&amp;rsquo;s Weighted Slope One collaborative filtering
algorithm.&lt;/p&gt;
&lt;p&gt;Steve Jenson sent me a pointer to his &lt;a href="http://saladwithsteve.com/2007/08/weighted-slope-one-in-scala.html"&gt;Scala
implementation&lt;/a&gt; last week,
but his code is a straight port of the Python version, not using any of Scala&amp;rsquo;s tasty functional
crunchiness. In an idle period the other evening, I ported my Python code to Haskell.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;module SlopeTwo (Rating, SlopeOne, empty, predict, update) where
import Data.List (foldl')
import qualified Data.Map as M
newtype SlopeOne a = SlopeOne (M.Map a (M.Map a (Int, Double))) deriving (Show)
type Rating a = M.Map a Double
empty = SlopeOne M.empty
addT (a,b) (c,d) = let (l,r) = (a+c, b+d) in l `seq` r `seq` (l, r)
update :: Ord a =&amp;gt; SlopeOne a -&amp;gt; [Rating a] -&amp;gt; SlopeOne a
update (SlopeOne s) = SlopeOne . M.map (M.map norm) . foldl' update' s
where norm (a,b) = (a, b / fromIntegral a)
update' s rm = foldl' (\m (k, v) -&amp;gt; insert m k v) s prod
where prod = [((a, b), (1, m - n)) | (a, m) &amp;lt;- rs, (b, n) &amp;lt;- rs]
rs = M.toList rm
insert m (a, b) v = M.alter foo a m
where foo = Just . maybe (M.singleton b v) (M.insertWith' addT b v)
predict :: Ord a =&amp;gt; SlopeOne a -&amp;gt; Rating a -&amp;gt; Rating a
predict (SlopeOne s) rm =
let freqm = foldl' insert M.empty
[(a,b,r) | (a, m) &amp;lt;- M.keys s, (b, r) &amp;lt;- M.toList rm]
insert n (a,b,r) = let (f, d) = find s (a, b) in
M.insertWith' addT a (f, fromIntegral f * (r + d)) n
norm = M.map (\(a, b) -&amp;gt; b / fromIntegral a) freqm
find m (a,b) = M.findWithDefault (0,0) b (M.findWithDefault M.empty a m)
in M.filterWithKey (\k v -&amp;gt; v &amp;gt; 0 &amp;amp;&amp;amp; M.notMember k rm) norm
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The Haskell code uses essentially the same approach as the Python code, though of course it has
to use purely functional maps instead of dicts (hash tables), because hash tables don&amp;rsquo;t make
much sense in a functional language. I also cut down the number of maps from two to one, which
simplified the code a little.&lt;/p&gt;</description></item><item><title>Announcing Data.SuffixTree, a lazy, efficient Haskell suffix tree</title><link>https://www.serpentine.com/2007/08/23/announcing-datasuffixtree-a-lazy-efficient-haskell-suffix-tree/</link><pubDate>Thu, 23 Aug 2007 23:43:39 +0000</pubDate><guid>https://www.serpentine.com/2007/08/23/announcing-datasuffixtree-a-lazy-efficient-haskell-suffix-tree/</guid><description>&lt;p&gt;A few days ago, I wrote a Haskell library for building and working with &lt;a href="http://en.wikipedia.org/wiki/Suffix_tree"&gt;suffix trees&lt;/a&gt;. It builds a suffix tree lazily, so even though its performance is &lt;em&gt;O(n log n)&lt;/em&gt; on large input strings, it often has linear performance for many applications.&lt;/p&gt;
&lt;p&gt;The implementation is simple and easy to read; the API is &lt;a href="https://web.archive.org/web/20071017213939/http://darcs.serpentine.com:80/suffixtree/dist/doc/html/Data-SuffixTree.html"&gt;well-documented&lt;/a&gt; and easy to use; and the internals of the tree structure are exposed, so you can build your own traversal, inspection, and manipulation functions on top of it. The code is liberally licensed (BSD3), to encourage wide use.&lt;/p&gt;</description></item><item><title>Why is del.icio.us trapped in amber?</title><link>https://www.serpentine.com/2007/08/11/why-is-delicious-trapped-in-amber/</link><pubDate>Sat, 11 Aug 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/08/11/why-is-delicious-trapped-in-amber/</guid><description>&lt;p&gt;I&amp;rsquo;ve had an &lt;a href="https://web.archive.org/web/https://web.archive.org/web/20251007193640/https://del.icio.us//bos"&gt;account on del.icio.us&lt;/a&gt; for several years, but I only started using it heavily perhaps a year ago. While it&amp;rsquo;s a wonderful site in many respects, I&amp;rsquo;ve been surprised and disappointed by what&amp;rsquo;s happened since Yahoo acquired the company: nothing at all.&lt;/p&gt;
&lt;p&gt;Clearly, Yahoo has had no idea what to do with their acquisition: almost its first reaction to the grafted del.icio.us antibodies was to roll out a homegrown NIH tagging site, the name of which nobody now remembers. Since then, Yahoo hasn&amp;rsquo;t even bothered to switch users over to its unified login system as it did with Flickr. Whether you liked that move or not, it was a clear sign that Yahoo had some interest in Flickr.&lt;/p&gt;</description></item><item><title>Modern Irish comedy in bite-sized nuggets</title><link>https://www.serpentine.com/2007/08/08/modern-irish-comedy-in-bite-sized-nuggets/</link><pubDate>Thu, 09 Aug 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/08/08/modern-irish-comedy-in-bite-sized-nuggets/</guid><description>&lt;p&gt;Irish television hasn&amp;rsquo;t changed much since I left the country twelve years ago. The main national broadcaster, RTÃ‰, mainly serves up imported American and British shows, with locally originated fare dominated by vast quantities of sports coverage, a few soaps and talk shows, and the occasional documentary. It&amp;rsquo;s a tepid, uninspiring mix.&lt;/p&gt;
&lt;p&gt;Except for one show, that is. Soupy Norman is a Polish soap opera (Pierwsza miÅ‚oÅ›Ä‡), dubbed into English and utterly twisted out of recognition by a team of Irish comedians. The writing, air of absurdity, and comic timing are pitch-perfect. (Mind you, the Cork accents might be a bit tough for non-native ears to decipher. My wife kept asking me &amp;ldquo;can you &lt;em&gt;really&lt;/em&gt; understand what they&amp;rsquo;re saying?&amp;rdquo;)&lt;/p&gt;</description></item><item><title>On the value of strong static typing</title><link>https://www.serpentine.com/2007/07/29/on-the-value-of-strong-static-typing/</link><pubDate>Mon, 30 Jul 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/07/29/on-the-value-of-strong-static-typing/</guid><description>&lt;p&gt;Here&amp;rsquo;s a great &lt;a href="http://lambda-the-ultimate.org/node/2216#comment-31690"&gt;quote from Yaron Minsky&lt;/a&gt; about the use of types in functional programs.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;[&amp;hellip;] most of the advantage of types in a language like ML comes from completely vanilla uses of the type system. One of our programming maxims at &lt;a href="https://web.archive.org/web/20120806135801/http://www.janestcapital.com/"&gt;Jane Street&lt;/a&gt; is to &amp;ldquo;make illegal states unrepresentable&amp;rdquo;. Algebraic datatypes, parametric polymorphism and abstraction can be used to great effect in this regard.&lt;/p&gt;
&lt;p&gt;I think that people who are new to ML think of the type system as merely a constraint, that is to say, you write code as you did before, and then you see whether the compiler accepts it. As people get more experienced, they start to use the type system as a tool in its own right, and one of the things that is constantly on one&amp;rsquo;s mind is how to pass off as much of the proof burden as possible to the compiler. Most of this work can and should be done using boring old vanilla ML types.&lt;/p&gt;</description></item><item><title>But I wore the juice!</title><link>https://www.serpentine.com/2007/06/30/but-i-wore-the-juice/</link><pubDate>Sun, 01 Jul 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/06/30/but-i-wore-the-juice/</guid><description>&lt;p&gt;Here&amp;rsquo;s a fabulous way to start a research paper.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;In 1995, McArthur Wheeler walked into two Pittsburgh banks and robbed them in broad daylight, with no visible attempt at disguise. He was arrested later that night, less than an hour after videotapes of him taken from surveillance cameras were broadcast on the 11 o&amp;rsquo;clock news. When police later showed him the surveillance tapes, Mr. Wheeler stared in incredulity. &amp;ldquo;But I wore the juice,&amp;rdquo; he mumbled. Apparently, Mr. Wheeler was under the impression that rubbing one&amp;rsquo;s face with lemon juice rendered it invisible to videotape cameras. The paper in question,
&lt;a href="http://www.apa.org/journals/features/psp7761121.pdf"&gt; Unskilled and Unaware of It: How Difficulties in Recognizing One&amp;rsquo;s Own Incompetence Lead to Inflated Self-Assessments&lt;/a&gt; is a great read. Personally, I have my nose rubbed in the evidence of my own ineptitude often enough that I hope that I&amp;rsquo;m not in the category of people the authors study. That said, &amp;ldquo;but I wore the juice!&amp;rdquo; has now become my catch-all excuse for error.&lt;/p&gt;</description></item><item><title>Fedora 7 on a Thinkpad X60: not so hot</title><link>https://www.serpentine.com/2007/06/20/fedora-7-on-a-thinkpad-x60-not-so-hot/</link><pubDate>Thu, 21 Jun 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/06/20/fedora-7-on-a-thinkpad-x60-not-so-hot/</guid><description>&lt;p&gt;I&amp;rsquo;ve been running test releases of Fedora 7, and lately the final release, for a number of months on my fairly new Lenovo Thinkpad X60. Here&amp;rsquo;s a brief summary of my experiences.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been using Fedora since 0.92 (Taroon), and while I&amp;rsquo;ve generally been happy with it, F7 is not exactly a model of stability or sleekness. Here&amp;rsquo;s a list of problems I&amp;rsquo;ve run into. My biggest problems so far have been with suspend and resume, and network drivers.&lt;/p&gt;</description></item><item><title>So I’m writing a Haskell book!</title><link>https://www.serpentine.com/2007/05/23/so-im-writing-a-haskell-book/</link><pubDate>Wed, 23 May 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/05/23/so-im-writing-a-haskell-book/</guid><description>&lt;p&gt;I&amp;rsquo;ve been sitting on this for a while, so I&amp;rsquo;m very excited to announce that Don Stewart, John Goerzen and I are collaborating on an upcoming book for O&amp;rsquo;Reilly, the working title of which is &amp;ldquo;Real-World Haskell&amp;rdquo;. Better yet, O&amp;rsquo;Reilly has agreed to publish the title under a Creative Commons license!&lt;/p&gt;
&lt;p&gt;You can find more details, and follow our progress, over at &lt;a href="https://web.archive.org/web/20250714091743/http://realworldhaskell.org/"&gt;the web site we&amp;rsquo;ve set up&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>GHC 6.6.1 for Fedora</title><link>https://www.serpentine.com/2007/05/14/ghc-661-for-fedora/</link><pubDate>Tue, 15 May 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/05/14/ghc-661-for-fedora/</guid><description>&lt;p&gt;With Jens Petersen&amp;rsquo;s blessing, I&amp;rsquo;ve packaged GHC 6.6.1 for Fedora Extras. If you use FC6, it&amp;rsquo;s available via &lt;code&gt;yum&lt;/code&gt; as of a few days ago. It will be a part of Fedora 7 as soon as that comes out, too.&lt;/p&gt;
&lt;p&gt;The upgrade to 6.6.1 necessitated a bump of the release number of the Fedora Gtk2Hs package, too. There are no changes in the new release; it&amp;rsquo;s just built against the newer compiler release.&lt;/p&gt;</description></item><item><title>Norvig’s spell checker and idiomatic Haskell</title><link>https://www.serpentine.com/2007/05/14/norvigs-spell-checker-and-idiomatic-haskell/</link><pubDate>Mon, 14 May 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/05/14/norvigs-spell-checker-and-idiomatic-haskell/</guid><description>&lt;p&gt;A few weeks ago, I spent a little time porting Peter Norvig&amp;rsquo;s Python code from his article &lt;a href="http://norvig.com/spell-correct.html"&gt;How to Write a Spelling Corrector&lt;/a&gt; to Haskell. It&amp;rsquo;s a concise vehicle for a few Haskelly topics that don&amp;rsquo;t get much airing in front of a general audience: what idiomatic Haskell looks like, and the dreaded &lt;em&gt;space leak&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Bear in mind as you read this that I&amp;rsquo;m porting Norvig&amp;rsquo;s algorithm, not implementing the approach that would be best suited to Haskell (dynamic programming). And I&amp;rsquo;m trying to do so idiomatically, so that the resulting code looks like decent Haskell. This isn&amp;rsquo;t an attempt to &amp;ldquo;golf&amp;rdquo; the code for either performance or terseness. Neither am I trying to show that either language is better than the other. Whew, enough with the disclaimers.&lt;/p&gt;</description></item><item><title>FileManip, an expressive Haskell library for manipulating files</title><link>https://www.serpentine.com/2007/05/01/filemanip-an-expressive-haskell-library-for-manipulating-files/</link><pubDate>Wed, 02 May 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/05/01/filemanip-an-expressive-haskell-library-for-manipulating-files/</guid><description>&lt;p&gt;I just released version 0.1 of &lt;a href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/FileManip-0.1"&gt;FileManip&lt;/a&gt;, a Haskell library I put together to make it easier to futz about with files in the filesystem.&lt;/p&gt;
&lt;p&gt;There are a few different components to the package.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://web.archive.org/web/https://web.archive.org/web/20070722071358/http://darcs.serpentine.com/filemanip/dist/doc/html/FileManip/System-FilePath-Find.html"&gt;&lt;code&gt;Find&lt;/code&gt;&lt;/a&gt; module lets you search the filesystem for files, after the manner of the Unix &lt;code&gt;find&lt;/code&gt; program. It provides a nice embedded language for building filters and controlling recursion, so you can write readable expressions like this:&lt;/p&gt;</description></item><item><title>Efficiently computing a factorial using binary splitting</title><link>https://www.serpentine.com/2007/04/23/efficiently-computing-a-factorial-using-binary-splitting/</link><pubDate>Tue, 24 Apr 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/04/23/efficiently-computing-a-factorial-using-binary-splitting/</guid><description>&lt;p&gt;I don&amp;rsquo;t intend for this blog to become a dumping ground for code snippets, but sometimes the temptation is too strong. Here&amp;rsquo;s a simple but fast function for computing a factorial, using the binary splitting algorithm from &lt;a href="http://numbers.computation.free.fr/Constants/Algorithms/splitting.html"&gt;this page&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;factorial :: Integral a =&amp;gt; a -&amp;gt; a
factorial n = split n 0
where split a b = let d = a - b
in if d &amp;lt; 0
then 0
else case d of
0 -&amp;gt; 1
1 -&amp;gt; a
2 -&amp;gt; a * (a - 1)
3 -&amp;gt; a * (a - 1) * (a - 2)
_ -&amp;gt; let m = (a + b) `div` 2
in split a m * split m b
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Must-see Haskell talks at OSCON ’07</title><link>https://www.serpentine.com/2007/04/16/must-see-haskell-talks-at-oscon-07/</link><pubDate>Mon, 16 Apr 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/04/16/must-see-haskell-talks-at-oscon-07/</guid><description>&lt;p&gt;Simon Peyton Jones will be giving &lt;a href="http://conferences.oreillynet.com/cs/os2007/view/e_spkr/3429"&gt;two Haskell-related talks&lt;/a&gt; at &lt;a href="http://conferences.oreillynet.com/os2007/"&gt;OSCON&lt;/a&gt; in July! As far as I know, this will be the first time that Haskell gets an airing at a general-interest conference. Simon is a fantastic speaker, so if you were going to OSCON anyway, you absolutely should not miss his talks.&lt;/p&gt;
&lt;p&gt;One of Simon&amp;rsquo;s talks is to be a three-hour Haskell tutorial. It&amp;rsquo;s explicitly &lt;em&gt;not&lt;/em&gt; aimed at &amp;ldquo;pointy-headed academics&amp;rdquo;, so if you like to get practical things done quickly and safely, this should be just the job.&lt;/p&gt;</description></item><item><title>Haskell.org and Google’s Summer of Code</title><link>https://www.serpentine.com/2007/04/12/haskellorg-and-googles-summer-of-code/</link><pubDate>Thu, 12 Apr 2007 16:11:17 +0000</pubDate><guid>https://www.serpentine.com/2007/04/12/haskellorg-and-googles-summer-of-code/</guid><description>&lt;p&gt;This year, the &lt;a href="http://www.haskell.org/"&gt;Haskell.org&lt;/a&gt; community has had nine projects funded by Google, out of 64 student applications. We had mentoring capacity for over 20 projects, so the final number was decided by Google, not by our ability to deal with them. Congratulations to those who were accepted! And to those who were not, take heart; the competition was tight.&lt;/p&gt;
&lt;p&gt;Most of this year&amp;rsquo;s successful applications are centered around library and infrastructure improvements, so I&amp;rsquo;m hopeful that we&amp;rsquo;ll see quite a lot of generally useful code come out at the end of this summer.&lt;/p&gt;</description></item><item><title>How to dual-boot Windows and Fedora, by hand, for the insane</title><link>https://www.serpentine.com/2007/04/11/how-to-dual-boot-windows-and-fedora-by-hand-for-the-insane/</link><pubDate>Thu, 12 Apr 2007 06:20:59 +0000</pubDate><guid>https://www.serpentine.com/2007/04/11/how-to-dual-boot-windows-and-fedora-by-hand-for-the-insane/</guid><description>&lt;p&gt;I recently bought a Thinkpad X60 that came with Windows preinstalled. I never actually use Windows, but it&amp;rsquo;s convenient to have around for the occasional BIOS update.&lt;/p&gt;
&lt;p&gt;My Linux distribution of choice has long been &lt;a href="http://www.fedoraproject.org/"&gt;Fedora&lt;/a&gt;. Unfortunately, unlike other modern Linux distros, Fedora doesn&amp;rsquo;t provide a simple graphical means to shrink an NTFS partition in its installer.&lt;/p&gt;
&lt;p&gt;Since the X60 doesn&amp;rsquo;t have an optical drive, and I don&amp;rsquo;t have any USB storage like a memory stick or CD-ROM drive, I couldn&amp;rsquo;t easily boot into something like &lt;a href="http://www.knoppix.org/"&gt;Knoppix&lt;/a&gt;. If I&amp;rsquo;d had such gear available, I could easily have shrunk the Windows partition using &lt;a href="http://qtparted.sourceforge.net/"&gt;&lt;code&gt;qtparted&lt;/code&gt;&lt;/a&gt;. So here are my notes on how to get dual-booting working, by hand, in a bare-bones environment.&lt;/p&gt;</description></item><item><title>Who says there’s nothing to numerology?</title><link>https://www.serpentine.com/2007/03/02/who-says-theres-nothing-to-numerology/</link><pubDate>Fri, 02 Mar 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/03/02/who-says-theres-nothing-to-numerology/</guid><description>&lt;p&gt;From &lt;code&gt;diffbavis&lt;/code&gt; on &lt;code&gt;#haskell&lt;/code&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;blockquote&gt;&lt;p&gt;sum (map ord &amp;ldquo;al gore&amp;rdquo;) 666&lt;/p&gt;
&lt;/blockquote&gt;&lt;/blockquote&gt;</description></item><item><title>A Haskell regular expression tutorial</title><link>https://www.serpentine.com/2007/02/27/a-haskell-regular-expression-tutorial/</link><pubDate>Tue, 27 Feb 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/02/27/a-haskell-regular-expression-tutorial/</guid><description>&lt;p&gt;Someone showed up on &lt;code&gt;#haskell&lt;/code&gt; yesterday, asking how to use regular expressions. This isn&amp;rsquo;t a completely straightforward question to answer. While Haskell&amp;rsquo;s regexp libraries provide the same functionality you&amp;rsquo;ll find in Perl, Python, and Java, they provide a rich and fairly abstract interface that can be daunting to newcomers.&lt;/p&gt;
&lt;p&gt;So let&amp;rsquo;s fix that, and strip away the abstractions to show how we might actually use regexps in practice. I&amp;rsquo;m assuming that you&amp;rsquo;re already familiar with regexps from using them in some other language, and simply want to find your feet in Haskell. The standard library that implements regexps is &lt;a href="https://web.archive.org/web/20090420134904/http://www.haskell.org:80/ghc/docs/latest/html/libraries/regex-posix/Text-Regex-Posix.html"&gt;Text.Regex.Posix&lt;/a&gt;. As the name suggests, this wraps the system&amp;rsquo;s native POSIX extended regexp library.&lt;/p&gt;</description></item><item><title>A quick programmer’s look at NVIDIA’s CUDA</title><link>https://www.serpentine.com/2007/02/22/a-quick-programmers-look-at-nvidias-cuda/</link><pubDate>Thu, 22 Feb 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/02/22/a-quick-programmers-look-at-nvidias-cuda/</guid><description>&lt;p&gt;I spent a while this evening reading through the documentation for the beta release of &lt;a href="http://developer.nvidia.com/object/cuda.html"&gt;NVIDIA&amp;rsquo;s CUDA&lt;/a&gt; GPGPU system. My motivation for this was that &lt;code&gt;nvcc&lt;/code&gt;, the CUDA compiler, is based on a code drop of the &lt;a href="http://www.pathscale.com/ekopath.html"&gt;EkoPath&lt;/a&gt; compiler, which I&amp;rsquo;ve worked on intermittently over the past few years.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://web.archive.org/web/20070421202952/http://developer.download.nvidia.com:80/compute/cuda/0_8/NVIDIA_CUDA_Programming_Guide_0.8.pdf" title="CUDA Programming Guide [PDF]"&gt;programming model&lt;/a&gt; that these GPUs enforce is incredibly complex. It&amp;rsquo;s more than a little reminiscent of the Connection Machine (for a blast from the past, see a &lt;a href="https://web.archive.org/web/20090722043941/http://bradley.csail.mit.edu:80/cm5docs/"&gt;collection of scanned CM-5 documentation&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Haskell Cabal, now with extra crunchy RPM goodness</title><link>https://www.serpentine.com/2007/02/20/haskell-cabal-now-with-extra-crunchy-rpm-goodness/</link><pubDate>Tue, 20 Feb 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/02/20/haskell-cabal-now-with-extra-crunchy-rpm-goodness/</guid><description>&lt;p&gt;The Haskell community has a very nice implementation-independent mechanism for building libraries and applications, called &lt;a href="http://www.haskell.org/cabal/"&gt;Cabal&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I spent a few hours over the past couple of days hacking on Cabal to add the ability to build RPM packages. You can fetch my darcs repository from here:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;darcs get --partial http://darcs.serpentine.com/cabal-rpm
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This new capability is easy to use. It adds a single new Cabal command, called &lt;code&gt;rpm&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;runhaskell Setup.*hs rpm
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This generates a spec file, and builds source and binary RPMs.&lt;/p&gt;</description></item><item><title>Esh, the fabulous, forgotten Scheme implementation</title><link>https://www.serpentine.com/2007/02/16/esh-the-fabulous-forgotten-scheme-implementation/</link><pubDate>Fri, 16 Feb 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/02/16/esh-the-fabulous-forgotten-scheme-implementation/</guid><description>&lt;p&gt;In 1995, I moved from Ireland to the San Francisco Bay Area, because I&amp;rsquo;d been offered a job that
promised to combine Unix and Scheme hacking. The prospect tickled me pink.&lt;/p&gt;
&lt;p&gt;At Sun Microsystems, the SPARC design team used a home-built tool called DReAM to manage their
ranch of servers as they ran huge batches of EDA design synthesis, verification and simulation
runs. I was to join the DReAM group to maintain and extend the software.&lt;/p&gt;</description></item><item><title>Anatol Rapaport on argument</title><link>https://www.serpentine.com/2007/02/15/anatol-rapaport-on-argument/</link><pubDate>Thu, 15 Feb 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/02/15/anatol-rapaport-on-argument/</guid><description>&lt;p&gt;Here&amp;rsquo;s a wonderful excerpt from a &lt;a href="http://ase.tufts.edu/cogstud/papers/dawkinsreview.pdf"&gt;book review written by Daniel Dennett&lt;/a&gt;, in which he paraphrases Rapaport on how to argue constructively.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Serious argument depends on mutual respect, and this is often hard to engender when disagreements turn vehement. The social psychologist and game theorist Anatol Rapoport (creator of the winning Tit-for-Tat strategy in Robert Axelrod&amp;rsquo;s legendary prisoner&amp;rsquo;s dilemma tournament) once promulgated a list of rules for how to write a successful critical commentary on an opponent&amp;rsquo;s work. First, he said, you must attempt to re-express your opponent&amp;rsquo;s position so clearly, vividly and fairly that your opponent says &amp;ldquo;Thanks, I wish I&amp;rsquo;d thought of putting it that way.&amp;rdquo; Then, you should list any points of agreement (especially if they are not matters of general or widespread agreement), and third, you should mention anything you have learned from your opponent. Only then are you permitted to say so much as a word of rebuttal or criticism. I have found this a salutary discipline to follow-or, since it is challenging, to attempt to follow. When it succeeds, the results are gratifying: your opponent is in a mood to be enlightened and eagerly attentive.&lt;/p&gt;</description></item><item><title>Parsing a simple config file in Haskell</title><link>https://www.serpentine.com/2007/01/31/parsing-a-simple-config-file-in-haskell/</link><pubDate>Thu, 01 Feb 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/01/31/parsing-a-simple-config-file-in-haskell/</guid><description>&lt;p&gt;Even though I wrote my Haskell &lt;a href="https://www.serpentine.com/2007/01/30/blogging-with-emacs-and-haskell-part-zero/"&gt;blog helper
tool&lt;/a&gt; purely for my own use, I
don&amp;rsquo;t want to store hard-coded strings in it, lest my username and password escape into the
wild.&lt;/p&gt;
&lt;p&gt;This suggests that I need a small config file of some kind. I&amp;rsquo;m going to walk through the parser
I wrote for this config file, not as a tutorial, but as an example of how to solve a simple
pratical problem in Haskell.&lt;/p&gt;</description></item><item><title>Blogging with Emacs and Haskell, part Zero</title><link>https://www.serpentine.com/2007/01/30/blogging-with-emacs-and-haskell-part-zero/</link><pubDate>Wed, 31 Jan 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/01/30/blogging-with-emacs-and-haskell-part-zero/</guid><description>&lt;p&gt;Since I started using WordPress to host my blog, I&amp;rsquo;ve generally been fairly pleased with it. Its killer feature has to be Akismet, the built-in spam filter. Akismet has so far killed over 18,000 spam comments for me, or roughly 300 &lt;em&gt;per day&lt;/em&gt; in the two months since I switched from Blosxom to WordPress. Perhaps one in fifty spam comments make it through Akismet&amp;rsquo;s filters, at which point they&amp;rsquo;re easily dealt with via the web interface. So Akismet makes the difference between manageable comments and having to turn them off entirely.&lt;/p&gt;</description></item><item><title>Beautiful graphics manipulation (in Haskell, artistic flair required)</title><link>https://www.serpentine.com/2007/01/19/beautiful-graphics-manipulation-in-haskell-artistic-flair-required/</link><pubDate>Sat, 20 Jan 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/01/19/beautiful-graphics-manipulation-in-haskell-artistic-flair-required/</guid><description>&lt;p&gt;During my evening&amp;rsquo;s Haskell-related Googling, I came across a piece of software called
&lt;a href="https://web.archive.org/web/20071110020422/http://www.acooke.org:80/jara/pancito/"&gt;Pancito&lt;/a&gt;, written by Andrew Cooke. Pancito is a Haskell
package for manipulating images, and Andrew has a &lt;a href="https://web.archive.org/web/20080417031158/http://www.acooke.org:80/pancito/intnleng/index.html"&gt;beautiful
gallery&lt;/a&gt; of some of the work he&amp;rsquo;s done with
it. It&amp;rsquo;s well worth a look. (How did I find Pancito? Because I was playing with &lt;a href="https://web.archive.org/web/20080523223931/http://www.acooke.org:80/andrew/writing/folds.html"&gt;tree
folds&lt;/a&gt;.)&lt;/p&gt;</description></item><item><title>Playing fast and loose with Parsec for parsing in Haskell</title><link>https://www.serpentine.com/2007/01/19/playing-fast-and-loose-with-parsec-for-parsing-in-haskell/</link><pubDate>Fri, 19 Jan 2007 21:00:48 +0000</pubDate><guid>https://www.serpentine.com/2007/01/19/playing-fast-and-loose-with-parsec-for-parsing-in-haskell/</guid><description>&lt;p&gt;For the past number of years, whenever I&amp;rsquo;ve needed to write a parser for a language, I&amp;rsquo;ve turned
to Terence Parr&amp;rsquo;s &lt;a href="http://www.antlr.org/"&gt;ANTLR&lt;/a&gt;. It&amp;rsquo;s a wonderful piece of software, far more
capable than the old standbys lex and yacc. Just as appealing is the fact that it generates
recursive-descent parsers that are easy to read and debug. Compare an ANTLR-generated parser
with the pages of pushdown automaton state transition muck that yacc and its descendants
generate and you&amp;rsquo;ll quickly appreciate the clean nature of ANTLR&amp;rsquo;s code. In the Haskell world, a
close approximation to ANTLR is available in the form of
&lt;a href="https://web.archive.org/web/20070603012003/http://www.cs.uu.nl:80/~daan/parsec.html"&gt;Parsec&lt;/a&gt;, a library for building parsers using
combinators. Where ANTR has its own special syntax, and you run a tool that generates code in
some target language, you construct a Parsec parser entirely in Haskell. The Parsec
documentation is excellent, with a &lt;a href="https://web.archive.org/web/20070610090033/http://www.cs.uu.nl:80/~daan/download/parsec/parsec.html"&gt;great
tutorial&lt;/a&gt; that makes it clear how easy it
is to use Parsec to build a parser. In my case, I wanted to parse a simple language that has
some structure, but no formal grammar, and a few nasty corners. This language makes heavy use of
key/value pairs, in which the keys and values are usually just contiguous non-whitespace
strings. In other words, a typical pair might be &amp;ldquo;foo=bar&amp;rdquo;, or &amp;ldquo;offset=17&amp;rdquo;. Sequences of pairs
are separated by white space, so three pairs might look like &amp;ldquo;a=1 b=2 c=3&amp;rdquo;. It&amp;rsquo;s easy to
recognise one of these pairs.&lt;/p&gt;</description></item><item><title>New Haskell packages for Fedora Extras</title><link>https://www.serpentine.com/2007/01/19/new-haskell-packages-for-fedora-extras/</link><pubDate>Fri, 19 Jan 2007 18:42:59 +0000</pubDate><guid>https://www.serpentine.com/2007/01/19/new-haskell-packages-for-fedora-extras/</guid><description>&lt;p&gt;Rather than bemoan the state of prepackaged Haskell goodness for Fedora, I&amp;rsquo;ve started down the
path of doing something about it. This morning, I put together new packages for Alex, a Haskell
lexer, and Happy, a parser generator, and submitted them for consideration via the byzantine
Extras &lt;a href="http://fedoraproject.org/wiki/Extras/Contributors"&gt;review process&lt;/a&gt;. If you&amp;rsquo;re a Haskell
hacker and Fedora user, please take a look at bugs
&lt;a href="https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=223486"&gt;223486&lt;/a&gt; (Happy) and
&lt;a href="https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=223490"&gt;223490&lt;/a&gt; (Alex).&lt;/p&gt;</description></item><item><title>Attention, the Soviet herring fleet!</title><link>https://www.serpentine.com/2007/01/13/attention-the-soviet-herring-fleet/</link><pubDate>Sat, 13 Jan 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/01/13/attention-the-soviet-herring-fleet/</guid><description>&lt;p&gt;From the department of microscopic obsessions of the bourgeoisie: I&amp;rsquo;ve subscribed to &lt;em&gt;The New
Yorker&lt;/em&gt; since I first came to the US, over a decade ago. On a mailing list, a correspondent
alerts readers to &lt;a href="http://emdashes.com/2007/01/ask-the-librarians-iv.php"&gt;this blog entry&lt;/a&gt;,
which tickled me pink.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Q. Is it true that at some point in the seventies, Goings On About Town used the listings for
&lt;em&gt;The Fantasticks&lt;/em&gt; to serialize James Joyce&amp;rsquo;s &lt;em&gt;Ulysses&lt;/em&gt;? Jon writes: Yes. &lt;em&gt;The New Yorker&lt;/em&gt;
began serializing &lt;em&gt;Ulysses&lt;/em&gt; in the November 3, 1968 listing for &lt;em&gt;The Fantasticks&lt;/em&gt;, which
famously ran for 17,162 performances, or nearly 42 years. That issue quoted the copyright
information from the third printing of the novel (London, Egoist Press). The book&amp;rsquo;s opening
words&amp;ndash;&amp;ldquo;Stately plump Buck Mulligan came from the stairhead bearing a bowl of lather on
which a mirror and a razor lay crossed&amp;rdquo;&amp;ndash;appeared in the Dec. 21, 1968, issue. The
serialization lasted almost three years, ending in November of 1971, and encompassed the
entirety of the book&amp;rsquo;s first chapter. […] Asked about reader response to the
serialization, [New Yorker editor Gardner] Botsford observed, &amp;ldquo;Many are delighted they can
identify the excerpts, but others think we are trying to communicate with the Russian herring
fleet in code.&amp;rdquo; Everybody loves easter eggs.&lt;/p&gt;</description></item><item><title>First impressions of darcs: not so hot</title><link>https://www.serpentine.com/2007/01/11/why-i-dont-like-darcs/</link><pubDate>Fri, 12 Jan 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/01/11/why-i-dont-like-darcs/</guid><description>&lt;p&gt;I&amp;rsquo;ve been using darcs recently for some Haskell-related revision control tasks, as it&amp;rsquo;s the
revision control tool of choice for the Haskell community (no surprise; it&amp;rsquo;s the most widely
used Haskell program in existence). However, I can&amp;rsquo;t say I&amp;rsquo;ve been all that happy with darcs
during my first few days of use. It has some behaviours that I think of as ill-considered, and
not oriented towards making new users comfortable quickly. By default, &amp;ldquo;darcs record&amp;rdquo; (the
equivalent of &amp;ldquo;commit&amp;rdquo; in other tools&amp;ndash;why the different command name?) prompts me for every
single hunk, to see if I really want to commit that hunk. The&amp;quot;-all&amp;quot; option records all hunks,
but why is this not the default? It&amp;rsquo;s all very well that I can pick and choose hunks, but why
isn&amp;rsquo;t by far the most frequent use case embodied in the default behaviour of the command? When I
run &amp;ldquo;darcs record&amp;rdquo; without &amp;ldquo;-all&amp;rdquo;, darcs presents me with a prompt that is impressive in its
opacity.&lt;/p&gt;</description></item><item><title>Two-dimensional spatial hashing with space-filling curves</title><link>https://www.serpentine.com/2007/01/11/two-dimensional-spatial-hashing-with-space-filling-curves/</link><pubDate>Thu, 11 Jan 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/01/11/two-dimensional-spatial-hashing-with-space-filling-curves/</guid><description>&lt;p&gt;The Hilbert curve is a fractal &lt;a href="http://en.wikipedia.org/wiki/Space-filling_curve"&gt;space-filling
curve&lt;/a&gt; that is rather pretty to look at.
[!&lt;a href="https://web.archive.org/web/20070717200850/http://www.serpentine.com/wordpress/wp-content/uploads/2007/01/hilbert.png"&gt;hilbert.png&lt;/a&gt;](&lt;a href="http://mathworld.wolfram.com/HilbertCurve.html"&gt;http://mathworld.wolfram.com/HilbertCurve.html&lt;/a&gt;)
A Hilbert curve of order &lt;em&gt;n&lt;/em&gt; traces a single path over a square of side 2^&lt;em&gt;n&lt;/em&gt; units, as you can
see in the images from MathWorld above (with curves of order 2 through 6). If you pick a point
&lt;em&gt;p&lt;/em&gt; from within the square covered by a curve, and trace out the curve until you reach that
point, the number of intermediate points that you passed through along your way to &lt;em&gt;p&lt;/em&gt; is called
the Hilbert distance. The notion of distance along a space-filling curve is useful for a few
reasons.&lt;/p&gt;</description></item><item><title>Haskell: bootstrapping into a clue about monads</title><link>https://www.serpentine.com/2007/01/09/haskell-bootstrapping-into-a-clue-about-monads/</link><pubDate>Tue, 09 Jan 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/01/09/haskell-bootstrapping-into-a-clue-about-monads/</guid><description>&lt;p&gt;As part of my remedial Haskell learning process, I&amp;rsquo;ve been getting my feet wet once more with
monads. Here are a few notes on the techniques that I&amp;rsquo;ve tried, and how I&amp;rsquo;ve fared with them.
Not surprisingly, my first step was to try reading some tutorials. If you&amp;rsquo;ve looked, you may
have noticed that the web is awash with monad tutorials. There&amp;rsquo;s something about monads that
seems to compel people to write tutorials about them. They sound scary: what&amp;rsquo;s this chunk of
category theory doing in my language soup? After a few nights of reading, but absorbing little,
I concluded that this was getting me nowhere. I&amp;rsquo;m happy to concede that this was in large part
my fault; I prefer taking things apart to reading about how they&amp;rsquo;re put together; and I have two
little kids, so my attention is perforce limited to brief spans, right before bed. But I suspect
that Sturgeon&amp;rsquo;s Revelation may have had more than a little to do with my indifferent level of
enlightenment. My reaction was to abandon the tutorials, and start reading the source code of
the Haskell prelude (the chunk of standard library that&amp;rsquo;s always available without you having to
explicitly pull it in). To my delight, I found that the &lt;a href="http://www.nomaware.com/monads/html/maybemonad.html"&gt;Maybe
type&lt;/a&gt; was a monad; even better, it looked
like it might be easy to use. Armed with a text editor and a Haskell interpreter, I wrote a
simple parser and interpreter for a pattern language, and used the Maybe monad to represent the
results of both parsing and matching. (In case you&amp;rsquo;re interested, I reimplemented the Unix
&lt;a href="http://www.opengroup.org/onlinepubs/000095399/functions/fnmatch.html"&gt;fnmatch library call&lt;/a&gt;.
It&amp;rsquo;s a nice, tidy problem that doesn&amp;rsquo;t require a full regexp engine to solve, and that provides
a bit of useful functionality that&amp;rsquo;s not available through any standard Haskell library.) While
I was doing this, I deliberately &lt;a href="http://syntaxfree.wordpress.com/2006/12/12/do-notation-considered-harmful/"&gt;avoided Haskell&amp;rsquo;s &amp;ldquo;do&amp;rdquo;
syntax&lt;/a&gt;, the better
to give me an idea of what was really happening. And rather than try to follow the rickety
exposition of a tutorial, I simply made lots of elementary mistakes. Each infinite loop and type
error was my own shining beacon of stupid, lighting a step on the random walk towards slightly
less stupid. At the end of a few hours of hacking, I had a nifty little piece of code going,
complete with uses of the three monad functions. I was satisfied that I at least had some notion
of the use of the Maybe monad, albeit in splendid isolation. This turned out to be an especially
good place to start, because the Maybe datatype is incredibly simple, as are the monad functions
defined on it. Once I was happy with the Maybe monad, I decided to try the &lt;a href="http://www.nomaware.com/monads/html/statemonad.html"&gt;State
monad&lt;/a&gt;. My programming vehicle this time
was much simpler than fnmatch; I just decided to count repeated instances of an item in a tree.
This turned out to be a lucky choice, because I found State much harder to grasp than Maybe.
(Perhaps this was because I was coming from the direction of reading the source code in a vacuum
and trying to decide how to put the pieces together. I won&amp;rsquo;t be surprised if the &amp;ldquo;read the
source&amp;rdquo; approach fails me at some point, but so far, so good.) This was an endeavour where
Haskell&amp;rsquo;s brevity and type system really shone for me. Even though I had little initial idea of
what I was doing, I was able to run my initial State-using code through the interpreter, have it
point out something egregious that I was misunderstanding, and iteratively refine (I mean &amp;ldquo;rip
to shreds and rewrite&amp;rdquo;) my code until I got it to actually work, all the while referring to the
source for the State monad so that I could find functions like evalState, get, and put. The
brevity of Haskell helped me here because the State monad is tiny; even though it&amp;rsquo;s much more
complex than the Maybe monad, it&amp;rsquo;s still small enough that the source fits in a single editor
window. And the type system was valuable not only because the interpreter could spank me
whenever I was being dull-witted, but because I could read the type signatures of functions and
actions around the State monad that I thought I might need, and tell whether they had a chance
of doing what I wanted. Once I had a basic grasp of the Maybe and State monads, I found that
going back and rereading the same tutorials that had initially baffled me had a profoundly
different result. I now had a framework in which I could think usefully about what the tutorial
authors were trying to tell me. (I also have stronger opinions as to which of the tutorials and
references are best, but I&amp;rsquo;ll save those for another time.) After a few days of tinkering with
them, monads are looking decidedly less scary to me. We&amp;rsquo;ll see if I&amp;rsquo;m still saying that after
spending a little time with StateT and a few stacked monads, but getting my hands dirty has
given me a degree of understanding that I could not have matched with reading. If monads still
give you palpitations, I urge you to dive in, create a silly contrived problem for yourself, and
just wallow with Maybe for a while.&lt;/p&gt;</description></item><item><title>Getting started with installing third-party Haskell packages</title><link>https://www.serpentine.com/2007/01/05/getting-started-with-installing-third-party-haskell-packages/</link><pubDate>Sat, 06 Jan 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/01/05/getting-started-with-installing-third-party-haskell-packages/</guid><description>&lt;p&gt;Since I&amp;rsquo;ve been away from the Haskell world for a long time, it&amp;rsquo;s been interesting to return and
observe some surprises about the practical side of working with the language. For me, an early
gotcha has been the relative paucity of information on how to obtain and install third-party
software packages. So here&amp;rsquo;s my little contribution, in the form of simple instructions for the
newcomer. I hope that someone will find them useful. If you&amp;rsquo;re using Debian, you&amp;rsquo;re in great
shape; there&amp;rsquo;s a good chance that whatever third-party package you&amp;rsquo;re interested in is already
available. Whatever the Haskell package is named, if there&amp;rsquo;s a corresponding Debian package, it
will ave a lowercase name. So here&amp;rsquo;s how use the regular package management tools to see if, for
example, the indispensable &lt;a href="https://web.archive.org/web/20080516232359/http://software.complete.org/missingh"&gt;MissingH&lt;/a&gt; is available:&lt;/p&gt;</description></item><item><title>Dealing with yum hangs on FC6</title><link>https://www.serpentine.com/2007/01/04/dealing-with-yum-hangs-on-fc6/</link><pubDate>Fri, 05 Jan 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/01/04/dealing-with-yum-hangs-on-fc6/</guid><description>&lt;p&gt;One of the exciting things about upgrading to Fedora Core 6 is that the yum package manager now frequently hangs on me. This does not fill me with joy. The most common way in which it falls over is by hanging hard after printing this message:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Parsing package install arguments What it means to &amp;ldquo;hang hard&amp;rdquo; here is that you can&amp;rsquo;t interrupt it using control-C, or by killing it with a normal, neighbourly signal like SIGINT or SIGTERM. A little bit of digging in another terminal window indicates why:&lt;/p&gt;</description></item><item><title>Of bureaucracy and second-guessing</title><link>https://www.serpentine.com/2007/01/03/of-bureaucracy-and-second-guessing/</link><pubDate>Wed, 03 Jan 2007 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2007/01/03/of-bureaucracy-and-second-guessing/</guid><description>&lt;p&gt;Carol Lloyd at the Chron wrote a &lt;a href="https://web.archive.org/web/20070102170442/http://www.sfgate.com/cgi-bin/article.cgi?f=/g/a/2006/12/29/carollloyd.DTL"&gt;second article&lt;/a&gt; about our fun with green building in San Francisco recently, which elicited a &lt;a href="http://www.socketsite.com/archives/2006/12/just_quotes_permit_hell_in_san_francisco.html"&gt;mention&lt;/a&gt; at SocketSite. The peanut gallery had a variety of comments, which I&amp;rsquo;ll quickly address here. Someone noticed that our planning drawings were sent back to an &amp;ldquo;earlier&amp;rdquo; desk in the review process because they differed from the original drawings we submitted. What happened was that the plans accumulated a number of small changes as they went from desk to desk in the City&amp;rsquo;s planning departments; this is almost inevitable if you&amp;rsquo;re not going by the numbers with a standard construction plan. The accumulated changes prompted one of the reviewers to send our plans back to make sure they were still conformant. It&amp;rsquo;s not a big deal, though the added delay is unwelcome. Another commenter:&lt;/p&gt;</description></item><item><title>Give a man a fire, he’ll be warm for a day</title><link>https://www.serpentine.com/2007/01/02/give-a-man-a-fire-hell-be-warm-for-a-day/</link><pubDate>Tue, 02 Jan 2007 18:11:01 +0000</pubDate><guid>https://www.serpentine.com/2007/01/02/give-a-man-a-fire-hell-be-warm-for-a-day/</guid><description>&lt;p&gt;Set him on fire, and he&amp;rsquo;ll be warm for the rest of his life. [!&lt;a href="https://web.archive.org/web/20070801020203/http://video.google.com/ThumbnailServer2?app=vss&amp;amp;contentid=26aec204a60cb8bf&amp;amp;offsetms=5000&amp;amp;itag=w320&amp;amp;lang=en&amp;amp;sigh=y9UlnxfgDWxi1WOwQV3DHtnmCMM"&gt;Tickle Me Elmo on
fire&lt;/a&gt;](&lt;a href="https://web.archive.org/web/20100308130050/http://video.google.com:80/videoplay?docid=-4024457809967804989"&gt;https://web.archive.org/web/20100308130050/http://video.google.com:80/videoplay?docid=-4024457809967804989&lt;/a&gt;)
Tip of the hat to &lt;a href="https://web.archive.org/web/20050308094244/http://tildequinn.livejournal.com/"&gt;Quinn&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>The shock of the forgotten</title><link>https://www.serpentine.com/2007/01/01/the-shock-of-the-forgotten/</link><pubDate>Tue, 02 Jan 2007 07:58:42 +0000</pubDate><guid>https://www.serpentine.com/2007/01/01/the-shock-of-the-forgotten/</guid><description>&lt;p&gt;I&amp;rsquo;ve lately become interested in the &lt;a href="http://www.haskell.org/"&gt;Haskell&lt;/a&gt; programming language
again, after a long time (eleven years!) away from the fold. During the process of thrashing
about and trying to find my footing, I discovered a new module, named
&lt;a href="https://web.archive.org/web/20110310121052/http://www.cse.unsw.edu.au:80/~dons/fps.html"&gt;Data.ByteString&lt;/a&gt;, which makes dealing with strings
in Haskell both sane and impressively fast. So I started to read the code, and whoa! &lt;a href="https://web.archive.org/web/20091022064242/http://www.cse.unsw.edu.au/~dons/code/fps/Data/ByteString.hs"&gt;There&amp;rsquo;s my
name&lt;/a&gt;! Because it had been so long
since I&amp;rsquo;d done any Haskell programming, I&amp;rsquo;d almost completely forgotten about everything that I
had written, including
&lt;a href="https://hackage.haskell.org/package/packedstring"&gt;Data.PackedString&lt;/a&gt;
(a pale precursor of the stream-fusing beauty that is Data.ByteString). I wrote PackedString in
1994 (before Haskell acquired a half-decent module system), when I spent a summer interning for
&lt;a href="https://web.archive.org/web/20081211014305/http://research.microsoft.com:80/~simonpj/"&gt;Simon Peyton Jones&lt;/a&gt;. It was almost a physical shock to
see my name in a context that I had so thoroughly forgotten. I must have sat staring at the
screen for a good 15 seconds, and even then I had to ask &lt;a href="https://donsbot.com/"&gt;Don
Stewart&lt;/a&gt;
on #haskell about the connection, beause I could just not figure it out (he pointed me at
Data.PackedString). I don&amp;rsquo;t know whether to be more amused by seeing my name in a chunk of code
that&amp;rsquo;s far superior to my original or my own astonishment at seeing it there.&lt;/p&gt;</description></item><item><title>How to build safe, clean Python 2.5 RPMs for Fedora Core 6</title><link>https://www.serpentine.com/2006/12/22/how-to-build-safe-clean-python-25-rpms-for-fedora-core-6/</link><pubDate>Sat, 23 Dec 2006 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2006/12/22/how-to-build-safe-clean-python-25-rpms-for-fedora-core-6/</guid><description>&lt;p&gt;Since FC6 ships with Python 2.4, you&amp;rsquo;re a bit stuck if you want to play with the new features of Python 2.5. Here&amp;rsquo;s a quick and easy way to build and install a cleanly-packaged version of Python 2.5 for FC6. First, you must ensure that you have a sufficient development environment available. Fortunately, you can do this in one step. Note: this is the &lt;em&gt;only&lt;/em&gt; command you&amp;rsquo;ll need to run with root privileges until the time comes for you to install the Python RPM that you&amp;rsquo;ve built.&lt;/p&gt;</description></item><item><title>Sony Ericsson Z520a phone review</title><link>https://www.serpentine.com/2006/12/22/sony-ericsson-z520a-phone-review/</link><pubDate>Fri, 22 Dec 2006 20:05:25 +0000</pubDate><guid>https://www.serpentine.com/2006/12/22/sony-ericsson-z520a-phone-review/</guid><description>&lt;p&gt;I&amp;rsquo;ve had a Sony Ericsson Z520a phone for a little under a year now, and as it&amp;rsquo;s still widely
available through cellular carriers, I thought I&amp;rsquo;d write up my experiences with it. I&amp;rsquo;m writing
in part as a reaction to the weakness of phone review web sites, which tend to publish reviews
from people who&amp;rsquo;ve had their phones for somewhere between an hour and a month. The reviews thus
rarely shed any light on the medium- to long-term issues of using the phones they cover, instead
clustering around the same few obviously good or bad points that immediately come to light. Case
in point: &lt;a href="http://reviews.cnet.com/Sony_Ericsson_Z520a/4505-6454_7-31597365.html"&gt;CNET&amp;rsquo;s review of the
Z520a&lt;/a&gt;, which cites the
crummy picture quality, but doesn&amp;rsquo;t note much else, and gives the phone a &amp;ldquo;very good&amp;rdquo; rating.
First, a few positive observations. Call quality is generally decent, and I&amp;rsquo;ve had fewer
problems with dropout than with my previous phone. Battery life is impressive, at about five
days, and it hasn&amp;rsquo;t diminished noticeably over the year I&amp;rsquo;ve been using the phone. The phone&amp;rsquo;s
user interface is only indifferently responsive. It takes a perceptible fraction of a second to
respond to keypresses. The lag isn&amp;rsquo;t enough to be a serious problem; it&amp;rsquo;s more of a peeve. The
Z520a is a clamshell phone, and it&amp;rsquo;s surprisingly difficult to open with one hand. This is due
to two design flaws. The grooves in the fold of the phone are small enough to require both
precision and force to insert the inside of a thumb to start the opening process. Once you&amp;rsquo;ve
cracked the shell open, the mechanism is unsprung, and requires constant application of force to
open it fully. This makes the phones much more difficult to open than similar models from other
manufacturers, such as Motorola. What drives me absolutely crazy, though, are the side operation
buttons. Thanks to Sony Ericsson&amp;rsquo;s fine design, I take upwards of half a dozen photos of the
inside of my pocket every day. As if that weren&amp;rsquo;t insult enough, the volume control rocker
button can&amp;rsquo;t take the abuse of sitting in a pocket, and my &amp;ldquo;increase volume&amp;rdquo; button &lt;em&gt;no longer
works at all&lt;/em&gt;. I somehow managed to avoid fat-fingering the &amp;ldquo;decrease volume&amp;rdquo; side of the rocker
for about a month after this happened, but the inevitable eventually occurred, and my phone is
now stuck permanently at minimum talk volume. And the only way I can even monkey with the volume
is to use those buttons &lt;em&gt;during a call&lt;/em&gt; (they do nothing useful when the phone is in standby
mode); there&amp;rsquo;s no redundancy in the design, and I have to use up my miserly supply of minutes to
even try. I also have some sour words for AT&amp;amp;T&amp;rsquo;s mangling of the user interface. At every level
of menu hierarchy, the first option I&amp;rsquo;m presented with is to visit AT&amp;amp;T&amp;rsquo;s mobile web site to buy
ringtones, pictures (who the hell buys &lt;em&gt;pictures&lt;/em&gt; from their cellular provider?), and other
stuff I don&amp;rsquo;t want. And accidentally fat-fingering such a menu item means that I&amp;rsquo;m paying for
the data transfer involved. Bah. Really, though, all other opinions I have of the phone are
overshadowed by its fragility, the result of which is that I can no longer hear anything during
a call unless I&amp;rsquo;m in an empty, silent room. If it weren&amp;rsquo;t for the side controls, I&amp;rsquo;d actually
call it a reasonably decent phone, but it snatches defeat from the jaws of victory to get a
default score of &amp;ldquo;crap&amp;rdquo; instead.&lt;/p&gt;</description></item><item><title>Refilling a missed TLB entry, now with special sauce</title><link>https://www.serpentine.com/2006/12/22/refilling-a-missed-tlb-entry-now-with-special-sauce/</link><pubDate>Fri, 22 Dec 2006 17:53:45 +0000</pubDate><guid>https://www.serpentine.com/2006/12/22/refilling-a-missed-tlb-entry-now-with-special-sauce/</guid><description>&lt;p&gt;&lt;a href="http://www.goop.org/~jeremy/"&gt;Jeremy&lt;/a&gt; and &lt;a href="http://mulix.livejournal.com/"&gt;Muli&lt;/a&gt; remind me that
x86-class CPUs refill a missed TLB entry in hardware. That&amp;rsquo;s what I get for rambling at
midnight! On these CPUs, the hardware walks the page tables directly when a miss occurs. The
operating system still gets involved during context switches, to keep the page tables and TLB
consistent; and it also shoots down individual TLB entries when messing with memory mappings. In
my puny and lame defence, most RISC CPUs (you know, the ones that nobody uses any more) trap to
the operating system when a TLB miss occurs, and do the refilling in software. (A few, like
SPARC, have an auxiliary cache that&amp;rsquo;s bigger than the TLB, to speed up software reloads.) Jeremy
also asked if a TLB lookup and L1 cache lookup can happen in parallel. As he points out, they
can&amp;rsquo;t if the L1 cache contains physical addresses (which is called &lt;em&gt;physical indexing&lt;/em&gt;). L1
caches that are virtually indexed do show up, though, because they allow the TLB lookup to occur
in parallel with the L1 cache lookup. The machinery is more complicated due to the need to
account for a single physical address having multiple virtual addresses mapping to it. As far as
I know, only the HP PA and AMD Athlon, both of which are defunct, have virtually indexed caches.&lt;/p&gt;</description></item><item><title>The translation lookaside buffer</title><link>https://www.serpentine.com/2006/12/21/the-translation-lookaside-buffer/</link><pubDate>Fri, 22 Dec 2006 06:43:22 +0000</pubDate><guid>https://www.serpentine.com/2006/12/21/the-translation-lookaside-buffer/</guid><description>&lt;p&gt;In an earlier post, &lt;a href="https://www.serpentine.com/2006/12/17/make-linux-performance-analysis-easier-with-oprofile/"&gt;I briefly
discussed&lt;/a&gt;
the oprofile system profiler. I was going somewhere with that; here&amp;rsquo;s another step along the
path. Modern CPUs that use virtual memory have to be able to turn virtual addresses into
physical addresses efficiently. While a userspace process operates on virtual addresses,
accessing any part of the memory hierarchy requires physical addresses. This means that when
your CPU goes to touch even the first-level (L1) cache, it must do this virtual-to-physical
translation. The CPU does this efficiently using a tiny cache called the &lt;em&gt;translation lookaside
buffer&lt;/em&gt;, or TLB. Each entry in the TLB maps a virtual page to a physical page, where a page is a
range of consecutive addresses. A typical TLB has between 32 and 2048 entries, and a CPU will
have a hierarchy of TLBs to go along with its hierarchy of caches. For example, an AMD Opteron
has a 32-entry first-level TLB, and a 512-entry second-level TLB. (In fact, it has separate TLBs
for handling instruction and data addresses; these are called the &lt;em&gt;iTLB&lt;/em&gt; and &lt;em&gt;dTLB&lt;/em&gt;.) The number
of pages that a TLB can translate at once is called its &lt;em&gt;range&lt;/em&gt;. With a 4KB page size and 512
entries, a TLB has a range of 2MB. The 2MB doesn&amp;rsquo;t have to be contiguous; I just mean that such
a TLB can translate 2MB of virtual addresses to physical addresses at one time. If the CPU needs
to translate a virtual address that is not currently covered by a TLB entry, this is called a
&lt;em&gt;TLB miss&lt;/em&gt;. (If there &lt;em&gt;is&lt;/em&gt; an entry in the TLB, a successful lookup is called a &lt;em&gt;hit&lt;/em&gt;.) Because
TLB lookup time is critical to the performance of the CPU, the normal case (of lookups resulting
in hits) is handled entirely in hardware. In fact, a TLB lookup is performed in parallel with an
L1 cache lookup, so that both can be done in a single cycle. But when a TLB miss occurs, the
hardware throws up its hands and causes a &lt;em&gt;trap&lt;/em&gt;. This suspends normal execution of the CPU so
that the operating system can load a new value into the TLB entry where the miss occurred. The
component of the kernel that handles this step is called the &lt;em&gt;TLB miss handler&lt;/em&gt;, and it&amp;rsquo;s
critical to performance, too. Since PC-class systems running Linux always use a 4KB page size,
the reach of the TLB is tiny compared to the size of physical memory. For example, my desktop
system has 2GB of RAM, and 1024 TLB entries; this gives its TLB a reach of only 4MB, or 0.2% of
RAM. I&amp;rsquo;ll return to the subjects of TLB size, page size, and oprofile soon.&lt;/p&gt;</description></item><item><title>Scott Aaronson on computational complexity and the anthropic principle</title><link>https://www.serpentine.com/2006/12/21/scott-aaronson-on-computational-complexity-and-the-anthropic-principle/</link><pubDate>Thu, 21 Dec 2006 21:11:22 +0000</pubDate><guid>https://www.serpentine.com/2006/12/21/scott-aaronson-on-computational-complexity-and-the-anthropic-principle/</guid><description>&lt;p&gt;I just read some &lt;a href="http://www.scottaaronson.com/talks/anthropic.html"&gt;notes from an entertaining
talk&lt;/a&gt; (one that&amp;rsquo;s surprisignly accessible,
even if you&amp;rsquo;re neither a computer scientist nor a string theorist) that &lt;a href="http://www.scottaaronson.com/"&gt;Scott
Aaronson&lt;/a&gt; recently gave at Stanford, and came across this gem:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;But what could NP-hardness possibly have to do with the Anthropic Principle? Well, when I
talked before about computational complexity, I forgot to tell you that there&amp;rsquo;s at least &lt;em&gt;one&lt;/em&gt;
foolproof way to solve NP-complete problems in polynomial time. The method is this: first
guess a solution at random, say by measuring electron spins. Then, if the solution is wrong,
kill yourself! If you accept the many-worlds interpretation of quantum mechanics, then there&amp;rsquo;s
certainly &lt;em&gt;some&lt;/em&gt; branch of the wavefunction where you guessed right, and that&amp;rsquo;s the only
branch where you&amp;rsquo;re around to &lt;em&gt;ask&lt;/em&gt; whether you guessed right! It&amp;rsquo;s a wonder more people don&amp;rsquo;t
try this.&lt;/p&gt;</description></item><item><title>A foray into philosophical silliness</title><link>https://www.serpentine.com/2006/12/20/a-foray-into-philosophical-silliness/</link><pubDate>Thu, 21 Dec 2006 05:22:09 +0000</pubDate><guid>https://www.serpentine.com/2006/12/20/a-foray-into-philosophical-silliness/</guid><description>&lt;p&gt;Inspired by a discussion on a mailing list, I dug up a copy of Ian Stewart and Jack Cohen&amp;rsquo;s
&lt;a href="http://www.amazon.com/Figments-Reality-Evolution-Curious-Mind/dp/0521663830"&gt;&lt;em&gt;Figments of
Reality&lt;/em&gt;&lt;/a&gt;, to find
the definition of &lt;em&gt;the zombike&lt;/em&gt;.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;[…] We begin with a topic that has greatly excited many philosophers: along with Dennett, we
think it is a complete red herring. We mention it because you may well run into it, and deduce
from the awe in which it seems to be held in some quarters that it is a serious contribution
to the subject - which it is not. This is the concept of a
&amp;ldquo;&lt;a href="http://en.wikipedia.org/wiki/Philosophical_zombie"&gt;zombie&lt;/a&gt;&amp;rdquo;, which is &lt;em&gt;exactly like a human&lt;/em&gt;
&lt;em&gt;in every respect&lt;/em&gt; except that it is not conscious. Zombies are thought experiments, often
used to focus attention on the (alleged) ineffable quality of consciousness that is so
different from the physicochemical activities of material brains. imagine a zombie, the
argument goes. It functions just like a real human being, right down to the electrical
activity of its brain cells - but you &lt;em&gt;know&lt;/em&gt; it&amp;rsquo;s not conscious, because that&amp;rsquo;s how you
imagine it. Conclusion: consciousness is different from the physical activity of a material
brain. There are so many things wrong with this suggestion that it is hard to know where to
start. The main one is that it&amp;rsquo;s a cheat. It&amp;rsquo;s a Silly Question in disguise, one of the &amp;ldquo;but
what if you saw a ghost?&amp;rdquo; variety […] You might as well encourage people to imagine a
zombike, which is &lt;em&gt;exactly like a bicycle in every way&lt;/em&gt; except that it does not move when the
pedals are pushed. Oh, mystic miracle of ineffable immateriality, the source of motion in a
bicycle is not anything physical!&lt;/p&gt;</description></item><item><title>Upon being found by the kids</title><link>https://www.serpentine.com/2006/12/20/upon-being-found-by-the-kids/</link><pubDate>Wed, 20 Dec 2006 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2006/12/20/upon-being-found-by-the-kids/</guid><description>&lt;p&gt;&amp;ldquo;Uh oh. I&amp;rsquo;ve drawn the attention of the shetland pony riders of the apocalypse.&amp;rdquo;&lt;/p&gt;</description></item><item><title>Adventures in juvenile linguistics</title><link>https://www.serpentine.com/2006/12/19/adventures-in-juvenile-linguistics/</link><pubDate>Tue, 19 Dec 2006 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2006/12/19/adventures-in-juvenile-linguistics/</guid><description>&lt;p&gt;Inspired by &lt;a href="http://itre.cis.upenn.edu/~myl/languagelog/archives/003936.html"&gt;this Language Log
article&lt;/a&gt;, a few newly minted
words and fresh observations from home:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Indispensable kid&amp;rsquo;s verb of the year: to &amp;ldquo;attackle&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Superman&amp;rsquo;s alter ego is Clark Dent.&lt;/li&gt;
&lt;li&gt;The protagonist of the past summer&amp;rsquo;s flaccid offering from Pixar is &lt;a href="http://en.wikipedia.org/wiki/Lightning_McQueen"&gt;Lightning the
Queen&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Make Linux performance analysis easier with oprofile</title><link>https://www.serpentine.com/2006/12/17/make-linux-performance-analysis-easier-with-oprofile/</link><pubDate>Mon, 18 Dec 2006 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2006/12/17/make-linux-performance-analysis-easier-with-oprofile/</guid><description>&lt;p&gt;If you&amp;rsquo;ve had to do much performance tuning on a Linux system, you may have come across the
&lt;a href="http://oprofile.sourceforge.net/news/"&gt;oprofile&lt;/a&gt; system profiler. It may sound like a great
piece of software, but it&amp;rsquo;s got a name for being difficult to use. In this article, I&amp;rsquo;m going to
try to show that oprofile is decidedly non-scary, and is in fact quite easy to use. On most of
my development systems, I run Fedora Core 6. What I&amp;rsquo;m going to describe is tailored to that
environment, but shouldn&amp;rsquo;t be hard to adapt to other distributions. The following instructions
work just fine for me on 32-bit x86, 64-bit x86, and 64-bit PowerPC. On Fedora, installing
oprofile is simple:&lt;/p&gt;</description></item><item><title>Mathbin, a pastebin that renders mathematics using LaTeX</title><link>https://www.serpentine.com/2006/12/14/mathbin-a-pastebin-that-renders-mathematics-using-latex/</link><pubDate>Thu, 14 Dec 2006 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2006/12/14/mathbin-a-pastebin-that-renders-mathematics-using-latex/</guid><description>&lt;p&gt;If you use IRC to collaborate on a software project, chances are you&amp;rsquo;ve come across
&lt;a href="http://pastebin.com/"&gt;pastebin.com&lt;/a&gt;, a site where you can post snippets of code, program
output, patches, and the like, and then give out the URL of the snippet to other people in the
channel you&amp;rsquo;re working in. A similar site is &lt;a href="https://web.archive.org/web/20250330085011/http://paste.lisp.org/"&gt;paste.lisp.org&lt;/a&gt;, which
controls a network of bots that sit in IRC channels and announce newly pasted URLs for you.
These seemingly trivial services make it &lt;em&gt;vastly&lt;/em&gt; easier to do collaborative development and
debugging. I just ran across a &lt;a href="http://www.mathbin.net/"&gt;mathbin.net&lt;/a&gt;, a site that takes one
step closer to nerd heaven, by allowing you to write mathematical equations using LaTeX&amp;rsquo;s
notation; it then renders the mathematics as inline images, using LaTeX&amp;rsquo;s renderer. The results
are beautiful; here&amp;rsquo;s an example of the &lt;a href="http://mathworld.wolfram.com/AiryFunctions.html"&gt;Airy
function&lt;/a&gt; defined over real values.&lt;/p&gt;</description></item><item><title>The obsessionally perfect news story</title><link>https://www.serpentine.com/2006/12/12/the-obsessionally-perfect-news-story/</link><pubDate>Wed, 13 Dec 2006 04:35:39 +0000</pubDate><guid>https://www.serpentine.com/2006/12/12/the-obsessionally-perfect-news-story/</guid><description>&lt;p&gt;Local scientists, ancient reptiles, volcanic eruptions, and Antarctica! &lt;a href="https://web.archive.org/web/20070126001934/http://www.mercurynews.com:80/mld/mercurynews/news/breaking_news/16215340.htm"&gt;All in one
story&lt;/a&gt;! Really, this
article was written precisely and exactly for me. In brief, a paleontologist from Berkeley
(across the Bay from me) was involved in a spectacular find: an almost complete skeleton
(cartilage and all) of a juvenile &lt;a href="https://web.archive.org/web/20250926102940/https://www.plesiosaur.com/"&gt;plesiosaur&lt;/a&gt;, buried in 70 million
year old volcanic ash. The team found it on their second trip to &lt;a href="http://en.wikipedia.org/wiki/Vega_Island"&gt;Vega
Island&lt;/a&gt;, off the coast of the &lt;a href="http://en.wikipedia.org/wiki/Antarctic_Peninsula"&gt;Antarctic
Peninsula&lt;/a&gt;. Strangely, the coverage in the
Valley&amp;rsquo;s local paper, the Mercury News (linked above), is of better quality than the
corresponding &lt;a href="http://www.nature.com/news/2006/061211/full/061211-4.html"&gt;news article in
Nature&lt;/a&gt;. That doesn&amp;rsquo;t happen often.&lt;/p&gt;</description></item><item><title>Make Linux happy with a modern laptop’s CD/DVD drive</title><link>https://www.serpentine.com/2006/12/12/make-linux-happy-with-a-modern-laptops-cddvd-drive/</link><pubDate>Wed, 13 Dec 2006 00:39:37 +0000</pubDate><guid>https://www.serpentine.com/2006/12/12/make-linux-happy-with-a-modern-laptops-cddvd-drive/</guid><description>&lt;p&gt;If you&amp;rsquo;re using a fairly modern laptop with an Intel chipset, the chances are that it has an
Intel ICH7 I/O controller hub:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ lspci | grep -i ide
00:1f.2 IDE interface: Intel Corporation 82801GBM/GHM (ICH7 Family) Serial ATA Storage Controller IDE (rev 01) This usually means that your internal hard disk and CD-ROM/DVD drive (if you have one) are wired using Serial ATA (SATA), not the obsolete Parallel ATA standard. However, while the Linux SATA driver will happily take control of your hard disk, for some reason the older IDE driver will often capture the CD-ROM drive. You can tell by looking at
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;/dev/cdrom&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>Collaborative filtering made easy</title><link>https://www.serpentine.com/2006/12/12/collaborative-filtering-made-easy/</link><pubDate>Tue, 12 Dec 2006 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2006/12/12/collaborative-filtering-made-easy/</guid><description>&lt;p&gt;During a lunchtime conversation the other day, a coworker mentioned that he was hacking in his
spare time on an entry for the &lt;a href="http://www.netflixprize.com/"&gt;Netflix Prize&lt;/a&gt;. This got me to
thinking about collaborative filtering: why had I never seen a good description of how to do it?
I suspect that people who might ordinarily have a casual interest in the subject hear that there
are some statistics involved, whereupon they immediately freeze in the mathematical headlights,
and turn the conversation to something else, &lt;em&gt;anything&lt;/em&gt; else. In early 2005, a researcher named
&lt;a href="http://www.daniel-lemire.com/blog/"&gt;Daniel Lemire&lt;/a&gt; published, with Anna Maclachlan, a paper
with the jazzy title of &amp;ldquo;&lt;a href="http://www.daniel-lemire.com/fr/abstracts/SDM2005.html"&gt;Slope One Predictors for Online Rating-Based Collaborative
Filtering&lt;/a&gt;&amp;rdquo;. This is an important paper,
because it presents a family of &lt;em&gt;really simple&lt;/em&gt; collaborative filtering schemes. I mean &lt;em&gt;really&lt;/em&gt;
simple: there are &lt;em&gt;no&lt;/em&gt; statistics involved, just a little bit of linear algebra. Unfortunately,
because the Lemire/Maclachlan paper is aimed at an academic audience, it&amp;rsquo;s not trivial to tell
by merely reading it how simple the technique it presents is, so what follows is my attempt to
translate its ideas into my native language of Attention Deficit Programmerese. To make things
more concrete, I&amp;rsquo;m going to present an implementation in less than 40 lines of Python (and I&amp;rsquo;ll
try to explain any obscure bits of Python as I go). Cool, huh? Regardless of the underlying
implementation, collaborative filters tend to try to solve the same broad problem using much the
same data.&lt;/p&gt;</description></item><item><title>Book review: Doug Macdougall, “Frozen Earth”</title><link>https://www.serpentine.com/2006/12/06/book-review-doug-macdougall-frozen-earth/</link><pubDate>Wed, 06 Dec 2006 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2006/12/06/book-review-doug-macdougall-frozen-earth/</guid><description>&lt;p&gt;Some time ago, I read a &lt;a href="http://www.nature.com/nature/journal/v432/n7018/full/432673a.html"&gt;Nature
review&lt;/a&gt; (subscription
required) of Doug Macdougall&amp;rsquo;s &amp;ldquo;&lt;a href="http://www.ucpress.edu/books/pages/10091.html"&gt;Frozen Earth&lt;/a&gt;&amp;rdquo;.
As is the way of such things, after I ordered my copy, the book suffered several months of
neglect before I finally had a chance to pick it up. However, once I started reading it, I
quickly became engrossed, and polished it off in a matter of days. The book opens with a few
chapters on the history of scientific inquiry into climate change. This I consider its only weak
part: it follows a formula of the past decade in popular science writing, of sketching the
characters involved in the early study of the field. Many of the founders of the field that
Macdougall introduces, and the controversies in which they were involved, merit multiple volumes
of their own, and so the first few chapters are necessarily skeletal. I found these passages
interesting, but not satisfying. The world probably has enough thumbnail sketches of &lt;a href="http://en.wikipedia.org/wiki/Louis_Agassiz"&gt;Louis
Agassiz&lt;/a&gt; at this point. Once Macdougall leaves
behind the early historical narrative, the book kicks into intellectual high gear, and I found
the entire rest of the book to be superb. In discussing the &lt;a href="http://en.wikipedia.org/wiki/Missoula_Floods"&gt;Missoula
Floods&lt;/a&gt;, Macdougall touches on both the evidence
for catastrophic flooding and the lengthy controversy that Harlen Bretz&amp;rsquo;s identification of the
source of the &lt;a href="http://en.wikipedia.org/wiki/Channeled_scablands"&gt;Channeled Scablands&lt;/a&gt; engendered
in the American geological community. This chapter is notable for its discussion of both the
astounding physical evidence involved, the research that Bretz and subsequent generations of
scientists performed, and how scientific controversy works. Another notable feature of the book
is Macdougall&amp;rsquo;s discussion of the effects of climate on the development of the human species and
human culture, both during early human evolution and through the written records of the past few
millenia. Among the surprising topics he touches on is a study of paintings from the &lt;a href="http://en.wikipedia.org/wiki/Little_Ice_Age"&gt;Little Ice
Age&lt;/a&gt; (roughly the 13th through 19th centuries) in
which someone noted light levels and counted the number of times in which the sky was
represented as clear or overcast, as a proxy for weather conditions of the time. I appreciated
Macdougall&amp;rsquo;s discussion of the drawing together of data from a variety of sources to try to
portray a consistent and continuous picture of climate over time. Since so many of the signals
upon which paleoclimatologists rely are either faint, broken up, or distorted, they look for
correlations between as many sources of data as possible, and correct for numerous possible
errors as they go. Macdougall discusses many of the proxies used, such as isotopic stratigraphy
and measurements of many properties of ice cores; why some of the data are unreliable; and how
climate scientists identify and correct errors. Most importantly, Macdougall writes clearly and
engagingly throughout the book. He doesn&amp;rsquo;t shy away from complex topics, but he presents them
clearly; he limits his use of jargon, and he remembers to introduce a new term by telling the
reader what it means. Once I got over my dubious reaction to the first few chapters, I found the
bulk of &amp;ldquo;Frozen Earth&amp;rdquo; to be intellectually exhilarating and thoroughly enjoyable.&lt;/p&gt;</description></item><item><title>Every parent’s nightmare</title><link>https://www.serpentine.com/2006/12/04/every-parents-nightmare/</link><pubDate>Tue, 05 Dec 2006 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2006/12/04/every-parents-nightmare/</guid><description>&lt;p&gt;I was shocked to read this evening about a &lt;a href="https://web.archive.org/web/20120310070552/http://www.sfgate.com/cgi-bin/article.cgi?f=/c/a/2006/12/04/BAGR2MP9383.DTL"&gt;local family that became snowbound for
days&lt;/a&gt; in the mountains
of southern Oregon; three of the four family members were rescued this afternoon. (This has
apparently been big news around here, but I&amp;rsquo;m afraid I don&amp;rsquo;t follow the local news much.) The
husband, James Kim, left his wife and two small children to seek help, and hasn&amp;rsquo;t been seen in
over two days. It seems that there&amp;rsquo;s a good chance he&amp;rsquo;s still alive. The Kims own a store two
blocks from my house, and their kids are only a few months removed in age from my own. I hope
that James has found shelter and is sitting tight, waiting to be found. What an ordeal for them
all. Update, 2006/12/06: James&amp;rsquo;s body was found today. My condolences to his wife, children, and
friends.&lt;/p&gt;</description></item><item><title>Notes on migrating from Blosxom to WordPress, Fedora edition</title><link>https://www.serpentine.com/2006/12/01/notes-on-migrating-from-blosxom-to-wordpress-fedora-edition/</link><pubDate>Fri, 01 Dec 2006 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2006/12/01/notes-on-migrating-from-blosxom-to-wordpress-fedora-edition/</guid><description>&lt;p&gt;I&amp;rsquo;ve used &lt;a href="http://www.blosxom.com/"&gt;blosxom&lt;/a&gt; for a few years to manage my blog, and while I
appreciate its simplicity and &amp;ldquo;Unix nature&amp;rdquo;, it&amp;rsquo;s not actually very usable. It&amp;rsquo;s difficult to
extend; the code is impenetrable; and it&amp;rsquo;s been orphaned by its author, who has gone on to
&lt;a href="http://www.stikkit.com/"&gt;better things&lt;/a&gt;. For example, as I couldn&amp;rsquo;t find a simple automated way
to deal with the tide of comment spam I was receiving, I ended up disabling comments entirely.
Since I&amp;rsquo;d still like to be able to blog, and would prefer to host the service myself, the only
realistic-looking choice to migrate to was &lt;a href="http://www.wordpress.org/"&gt;WordPress&lt;/a&gt;. I&amp;rsquo;m feeling
nervous about the move, as WordPress is written in PHP, and PHP has a deserved notoriety for
security problems. Indeed, WordPress and its plugins have a history of security problems. But
the alternatives all appear less usable and less widely supported. After taking a deep breath, I
started the migration process yesterday. A nice benefit of running Fedora on my new server is
that I was able to install a prebuilt package from Extras, named &lt;code&gt;wordpress&lt;/code&gt;, and have the
necessary dependencies (PHP and MySQL) installed automatically for me. A quick glance through
the &lt;code&gt;README.fedora&lt;/code&gt; file that ships with the &lt;code&gt;wordpress&lt;/code&gt; package, and a few configuration
tweaks, and I was ready to get started. The first thing that I wanted to do was import my old
blog postings from blosxom. After trying other approaches for an hour or so, I wrote a small
Python script to generate an RSS 2.0 feed directly from the text files that blosxom reads. This
let me handle the obscure markup format I&amp;rsquo;d been using with blosxom. At this point, I hit the
first serious snag. No way could I get WordPress to successfully import my carefully crafted RSS
2.0 feed, no matter how I tried. I ended up reading the WordPress source, and found a bug in the
code that tries to print an informative error message when WordPress fails to import a file
successfully. It tries to print the value of the wrong variable, which is undefined, and so (PHP
trying to be helpful) prints an empty string:&lt;/p&gt;</description></item><item><title>Linux on the Dell XPS M1210</title><link>https://www.serpentine.com/2006/10/18/linux-on-the-dell-xps-m1210/</link><pubDate>Thu, 19 Oct 2006 02:43:42 +0000</pubDate><guid>https://www.serpentine.com/2006/10/18/linux-on-the-dell-xps-m1210/</guid><description>&lt;p&gt;Since 2003, I&amp;rsquo;d been using a Thinkpad X31 for much of my work; it was the best laptop I&amp;rsquo;d ever owned, and was really the only one I used heavily over a long period of time. It had an irresistible combination of small size, light weight, good performance (for its time), and excellent support from Linux. A few months ago, I dropped my formerly dependable workhorse on its head. It didn&amp;rsquo;t quite die, but it became increasingly erratic. It was clear that I&amp;rsquo;d jarred loose some power-related connection, because it would rarely survive a suspend-to-RAM long enough to actually resume. The last straw came when it ploughed an unexpected furrow in its root filesystem. Since I use &lt;a href="http://www.selenic.com/mercurial"&gt;distributed development tools&lt;/a&gt;, I lost maybe an hour of work in total, but I was now nervous. I couldn&amp;rsquo;t rely on it any longer. Since my &lt;a href="http://www.pathscale.com/"&gt;employers&lt;/a&gt; recently got &lt;a href="http://www.qlogic.com/"&gt;bought out&lt;/a&gt;, and our new corporate IT standards almost mandate the purchase of Dell hardware, I looked through Dell&amp;rsquo;s laptop line for a suitable replacement. In my ideal world, I&amp;rsquo;d have preferred a Thinkpad X60 to any Dell, but I wasn&amp;rsquo;t inclined to try to wrestle with the purchasing policies of an unfamiliar IT department so soon after a buyout. I wanted an ultraportable (i.e. small and light) dual-core system, but the closest approximation in Dell&amp;rsquo;s current product lineup is the XPS M1210. It&amp;rsquo;s too big and heavy to fit in the ultraportable category, but at 2kg (4.4lb), it will do fine. The system I ended up getting came packed with a surprise or two. It was outfitted with a GeForce Go 7400 GPU, which I had asked not to get. I had been hoping to use as many completely open device drivers as possible (the Linux drivers that NVIDIA provides are very fast, but proprietary), and I figured that the Intel 915 integrated graphics that were my other option would surely have better heat and power consumption characteristics. In spite of this preference, once the system arrived with the unexpected &amp;ldquo;bonus GPU&amp;rdquo;, I felt disinclined to kibitz with my IT department or Dell and go without a reliable laptop for an additional few weeks. I initially installed Fedora Core 5 on the laptop, as I&amp;rsquo;ve used Fedora for a long time, and like it. Although the install went without a hitch, I found that I could not suspend to memory or disk. Otherwise, the machine seemed to work well. The &lt;a href="http://ipw3945.sourceforge.net/"&gt;Intel 3945&lt;/a&gt; driver worked without a problem, although it has a clumsy installation mechanism and nobody has volunteered to package it for the &lt;a href="https://web.archive.org/web/20230401001933/http://rpm.livna.org/"&gt;livna&lt;/a&gt; package repository yet. Indeed, the 3945 seems to have several better characteristics than the &lt;a href="https://web.archive.org/web/20200923032434/http://madwifi.org/"&gt;Atheros&lt;/a&gt; wifi hardware I&amp;rsquo;d used in the X31 (and which is still used in more recent Thinkpad laptops). With the 3945, I can associate quickly and reliably to every wireless network I&amp;rsquo;ve tried, using &lt;a href="https://web.archive.org/web/20081104043225/http://www.gnome.org:80/projects/NetworkManager/"&gt;NetworkManager&lt;/a&gt;. The Atheros chip wouldn&amp;rsquo;t talk to encrypted wifi networks at all. Also, NetworkManager-on-Atheros took about 40 seconds to associate to unencrypted networks, and would drop an association every so often for no apparent reason. Ugh. Finally, the 3945 reports sane signal strengths, while Atheros seems to be measuring some other strange characteristic of a signal that never goes above 50%, even if you&amp;rsquo;re sitting two feet from an access point. From the perspective of wanting open drivers, neither wireless chipset is ideal. Much of the madwifi driver is proprietary, even though it lives in the kernel, while the 3945 requires both a binary firmware blob and a proprietary userspace daemon that enforces airwave regulation compliance. Out of curiosity, I installed the proprietary NVIDIA drivers, and whatever power and thermal management they perform improved my battery life from about five hours to over six. This impressed me. Unfortunately, there was little I could do about the lack of suspend support in FC5. At least part of the problem is that stock kernels don&amp;rsquo;t power-manage the Intel SATA controller, so it is guaranteed to die during suspend or resume. Just as I was rolling up my sleeves to install a custom patched kernel and debug it, I noticed that recent Fedora rawhide (testing) kernels incorporate exactly the patch I needed. I upgraded to Fedora Core 6 test 1 without a hitch, using yum; installed a rawhide kernel; rebooted; and I could suspend, both to RAM and to disk! And all without having to do any &amp;ldquo;real work&amp;rdquo;. The only downside to the upgrade has been that NVIDIA hasn&amp;rsquo;t updated its proprietary drivers to handle the newest X.org ABI or kernel build infrastructure, so they don&amp;rsquo;t work with fc6t1; another good reason to prefer not to use proprietary drivers. For now, at least, I&amp;rsquo;m back to running the open nv driver for graphics. I can&amp;rsquo;t discern a speed difference for the kind of stuff I do (lots of terminals, Emacs, and Firefox), and it&amp;rsquo;s nice to be running with a free driver, but I miss that extra 20% of battery life. Anyway, after all that blather, what are the actual specs of the machine?&lt;/p&gt;</description></item><item><title>Climbing in Bishop</title><link>https://www.serpentine.com/2006/10/18/climbing-in-bishop/</link><pubDate>Thu, 19 Oct 2006 02:38:37 +0000</pubDate><guid>https://www.serpentine.com/2006/10/18/climbing-in-bishop/</guid><description>&lt;p&gt;Having not set hand or foot on an honest-to-god rock in well over a year, I was full of uncertainty last weekend as Tony and I left San Francisco, bound for four days of climbing near Bishop. A few flurries of snow in Tuolumne Meadows forced us to detour over Sonora Pass. Not having passed through that portion of the Sierra Nevada before, I was impressed by both the beauty of the scenery and the quantity of &lt;a href="http://www.sonorapassclimbing.com/"&gt;climbable alpine-style granite&lt;/a&gt; that seems to receive little traffic. On the steep descent towards Highway 395, we were surprised to see a number of groups of heavily-armed troops lining up for food in the few relatively flat areas off the sides of the road. Their presence lost its brief at lower altitude, when we drove past a US Marine winter warfare training camp. Even with the miles added by the diversion, we completed the drive in a respectable six and a half hours. Friday morning began with the long scramble down the blocky central gully into the Owens River Gorge. On my first visit as a neophyte climber, around seven years ago, I had found the descent intimidating. Subsequent experience has relegated it to &amp;ldquo;comparatively trivial&amp;rdquo; status in my mind, as it would require considerable creativity or astounding bad luck to kill oneself on the descent. The only feature that remains constant across the years is that the descent is guaranteed to turn the quadriceps of your ill-seasoned weekend warrior into a twitching rubbery mass. Starting the first day of a trip in such a state after a long furlough makes for unnecessary excitement, as events at the Great Wall of China quickly demonstrated. China Doll (5.8) is a typical Owens climb of &amp;ldquo;moderate difficulty&amp;rdquo;. What &amp;ldquo;moderate&amp;rdquo; means in Owens is that the climbing is at a low angle, the holds are mediocre, and traffic has polished everything you might prefer to trust to a slick, confidence-sapping sheen. After quivering through three bolts to the crux, I found my will to continue sapped, my arms pumped, and my ability to think clearly enshrouded in fog. I backed off, took a break while Tony led the route, and re-led it cleanly a few minutes later. The poor start didn&amp;rsquo;t cloud the rest of my day, though, as we spent the following five hours treating the Wall area as an almost empty gym. The snow over the Sierra must have kept a number of climbers at home, as I have never seen the Bishop area so empty of climbers. It was wonderful to have the run of every climb we wanted for three solid days. On the morning of day two, we took ourselves to &lt;a href="http://www.fishproducts.com/powerandrubber/buttermilk.html"&gt;the Buttermilks&lt;/a&gt;, the famous (among boulderers, anyway) granite boulders east of Bishop. My outdoor bouldering experience is minuscule, so I found the tiny features and harsh crystals of the Buttermilks absolutely overpowering. I thrashed through perhaps two easy problems during our visit. It&amp;rsquo;s a beautiful area, but not a good destination for the casual climber, I think. Much more to my taste were the &lt;a href="http://www.getbeta.com/location_climbing.asp?locID=5359"&gt;Happy Boulders&lt;/a&gt;, which we visited after lunch. The volcanic rock features many newbie-friendly problems where you can gain a bit of experience without feeling like you&amp;rsquo;re wearing down your fingertips on a coarse cheesegrater. Even here, I was stumped by mere V2-level problems, as my poor condition and lack of outdoor bouldering know-how conspired against me. This failed to dampen my enthusiasm, as I simply dropped back to overhung routes with huge holds. On the evening of the second day, we attended a fund-raising screening of the &lt;a href="http://www.reelrocktour.com/"&gt;Reel Rock Tour&lt;/a&gt;, a pair of climbing movies made by &lt;a href="https://web.archive.org/web/20081205060502/http://www.bigupproductions.com/"&gt;Josh Lowell&lt;/a&gt; (&amp;ldquo;Dosage IV&amp;rdquo;) and &lt;a href="http://www.senderfilms.com/"&gt;Peter Mortimer&lt;/a&gt; (&amp;ldquo;First Ascent&amp;rdquo;). Dosage was a moderately entertaining formula film (being the fourth in a now-annual series), featuring many of the &amp;ldquo;usual suspects&amp;rdquo; climbing hard routes. The only eye-opener (for me) was a sequence involving ridiculously talented teenagers free soloing hard routes over water on Thailand&amp;rsquo;s limestone pinnacle islands. Wow. Mortimer&amp;rsquo;s &amp;ldquo;First Ascent&amp;rdquo; was a much more personal movie, as Mortimer blatantly inserted himself into the narrative, making it a highly engaging and entertaining show. We returned to the Gorge on the third day, focusing on more difficult routes in the Pub Wall area. As my endurance is negligible, Tony led every route (taking some fine falls), and I did my game best to follow them without floundering too much. The highlights for me were Hammered (5.11b) and Hardly Wallbanger (5.10c), both of which feature steep climbing of stellar quality. For a small town, Bishop has surprisingly good food. I&amp;rsquo;ve long been a fan of &lt;a href="https://web.archive.org/web/20250908193146/http://www.erickschatsbakery.com/"&gt;Erick Schat&amp;rsquo;s BÃ¤kkery&lt;/a&gt; (one of the better bakeries I&amp;rsquo;ve ever visited) and the &lt;a href="http://www.whiskeycrk.com/"&gt;Whiskey Creek&lt;/a&gt; restaurant. Another of the great pleasures of visiting the Eastern Sierra is &lt;a href="http://www.trails.com/tcatalog_trail.asp?trailid=HGS271-066"&gt;Wild Willy&amp;rsquo;s hot spring&lt;/a&gt; next to Crowley Lake, where we had a good soak. The old trail has recently been replaced by a boardwalk to prevent damage to the surrounding salt flats, and it remains an incredibly pleasant place to spend a few hours on a chilly October evening. Had we conceived of the trip more than a few weeks in advance, I might have trained for it, and hence been able to climb at a more respectable level, but what a fantastic weekend it nevertheless was! My previously flagging enthusiasm for pulling plastic at the climbing gym has received a shot in the arm as I remember &lt;em&gt;why&lt;/em&gt; I do it. Right, back to daydreaming about when the next climbing trip might happen&amp;hellip;&lt;/p&gt;</description></item><item><title>What I did at the weekend</title><link>https://www.serpentine.com/2006/10/18/what-i-did-at-the-weekend/</link><pubDate>Thu, 19 Oct 2006 02:38:19 +0000</pubDate><guid>https://www.serpentine.com/2006/10/18/what-i-did-at-the-weekend/</guid><description>&lt;p&gt;I spent a few hours on Sunday putting together a web site for my friend &lt;a href="http://www.carolermoore.com/"&gt;Carole Moore&lt;/a&gt;, a talented San Francisco painter.&lt;/p&gt;
&lt;p&gt;This was my first time paying any attention to web design in &lt;em&gt;years&lt;/em&gt;. All of my prior knowledge dated back to HTML 3.2, circa middle-dot-com-boom. How pleasant it was to discover that I no longer need to use endless nested tables to create a decent-looking page layout! And that cascading style sheets are quite decent to work with. And, of course, I am relieved that my knowledge is no longer so embarrassingly rusty.&lt;/p&gt;</description></item><item><title>Restaurant mini-review: Dosa</title><link>https://www.serpentine.com/2006/10/03/restaurant-mini-review-dosa/</link><pubDate>Tue, 03 Oct 2006 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2006/10/03/restaurant-mini-review-dosa/</guid><description>&lt;p&gt;Among the line-up of trendy ethnic restaurants in San Francisco&amp;rsquo;s Mission district is Dosa, which has been open for about nine months.&lt;/p&gt;
&lt;p&gt;Dosa purports to offer up South Indian food, which only vaguely resembles the North Indian fare usually served at Indian restaurants. As Silicon Valley is bursting with excellent South Indian restaurants, but San Francisco was until now bereft of them, I was quite excited when Dosa opened, and wasted no time in paying it a visit.&lt;/p&gt;</description></item><item><title>The $10,000 laptop … almost</title><link>https://www.serpentine.com/2006/09/07/the-10000-laptop-almost/</link><pubDate>Thu, 07 Sep 2006 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2006/09/07/the-10000-laptop-almost/</guid><description>&lt;p&gt;I &lt;a href="https://web.archive.org/web/20201109010659/http://www.friday.com/bbum/2006/09/06/what-the-dell/"&gt;read in Bill Bumgarner&amp;rsquo;s blog&lt;/a&gt; that Dell has released a new model in its XPS line, the M2010. It&amp;rsquo;s not somethhing one could plausibly refer to as a laptop, due to its weight of 18.3lbs (8.3kg!) and 20&amp;quot; screen.&lt;/p&gt;
&lt;p&gt;Being a curious sort, and owning the M2010&amp;rsquo;s tiny cousin, the M1210 (the weight of which is a feathery 23% that of the M2010), I visited Dell&amp;rsquo;s web site to try to configure a system and see what it would cost.&lt;/p&gt;</description></item><item><title>OSCON 2006: Come see me talk</title><link>https://www.serpentine.com/2006/07/24/oscon-2006-come-see-me-talk/</link><pubDate>Mon, 24 Jul 2006 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2006/07/24/oscon-2006-come-see-me-talk/</guid><description>&lt;p&gt;I&amp;rsquo;m giving a talk at OSCON in Portland this week; the title is &amp;ldquo;Painless maintenance of local changes to fast-moving software&amp;rdquo;. The content is about how managing and developing patches with Mercurial Queues will make you a happier person and straighten your teeth while you sleep, all for free.&lt;/p&gt;
&lt;p&gt;The talk is in room F150, on Wednesday, July 26, at 2:35pm. It&amp;rsquo;ll be a lot of fun.&lt;/p&gt;</description></item><item><title>Been a busy month</title><link>https://www.serpentine.com/2006/07/15/been-a-busy-month/</link><pubDate>Sun, 16 Jul 2006 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2006/07/15/been-a-busy-month/</guid><description>&lt;p&gt;Couple my usual reluctance to post here with work on a new all-consuming project, and you have a recipe for potentially long periods of silence.&lt;/p&gt;
&lt;p&gt;Yesterday, I posted an announcement of the availability of the first chapter of the Mercurial manual to the mailing list. You can &lt;a href="https://web.archive.org/web/20081201224827/http://www.red-bean.com/~bos/hgbook.pdf"&gt;read the first chapter here&lt;/a&gt; (PDF only thus far); it documents Mercurial Queues, which I&amp;rsquo;ve enthused about at length in front of several audiences recently.&lt;/p&gt;</description></item><item><title>LaTex vs DocBook</title><link>https://www.serpentine.com/2006/06/20/latex-vs-docbook/</link><pubDate>Tue, 20 Jun 2006 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2006/06/20/latex-vs-docbook/</guid><description>&lt;p&gt;I&amp;rsquo;m about to embark on a documentation project, and I&amp;rsquo;ve been thinking quite a bit about the tools I&amp;rsquo;d ideally like to use for the job.&lt;/p&gt;
&lt;p&gt;Previously, when I&amp;rsquo;ve done a lot of writing, it&amp;rsquo;s been with &lt;a href="http://www.latex-project.org/"&gt;LaTeX&lt;/a&gt;, or on rare, painful, occasion with a word processor or dedicated tech pubs tool like FrameMaker.&lt;/p&gt;
&lt;p&gt;What I like about using a text-based markup language is the ability to use normal revision control tools to see the evolution of what I&amp;rsquo;ve been doing. Ignoring any issues surrounding whether word processors are more or less appropriate than feeding text markup into a compiler, trying to use revision control tools with opaque word processor files is pointless, as I get no information more useful than a blob; trying to use the internal change-tracking features of word processors is worse.&lt;/p&gt;</description></item><item><title>The joint Mercurial / Bazaar-NG sprint: aftermath</title><link>https://www.serpentine.com/2006/06/12/the-joint-mercurial-bazaar-ng-sprint-aftermath/</link><pubDate>Tue, 13 Jun 2006 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2006/06/12/the-joint-mercurial-bazaar-ng-sprint-aftermath/</guid><description>&lt;p&gt;The weekend in London, now almost a week past, was sufficiently intense that I didn&amp;rsquo;t have the energy to write it up as I went along, or indeed to write much of anything about it until now.&lt;/p&gt;
&lt;p&gt;Of course we didn&amp;rsquo;t come to any conclusions about one project subsuming the other, but we did gain a better understanding of where our respective projects stand relative to each other.&lt;/p&gt;
&lt;p&gt;The sprint lasted three days. We spent much of the first day talking about how we got to where we are; how did people get interested in revision control, why and how they started contributing to their respective projects, and so on. The second day involved more discussions of details, while thinking in terms of how we could do things that benefited each project individually while assisting both. A few prospects, for example, were a common format for exporting metadata to the likes of GUIs, and a common plugin framework. The third day was much less structured; we showed off interesting bits of functionality, hacked a little, and talked about whatever topics were interesting at the time.&lt;/p&gt;</description></item><item><title>Baypiggies talk, tomorrow, June 8</title><link>https://www.serpentine.com/2006/06/07/baypiggies-talk-tomorrow-june-8/</link><pubDate>Thu, 08 Jun 2006 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2006/06/07/baypiggies-talk-tomorrow-june-8/</guid><description>&lt;p&gt;I&amp;rsquo;m giving a talk on Mercurial at &lt;a href="http://www.baypiggies.net/"&gt;Baypiggies&lt;/a&gt;, the San Francisco Bay Area Python user&amp;rsquo;s group, tomorrow evening at 7:30pm.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re a local Mercurial user and we haven&amp;rsquo;t met, please feel free to come along. If you don&amp;rsquo;t use Mercurial, you&amp;rsquo;re welcome to attend and see what it&amp;rsquo;s all about.&lt;/p&gt;</description></item><item><title>Joint Mercurial / Bazaar-NG sprint</title><link>https://www.serpentine.com/2006/06/01/joint-mercurial-bazaar-ng-sprint/</link><pubDate>Fri, 02 Jun 2006 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2006/06/01/joint-mercurial-bazaar-ng-sprint/</guid><description>&lt;p&gt;A few weeks ago, &lt;a href="http://www.markshuttleworth.com/"&gt;Mark Shuttleworth&lt;/a&gt; showed up on IRC, and invited several core developers from the &lt;a href="http://www.selenic.com/mercurial/"&gt;Mercurial&lt;/a&gt; and &lt;a href="https://web.archive.org/web/20090926235129/http://bazaar-vcs.org:80/?"&gt;Bazaar-NG&lt;/a&gt; to visit London, on &lt;a href="https://web.archive.org/web/20251115205321/https://canonical.com/"&gt;Canonical, Ltd&amp;rsquo;s&lt;/a&gt; shilling. The purpose of the joint visit is to discuss possible points of collaboration between the two projects.&lt;/p&gt;
&lt;p&gt;I got to come along as gadfly-in-chief, or filler-of-the-bug-database, or some such thing, but I am writing this entry from London, and the sprint will kick off tomorrow morning.&lt;/p&gt;
&lt;p&gt;Each project is already actively snarfing code from the other. For example, Alexander Schremmer&amp;rsquo;s lovely &lt;a href="https://web.archive.org/web/20070802140234/http://moin.pocoo.org:8080/hg-branchview-integration?cmd=branchview"&gt;branchview&lt;/a&gt; work lets you view the branch and merge history of a Mercurial repository, graphically, from within a regular web browser. It uses code from Bazarr-NG&amp;rsquo;s &lt;a href="https://web.archive.org/web/https://web.archive.org/web/20090926235129/http://bazaar-vcs.org:80/?bzrk"&gt;bzrk plugin&lt;/a&gt; to do the abstract graph rendering. On the other side, Goffredo Baroncelli has ported Mercurial&amp;rsquo;s built-in web server to &lt;a href="https://web.archive.org/web/20061127161717/http://bzr.phanatic.hu:80/browse/bazaar-hgweb"&gt;run on top of bzr&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Why I’ve been quiet for a while</title><link>https://www.serpentine.com/2006/01/06/why-ive-been-quiet-for-a-while/</link><pubDate>Sat, 07 Jan 2006 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2006/01/06/why-ive-been-quiet-for-a-while/</guid><description>&lt;p&gt;While it may appear that I gave up blogging over the nonsense a few months ago with Larry, in fact I&amp;rsquo;ve been otherwise occupied for over two months now.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;(This post originally included a photo of Baby R bundled in a blanket, but the
image is no longer available.)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;The fact that the above picture is the most recent I&amp;rsquo;ve had a chance to upload should speak volumes. While R is the most excellent baby ever (excepting his big brother), taking care of him has kept us &amp;hellip; busy. Couple his arrival with my indifferent attachment to blogging in the first place, and you have the perfect recipe for months of silence.&lt;/p&gt;</description></item><item><title>Mercurial: I am just going outside and may be some time</title><link>https://www.serpentine.com/2005/10/01/mercurial-i-am-just-going-outside-and-may-be-some-time/</link><pubDate>Sat, 01 Oct 2005 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2005/10/01/mercurial-i-am-just-going-outside-and-may-be-some-time/</guid><description>&lt;p&gt;Here follows the text of a message I posted to the Mercurial mailing list earlier today.&lt;/p&gt;
&lt;p&gt;As I mentioned the other day, I will not be contributing to Mercurial development for a while. Several people have asked me why.&lt;/p&gt;
&lt;p&gt;At my workplace, we use a commercial SCM tool called BitKeeper to manage a number of source trees. Last week, Larry McVoy (the CEO of BitMover, which produces BitKeeper) contacted my company&amp;rsquo;s management.&lt;/p&gt;</description></item><item><title>Announcing a Windows installer for Mercurial</title><link>https://www.serpentine.com/2005/09/21/announcing-a-windows-installer-for-mercurial/</link><pubDate>Wed, 21 Sep 2005 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2005/09/21/announcing-a-windows-installer-for-mercurial/</guid><description>&lt;p&gt;I am pleased to announce the availability of a standalone Windows version of Mercurial 0.7 (plus extra bits), packaged as a self-extracting installer.&lt;/p&gt;
&lt;p&gt;Benefits of this package:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No prerequisites!&lt;/strong&gt; You don&amp;rsquo;t need Python installed to use Mercurial any longer, because it&amp;rsquo;s a Windows executable. You can&amp;rsquo;t even tell that Mercurial is a Python application!&lt;/li&gt;
&lt;li&gt;Uses standard Windows installer/uninstaller wizards that everyone is familiar with.&lt;/li&gt;
&lt;li&gt;The download is just 2.5MB in size, but is fully featured.&lt;/li&gt;
&lt;li&gt;Comes with complete post-install configuration instructions.&lt;/li&gt;
&lt;li&gt;If your system uses NTFS filesystems, we use hardlinks to clone local repositories, saving time and disk space.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&amp;rsquo;s the download link: &lt;a href="https://mercurial-scm.org/install"&gt;https://mercurial-scm.org/install&lt;/a&gt;&lt;/p&gt;</description></item><item><title>tumgreyspf considered harmful</title><link>https://www.serpentine.com/2005/09/19/tumgreyspf-considered-harmful/</link><pubDate>Mon, 19 Sep 2005 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2005/09/19/tumgreyspf-considered-harmful/</guid><description>&lt;p&gt;A few months ago, I grew sufficiently tired of wading through the enormous quantities of spam I
was receiving (about a thousand junk emails per day) that I decided to experiment with a
technique called &lt;a href="http://www.greylisting.org/"&gt;greylisting&lt;/a&gt; to see if it would reduce the amount
of junk email I received.&lt;/p&gt;
&lt;p&gt;My first choice was a program called &lt;a href="http://isg.ee.ethz.ch/tools/postgrey/"&gt;postgrey&lt;/a&gt;, but when
I tried to install it, I realised that my mail server box was running a version of
&lt;a href="http://www.postfix.org/"&gt;Postfix&lt;/a&gt; that couldn&amp;rsquo;t work with postgrey.&lt;/p&gt;</description></item><item><title>On distributed revision control and project forking</title><link>https://www.serpentine.com/2005/09/16/on-distributed-revision-control-and-project-forking/</link><pubDate>Sat, 17 Sep 2005 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2005/09/16/on-distributed-revision-control-and-project-forking/</guid><description>&lt;p&gt;One of those myths about distributed revision control systems that has grown legs and acquired a heartbeat is that they make forking a project easier.&lt;/p&gt;
&lt;p&gt;To the uninitiated, a &amp;ldquo;fork&amp;rdquo; occurs when some contributors to a project get disgruntled and decide to take the code, make their own changes, and start a new project based on the existing one.&lt;/p&gt;
&lt;p&gt;Forking is a fairly common occurrence. It happens every few years to the BSD operating systems; it happened to GCC in the late 1990s; and it happened to Emacs almost fifteen years ago.&lt;/p&gt;</description></item><item><title>Mercurial Queues</title><link>https://www.serpentine.com/2005/09/08/mercurial-queues/</link><pubDate>Fri, 09 Sep 2005 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2005/09/08/mercurial-queues/</guid><description>&lt;p&gt;Chris Mason has been working on a very useful extension to Mercurial called Mercurial Queues, or
mq for short.&lt;/p&gt;
&lt;p&gt;It has languished in semi-obscurity for a while on SuSE&amp;rsquo;s ftp servers, so we&amp;rsquo;ve &lt;a href="https://web.archive.org/web/20081006065303/http://hg.serpentine.com:80/mercurial/mq"&gt;made a
repository available&lt;/a&gt; for people to pull from directly.&lt;/p&gt;
&lt;p&gt;Several years ago, Andrew Morton published some scripts that he used to manage patches to the
Linux kernel. These got turned into a set of tools called
&lt;a href="http://savannah.nongnu.org/projects/quilt"&gt;quilt&lt;/a&gt;. The quilt tools are popular among developers
who need to maintain a set of changes to a changing source tree over a long period of time,
without integrating those changes into the main source tree.&lt;/p&gt;</description></item><item><title>Coworking in San Francisco</title><link>https://www.serpentine.com/2005/09/08/coworking-in-san-francisco/</link><pubDate>Thu, 08 Sep 2005 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2005/09/08/coworking-in-san-francisco/</guid><description>&lt;p&gt;I had a chance encounter with &lt;a href="http://www.codinginparadise.org/"&gt;Brad Neuberg&lt;/a&gt; today, who is trying to get a part-time &lt;a href="http://codinginparadise.org/coworking/coworking.html"&gt;coworking arrangement&lt;/a&gt; off the ground. The idea is that if you do one of those nebulous &amp;ldquo;new economy&amp;rdquo; jobs that involves dinking on a laptop in a coffee shop for endless hours, it can be a welcome relief to impose a bit of structure on work sometimes.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve talked to several people before who found the idea appealing, but Brad has gone a step farther and found a space, made arrangements to occupy it two days a week, and started recruiting people to try to make it work.&lt;/p&gt;</description></item><item><title>Slides from distributed SCM talk at Foo Camp 2005 available</title><link>https://www.serpentine.com/2005/08/24/slides-from-distributed-scm-talk-at-foo-camp-2005-available/</link><pubDate>Thu, 25 Aug 2005 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2005/08/24/slides-from-distributed-scm-talk-at-foo-camp-2005-available/</guid><description>&lt;p&gt;I gave a talk on distributed SCMs at Foo Camp last weekend. The slides were
originally posted as a PDF, but the file has since disappeared. The talk was an
overview of the current state of the Free Software distributed SCM world; I
didn&amp;rsquo;t concentrate on any one system.&lt;/p&gt;
&lt;p&gt;The talk was surprisngly (to me) well attended, particularly given its fairly obscure topic and the competition from many other insanely entertaining sessions scheduled at the same time. Most of the audience were CVS or Subversion users, although Bram Cohen (who hacks on Codeville) and an SVK developer whose name I do not recall were there, too.&lt;/p&gt;</description></item><item><title>On distributed and centralised revision control</title><link>https://www.serpentine.com/2005/08/10/on-distributed-and-centralised-revision-control/</link><pubDate>Thu, 11 Aug 2005 01:22:17 +0000</pubDate><guid>https://www.serpentine.com/2005/08/10/on-distributed-and-centralised-revision-control/</guid><description>&lt;p&gt;Ian Bicking has written two thoughtful articles on distributed and centralised revision control systems (&lt;a href="https://web.archive.org/web/20131004054639/http://blog.ianbicking.org/distributed-vs-centralized-scm.html"&gt;the first&lt;/a&gt;, &lt;a href="https://web.archive.org/web/20131004032247/http://blog.ianbicking.org/centralized-vs-decentralized.html"&gt;the second&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;His original thesis was one that he shared with Greg Hudson, one of the Subversion developers: for free software, distributed SCM bad, centralised good. He had four main points, which I have reduced to three:&lt;/p&gt;
&lt;p&gt;0 Work ought to be visible to other developers, and easy to find. 0 It should be easy to understand the changes made. 0 It ought to be simple to integrate changes.&lt;/p&gt;</description></item><item><title>More about Subversion</title><link>https://www.serpentine.com/2005/08/10/more-about-subversion/</link><pubDate>Thu, 11 Aug 2005 00:15:31 +0000</pubDate><guid>https://www.serpentine.com/2005/08/10/more-about-subversion/</guid><description>&lt;p&gt;[I originally posted this about two weeks ago, but something caused it to disappear. Here&amp;rsquo;s a
lightly edited repost.]&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.red-bean.com/kfogel/"&gt;Karl Fogel&lt;/a&gt; posted a comment on my &lt;a href="https://www.serpentine.com/2005/06/25/i-have-seen-the-future-of-free-distributed-revision-control-systems/"&gt;future of free distributed
SCM systems&lt;/a&gt;
entry, asking for some more detail on what it is
that I don&amp;rsquo;t like about Subversion.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s a tall order. Since Karl is one of the primary authors of Subversion, I can&amp;rsquo;t just go
making wild scattershot accusations. Well, I suppose I could, and I did, in that earlier
posting. But now for some actual information, or at least opinions posing in that form.&lt;/p&gt;</description></item><item><title>Automatic merging, or how to spend all of your sanity on one problem</title><link>https://www.serpentine.com/2005/08/10/automatic-merging-or-how-to-spend-all-of-your-sanity-on-one-problem/</link><pubDate>Wed, 10 Aug 2005 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2005/08/10/automatic-merging-or-how-to-spend-all-of-your-sanity-on-one-problem/</guid><description>&lt;p&gt;Zooko has written a clever &lt;a href="http://zooko.com/darcs_demystified.html"&gt;article comparing Darcs&amp;rsquo;s merge strategy with Subversion&amp;rsquo;s&lt;/a&gt;. The essence of the article is a case where two edits to the same file in different branches cause Subversion to automatically do a merge that introduces a bug, while Darcs gets the merge right.&lt;/p&gt;
&lt;p&gt;Out of curiosity, I tried Zooko&amp;rsquo;s test case with BitKeeper and Mercurial. BK got the merge right (as I expected), while Mercurial punted and dropped me into a manual merge tool.&lt;/p&gt;</description></item><item><title>The legacy of BitKeeper</title><link>https://www.serpentine.com/2005/08/06/the-legacy-of-bitkeeper/</link><pubDate>Sat, 06 Aug 2005 15:00:00 +0000</pubDate><guid>https://www.serpentine.com/2005/08/06/the-legacy-of-bitkeeper/</guid><description>&lt;p&gt;It has now been a month since BitMover withdrew BitKeeper from use by people who didn&amp;rsquo;t have paid licenses. Ian Bicking has written a &lt;a href="https://web.archive.org/web/20131004054639/http://blog.ianbicking.org/distributed-vs-centralized-scm.html"&gt;blog entry&lt;/a&gt; on the evils of distributed revision control, so this seems a good time to talk about the legacy of BitKeeper.&lt;/p&gt;
&lt;p&gt;Early during the use of BK for Linux kernel development, Greg Hudson wrote a polemic entitled &lt;a href="http://web.mit.edu/ghudson/thoughts/bitkeeper.whynot"&gt;Why BitKeeper Isn&amp;rsquo;t Right For Free Software&lt;/a&gt;. He had two main points:&lt;/p&gt;</description></item><item><title>On moving, in a hurry</title><link>https://www.serpentine.com/2005/08/06/on-moving-in-a-hurry/</link><pubDate>Sat, 06 Aug 2005 09:26:42 +0000</pubDate><guid>https://www.serpentine.com/2005/08/06/on-moving-in-a-hurry/</guid><description>&lt;p&gt;One of our tenants is about to move out of her apartment in San Francisco. While we wait for the City to digest our plans to build a new house, we have two mortgages to pay; one on the house we live in, and one on the empty lot that, if pressed, maybe we could camp in.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not as satisfying as you might think to watch a lot of money fly out the door every month, especially as most of it is interest.&lt;/p&gt;</description></item><item><title>Where’s that damn backstory when you need it</title><link>https://www.serpentine.com/2005/07/23/wheres-that-damn-backstory-when-you-need-it/</link><pubDate>Sat, 23 Jul 2005 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2005/07/23/wheres-that-damn-backstory-when-you-need-it/</guid><description>&lt;p&gt;Overheard in San Francisco.&lt;/p&gt;
&lt;p&gt;-So what have you been doing?&lt;br&gt;
-I was in the Marines for five weeks.&lt;br&gt;
-&lt;em&gt;Five weeks&lt;/em&gt;? What happened?&lt;br&gt;
-Well, I&amp;rsquo;m not there now.&lt;/p&gt;</description></item><item><title>First impressions of FC4</title><link>https://www.serpentine.com/2005/07/11/first-impressions-of-fc4/</link><pubDate>Tue, 12 Jul 2005 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2005/07/11/first-impressions-of-fc4/</guid><description>&lt;p&gt;Since the last month has been quite thoroughly insane, I have only just gotten around to installing Fedora Core 4 on my desktop and laptop. So far, I have been quite impressed.&lt;/p&gt;
&lt;p&gt;GNOME didn&amp;rsquo;t keel over and die on me after the upgrade, though it briefly behaved in a peculiar manner on the laptop. I am so used to destroying all of my GNOME configuration data so it can get its knickers unwrapped after an upgrade that I was pleasantly surprised by this. How low my expectations have fallen!&lt;/p&gt;</description></item><item><title>Bye, Charlie</title><link>https://www.serpentine.com/2005/07/08/bye-charlie/</link><pubDate>Sat, 09 Jul 2005 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2005/07/08/bye-charlie/</guid><description>&lt;p&gt;Nine years ago. I break up with the first girlfriend I had after I moved to California. As Sunnyvale is a wretched place to live, particularly if you&amp;rsquo;re in your early twenties, newly single, and full of piss, I up and move to San Francisco. I teach myself to navigate by driving through the city in the night-time fog.&lt;/p&gt;
&lt;p&gt;For company, I acquire two kittens, the wide-eyed runts of a semi-feral litter. (To this day, Oedipus and Electra skitter and scramble whenever a human approaches, only deigning to approach when we&amp;rsquo;re sitting or lying down.)&lt;/p&gt;</description></item><item><title>Four months, and counting</title><link>https://www.serpentine.com/2005/07/08/four-months-and-counting/</link><pubDate>Fri, 08 Jul 2005 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2005/07/08/four-months-and-counting/</guid><description>&lt;p&gt;A snapshot of what it&amp;rsquo;s like with a &lt;a href="https://web.archive.org/web/https://web.archive.org/web/20060402212246/http://mamafu.org:80//blog/bedrest.html"&gt;wife on bed rest&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;Son ambles in at six thirty. &amp;ldquo;Let&amp;rsquo;s watch Spider-Man!&amp;rdquo; Decides my slothful motions are not indicative of Spider-Man watching; visits wife.&lt;br&gt;
Get up. Find son and wife curled up, asleep. Damn, that&amp;rsquo;s cute.&lt;br&gt;
Make breakfasts for family.&lt;br&gt;
Fuss over wife.&lt;br&gt;
Go upstairs and work, because it&amp;rsquo;s Bay Area rush hour; there&amp;rsquo;s no point in getting in the car.&lt;br&gt;
Ninety minutes later, decide that traffic flow could conceivably be bearable.&lt;br&gt;
Receive surprise quickie neck massage from Jamey, who&amp;rsquo;s visiting as company for Shannon. Give profuse thanks.&lt;br&gt;
Fuss over wife. Into car.&lt;br&gt;
Work like dog. Discover that someone else&amp;rsquo;s code I&amp;rsquo;m supposed to be &amp;ldquo;finishing off&amp;rdquo; is not only incomprehensible, but gets wrong answers that vary wildly on every. Single. Frigging. Run.&lt;br&gt;
Leave early. Now have to make dinner every day.&lt;br&gt;
Home after five. Fuss over wife. Stress causing sleep loss causing migraine. Poor unfortunate fucking woman, as if bed rest weren&amp;rsquo;t enough.&lt;br&gt;
Dinner on table before six, cleaned up by six fifteen. How did an indolent geek turn into this model of domestic efficiency?&lt;br&gt;
Take son grocery shopping. No, he can&amp;rsquo;t have the sugar bombs. No, the candy nukes are right out. No, nobody makes gooey silicone Spider-Man toys, as has been the case at each inquiry, every day of the past several months.&lt;br&gt;
Return home many dollars poorer, but with fresh cherries and plums. Joy! Plop son into bath.&lt;br&gt;
Put son to bed. Tell incoherent bedtime story involving Spider-Man and sundry maleficent cartoon characters.&lt;br&gt;
Fuss over wife.&lt;br&gt;
Put out recycling. Curse idiot who mixed plastic and paper, forcing messy sorting. Conclude that idiot was most probably self.&lt;br&gt;
Launder. Fold.&lt;br&gt;
Decide that perhaps a beer may be in order. It transpires that the Bud languishing at the back of the fridge passed away almost a year ago, unnoticed. Do the decent thing; flush the bugger down the sink.&lt;/p&gt;</description></item><item><title>Mercurial: “proper” ssh support added</title><link>https://www.serpentine.com/2005/07/06/mercurial-proper-ssh-support-added/</link><pubDate>Wed, 06 Jul 2005 15:28:05 +0000</pubDate><guid>https://www.serpentine.com/2005/07/06/mercurial-proper-ssh-support-added/</guid><description>&lt;p&gt;Until now, &lt;a href="https://www.mercurial-scm.org/"&gt;Mercurial&lt;/a&gt; only supported tunnelling over an
&lt;code&gt;ssh&lt;/code&gt; connection when &lt;code&gt;push&lt;/code&gt;ing changes to a remote repository. Matt just committed some changes
that lets &lt;em&gt;all&lt;/em&gt; commands that talk to other repositories work over &lt;code&gt;ssh&lt;/code&gt; tunnels.&lt;/p&gt;</description></item><item><title>Mercurial: “locate” command added</title><link>https://www.serpentine.com/2005/07/06/mercurial-locate-command-added/</link><pubDate>Wed, 06 Jul 2005 15:23:31 +0000</pubDate><guid>https://www.serpentine.com/2005/07/06/mercurial-locate-command-added/</guid><description>&lt;p&gt;I &lt;a href="http://www.selenic.com/pipermail/mercurial/2005-July/thread.html#2037"&gt;implemented a &lt;code&gt;locate&lt;/code&gt;
command&lt;/a&gt; that finds files
in a repository by pattern. Here&amp;rsquo;s a simple example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ hg locate '*.c' mercurial/bdiff.c mercurial/mpatch.c
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Mercurial snapshot builds for Fedora Core</title><link>https://www.serpentine.com/2005/07/05/mercurial-snapshot-builds-for-fedora-core/</link><pubDate>Tue, 05 Jul 2005 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2005/07/05/mercurial-snapshot-builds-for-fedora-core/</guid><description>&lt;p&gt;I have started doing regular automated builds of
&lt;a href="https://www.mercurial-scm.org/"&gt;Mercurial&lt;/a&gt;, and packaging up the results for Fedora Core 2
and 3. These builds are performed four times a day, and the results are available here.&lt;/p&gt;
&lt;p&gt;Due to the vagaries of my local setup, I have &lt;code&gt;i386&lt;/code&gt; packages available for FC2 and FC3, and
&lt;code&gt;x86_64&lt;/code&gt; for FC3 only.&lt;/p&gt;
&lt;p&gt;The easiest way to install them is using the &lt;a href="https://web.archive.org/web/20080918083526/http://www.linux.duke.edu:80/projects/yum/"&gt;yum package
manager&lt;/a&gt;. On FC2 systems, add the following to your
&lt;code&gt;/etc/yum.conf&lt;/code&gt; file. On FC3 systems, add it to a new file named
&lt;code&gt;/etc/yum.repos.d/mercurial.repo&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Mercurial: RSS feeds added</title><link>https://www.serpentine.com/2005/07/03/mercurial-rss-feeds-added/</link><pubDate>Sun, 03 Jul 2005 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2005/07/03/mercurial-rss-feeds-added/</guid><description>&lt;p&gt;Goffredo Baroncelli has contributed a &lt;a href="http://www.selenic.com/pipermail/mercurial/2005-July/001954.html"&gt;patch to add RSS 2.0 support&lt;/a&gt; to &lt;a href="https://www.mercurial-scm.org/"&gt;Mercurial&lt;/a&gt;&amp;rsquo;s HTTP serving capabilities. This means that you can subscribe to a Mercurial repository using the RSS feed reader of your choice, and be notified when someone publishes new changes.&lt;/p&gt;</description></item><item><title>Mercurial: “revert” command added</title><link>https://www.serpentine.com/2005/07/02/mercurial-revert-command-added/</link><pubDate>Sat, 02 Jul 2005 15:00:00 +0000</pubDate><guid>https://www.serpentine.com/2005/07/02/mercurial-revert-command-added/</guid><description>&lt;p&gt;I have &lt;a href="http://www.selenic.com/pipermail/mercurial/2005-July/thread.html#1883"&gt;implemented a &lt;code&gt;revert&lt;/code&gt;
command&lt;/a&gt; that lets you
undo uncommitted modifications.&lt;/p&gt;</description></item><item><title>Mercurial hacking</title><link>https://www.serpentine.com/2005/07/01/mercurial-hacking/</link><pubDate>Sat, 02 Jul 2005 05:12:40 +0000</pubDate><guid>https://www.serpentine.com/2005/07/01/mercurial-hacking/</guid><description>&lt;p&gt;Since I started looking at Mercurial a few days ago, I&amp;rsquo;ve been hacking quite heavily on it. I&amp;rsquo;ll try to make some time to write about it here, but much of what I&amp;rsquo;ve been doing is documented on the &lt;a href="https://mercurial-scm.org/"&gt;Mercurial wiki&lt;/a&gt; that I&amp;rsquo;ve put together.&lt;/p&gt;</description></item><item><title>The lithic principle</title><link>https://www.serpentine.com/2005/06/27/the-lithic-principle/</link><pubDate>Tue, 28 Jun 2005 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2005/06/27/the-lithic-principle/</guid><description>&lt;p&gt;Courtesy of the &lt;a href="http://effectmeasure.blogspot.com/"&gt;Effect Measure&lt;/a&gt; public health blog, this gem from Carl Sagan&amp;rsquo;s &lt;a href="http://isbn.nu/0345376595"&gt;&lt;em&gt;Pale Blue Dot&lt;/em&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;There is something stunningly narrow about how the &lt;a href="http://en.wikipedia.org/wiki/Anthropic_principle"&gt;Anthropic Principle&lt;/a&gt; is phrased. Yes, only certain laws and constants of nature are consistent with our kind of life. But essentially the same laws and constants are required to make a rock. So why not talk about a Universe designed so rocks could one day come to be, and strong and weak Lithic Principles? If stones could philosophize, I imagine Lithic Principles would be at the intellectual frontiers.&lt;/p&gt;</description></item><item><title>I have seen the future of free distributed revision control systems</title><link>https://www.serpentine.com/2005/06/25/i-have-seen-the-future-of-free-distributed-revision-control-systems/</link><pubDate>Sat, 25 Jun 2005 16:22:56 +0000</pubDate><guid>https://www.serpentine.com/2005/06/25/i-have-seen-the-future-of-free-distributed-revision-control-systems/</guid><description>&lt;p&gt;And it is &lt;a href="http://www.selenic.com/mercurial"&gt;Mercurial&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I have used &lt;a href="http://www.bitkeeper.com/"&gt;BitKeeper&lt;/a&gt; for several years, and it is quite simply a
fantastic piece of software. But for non-commercial projects, at least if I want to collaborate
with other people, it is &lt;a href="https://web.archive.org/web/20160914022736/http://www.bitkeeper.com/press/2005-04-05.html"&gt;no longer an option&lt;/a&gt;.
BitMover will make the &amp;ldquo;free&amp;rdquo; version of BK unavailable from July 1.&lt;/p&gt;
&lt;p&gt;The result is that many people are now casting about for BK replacements.&lt;/p&gt;
&lt;p&gt;Here is my brief, skewed summary of the free distributed revision control world.&lt;/p&gt;</description></item><item><title>How to stop feeling sorry for oneself</title><link>https://www.serpentine.com/2005/06/25/how-to-stop-feeling-sorry-for-oneself/</link><pubDate>Sat, 25 Jun 2005 12:33:01 +0000</pubDate><guid>https://www.serpentine.com/2005/06/25/how-to-stop-feeling-sorry-for-oneself/</guid><description>&lt;p&gt;Not too long ago, I decided to start tracking the books I read more closely. Though I had no particular goal in mind when I started this, I had been entertaining, for a while, the notion that I am not graced with much spare time.&lt;/p&gt;
&lt;p&gt;The quantity of books I apparently read has given the lie to that particular notion. Somewhere, I am finding time to read hundreds of pages a week. This has greatly cheered me up. On the other hand, I am faced with the sad fact that I&amp;rsquo;m reading enough sci-fi to thoroughly rot my brain. I can almost feel the &lt;a href="http://ghr.nlm.nih.gov/ghr/glossary/amyloidplaque"&gt;amyloid plaques&lt;/a&gt; coagulating in real time.&lt;/p&gt;</description></item><item><title>Missourian sprawl</title><link>https://www.serpentine.com/2005/06/22/missourian-sprawl/</link><pubDate>Wed, 22 Jun 2005 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2005/06/22/missourian-sprawl/</guid><description>&lt;p&gt;We spent the past week near Kansas City, MO, at a wedding-cum-reunion for Shannon&amp;rsquo;s family.&lt;/p&gt;
&lt;p&gt;The sprawl around Kansas City is frightening, making Silicon Valley appear dense by comparison. It was over thirty miles from our hotel to the nearest semi-decent bookstore (a Borders, at that).&lt;/p&gt;
&lt;p&gt;The area is blighted by new McMansion developments, many built around artifical lakes that are held in by lev'ees. It is possible to buy a brand new 3,000 square foot faux-rococo mammoth on a somewhat decent plot of land for less than $300,000, a price that won&amp;rsquo;t buy you a tiny dirt lot anywhere near San Francisco.&lt;/p&gt;</description></item><item><title>Cleaning up the geek bookshelf, part 1: “What was I thinking?”</title><link>https://www.serpentine.com/2005/06/13/cleaning-up-the-geek-bookshelf-part-1-what-was-i-thinking/</link><pubDate>Mon, 13 Jun 2005 14:55:09 +0000</pubDate><guid>https://www.serpentine.com/2005/06/13/cleaning-up-the-geek-bookshelf-part-1-what-was-i-thinking/</guid><description>&lt;p&gt;In preparation for a move of house that isn&amp;rsquo;t actually likely to happen until 2007, Shannon and I have been going through some of our bookshelves. Our (admittedly unattainable) goal is to get rid of half of our books.&lt;/p&gt;
&lt;p&gt;Since we don&amp;rsquo;t know when the move will occur (we first have to get permission from the City of San Francisco to demolish a house and build another, then actually build the bugger), what I think will &lt;em&gt;really&lt;/em&gt; happen is that we will, some time in 2007, move exactly as many books as we have now.&lt;/p&gt;</description></item><item><title>Delicious Python</title><link>https://www.serpentine.com/2005/06/12/delicious-python/</link><pubDate>Mon, 13 Jun 2005 05:47:48 +0000</pubDate><guid>https://www.serpentine.com/2005/06/12/delicious-python/</guid><description>&lt;p&gt;Or why I love popular scripting languages, reason number one zillion.&lt;/p&gt;
&lt;p&gt;I use &lt;a href="https://web.archive.org/web/20081109030031/http://sage.mozdev.org:80/"&gt;Sage&lt;/a&gt; with &lt;a href="http://www.getfirefox.com/"&gt;Firefox&lt;/a&gt; to keep up with
various blogs, and &lt;a href="https://web.archive.org/web/20251007193640/https://del.icio.us/"&gt;&lt;code&gt;del.icio.us&lt;/code&gt;&lt;/a&gt; as a URL dumping ground.&lt;/p&gt;
&lt;p&gt;It took me approximately five minutes to find a Python interface to &lt;code&gt;del.icio.us&lt;/code&gt; and write a
script that turns sets of tagged URLs into an OPML file that I can either drop into Sage or post
to my blog:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import delicious deli = delicious.DeliciousNOTAPI() blogs = deli.get_posts_by_user('bos', 'blog') print &amp;quot;'
del.icio.us OPML Export
&amp;quot;' for blog in blogs: blog['description'] = blog['description'].lower() blogs.sort(lambda a, b: cmp(a['description'], b['description'])) for blog in blogs: print '' % (blog['description'], blog.get('extended', &amp;quot;), blog['url']) print ''
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Ah, classic science fiction</title><link>https://www.serpentine.com/2005/06/12/ah-classic-science-fiction/</link><pubDate>Mon, 13 Jun 2005 05:07:07 +0000</pubDate><guid>https://www.serpentine.com/2005/06/12/ah-classic-science-fiction/</guid><description>&lt;p&gt;Shannon and I spent a dizzying hour at &lt;a href="http://www.borderlands-books.com/"&gt;Borderlands Books&lt;/a&gt; in the Mission last Friday. (I know, I know, it&amp;rsquo;s been over a week.) Borderlands is the &lt;em&gt;perfect&lt;/em&gt; geek bookstore, right down to the unnaturally friendly Sphinx cat who haunts the front counter. It houses an impressive collection of science fiction and fantasy, including used books and small-press zines, in a pleasant atmosphere.&lt;/p&gt;
&lt;p&gt;Somehow, I lived in the Bay Area for ten years without realising that Borderlands even existed, until Shannon told me about it last month. So much for being savvy about my environs.&lt;/p&gt;</description></item><item><title>Why I love Atlas Cafe</title><link>https://www.serpentine.com/2005/06/12/why-i-love-atlas-cafe/</link><pubDate>Mon, 13 Jun 2005 05:06:28 +0000</pubDate><guid>https://www.serpentine.com/2005/06/12/why-i-love-atlas-cafe/</guid><description>&lt;p&gt;I&amp;rsquo;m taking a lazy afternoon away from Shannon and Cian, who are &lt;a href="https://web.archive.org/web/20060622202619/http://www.crows-at-the-beach.com/"&gt;at the beach in Aptos&lt;/a&gt;. Atlas is a sublime place to laze.&lt;/p&gt;
&lt;p&gt;As I&amp;rsquo;m tapping away on my laptop, the Mission Chick behind the bar yells out, &amp;ldquo;You know what, Stuart? I like you. You&amp;rsquo;re not like the other people here, in the trailer park.&amp;rdquo; Which is the beginning of a &lt;a href="http://www.plyrics.com/lyrics/deadmilkmen/stuart.html"&gt;classic spoken-word piece&lt;/a&gt; by the Dead Milkmen. And which I don&amp;rsquo;t think I&amp;rsquo;ve ever heard anyone else quote.&lt;/p&gt;</description></item><item><title>The multithreaded programming FAQ: It’s back (sort of)</title><link>https://www.serpentine.com/2005/06/11/the-multithreaded-programming-faq-its-back-sort-of/</link><pubDate>Sat, 11 Jun 2005 15:00:00 +0000</pubDate><guid>https://www.serpentine.com/2005/06/11/the-multithreaded-programming-faq-its-back-sort-of/</guid><description>&lt;p&gt;About a decade ago (!), I wrote the &lt;a href="https://www.serpentine.com/threads-faq/"&gt;Usenet FAQ on multithreaded programming&lt;/a&gt;. In spite of the fact that I haven&amp;rsquo;t maintained the thing since 1997, it surprises me by continuing to get a few thousand hits every month. Unfortunately, much of the information in the old FAQ is so stale as to be useless. While the abstract &amp;ldquo;how do I do this?&amp;rdquo; content remains unchanged, and the state of the art has hardly budged, system specifics have evolved. I will be making some time over the coming months to bring the FAQ at least somewhat back up to speed. Post comments here, or send me email, and I&amp;rsquo;ll keep the content fresh.&lt;/p&gt;</description></item><item><title>A nasty bug in mDNSResponder</title><link>https://www.serpentine.com/2005/06/10/a-nasty-bug-in-mdnsresponder/</link><pubDate>Sat, 11 Jun 2005 03:28:32 +0000</pubDate><guid>https://www.serpentine.com/2005/06/10/a-nasty-bug-in-mdnsresponder/</guid><description>&lt;p&gt;I found an interesting bug this morning in Apple&amp;rsquo;s &lt;a href="https://developer.apple.com/bonjour/"&gt;&lt;code&gt;mDNSResponder&lt;/code&gt;
daemon&lt;/a&gt;. This is the Mac OS X daemon
responsible for managing automatic network configuration and service discovery, basically the
thingy that a Mac uses to tell you &amp;ldquo;there&amp;rsquo;s a printer on the network here that you could use&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;The bug is of the &amp;ldquo;malicious value injection&amp;rdquo; type: given a piece of code that expects certain
inputs, what happens if you feed it something unexpected?&lt;/p&gt;</description></item><item><title>We await Sharkfin Garbage Can’s empire</title><link>https://www.serpentine.com/2005/06/08/we-await-sharkfin-garbage-cans-empire/</link><pubDate>Wed, 08 Jun 2005 23:41:19 +0000</pubDate><guid>https://www.serpentine.com/2005/06/08/we-await-sharkfin-garbage-cans-empire/</guid><description>&lt;p&gt;On Monday, Shannon had The Ultrasound, in which we got to observe the person who is crowding out her internal organs. The person in question is a little boy, about twelve inches long, who gets to spend the next four and a half months whiling away the time in foetal darkness. Lucky little bugger.&lt;/p&gt;
&lt;p&gt;Cian&amp;rsquo;s current preference for a name is &amp;ldquo;Sharkfin Garbage Can&amp;rdquo;. Shannon and I are trying to find a non-clich'ed &lt;a href="http://www.babynamesofireland.com/"&gt;Irish boy&amp;rsquo;s name&lt;/a&gt; that is euphonious to both Irish and American ears. This may sound difficult, and it is.&lt;/p&gt;</description></item><item><title>That book meme</title><link>https://www.serpentine.com/2005/06/08/that-book-meme/</link><pubDate>Wed, 08 Jun 2005 15:00:00 +0000</pubDate><guid>https://www.serpentine.com/2005/06/08/that-book-meme/</guid><description>&lt;p&gt;Total number of books I have owned: no real idea, but probably between one and two thousand.&lt;/p&gt;
&lt;p&gt;Last book I bought: Michael Shermer, &lt;a href="https://web.archive.org/web/20041211064421/http://www.skeptic.com:80/prods/pdetail/1080.html"&gt;&lt;em&gt;The Borderlands of Science&lt;/em&gt;&lt;/a&gt;. I confess that it cost $3 in the remainder rack at Red Hill Books.&lt;/p&gt;
&lt;p&gt;Last book I read: Lynch and Livingston&amp;rsquo;s &lt;a href="http://isbn.nu/0521775043"&gt;&lt;em&gt;Color and Light in Nature&lt;/em&gt;&lt;/a&gt;. I am still &lt;a href="https://www.serpentine.com/2005/05/13/color-and-light-in-nature/"&gt;making my way&lt;/a&gt; through this one.&lt;/p&gt;
&lt;p&gt;Last book I finished: Gene Wolfe, &lt;a href="http://isbn.nu/0312872577"&gt;&lt;em&gt;On Blue&amp;rsquo;s Waters&lt;/em&gt;&lt;/a&gt;. Complex sci-fi full of ambiguity, false starts, and unreliable narration. In short, wonderful.&lt;/p&gt;</description></item><item><title>The innacurately named Mail 2.0</title><link>https://www.serpentine.com/2005/05/15/the-innacurately-named-mail-20/</link><pubDate>Sun, 15 May 2005 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2005/05/15/the-innacurately-named-mail-20/</guid><description>&lt;p&gt;I&amp;rsquo;ve been attempting to use the latest version of Apple Mail to read my mail. An uncontroversial thing to do, you might think, but I can&amp;rsquo;t actually manage it.&lt;/p&gt;
&lt;p&gt;I started Mail about an hour ago, and it has busied itself ever since with tasks more important than letting me read my mail. According to Mail&amp;rsquo;s &amp;ldquo;Activity Viewer&amp;rdquo; window, or the &amp;ldquo;Reasons Why I Can&amp;rsquo;t Read My Mail&amp;rdquo; window as I&amp;rsquo;ve come to think of it, Mail has been preoccupied updating colours (updating colours!?), synchronising with servers, adding messages, and otherwise keeping the fan on the PowerBook running noisily.&lt;/p&gt;</description></item><item><title>Higher order indifference</title><link>https://www.serpentine.com/2005/05/13/higher-order-indifference/</link><pubDate>Fri, 13 May 2005 15:43:16 +0000</pubDate><guid>https://www.serpentine.com/2005/05/13/higher-order-indifference/</guid><description>&lt;p&gt;I had occasion to be in a bookstore yesterday, and came across Mark-Jason Dominus&amp;rsquo;s &lt;a href="http://hop.perl.plover.com/"&gt;&lt;em&gt;Higher Order Perl&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Anyone wanting to do functional programming in Perl has to be seriously demented. Such activity is like reproducing the finest paintings of the Renaissance in excrement, using your finger (to paraphrase a well-known Perl author). But let&amp;rsquo;s set this basic violation of good sense aside.&lt;/p&gt;
&lt;p&gt;The book is a rehash, transcribed into Perl, of two classic functional programming texts: Abelson and Sussman&amp;rsquo;s &lt;a href="https://web.archive.org/web/20171226134539/https://mitpress.mit.edu/sicp/"&gt;&lt;em&gt;Structure and Interpretation of Computer Programming&lt;/em&gt;&lt;/a&gt;, and Bird and Wadler&amp;rsquo;s &lt;a href="https://web.archive.org/web/20080905222136/http://vig.prenhall.com/catalog/academic/product/0,1144,0134843460.html,00.html"&gt;&lt;em&gt;Introduction to Functional Programming&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Color and Light in Nature</title><link>https://www.serpentine.com/2005/05/13/color-and-light-in-nature/</link><pubDate>Fri, 13 May 2005 15:42:36 +0000</pubDate><guid>https://www.serpentine.com/2005/05/13/color-and-light-in-nature/</guid><description>&lt;p&gt;Each night, I read a few pages of Lynch and Livingstone&amp;rsquo;s compendium of natural optical phenomena. Although the writing is a little wooden, and they assume more of a background in physics than I possess, &lt;a href="http://isbn.nu/0521775043"&gt;&lt;em&gt;Color and Light in Nature&lt;/em&gt;&lt;/a&gt; is a wonderful book.&lt;/p&gt;
&lt;p&gt;So far, my favourite technical term from the book is &amp;ldquo;glitter patch,&amp;rdquo; the light from the sun reflected in water when the sun is low in the sky. &amp;ldquo;Glitter Patch&amp;rdquo; cries out to be the title of a science fiction novel.&lt;/p&gt;</description></item><item><title>A brief note on the universe of free batching systems</title><link>https://www.serpentine.com/2005/03/05/a-brief-note-on-the-universe-of-free-batching-systems/</link><pubDate>Sat, 05 Mar 2005 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2005/03/05/a-brief-note-on-the-universe-of-free-batching-systems/</guid><description>&lt;p&gt;&lt;a href="http://www.pathscale.com"&gt;At work&lt;/a&gt;, we spent some months wringing our hands over how to harness our increasing number of racked machines in a semi-sane way. In our case, since we work in the HPC arena, we needed a batch queuing system.&lt;/p&gt;
&lt;p&gt;Ten years ago, I wrote and maintained such a system at Sun. It managed the execution of jobs on about 2,200 computers, and had a user community of several hundred. Although it was a fine piece of software, Sun never did much with it, even though for a while it was substantially superior to &lt;a href="http://www.platform.com/products/LSFfamily/"&gt;Platform&amp;rsquo;s LSF&lt;/a&gt;, and could have made a modestly successful product.&lt;/p&gt;</description></item><item><title>Hitachi redux</title><link>https://www.serpentine.com/2005/02/22/hitachi-redux/</link><pubDate>Tue, 22 Feb 2005 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2005/02/22/hitachi-redux/</guid><description>&lt;p&gt;I &lt;a href="https://web.archive.org/web/20050728151439/http://www.sheller.com:80/SubPage.asp?SubPageID=88"&gt;should have known better&lt;/a&gt;, but when I was
incarnating the current noisy boat anchor that sits on my desk at home, I put a Hitachi hard
disk in it. Not specifically one of the notorious IBM-era eat-your-data models, but something
much more recent.&lt;/p&gt;
&lt;p&gt;It made it to about six months of age before developing a perforated filesystem ulcer and
bleeding out at about 4am on Saturday morning. I didn&amp;rsquo;t even notice until Sunday night,
whereupon I booted into a rescue environment and attempted a &lt;code&gt;fsck&lt;/code&gt;. The &lt;code&gt;fsck&lt;/code&gt; yielded many,
many short reads, which I interpret as the hard disk telling me &amp;ldquo;I&amp;rsquo;ve run out of bad blocks to
silently remap, so now I&amp;rsquo;m going to cack on your data in a way you &lt;em&gt;can&amp;rsquo;t&lt;/em&gt; ignore&amp;rdquo;. My root
filesystem was almost completely trashed, leaving almost 4,000 entries in &lt;code&gt;lost+found&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>The great Python vs ld.so smackdown</title><link>https://www.serpentine.com/2005/02/02/the-great-python-vs-ldso-smackdown/</link><pubDate>Wed, 02 Feb 2005 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2005/02/02/the-great-python-vs-ldso-smackdown/</guid><description>&lt;p&gt;At work, I&amp;rsquo;m building an application in a combination of Python and C++. Working in Python is
sheer pleasure, but trying to build a &amp;ldquo;shrink wrap&amp;rdquo; application in Python is a horrible task.&lt;/p&gt;
&lt;p&gt;The problem is that in order to have any hope of shipping a single package that should work on a
number of versions of a given Linux distribution, you must ship your own Python interpreter, and
your own versions of any other packages that either have licensing issues or suffer from version
drift.&lt;/p&gt;</description></item><item><title>Configuring Postfix to use TLS and SMTP AUTH</title><link>https://www.serpentine.com/2005/01/30/configuring-postfix-to-use-tls-and-smtp-auth/</link><pubDate>Sun, 30 Jan 2005 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2005/01/30/configuring-postfix-to-use-tls-and-smtp-auth/</guid><description>&lt;p&gt;I finally sat down to set up Postfix to allow people outside my firewall to send mail using my
SMTP server. It was a mildly annoying task, but not too troublesome. Here are my notes on how it
worked, in case anyone needs a crib sheet.&lt;/p&gt;
&lt;p&gt;First of all, my mail server runs Fedora Core 2, and I&amp;rsquo;m using the default &lt;code&gt;postfix&lt;/code&gt; and
&lt;code&gt;cyrus-sasl&lt;/code&gt; packages that come with FC2.&lt;/p&gt;
&lt;p&gt;My motivation for using SMTP AUTH (for authentication) and TLS (for secrecy) was
straightforward. I didn&amp;rsquo;t want to configure an open relay, so some kind of authentication was
required. I wanted to use PAM to maintain a single list of user names and passwords for my
network. Unfortunately, it&amp;rsquo;s impossible to configure &lt;code&gt;saslauthd&lt;/code&gt;, the daemon that is easiest to
hook up to Postfix to manage password authentication, to use anything other than plaintext
passwords. I didn&amp;rsquo;t want passwords or message bodies to be sniffable, hence using TLS.&lt;/p&gt;</description></item><item><title>Searching video</title><link>https://www.serpentine.com/2005/01/28/searching-video/</link><pubDate>Fri, 28 Jan 2005 09:15:50 +0000</pubDate><guid>https://www.serpentine.com/2005/01/28/searching-video/</guid><description>&lt;p&gt;It was amusing to come across Google&amp;rsquo;s announcement of searchable video subtitles the other day. I thought of this applying this idea to a set-top box when I was at Rearden Steel; no, I&amp;rsquo;m sorry, Moxi; er, make that Digeo.&lt;/p&gt;
&lt;p&gt;Unfortunately, the CEO was too busy driving the company into the ground at the time for the idea to take root; the entire engineering staff spent four solid months playing Quake 3 before the Digeo purchase.&lt;/p&gt;</description></item><item><title>Probability Theory</title><link>https://www.serpentine.com/2005/01/27/probability-theory/</link><pubDate>Fri, 28 Jan 2005 03:36:38 +0000</pubDate><guid>https://www.serpentine.com/2005/01/27/probability-theory/</guid><description>&lt;p&gt;I&amp;rsquo;m trying to slog through Jaynes&amp;rsquo;s &lt;em&gt;Probability Theory: The Logic of Science&lt;/em&gt;. It&amp;rsquo;s a refreshing change to read a book where I spend a good portion of the time clutching my head, feeling hopelessly stupid.&lt;/p&gt;
&lt;p&gt;This is no fault of the book itself; it&amp;rsquo;s wonderfully written, and would probably make perfect sense to any reasonably clever person with a strong background in applied mathematics. Unfortunately, my background in applied mathematics is entirely nonexistent, so when Jaynes says something like &amp;ldquo;let&amp;rsquo;s assume that variable &lt;em&gt;x&lt;/em&gt; is differentiable, so that all of these nice consequences follow during our big long chain of derivations and rewritings,&amp;rdquo; I am forced to nod my head and grunt.&lt;/p&gt;</description></item><item><title>The Scientists</title><link>https://www.serpentine.com/2005/01/22/the-scientists/</link><pubDate>Sun, 23 Jan 2005 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2005/01/22/the-scientists/</guid><description>&lt;p&gt;I have just finished reading John Gribbin&amp;rsquo;s &lt;em&gt;The Scientists&lt;/em&gt;, which is a wonderful book on the history of Western science, from the era of Copernicus to the present. The style of the book is biographical, avoiding deep treatment of discoveries in favour of talking about the contributions of individuals. Gribbin enlivens his story with colourful anecdotes about some of the more engaging characters.&lt;/p&gt;
&lt;p&gt;The overall effect is to avoid the pitfall of Biblical-style genealogy; there&amp;rsquo;s only an occasional sense of &amp;ldquo;A lived N years, and discovered idea X, which begat Y&amp;rdquo;. I was amused to see Gribbin take repeated swipes at Thomas Kuhn (&lt;em&gt;The Structure of Scientific Revolutions&lt;/em&gt;), who he clearly regards as clueless.&lt;/p&gt;</description></item><item><title>Better luck with music</title><link>https://www.serpentine.com/2005/01/02/better-luck-with-music/</link><pubDate>Sun, 02 Jan 2005 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2005/01/02/better-luck-with-music/</guid><description>&lt;p&gt;How much better it is to be patient, and visit &lt;a href="http://www.aquariusrecords.org/"&gt;Aquarius&lt;/a&gt;, than to give into the desire for a quick fix and waste time at Borders or some other soulless chain.&lt;/p&gt;
&lt;p&gt;I pulled my occasional largely-unplanned-trip-to-the-record-store trick on Thursday. Oh, it was good. A mediocre, rushed trip to Aquarius is enormously more satisfying than two hours ferreting through endless top-40 dreck at Borders, and this trip was neither mediocre nor rushed.&lt;/p&gt;</description></item><item><title>Methuselah goes on a cruise</title><link>https://www.serpentine.com/2004/12/30/methuselah-goes-on-a-cruise/</link><pubDate>Fri, 31 Dec 2004 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2004/12/30/methuselah-goes-on-a-cruise/</guid><description>&lt;p&gt;From the terms and restrictions of a package cruise on Expedia&amp;rsquo;s web site: &amp;ldquo;This cruise line requires that passengers younger than 255 years old be accompanied by an adult 25 years or older in the same cabin.&amp;rdquo;&lt;/p&gt;</description></item><item><title>No X, know Y</title><link>https://www.serpentine.com/2004/12/21/no-x-know-y/</link><pubDate>Wed, 22 Dec 2004 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2004/12/21/no-x-know-y/</guid><description>&lt;p&gt;Last night, sitting on the floor, attempting to convince Cian to put his pajamas on. He running circles around me and hooting with delight, me sharing an exasperated look with Shannon.&lt;/p&gt;
&lt;p&gt;Suddenly, an idea forms.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Know Cian, no peace,&amp;rdquo; I say to her. She cracks up.&lt;/p&gt;
&lt;p&gt;Cian looks delighted.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Know Cian! No peace!&amp;rdquo; he yells.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;No Cian! Know peace!&amp;rdquo; we all chant.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Exeunt&lt;/em&gt;.&lt;/p&gt;</description></item><item><title>The New Year’s climbing resolution</title><link>https://www.serpentine.com/2004/12/19/the-new-years-climbing-resolution/</link><pubDate>Sun, 19 Dec 2004 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2004/12/19/the-new-years-climbing-resolution/</guid><description>&lt;p&gt;I&amp;rsquo;ve decided that there&amp;rsquo;s no reason to wait until January to start obsessing about climbing again. For the past several months, I&amp;rsquo;ve become increasingly discouraged as my climbing ability has slowly slipped backwards.&lt;/p&gt;
&lt;p&gt;Last weekend, I went to Pinnacles with the usual suspects and didn&amp;rsquo;t feel like leading anything, not even a 5.9. This was finally enough to shake me out of my funk. Since the summer, I had dropped back to training at the gym only twice a week, for 2.5 hours at a time, and watched my endurance dwindle all the while.&lt;/p&gt;</description></item><item><title>Casual profiling</title><link>https://www.serpentine.com/2004/12/14/casual-profiling/</link><pubDate>Tue, 14 Dec 2004 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2004/12/14/casual-profiling/</guid><description>&lt;p&gt;In the coffee shop this morning:&lt;/p&gt;
&lt;p&gt;&amp;ldquo;I&amp;rsquo;ll have a latte and a scone, please.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;You&amp;rsquo;re Irish, right?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;I am.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Yeah-all the Irish buy scones.&amp;rdquo;&lt;/p&gt;</description></item><item><title>Ireland 2004: notes from an outsider</title><link>https://www.serpentine.com/2004/12/06/ireland-2004-notes-from-an-outsider/</link><pubDate>Mon, 06 Dec 2004 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2004/12/06/ireland-2004-notes-from-an-outsider/</guid><description>&lt;p&gt;We&amp;rsquo;ve been visiting Ireland for the past week and a bit, to see family, friends, and attend Siobhán and Jonathan&amp;rsquo;s wedding. My visits back here amount to annual impressionistic snapshots of how the country has changed.&lt;/p&gt;
&lt;p&gt;I am infinitely grateful for the government&amp;rsquo;s workplace smoking ban. It is now possible to go to a pub for the night and not have to burn your clothes before you go to bed to avoid polluting your entire house. Oh, and there&amp;rsquo;s the small graces of my asthma and eyes not being driven towards breaking point.&lt;/p&gt;</description></item><item><title>Ignoring jet lag doesn’t make it go away</title><link>https://www.serpentine.com/2004/12/05/ignoring-jet-lag-doesnt-make-it-go-away/</link><pubDate>Sun, 05 Dec 2004 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2004/12/05/ignoring-jet-lag-doesnt-make-it-go-away/</guid><description>&lt;p&gt;It&amp;rsquo;s 5am Irish time as I write this. I am tired, almost ready to finally go asleep. This is the first Ireland visit where I haven&amp;rsquo;t even tried to adjust, or more importantly to get the wee fella to adjust, to the 8-hour time difference.&lt;/p&gt;
&lt;p&gt;Frankly, this approach doesn&amp;rsquo;t work well. Either I get up at a semi-normal hour by Irish standards, and fall about the place like a hobbled zombie until 4am, or I get up at 2pm and miss most of daylight, along with opportunities for spending time with people and, well, doing things. I think this is an experiment I won&amp;rsquo;t be repeating.&lt;/p&gt;</description></item><item><title>From the department of unintentional Tom Swifties</title><link>https://www.serpentine.com/2004/11/16/from-the-department-of-unintentional-tom-swifties/</link><pubDate>Tue, 16 Nov 2004 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2004/11/16/from-the-department-of-unintentional-tom-swifties/</guid><description>&lt;p&gt;[From a Reuters story about some new Dell hardware.]&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Frankly, we shot ahead of the goose,&amp;rdquo; Golden said.&lt;/p&gt;</description></item><item><title>Arrival in Pittsburgh</title><link>https://www.serpentine.com/2004/11/08/arrival-in-pittsburgh/</link><pubDate>Mon, 08 Nov 2004 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2004/11/08/arrival-in-pittsburgh/</guid><description>&lt;p&gt;I stumbled out of bed at 4am this morning, and bleared my way onto a two-hop flight from San Francisco to Pittsburgh, to start getting ready for this year&amp;rsquo;s &lt;a href="https://web.archive.org/web/20041011231620/http://www.sc-conference.org/sc2004/"&gt;Supercomputing Conference&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So far, my seven-hour experience of Pittsburgh has been mixed. On the one hand, the weather was beautiful today, and the Best Festerin&amp;rsquo; that I&amp;rsquo;m staying in has free high-speed net connections in every room. On the other, said hotel is 4 miles from the conference centre, in a grotty little exurb with nothing nearby, and the conference centre is in a sort of urban desert, so my options for eating actual food (as opposed to Snickers and M&amp;amp;Ms, which can be found in abundance) are limited.&lt;/p&gt;</description></item><item><title>Conversation of the day</title><link>https://www.serpentine.com/2004/10/30/conversation-of-the-day/</link><pubDate>Sun, 31 Oct 2004 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2004/10/30/conversation-of-the-day/</guid><description>&lt;p&gt;Or, a vignette into life with a precocious not-yet-three-year-old.&lt;/p&gt;
&lt;p&gt;The cast: Dad (30), child (2), Mom (young and beautiful).&lt;/p&gt;
&lt;p&gt;The setting: Mom and child are watching grizzly bears fishing on TV.&lt;/p&gt;
&lt;p&gt;Dad (to child): &amp;ldquo;Would you like to go to the grocery store?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Satanic cherub: &amp;ldquo;Go away. Stop annoying us. We need our privacy. We need to watch these scary animals.&amp;rdquo;&lt;/p&gt;</description></item><item><title>NowHouse, day 2</title><link>https://www.serpentine.com/2004/10/30/nowhouse-day-2/</link><pubDate>Sat, 30 Oct 2004 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2004/10/30/nowhouse-day-2/</guid><description>&lt;p&gt;Shannon went to the opening of the &lt;a href="http://www.nowhouse.org"&gt;NowHouse&lt;/a&gt; in San Francisco
yesterday morning. Being stuck with a deadline at work, I couldn&amp;rsquo;t attend, but we went back this
morning. I brought my camera along.&lt;/p&gt;
&lt;p&gt;[!](&lt;a href="https://web.archive.org/web/20051027113150/http://www.serpentine.com:80/gallery/NowHouse"&gt;https://web.archive.org/web/20051027113150/http://www.serpentine.com:80/gallery/NowHouse&lt;/a&gt;)
[!](&lt;a href="https://web.archive.org/web/20051027113150/http://www.serpentine.com:80/gallery/NowHouse"&gt;https://web.archive.org/web/20051027113150/http://www.serpentine.com:80/gallery/NowHouse&lt;/a&gt;)
[!](&lt;a href="https://web.archive.org/web/20051027113150/http://www.serpentine.com:80/gallery/NowHouse"&gt;https://web.archive.org/web/20051027113150/http://www.serpentine.com:80/gallery/NowHouse&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;The October morning weather provided a uniformly dreary light, so it&amp;rsquo;s very difficult to tell
from the photos that the NowHouse is in fact extremely attractive. Naturally, the weather
improved as soon as we left.&lt;/p&gt;</description></item><item><title>Happy child, miserable cat</title><link>https://www.serpentine.com/2004/10/26/happy-child-miserable-cat/</link><pubDate>Tue, 26 Oct 2004 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2004/10/26/happy-child-miserable-cat/</guid><description>&lt;p&gt;&lt;img alt="Happy child sharing space with a very unimpressed cat" loading="lazy" src="https://web.archive.org/web/20060305082514/http://www.serpentine.com:80/albums/album102/aan.sized.jpg"&gt;&lt;/p&gt;</description></item><item><title>Why Python is useless for serious XML processing</title><link>https://www.serpentine.com/2004/10/22/why-python-is-useless-for-serious-xml-processing/</link><pubDate>Fri, 22 Oct 2004 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2004/10/22/why-python-is-useless-for-serious-xml-processing/</guid><description>&lt;p&gt;I have a Python application in which, for my sins, I decided to use XML as an on-disk storage format. Unfortunately, when I made this decision, I neglected to measure the performance of the available Python XML processing implementations.&lt;/p&gt;
&lt;p&gt;Bad, bad, &lt;em&gt;bad&lt;/em&gt; mistake. I expected that I was going to trade a little saved work for some performance, but when I finally got around to profiling my app today, to see why it was so slow, I was shocked.&lt;/p&gt;</description></item><item><title>Indian summer</title><link>https://www.serpentine.com/2004/10/17/indian-summer/</link><pubDate>Sun, 17 Oct 2004 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2004/10/17/indian-summer/</guid><description>&lt;p&gt;!!&lt;/p&gt;</description></item><item><title>Another reason not to buy CDs on spec</title><link>https://www.serpentine.com/2004/10/16/another-reason-not-to-buy-cds-on-spec/</link><pubDate>Sat, 16 Oct 2004 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2004/10/16/another-reason-not-to-buy-cds-on-spec/</guid><description>&lt;p&gt;Another album that I picked up during my Borders trip last week was M83&amp;rsquo;s &lt;em&gt;Dead Cities, Red Seas &amp;amp; Lost Ghosts&lt;/em&gt;. After I bought it and played it, I was stunned by the warm reception this album received at places like Amazon&amp;rsquo;s customer reviews and &lt;a href="https://web.archive.org/web/20080720031242/http://www.pitchforkmedia.com/record-reviews/m/m83/dead-cities-red-seas-and-lost-ghosts.shtml"&gt;Pitchfork Media&lt;/a&gt;. At least I had my curiosity piqued: What &lt;em&gt;else&lt;/em&gt; do the people who like this enjoy? Do they have any friends? Have they left the house since 1987?&lt;/p&gt;</description></item><item><title>Adventures in judging CDs by their covers</title><link>https://www.serpentine.com/2004/10/11/adventures-in-judging-cds-by-their-covers/</link><pubDate>Tue, 12 Oct 2004 00:55:20 +0000</pubDate><guid>https://www.serpentine.com/2004/10/11/adventures-in-judging-cds-by-their-covers/</guid><description>&lt;p&gt;I went to Borders the other day, to replenish my stock of commute music. I get restless when I have to rotate the same few discs more than a few times when driving up and down the Peninsula, and NPR is currently so focused on election politics that I can&amp;rsquo;t listen. Oliver Sacks had a wonderful vignette in &lt;em&gt;The Man Who Mistook His Wife for a Hat&lt;/em&gt; about a roomful of aphasics laughing at what, to them, were the obvious lies in a Ronald Reagan speech (even though they couldn&amp;rsquo;t understand the words); I have a similar reaction to every word from Bush&amp;rsquo;s mouth, save that his words turn my stomach.&lt;/p&gt;</description></item><item><title>Squarepusher, &lt;i&gt;Ultravisitor&lt;/i&gt;</title><link>https://www.serpentine.com/2004/10/11/squarepusher-ultravisitor/</link><pubDate>Tue, 12 Oct 2004 00:54:46 +0000</pubDate><guid>https://www.serpentine.com/2004/10/11/squarepusher-ultravisitor/</guid><description>&lt;p&gt;Tom Jenkinson has been recording as Squarepusher for years. He started out with genre-defining drill-and-bass albums, then moved on to his own peculiar interpretation of jazz. His latest, &lt;em&gt;Ultravisitor&lt;/em&gt;, is a part-live, part-studio album, about evenly split between d&amp;rsquo;n&amp;rsquo;b and jazz.&lt;/p&gt;
&lt;p&gt;The album as a whole is disappointing to me. The drill-and-bass tracks are either stuck in a stale late-90s groove or so harsh as to have me diving for the &amp;ldquo;skip past this track&amp;rdquo; button. The jazz tracks are standard middlebrow fare-not unpleasant, but they don&amp;rsquo;t have any stick-in-your head quality either. Most of the album strikes me as either reprises of earlier fare or obvious derivations of work by newer artists, most obviously Prefuse 73.&lt;/p&gt;</description></item><item><title>Khalid Kelly!?</title><link>https://www.serpentine.com/2004/10/07/khalid-kelly/</link><pubDate>Fri, 08 Oct 2004 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2004/10/07/khalid-kelly/</guid><description>&lt;p&gt;While driving home from the climbing gym last night, I listened to some of &lt;a href="https://web.archive.org/web/20060614163537/http://www.insideout.org/documentaries/britishjihad/default.asp"&gt;&lt;em&gt;British Jihad&lt;/em&gt;&lt;/a&gt;, a public radio documentary about the rise of radical Islam in Britain.&lt;/p&gt;
&lt;p&gt;While most of the show was unsurprising, it was utterly bizarre to hear one of Michael Goldfarb&amp;rsquo;s interviewees introduced as Khalid Kelly, a Dubliner who had converted to Wahabbist Islam while working in Saudi Arabia. Apparently, Kelly is something of a quotable media figure, having shown up in both the &lt;a href="https://web.archive.org/web/20081012033931/http://www.religionnewsblog.com/7283-.html"&gt;&lt;em&gt;Independent&lt;/em&gt;&lt;/a&gt; and the &lt;a href="https://web.archive.org/web/20120414114506/http://www.sfgate.com/cgi-bin/article.cgi?file=/chronicle/archive/2004/07/24/MNGN67SF4U1.DTL"&gt;San Francisco &lt;em&gt;Chronicle&lt;/em&gt;&lt;/a&gt; a few months ago.&lt;/p&gt;</description></item><item><title>I can die happy now (or, as it turned out, &lt;i&gt;not&lt;/i&gt;)</title><link>https://www.serpentine.com/2004/10/06/i-can-die-happy-now-or-as-it-turned-out-not/</link><pubDate>Wed, 06 Oct 2004 15:22:07 +0000</pubDate><guid>https://www.serpentine.com/2004/10/06/i-can-die-happy-now-or-as-it-turned-out-not/</guid><description>&lt;p&gt;I just noticed that Geoff Pullum &lt;a href="https://web.archive.org/web/20110917015915/http://people.ucsc.edu:80/~pullum/langlogposts.html"&gt;contributes frequently&lt;/a&gt; to &lt;a href="https://web.archive.org/web/20250925153520/https://www.languagelog.org/"&gt;Language Log&lt;/a&gt;. One of the first books I read after coming to the US was his &lt;em&gt;The Great Eskimo Vocabulary Hoax&lt;/em&gt;, which is fabulously entertaining. My lasting impression was a goggle-eyed &amp;ldquo;gee, Pullum must be smart, and stuff.&amp;rdquo; Until tonight.&lt;/p&gt;
&lt;p&gt;Pullum wonders where the phrase &lt;a href="http://itre.cis.upenn.edu/~myl/languagelog/archives/001521.html"&gt;&amp;ldquo;this isn&amp;rsquo;t rocket science&amp;rdquo;&lt;/a&gt; comes from. He claims that rockets are simple, but they&amp;rsquo;re really not. A &lt;em&gt;simple&lt;/em&gt; rocket is (self-evidently) simple, but an even slightly interesting (read &amp;ldquo;predictable&amp;rdquo;) one requires an astonishing amount of work to design and build. Well, blind hero worship was overrated all along.&lt;/p&gt;</description></item><item><title>I, for one, welcome our new corrected quote</title><link>https://www.serpentine.com/2004/10/06/i-for-one-welcome-our-new-corrected-quote/</link><pubDate>Wed, 06 Oct 2004 14:59:33 +0000</pubDate><guid>https://www.serpentine.com/2004/10/06/i-for-one-welcome-our-new-corrected-quote/</guid><description>&lt;p&gt;At Zeitgeist last night with &lt;a href="https://web.archive.org/web/20080724165100/http://prometheus.frii.com/~gnat/frii/"&gt;Nat&lt;/a&gt;, &lt;a href="https://web.archive.org/web/20170518191444/http://raelity.org/"&gt;Rael&lt;/a&gt;, &lt;a href="http://www.craphound.com/"&gt;Cory&lt;/a&gt;, &lt;a href="https://web.archive.org/web/20051111043403/http://www.wetware.com:80/jhw/"&gt;James&lt;/a&gt; and &lt;a href="https://web.archive.org/web/20051103064443/http://www.wetware.com:80/bc/"&gt;Bill&lt;/a&gt;, I regurgitated a quip to the effect of &amp;ldquo;I, for one, welcome our robot masters.&amp;rdquo; Cory offered the corrected version with &amp;ldquo;I, for one, welcome our &lt;em&gt;new&lt;/em&gt; robot masters.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Which got me to thinking a typically inane thought: why was this phrase stuck in my head? A Google search for &lt;em&gt;&amp;ldquo;for one&amp;rdquo; &amp;ldquo;welcome our new&amp;rdquo;&lt;/em&gt; yielded not just the phrase, but &lt;a href="http://itre.cis.upenn.edu/~myl/languagelog/archives/000403.html"&gt;its memetic phylogeny&lt;/a&gt;. The original is a Simpsons quote, and it seems to have gotten lodged (albeit loosely) in several million skulls. Oh, and surprise, I&amp;rsquo;m about two years late to the memetic party.&lt;/p&gt;</description></item><item><title>Letters from Iraq</title><link>https://www.serpentine.com/2004/10/05/letters-from-iraq/</link><pubDate>Wed, 06 Oct 2004 05:00:00 +0000</pubDate><guid>https://www.serpentine.com/2004/10/05/letters-from-iraq/</guid><description>&lt;p&gt;Sent by soldiers who served, or are serving, to Michael Moore; published in &lt;a href="https://web.archive.org/web/20040927010041/http://www.guardian.co.uk/Iraq/Story/0,2763,1319718,00.html"&gt;today&amp;rsquo;s &lt;em&gt;Guardian&lt;/em&gt;&lt;/a&gt;. I&amp;rsquo;m sure Moore was selective in his choices of letters to publish, but it&amp;rsquo;s still depressing.&lt;/p&gt;
&lt;p&gt;I know someone who had two members of the Reserve company he commands airlifted home due to injuries sustained during the first week of their tour, just last week. His company is tasked with psychological operations, &amp;ldquo;preparing the ground&amp;rdquo; prior to military incursions into neighbourhoods and towns. His company&amp;rsquo;s predecessors rotated out after a twelvemonth tour, with hardly a chance to meet any of his men. His team has to build up all of their field knowledge from scratch. A fine way to fight a war.&lt;/p&gt;</description></item><item><title>Tankers</title><link>https://www.serpentine.com/2004/10/01/tankers/</link><pubDate>Sat, 02 Oct 2004 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2004/10/01/tankers/</guid><description>&lt;p&gt;Spent a while at Kate&amp;rsquo;s last night, keeping an eye on the wee fella while Shannon worked. Cian chanted.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Tankers! Tankers! Tankers!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;How charming,&amp;rdquo; I thought to myself. &amp;ldquo;He must have seen some tanker trucks.&amp;rdquo; Then the devilish grin spread across his face, and the chant changed.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Wankers! Wankers! Wankers!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;My heart sank. It couldn&amp;rsquo;t have been Shannon he heard saying this, because Americans don&amp;rsquo;t have any facility with wankers, tosspots, or other fine selections from the onanistic line of verbal abuse.&lt;/p&gt;</description></item><item><title>Used car sales for physicists</title><link>https://www.serpentine.com/2004/09/29/used-car-sales-for-physicists/</link><pubDate>Thu, 30 Sep 2004 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2004/09/29/used-car-sales-for-physicists/</guid><description>&lt;p&gt;I was talking to my coworker Jane today, who mentioned in passing that her car has over
480,000km on the clock. My first response was, &amp;ldquo;Hey! Just another 110K before you hit its second
light second!&amp;rdquo; Drop the &amp;ldquo;light,&amp;rdquo; because it&amp;rsquo;s assumed, and you can quote your car&amp;rsquo;s odometer in
seconds.&lt;/p&gt;
&lt;p&gt;This got me to thinking more deeply, though. Geochronologists use a method called fission-track
dating (along with a battery of others) to measure the age of rock samples. When unstable
elements (such as U_238) decay spontaneously inside rocks, they leave short tracks of damage in
the crystals. Since the decay rate for a given element is constant, counting the number of
tracks in a rock sample lets you estimate the age of the sample.&lt;/p&gt;</description></item><item><title>Bush, Kerry could learn a few things from Cian</title><link>https://www.serpentine.com/2004/09/23/bush-kerry-could-learn-a-few-things-from-cian/</link><pubDate>Thu, 23 Sep 2004 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2004/09/23/bush-kerry-could-learn-a-few-things-from-cian/</guid><description>&lt;p&gt;Yesterday, when Shannon picked Cian up from preschool, he complained loudly and at length about his ears hurting. As is his wont when not feeling well, he proceeded to scream bloody inchoate murder, while she tried to secure an appointment with his paediatrician.&lt;/p&gt;
&lt;p&gt;When finally she dragged (I believe this is literally what happened) him to the doctor&amp;rsquo;s examination room, she had to pin his bad wriggly self down so that the nurse could take his temperature with one of those infrared in-ear thermometer things (not the right scientific designation, I know). Whereupon the cherub held forth with his opinions.&lt;/p&gt;</description></item><item><title>Ghost in the house</title><link>https://www.serpentine.com/2004/09/19/ghost-in-the-house/</link><pubDate>Sun, 19 Sep 2004 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2004/09/19/ghost-in-the-house/</guid><description>&lt;p&gt;Robert came by this evening. &amp;ldquo;I went to see &lt;em&gt;Ghost in the Shell II&lt;/em&gt; last night,&amp;rdquo; he said. &amp;ldquo;Definitely two cybernetic, depleted uranium, thumbs up.&amp;rdquo;&lt;/p&gt;</description></item><item><title>Maybe phone cameras aren’t so bad, after all</title><link>https://www.serpentine.com/2004/09/17/maybe-phone-cameras-arent-so-bad-after-all/</link><pubDate>Fri, 17 Sep 2004 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2004/09/17/maybe-phone-cameras-arent-so-bad-after-all/</guid><description>&lt;p&gt;Although the image quality of the built-in phone that my camera sports is generally abysmal,
sometimes the poor resolution and washed-out colours add a certain tone to the images that I end
up liking rather a lot, much as people seem to be very fond of those old &lt;a href="https://web.archive.org/web/20050420090013/http://elvis.rowan.edu:80/~cassidy/pixel/"&gt;Fisher Price
cameras&lt;/a&gt; that record to audio cassette.&lt;/p&gt;
&lt;p&gt;!!&lt;/p&gt;</description></item><item><title>It’s (they’re) ours!</title><link>https://www.serpentine.com/2004/09/16/its-theyre-ours/</link><pubDate>Thu, 16 Sep 2004 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2004/09/16/its-theyre-ours/</guid><description>&lt;p&gt;We signed the final paperwork on the new properties last night. I remain impressed by how little my signature at the beginning of a signing session resembles itself forty repetitions later.&lt;/p&gt;
&lt;p&gt;Shannon and I spent tonight drawing floor plans on graph paper. I thought that I was fairly indifferent to my surroundings, preferring to live inside my head, but it turns out that I ignore the walls around me only when I have no control over them. Give me a pencil and an eraser, and suddenly I&amp;rsquo;m the Tyrant of the Basement.&lt;/p&gt;</description></item><item><title>Never trust a pen-and-ink real estate drawing</title><link>https://www.serpentine.com/2004/09/11/never-trust-a-pen-and-ink-real-estate-drawing/</link><pubDate>Sat, 11 Sep 2004 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2004/09/11/never-trust-a-pen-and-ink-real-estate-drawing/</guid><description>&lt;p&gt;On the left, we have the image that was published with the listing for the new property. On the
right, a picture of the actual place. While the pen-and-ink drawing makes the property look
quite attractive, the photo fails to make the place look as decrepit and sad as it appears when
you actually walk around it.&lt;/p&gt;
&lt;p&gt;For example, you can&amp;rsquo;t see that the rails on the steps are &lt;em&gt;wire-wrapped onto their posts&lt;/em&gt;. The
photo also fails to show that most of the left side of the house in the drawing is &lt;em&gt;invisible&lt;/em&gt;
from the street, as zero lot lines cause the neighbouring property to abut it.&lt;/p&gt;</description></item><item><title>Blowing off the dust</title><link>https://www.serpentine.com/2004/09/09/blowing-off-the-dust/</link><pubDate>Thu, 09 Sep 2004 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2004/09/09/blowing-off-the-dust/</guid><description>&lt;p&gt;I decided to resurrect the blog this evening, after a mere 18 months of inactivity. I thought it
would be a simple matter of fiddling with a few Apache configuration directives; as I should
have expected, it turned into a heinous nightmare.&lt;/p&gt;
&lt;p&gt;I originally settled on Rael Dornfest&amp;rsquo;s &lt;a href="http://www.blosxom.com"&gt;blosxom&lt;/a&gt; blogging software.
It&amp;rsquo;s conceptually lovely, being both simple and flexible. Unfortunately, my original
installation bit-rotted to an unmourned death after a server move, so I had to resurrect it.&lt;/p&gt;</description></item><item><title>So much for product labelling</title><link>https://www.serpentine.com/2003/02/19/so-much-for-product-labelling/</link><pubDate>Wed, 19 Feb 2003 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2003/02/19/so-much-for-product-labelling/</guid><description>&lt;p&gt;In a mild frenzy over an apparently bad network card on my file server, I ran to Fry&amp;rsquo;s the other day, and picked up a Netgear FA-311 network card to replace the presumed dead card. Bad idea. Although the box clearly states that the FA-311 works under Linux, it doesn&amp;rsquo;t. You can download an elderly natsemi driver from Netgear&amp;rsquo;s web site, and it won&amp;rsquo;t work. The PCI ID of the card appears to be totally bogus, too. Sigh. The real lesson, though, is that home-crimped network cables are fragile. The old network card was fine, as it turned out; it just took me forever to get around to suspecting the cable itself.&lt;/p&gt;</description></item><item><title>First post!</title><link>https://www.serpentine.com/2003/02/14/first-post/</link><pubDate>Sat, 15 Feb 2003 00:00:00 +0000</pubDate><guid>https://www.serpentine.com/2003/02/14/first-post/</guid><description>&lt;p&gt;Shoot me now.&lt;/p&gt;</description></item></channel></rss>