<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>teideal glic deisbhéalach &#187; hardware</title>
	<atom:link href="http://www.serpentine.com/blog/category/hardware/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.serpentine.com/blog</link>
	<description>Bryan O&#039;Sullivan&#039;s blog</description>
	<lastBuildDate>Thu, 01 Dec 2011 16:53:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Functional programmers on Twitter</title>
		<link>http://www.serpentine.com/blog/2008/12/05/functional-programmers-on-twitter/</link>
		<comments>http://www.serpentine.com/blog/2008/12/05/functional-programmers-on-twitter/#comments</comments>
		<pubDate>Fri, 05 Dec 2008 19:11:03 +0000</pubDate>
		<dc:creator>Bryan O'Sullivan</dc:creator>
				<category><![CDATA[hardware]]></category>
		<category><![CDATA[slice-o-life]]></category>

		<guid isPermaLink="false">http://www.serpentine.com/blog/?p=294</guid>
		<description><![CDATA[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. Here is a list of people I know about who tweet about FP [...]]]></description>
			<content:encoded><![CDATA[<p>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.</p>
<p>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.</p>
<p><a href="http://www.twitter.com/bos31337">Bryan O&#8217;Sullivan (bos31337)</a> &#8211; Haskell<br />
<a href="http://www.twitter.com/aChrisSmith">Chris Smith (aChrisSmith)</a> &#8211; F#<br />
<a href="http://www.twitter.com/al3x">Alex Payne (al3x)</a> &#8211; Scala<br />
<a href="http://www.twitter.com/allberry_b">Brandon Allberry (allberry_b)</a> &#8211; Haskell<br />
<a href="http://www.twitter.com/alpheccar">alpheccar</a> &#8211; Haskell<br />
<a href="http://www.twitter.com/andrepang">Andre Pang (andrepang)</a> &#8211; Erlang<br />
<a href="http://www.twitter.com/arnarbi">Arnar Birgisson (arnarbi)</a> &#8211; Haskell<br />
<a href="http://www.twitter.com/boorad">Brad Anderson (boorad)</a> &#8211; Erlang<br />
<a href="http://www.twitter.com/chriseidhof">Chris Eidhof (chriseidhof)</a> &#8211; Haskell<br />
<a href="http://www.twitter.com/conal">Conal Elliott (conal)</a> &#8211; Haskell<br />
<a href="http://www.twitter.com/conradparker">Conrad Parker (conradparker)</a> &#8211; Haskell<br />
<a href="http://www.twitter.com/deanwampler">Dean Wampler (deanwampler)</a> &#8211; Scala<br />
<a href="http://www.twitter.com/donsbot">Don Stewart (donsbot)</a> &#8211; Haskell<br />
<a href="http://www.twitter.com/dpp">Dave Pollak (dpp)</a> &#8211; Scala<br />
<a href="http://www.twitter.com/DRMacIver">David MacIver (DRMacIver)</a> &#8211; Scala<br />
<a href="http://www.twitter.com/eeclo">Eelco Lempsink (eeclo)</a> &#8211; Haskell<br />
<a href="http://www.twitter.com/etrepum">Bob Ippolito (etrepum)</a> &#8211; Erlang<br />
<a href="http://www.twitter.com/galoisinc">Galois, Inc. (galoisinc)</a> &#8211; Haskell<br />
<a href="http://www.twitter.com/geezusfreeek">Jake McArthur (geezusfreeek)</a> &#8211; Haskell<br />
<a href="http://www.twitter.com/hate_pick_pick">Pepe Iborra (hate_pick_pick)</a> &#8211; Haskell<br />
<a href="http://www.twitter.com/jgoerzen">John Goerzen (jgoerzen)</a> &#8211; Haskell<br />
<a href="http://www.twitter.com/jkalucki">John Kalucki (jkalucki)</a> &#8211; Scala<br />
<a href="http://www.twitter.com/jkff">Eugene Kirpichov (jkff)</a> &#8211; Haskell<br />
<a href="http://www.twitter.com/jorgeortiz85">Jorge Ortiz (jorgeortiz85)</a> &#8211; Scala<br />
<a href="http://www.twitter.com/josephholsten">Joseph Holsten (josephholsten)</a> &#8211; FP<br />
<a href="http://www.twitter.com/justinsheehy">Justin Sheehy (justinsheehy)</a> &#8211; Erlang<br />
<a href="http://www.twitter.com/kazooya">Kazuya Sakakihara (kazooya)</a> &#8211; Haskell<br />
<a href="http://www.twitter.com/kevsmith">Kevin Smith (kevsmith)</a> &#8211; Erlang<br />
<a href="http://www.twitter.com/kirindave">Dave Fayram (kirindave)</a> &#8211; Erlang<br />
<a href="http://www.twitter.com/kmett">Edward Kmett (kmett)</a> &#8211; Haskell<br />
<a href="http://www.twitter.com/kscaldef">Kevin Scaldeferri (kscaldef)</a> &#8211; Erlang<br />
<a href="http://www.twitter.com/mattpodwysocki">Matthew Podwysocki (mattpodwysocki)</a> &#8211; F#, Haskell<br />
<a href="http://www.twitter.com/mdreid">Mark Reid (mdreid)</a> &#8211; Haskell<br />
<a href="http://www.twitter.com/mickael">MickaÃ«l RÃ©mond (mickael)</a> &#8211; Erlang<br />
<a href="http://www.twitter.com/morabbin">Andy Adams-Moran (morabbin)</a> &#8211; Haskell<br />
<a href="http://www.twitter.com/njbartlett">Neil Bartlett (njbartlett)</a> &#8211; Haskell<br />
<a href="http://www.twitter.com/ngerakines">Nick Gerakines (ngerakines)</a> &#8211; Erlang<br />
<a href="http://www.twitter.com/paulrbrown">Paul Brown (paulrbrown)</a> &#8211; Haskell<br />
<a href="http://www.twitter.com/psnively">Paul Snively (psnively)</a> &#8211; OCaml<br />
<a href="http://www.twitter.com/rklophaus">Rusty Klophaus (rklophaus)</a> &#8211; Erlang<br />
<a href="http://www.twitter.com/robey">Robey Pointer (robey)</a> &#8211; Scala<br />
<a href="http://www.twitter.com/shapr">Shae Erisson (shapr)</a> &#8211; Haskell<br />
<a href="http://www.twitter.com/sigbjorn_finne">Sigbjorn Finne (sigbjorn_finne)</a> &#8211; Haskell<br />
<a href="http://www.twitter.com/sigfpe">Dan Piponi (sigfpe)</a> &#8211; Haskell<br />
<a href="http://www.twitter.com/spencerjanssen">Spencer Janssen (spencerjanssen)</a> &#8211; Haskell<br />
<a href="http://www.twitter.com/stevej">Steve Jenson (jenson)</a> &#8211; Scala</p>
<p><a href="http://www.twitter.com/SyntaxPolice">Isaac Jones (SyntaxPolice)</a> &#8211; Haskell<br />
<a href="http://www.twitter.com/TacticalGrace">Manuel Chakravarty (TacticalGrace)</a> &#8211; Haskell<br />
<a href="http://www.twitter.com/tmoertel">Tom Moertel (tmoertel)</a> &#8211; Haskell<br />
<a href="http://www.twitter.com/thsutton">Thomas Sutton (thsutton)</a> &#8211; Haskell<br />
<a href="http://www.twitter.com/wagerlabs">Joel Reymont (wagerlabs)</a> &#8211; Erlang<br />
<a href="http://www.twitter.com/wchogg">Creighton Hogg (wchogg)</a> &#8211; Haskell<br />
<a href="http://www.twitter.com/williamsjoe">Joe Williams (williamsjoe)</a> &#8211; Erlang<br />
<a href="http://www.twitter.com/yarivs">Yariv Sadan (yarivs)</a> &#8211; Erlang</p>
]]></content:encoded>
			<wfw:commentRss>http://www.serpentine.com/blog/2008/12/05/functional-programmers-on-twitter/feed/</wfw:commentRss>
		<slash:comments>38</slash:comments>
		</item>
		<item>
		<title>Fedora 7 on a Thinkpad X60: not so hot</title>
		<link>http://www.serpentine.com/blog/2007/06/20/fedora-7-on-a-thinkpad-x60-not-so-hot/</link>
		<comments>http://www.serpentine.com/blog/2007/06/20/fedora-7-on-a-thinkpad-x60-not-so-hot/#comments</comments>
		<pubDate>Thu, 21 Jun 2007 06:54:07 +0000</pubDate>
		<dc:creator>Bryan O'Sullivan</dc:creator>
				<category><![CDATA[hardware]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://www.serpentine.com/blog/2007/06/20/fedora-7-on-a-thinkpad-x60-not-so-hot/</guid>
		<description><![CDATA[I&#8217;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&#8217;s a brief summary of my experiences. I&#8217;ve been using Fedora since 0.92 (Taroon), and while I&#8217;ve generally been happy with it, F7 is not exactly a model of stability [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;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&#8217;s a brief summary of my experiences.</p>

<p>I&#8217;ve been using Fedora since 0.92 (Taroon), and while I&#8217;ve generally
been happy with it, F7 is not exactly a model of stability or
sleekness.  Here&#8217;s a list of problems I&#8217;ve run into.  My biggest
problems so far have been with suspend and resume, and network
drivers.</p>

<p>Suspend to RAM doesn&#8217;t work by default; when I resume, the screen is
blank, and can&#8217;t be coaxed back to life save through a reboot.  This
is <a href="https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=243759">bug
243759</a>.
I came up with a fix (for my hardware, at least) in <a href="https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=237849">bug
237849</a>.
Richard Hughes&#8217;s fabulous <a href="http://people.freedesktop.org/~hughsient/quirk/index.html">HAL quirk
site</a> was
the key to figuring out that one; thanks, Richard!</p>

<p>Suspend to disk (aka &#8220;hibernate&#8221;) works, some of the time.  But it
interacts poorly with the crummy quality of the current <code>e1000</code>
ethernet driver.</p>

<p>The <code>e1000</code> driver is flaky in F7.  If I boot with a live ethernet
cable plugged in, it works.  But if I plug one in <em>after</em> booting, it
fails to detect the carrier signal, and simply never notices the
cable.  <a href="https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=236956">Bug
236956</a>.</p>

<p>There is a workaround, of sorts.  If I manually <code>rmmod</code>, then
<code>modprobe</code> the driver again, it will detect the carrier signal.
Unfortunately, after I do this, the next time that I try to suspend to
disk, all of my network-related processes get stuck in an unkillable
state, and suspend throws in the towel.  <a href="https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=245107">Bug
245107</a>.</p>

<p>If I try to use the screen backlight brightness control buttons, the
screen goes black instead.  <a href="https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=220466">Bug
220466</a>.</p>

<p>If I disable the internal modem in the BIOS, sound no longer works.
<a href="https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=205603">Bug
205603</a>.</p>

<p>The new <code>iwl3945</code> wireless driver simply falls over after a while,
depending on the network configuration it&#8217;s talking to.  <a href="https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=240826">Bug
240826</a>.</p>

<p>By the way, I&#8217;m not claiming that these problems are in any way the
fault of Dave Jones, Chuck Ebbert, the HAL guys, or other Fedora
maintainers.  They have a thankless job trying to clean up the endless
flood of new bugs in upstream kernels, not to mention cascades of junk
hardware and buggy BIOSes from vendors.  I&#8217;m frankly relieved every
time the kernel boots reliably at all.</p>

<p>On top of these stability and reliability problems, performance has
taken a bit of a beating.  F7 seems to take quite a bit longer than
earlier releases to boot, something <a href="http://kernelslacker.livejournal.com/81262.html">Dave Jones has
quantified</a>.  The
post-boot bloat also rises: there are more kernel threads and
userspace daemons running than ever before.</p>

<p>On the positive side, 3D graphics works quite well.  I can actually
run OpenGL apps like Google Earth and Second Life without crashes, and
get decent frame rates out of them.  And of course I can turn on wobbly windows and
induce vertigo and nausea within minutes, where previously I had to
resort to using Windows to get that sensation.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.serpentine.com/blog/2007/06/20/fedora-7-on-a-thinkpad-x60-not-so-hot/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A quick programmer&#8217;s look at NVIDIA&#8217;s CUDA</title>
		<link>http://www.serpentine.com/blog/2007/02/22/a-quick-programmers-look-at-nvidias-cuda/</link>
		<comments>http://www.serpentine.com/blog/2007/02/22/a-quick-programmers-look-at-nvidias-cuda/#comments</comments>
		<pubDate>Thu, 22 Feb 2007 08:06:31 +0000</pubDate>
		<dc:creator>Bryan O'Sullivan</dc:creator>
				<category><![CDATA[hardware]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.serpentine.com/blog/2007/02/22/a-quick-programmers-look-at-nvidias-cuda/</guid>
		<description><![CDATA[I spent a while this evening reading through the documentation for the beta release of NVIDIA&#8217;s CUDA GPGPU system. My motivation for this was that nvcc, the CUDA compiler, is based on a code drop of the EkoPath compiler, which I&#8217;ve worked on intermittently over the past few years. The programming model that these GPUs [...]]]></description>
			<content:encoded><![CDATA[<p>I spent a while this evening reading through the documentation for the
beta release of <a href="http://developer.nvidia.com/object/cuda.html">NVIDIA&#8217;s
CUDA</a> GPGPU system.  My
motivation for this was that <code>nvcc</code>, the CUDA compiler, is based on a
code drop of the <a href="http://www.pathscale.com/ekopath.html">EkoPath</a>
compiler, which I&#8217;ve worked on intermittently over the past few years.</p>

<p>The <a href="http://developer.download.nvidia.com/compute/cuda/0_8/NVIDIA_CUDA_Programming_Guide_0.8.pdf
" title="CUDA Programming Guide [PDF]">programming
model</a> that these GPUs enforce is incredibly
complex.  It&#8217;s more than a little reminiscent of the Connection
Machine (for a blast from the past, see a <a href="http://bradley.csail.mit.edu/cm5docs/">collection of scanned CM-5
documentation</a>.</p>

<p>The idea is that the GPU executes a &#8220;kernel&#8221; of compute-intensive,
highly parallelisable, code on behalf of the CPU.  Data is transferred
to the GPU when a kernel starts to execute, and back to the host when
it completes.  The GPU may execute multiple kernels simultaneously, if
it is capable of it.</p>

<p>A kernel is executed as a collection of threads, with threads
organised into &#8220;blocks&#8221;.  The blocks are further organised into
&#8220;grids&#8221;.  Each thread has thread-local storage, and a block of threads
shares a chunk read-write memory.  This is how they communicate and
synchronise with each other.  Threads can also access the GPU&#8217;s global
memory, although blocks of threads cannot synchronise with each other
via global memory.</p>

<p>Global memory has a pile of constraints.  There&#8217;s not one single kind
of global memory; instead, there are three.  Unlike the thread-local
and block-shared memories, global memories can be accessed by the host
(although accesses are expensive).</p>

<ul>
<li><p>Plain old read-write memory.  Accesses to this memory are not
cached.  When a thread block is scheduled to execute, and accesses
global memory, its performance is heavily penalised if threads don&#8217;t
access global memory in a suitable pattern (see section 6.1.2.1 of
the Programming Guide).</p></li>
<li><p>&#8220;Constant&#8221; memory is read-only, and reads are cached.  Again, there
are restrictions on access patterns to constant memory that affect
performance.</p></li>
<li><p>&#8220;Texture&#8221; memory is also read-only, and cached.  Cached texture data
is laid out to give best performance for 2D access patterns.</p></li>
</ul>

<p>Block-shared memory isn&#8217;t immune to peculiar performance constraints,
either.  It&#8217;s organised into &#8220;banks&#8221;, to allow parallel access to
multiple banks in a single operation.  In other words, <em>n</em> threads can
access <em>n</em> banks in one cycle.  However, concurrent accesses to a
single bank are forcibly serialised, so <em>n</em> threads hitting a single
bank will take <em>n</em> cycles.</p>

<p>So at every level of the GPU memory hierarchy, there are multiple
factors that you have to keep in mind if you want to achieve good
performance.</p>

<p>The extensions that NVIDIA has made to the C language are fairly
minimal.  There are some new keywords to control layout of data, to
determine where variables should live in the memory hierarchy.  Not
surprisingly, there are new vector types that look very much like
OpenGL vector types.</p>

<p>A few similar keywords control function layout.  Functions can be
marked as device accessible only, resident on the device but called
from the host (i.e. a kernel), or host-only.  A weird piece of syntax
`&lt;&lt;&lt; Dg, Db, Ns >>>&#8217; is required when calling a kernel, to control the
execution parameters for the kernel: grid size, block size (and number
of threads), and memory allocation.</p>

<p>With hardware of this complexity, a good optimising compiler can make
a substantial difference to application performance.  The heritage of
NVCC is unimpeachable.  It&#8217;s based on the EkoPath compiler, which has
been the most frequent compiler used for SPEC benchmark submissions by
AMD64 hardware vendors for several years.  The EkoPath compiler was in
turn based on Open64, a compiler that SGI GPLed when it dropped out of
the compiler business.</p>

<p>Among the memory hierarchy related optimisations in the Open64
compiler family that are available to NVCC are the following (this is
just a short list of highlights; the real number is <em>big</em>).  I don&#8217;t
know how many of these are enabled in NVCC, nor do I know enough about
individual cache sizes or miss penalties to have a clue as to which
ones are likely to be effective.</p>

<ul>
<li><p>Loop nest optimisation.  For a set of nested loops, this can change
the order in which the inner and outer loops are executed, to
improve the pattern of access to memory.</p></li>
<li><p>Vectorised intrinsics.  If application code is, for example,
computing <code>sin(x[i])</code> for all <code>i</code> in a vector, the compiler can
replace this with a single call to a highly optimised <code>sin</code>
specialised for vectors.</p></li>
<li><p>Cache blocking.  Replace a single loop over a large vector with
smaller loops that operate on cache-sized chunks of the vector.</p></li>
</ul>

<p>Given the degree of manual control over variable placement that
NVIDIA&#8217;s C extensions seem to enforce, it&#8217;s not clear to me that their
compiler team has had a chance to automate any of the transfer of data
between levels of the memory hierarchy yet.</p>

<p>I also find it telling that the programmer&#8217;s guide includes specific
guidelines on how to avoid bank conflicts in block-shared memory,
where in at least some of these cases it&#8217;s clear that the compiler
could be automating the job.</p>

<p>It&#8217;s worth reading the programmer&#8217;s guide in its entirety to get a
sense of just how complex CUDA is, and how many different constraints
the determined application programmer will have to keep in mind at a
time.  There&#8217;s not a lot of abstraction going on here (vendor-provided
BLAS and FFT libraries notwithstanding).</p>

<p>We have plenty of previous examples of hardware that failed to live up
to their early marketing promise, from the i860 to the PS3.  CUDA
looks set to follow in their footsteps: I expect that it will take
<em>vast</em> amounts of work for programmers to get halfway decent
performance out of a CUDA application, and that few will achieve more
than 10% of theoretical peak performance.</p>

<p>People with the expertise, persistence, and bloody-mindedness to keep
slogging away will undoubtedly see phenomenal speedups for some
application kernels.  I&#8217;m sure that the DOE and NSA, in particular,
are drooling over this stuff, as are the quants on Wall Street.  But
those groups have a tolerance for pain that is fairly unique.  This
technology is a <em>long</em> way from anything like true accessibility, even
to those already versed with parallel programming using environments
like MPI or OpenMP.  Still, it&#8217;s a great first step.</p>

<p>&#8220;Now, imagine a Beowulf cluster of these!&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.serpentine.com/blog/2007/02/22/a-quick-programmers-look-at-nvidias-cuda/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Sony Ericsson Z520a phone review</title>
		<link>http://www.serpentine.com/blog/2006/12/22/sony-ericsson-z520a-phone-review/</link>
		<comments>http://www.serpentine.com/blog/2006/12/22/sony-ericsson-z520a-phone-review/#comments</comments>
		<pubDate>Fri, 22 Dec 2006 20:05:25 +0000</pubDate>
		<dc:creator>Bryan O'Sullivan</dc:creator>
				<category><![CDATA[hardware]]></category>

		<guid isPermaLink="false">http://www.serpentine.com/blog/2006/12/22/sony-ericsson-z520a-phone-review/</guid>
		<description><![CDATA[I&#8217;ve had a Sony Ericsson Z520a phone for a little under a year now, and as it&#8217;s still widely available through cellular carriers, I thought I&#8217;d write up my experiences with it. I&#8217;m writing in part as a reaction to the weakness of phone review web sites, which tend to publish reviews from people who&#8217;ve [...]]]></description>
			<content:encoded><![CDATA[I&#8217;ve had a Sony Ericsson Z520a phone for a little under a year now, and as it&#8217;s still widely available through cellular carriers, I thought I&#8217;d write up my experiences with it.

I&#8217;m writing in part as a reaction to the weakness of phone review web sites, which tend to publish reviews from people who&#8217;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: <a target="_blank" href="http://reviews.cnet.com/Sony_Ericsson_Z520a/4505-6454_7-31597365.html">CNET&#8217;s review of the Z520a</a>, which cites the crummy picture quality, but doesn&#8217;t note much else, and gives the phone a &#8220;very good&#8221; rating.

First, a few positive observations. Call quality is generally decent, and I&#8217;ve had fewer problems with dropout than with my previous phone. Battery life is impressive, at about five days, and it hasn&#8217;t diminished noticeably over the year I&#8217;ve been using the phone.

The phone&#8217;s user interface is only indifferently responsive. It takes a perceptible fraction of a second to respond to keypresses. The lag isn&#8217;t enough to be a serious problem; it&#8217;s more of a peeve.

The Z520a is a clamshell phone, and it&#8217;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&#8217;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&#8217;s fine design, I take upwards of half a dozen photos of the inside of my pocket every day. As if that weren&#8217;t insult enough, the volume control rocker button can&#8217;t take the abuse of sitting in a pocket, and my &#8220;increase volume&#8221; button <em>no longer works at all</em>. I somehow managed to avoid fat-fingering the &#8220;decrease volume&#8221; 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 <em>during a call</em> (they do nothing useful when the phone is in standby mode); there&#8217;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&#038;T&#8217;s mangling of the user interface. At every level of menu hierarchy, the first option I&#8217;m presented with is to visit AT&#038;T&#8217;s mobile web site to buy ringtones, pictures (who the hell buys <em>pictures</em> from their cellular provider?), and other stuff I don&#8217;t want. And accidentally fat-fingering such a menu item means that I&#8217;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&#8217;m in an empty, silent room. If it weren&#8217;t for the side controls, I&#8217;d actually call it a reasonably decent phone, but it snatches defeat from the jaws of victory to get a default score of &#8220;crap&#8221; instead.]]></content:encoded>
			<wfw:commentRss>http://www.serpentine.com/blog/2006/12/22/sony-ericsson-z520a-phone-review/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Refilling a missed TLB entry, now with special sauce</title>
		<link>http://www.serpentine.com/blog/2006/12/22/refilling-a-missed-tlb-entry-now-with-special-sauce/</link>
		<comments>http://www.serpentine.com/blog/2006/12/22/refilling-a-missed-tlb-entry-now-with-special-sauce/#comments</comments>
		<pubDate>Fri, 22 Dec 2006 17:53:45 +0000</pubDate>
		<dc:creator>Bryan O'Sullivan</dc:creator>
				<category><![CDATA[hardware]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.serpentine.com/blog/2006/12/22/refilling-a-missed-tlb-entry-now-with-special-sauce/</guid>
		<description><![CDATA[Jeremy and Muli remind me that x86-class CPUs refill a missed TLB entry in hardware. That&#8217;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 [...]]]></description>
			<content:encoded><![CDATA[<a target="_blank" href="http://www.goop.org/~jeremy/">Jeremy</a> and <a target="_blank" href="http://mulix.livejournal.com/">Muli</a> remind me that x86-class CPUs refill a missed TLB entry in hardware. That&#8217;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&#8217;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&#8217;t if the L1 cache contains physical addresses (which is called <em>physical indexing</em>). 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.]]></content:encoded>
			<wfw:commentRss>http://www.serpentine.com/blog/2006/12/22/refilling-a-missed-tlb-entry-now-with-special-sauce/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The translation lookaside buffer</title>
		<link>http://www.serpentine.com/blog/2006/12/21/the-translation-lookaside-buffer/</link>
		<comments>http://www.serpentine.com/blog/2006/12/21/the-translation-lookaside-buffer/#comments</comments>
		<pubDate>Fri, 22 Dec 2006 06:43:22 +0000</pubDate>
		<dc:creator>Bryan O'Sullivan</dc:creator>
				<category><![CDATA[hardware]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://www.serpentine.com/blog/2006/12/21/the-translation-lookaside-buffer/</guid>
		<description><![CDATA[In an earlier post, I briefly discussed the oprofile system profiler. I was going somewhere with that; here&#8217;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 [...]]]></description>
			<content:encoded><![CDATA[In an earlier post, <a target="_blank" href="http://www.serpentine.com/blog/2006/12/17/make-linux-performance-analysis-easier-with-oprofile/">I briefly discussed</a> the oprofile system profiler. I was going somewhere with that; here&#8217;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 <em>translation lookaside buffer</em>, 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 <em>iTLB</em> and <em>dTLB</em>.)

The number of pages that a TLB can translate at once is called its <em>range</em>. With a 4KB page size and 512 entries, a TLB has a range of 2MB. The 2MB doesn&#8217;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 <em>TLB miss</em>. (If there <em>is</em> an entry in the TLB, a successful lookup is called a <em>hit</em>.)

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 <em>trap</em>. 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 <em>TLB miss handler</em>, and it&#8217;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&#8217;ll return to the subjects of TLB size, page size, and oprofile soon.]]></content:encoded>
			<wfw:commentRss>http://www.serpentine.com/blog/2006/12/21/the-translation-lookaside-buffer/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Make Linux happy with a modern laptop&#8217;s CD/DVD drive</title>
		<link>http://www.serpentine.com/blog/2006/12/12/make-linux-happy-with-a-modern-laptops-cddvd-drive/</link>
		<comments>http://www.serpentine.com/blog/2006/12/12/make-linux-happy-with-a-modern-laptops-cddvd-drive/#comments</comments>
		<pubDate>Wed, 13 Dec 2006 00:39:37 +0000</pubDate>
		<dc:creator>Bryan O'Sullivan</dc:creator>
				<category><![CDATA[hardware]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://www.serpentine.com/blog/2006/12/12/make-linux-happy-with-a-modern-laptops-cddvd-drive/</guid>
		<description><![CDATA[If you&#8217;re using a fairly modern laptop with an Intel chipset, the chances are that it has an Intel ICH7 I/O controller hub: $ lspci &#124; 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 [...]]]></description>
			<content:encoded><![CDATA[If you&#8217;re using a fairly modern laptop with an Intel chipset, the chances are that it has an Intel ICH7 I/O controller hub:
<pre><code>$ lspci | grep -i ide</code></pre>
<pre><code>00:1f.2 IDE interface: Intel Corporation 82801GBM/GHM (ICH7 Family) Serial ATA Storage Controller IDE (rev 01)</code></pre>
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 <tt>/dev/cdrom</tt>:
<pre><code>$ ls -l /dev/cdrom</code></pre>
<pre><code>lrwxrwxrwx 1 root root 4 Dec 12 13:23 /dev/cdrom -> hdc</code></pre>
If the text after the &#8220;<tt>-></tt>&#8221; arrow starts with &#8220;<tt>hd</tt>&#8221; as above, the IDE controller owns your CD-ROM/DVD drive.

Everything might initially look okay, because the CD-ROM/DVD drive will appear to work normally, but performance will turn out to be awful: try to play a CD or DVD, and you&#8217;ll see your notionally speedy laptop crawl nearly to a halt.

If you&#8217;ve used Linux on previous generations of laptops, you&#8217;ll know enough to check the output of the hdparm command, to see if the kernel has DMA enabled on the CD-ROM/DVD drive. It will say no, whereupon you might try to force the kernel to use DMA, and be stumped when it refuses.

The reason this doesn&#8217;t work is that the ICH7 hub is emulating an IDE device, and the Linux IDE driver doesn&#8217;t know how to configure it to use DMA. Never fear; you don&#8217;t need to do this at all.

Instead, configure your kernel to use the newer libata driver to control the CD-ROM/DVD drive. To do this, you&#8217;ll need to modify the kernel&#8217;s boot command line. On Fedora systems, edit <tt>/etc/grub.conf</tt> (this file will have a different name under other Linux distros), and look for the first line that starts with  bit of white space, followed by the word &#8220;<tt>kernel</tt>&#8220;. Append the following string to it: &#8220;<tt>combined_mode=libata</tt>&#8220;.

That line of your <tt>grub</tt> config file will now look more like this (for god&#8217;s sake, don&#8217;t make a literal copy of my kernel command line; it won&#8217;t work for you!):
<pre><code>kernel /vmlinuz-2.6.18-1.2849.fc6 ro root=LABEL=/ rhgb quiet combined_mode=libata</code></pre>
Reboot your laptop, and you should find that <tt>/dev/cdrom</tt> no longer points at something starting with &#8220;<tt>hd</tt>&#8220;:
<pre><code>$ ls -l /dev/cdrom</code></pre>
<pre><code>lrwxrwxrwx 1 root root 4 Dec 12 16:10 /dev/cdrom -> scd0</code></pre>
The &#8220;<tt>scd0</tt>&#8221; string means that libata is now managing the CD-ROM/DVD drive. You should now get great performance for CD and DVD playing, without it dragging down the interactive performance of your laptop.]]></content:encoded>
			<wfw:commentRss>http://www.serpentine.com/blog/2006/12/12/make-linux-happy-with-a-modern-laptops-cddvd-drive/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Linux on the Dell XPS M1210</title>
		<link>http://www.serpentine.com/blog/2006/10/18/linux-on-the-dell-xps-m1210/</link>
		<comments>http://www.serpentine.com/blog/2006/10/18/linux-on-the-dell-xps-m1210/#comments</comments>
		<pubDate>Thu, 19 Oct 2006 02:43:42 +0000</pubDate>
		<dc:creator>Bryan O'Sullivan</dc:creator>
				<category><![CDATA[hardware]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://home.serpentine.com/blog/2006/10/18/linux-on-the-dell-xps-m1210/</guid>
		<description><![CDATA[Since 2003, I&#8217;d been using a Thinkpad X31 for much of my work; it was the best laptop I&#8217;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 [...]]]></description>
			<content:encoded><![CDATA[Since 2003, I&#8217;d been using a Thinkpad X31 for much of my work; it was the best laptop I&#8217;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&#8217;t quite die, but it became increasingly erratic.  It was clear that I&#8217;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 <a href="http://www.selenic.com/mercurial">distributed development tools</a>, I lost maybe an hour of work in total, but I was now nervous.  I couldn&#8217;t rely on it any longer.

Since my <a href="http://www.pathscale.com/">employers</a> recently got <a href="http://www.qlogic.com/">bought out</a>, and our new corporate IT standards almost mandate the purchase of Dell hardware, I looked through Dell&#8217;s laptop line for a suitable replacement.  In my ideal world, I&#8217;d have preferred a Thinkpad X60 to any Dell, but I wasn&#8217;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&#8217;s current product lineup is the XPS M1210.  It&#8217;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 â€œbonus GPUâ€, 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&#8217;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 <a href="http://ipw3945.sourceforge.net/">Intel 3945</a> driver worked without a problem, although it has a clumsy installation mechanism and nobody has volunteered to package it for the <a href="http://rpm.livna.org/">livna</a> package repository yet.

Indeed, the 3945 seems to have several better characteristics than the <a href="http://madwifi.org/">Atheros</a> wifi hardware I&#8217;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&#8217;ve tried, using <a href="http://www.gnome.org/projects/NetworkManager/">NetworkManager</a>. The Atheros chip wouldn&#8217;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&#8217;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&#8217;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 â€œreal workâ€.

The only downside to the upgrade has been that NVIDIA hasn&#8217;t updated its proprietary drivers to handle the newest X.org ABI or kernel build infrastructure, so they don&#8217;t work with fc6t1; another good reason to prefer not to use proprietary drivers.  For now, at least, I&#8217;m back to running the open nv driver for graphics.  I can&#8217;t discern a speed difference for the kind of stuff I do (lots of terminals, Emacs, and Firefox), and it&#8217;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?
<ul>
	<li>2.16GHz Intel Core Duo CPU</li>
	<li>2GB RAM</li>
	<li>120GB SATA hard disk</li>
	<li>GeForce 7400 Go GPU</li>
	<li>1280&#215;800 gloss-finish display</li>
	<li>Intel HG audio chipset</li>
	<li>Synaptics touchpad</li>
	<li>Intel 3945 A/B/G wireless mini-PCIE card</li>
	<li>CD-RW/DVD-ROM</li>
	<li>1 Firewire port, Ricoh chipset</li>
	<li>4 USB 2.0 ports</li>
	<li>Built-in Bluetooth</li>
	<li>xD card interface (Ricoh again), hidden under the DVD drive</li>
	<li>Broadcom 100Mbit Ethernet chip (Linux b44 driver)</li>
</ul>
I was surprised that such an otherwise high-spec machine wouldn&#8217;t have gigabit Ethernet support.  As a practical matter, this doesn&#8217;t really affect me; I mostly use the wireless connection anyway (perhaps that&#8217;s what Dell was counting on).

As far as I can tell, all of the hardware works well under Fedora. For example, even the non-X.org <a href="http://web.telia.com/~u89404340/touchpad/">Synaptics touchpad driver</a> was configured automatically during the install, and works perfectly.

There&#8217;s often a considerable lag between a laptop appearing and its congeries of hardware actually working under Linux.  Since the M1210 is such a new-to-the-market system, I was astounded that all I needed was a recent stock userspace and kernel, and the ipw3945 driver from sourceforget, to get everything that I care about to work well enough for heavy daily abuse.

I have a few physical quibbles with the machine.  I have to hit the keys quite hard, or they tend to bounce and give repeats (e.g. I type â€œhâ€ and get â€œhhâ€).  The display is crisp, uniformly bright, has vibrant colours, and is a pleasure to work with.  I don&#8217;t like the glossy finish, though; it reflects too much, particularly if I&#8217;m running on batteries and have the screen brightness turned down a bit.

If corporate purchasing policies were a non-issue, I&#8217;d probably still prefer a Thinkpad X60 due to its comparable specs and lighter weight, but I am surprised and very pleased by how well the Dell XPS M1210 is working for me.  It&#8217;s exceptionally fast, and has been rock solid so far.]]></content:encoded>
			<wfw:commentRss>http://www.serpentine.com/blog/2006/10/18/linux-on-the-dell-xps-m1210/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>The $10,000 laptop &#8230; almost</title>
		<link>http://www.serpentine.com/blog/2006/09/07/the-10000-laptop-almost/</link>
		<comments>http://www.serpentine.com/blog/2006/09/07/the-10000-laptop-almost/#comments</comments>
		<pubDate>Thu, 07 Sep 2006 14:59:55 +0000</pubDate>
		<dc:creator>Bryan O'Sullivan</dc:creator>
				<category><![CDATA[hardware]]></category>

		<guid isPermaLink="false">http://home.serpentine.com/blog/2006/09/07/the-10000-laptop-almost/</guid>
		<description><![CDATA[I read in Bill Bumgarner&#8217;s blog that Dell has released a new model in its XPS line, the M2010. It&#8217;s not somethhing one could plausibly refer to as a laptop, due to its weight of 18.3lbs (8.3kg!) and 20&#8220; screen. Being a curious sort, and owning the M2010&#8242;s tiny cousin, the M1210 (the weight of [...]]]></description>
			<content:encoded><![CDATA[<p>I <a href="http://www.friday.com/bbum/2006/09/06/what-the-dell/">read in Bill Bumgarner&#8217;s blog</a> that Dell has released a new model in its XPS line, the M2010.  It&#8217;s not somethhing one could plausibly refer to as a laptop, due to its weight of 18.3lbs (8.3kg!) and 20&ldquo; screen.</p>
<p>Being a curious sort, and owning the M2010&#8242;s tiny cousin, the M1210 (the weight of which is a feathery 23% that of the M2010), I visited Dell&#8217;s web site to try to configure a system and see what it would cost.</p>
<p>Holy flaming battery packs; that is one <i>expensive</i> toy.  I failed in my attempt to configure it to a price of $10,000, but I got astoundingly close, at $9,564.</p>
<p>That is simply obscene.</p>]]></content:encoded>
			<wfw:commentRss>http://www.serpentine.com/blog/2006/09/07/the-10000-laptop-almost/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hitachi redux</title>
		<link>http://www.serpentine.com/blog/2005/02/22/hitachi-redux/</link>
		<comments>http://www.serpentine.com/blog/2005/02/22/hitachi-redux/#comments</comments>
		<pubDate>Tue, 22 Feb 2005 12:45:01 +0000</pubDate>
		<dc:creator>Bryan O'Sullivan</dc:creator>
				<category><![CDATA[hardware]]></category>

		<guid isPermaLink="false">http://home.serpentine.com/blog/2005/02/22/hitachi-redux/</guid>
		<description><![CDATA[I should have known better, 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. It made it to about six months of age before developing [...]]]></description>
			<content:encoded><![CDATA[<p>I <a href="http://www.sheller.com/SubPage.asp?SubPageID=88">should have known better</a>, 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.</p>
<p>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&#8217;t even notice until Sunday night, whereupon I booted into a rescue environment and attempted a <tt>fsck</tt>.  The <tt>fsck</tt> yielded many, many short reads, which I interpret as the hard disk telling me &ldquo;I&#8217;ve run out of bad blocks to silently remap, so now I&#8217;m going to cack on your data in a way you <i>can&#8217;t</i> ignore&ldquo;.  My root filesystem was almost completely trashed, leaving almost 4,000 entries in <tt>lost+found</tt>.</p>
<p>Through sheer luck, one of the only directories to survive the experience was the only one that would have been a pain to replace.  It got moved to <tt>lost+found</tt>, but I was able to recognise it by its contents almost immediately.</p>
<p>So it&#8217;s off to Fry&#8217;s tomorrow, to buy a new SATA hard disk, one specifically not touched by the evil of Hitachi Global Storage Destruction Technologies.  I&#8217;ve been wanting to wean myself off PATA for a while (my motherboard goes gimpy if I run the PATA drive with DMA turned on after a cold boot), so now I have an excuse, albeit more catastrophic than I wanted.</p>]]></content:encoded>
			<wfw:commentRss>http://www.serpentine.com/blog/2005/02/22/hitachi-redux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

