<?xml version="1.0" ?>
<rss version="2.0">  <channel>
<title>Lex Spoon's Blog</title> 
<link>http://www.lexspoon.org/blog/</link> 
<description>I am <a href="http://www.lexspoon.org">Lex Spoon</a>, and in
             this blog I write about a variety of computing
             issues.</description>
<language>en-us</language>
<managingEditor>lex@lexspoon.org</managingEditor>
<webMaster>lex@lexspoon.org</webMaster>
<item><title>GWT, host thyself</title>
<pubDate>May 28, 2008</pubDate>
<link>http://www.lexspoon.org/blog/gwt-host-thyself.html</link><description><![CDATA[
<p>The RC for GWT
1.5 <a href="http://code.google.com/docreader/#p(google-web-toolkit-doc-1-5)s(google-web-toolkit-doc-1-5)t(Whatsnewin15)">has
many new features</a>, but one of the most fun is that the
documentation is now hosted on a GWT program called
the <a href="http://code.google.com/docreader/#p(google-documentation-reader)">Google
Documentation Reader</a>.  Check it out.

<p>I used to be a fan of lowest-common-denominator web pages, hoping
that if enough people worked that way then the browsers would make
such pages look nice.  Nowadays that seems highly unrealistic.  Good
design cannot be built into an automatic browser; there will always be
an important role for site designers, and they need markup tools to do
their job.

<p><a href="http://en.wikipedia.org/wiki/AJAX">AJAX apps</a> such as
the ones Google puts out tend to be browser specific, but AJAX is the
only practical way for designers to get the tools they need to make
great web sites.  If you are a holdout for having a single,
browser-agnostic version of every web site, then a good challenge for
you would be to go look at
the <a href="http://code.google.com/docreader/#p(google-documentation-reader)">Google
Documentation Reader</a>.  Imagine browsing that information using static
links...
]]></description></item>
<item><title>George on Democracy in Second Life </title>
<pubDate>February 9, 2008</pubDate>
<link>http://www.lexspoon.org/blog/george-on-second-life.html</link><description><![CDATA[
George
Perantatos <a href="http://zorba.members.winisp.net/2008/01/second-life-and-changing-rules-of.html">recently
posted on the oddity</a> that a single company is the supreme court
and the executive branch for the land of Second Life.  This kind of
thing is not a big deal for a game, but raises disturbing questions if
people invest larger parts of their life as time goes on:
<blockquote>
Sounds like a pretty totalitarian system, right? A <q>government</q> of
sorts (Linden Labs) controlling most every aspect of life for its
virtual residents. Now, imagine if Second Life breaks out of the
fringes and into the true mainstream. As in, imagine if everyone you
knew spent at least 30-60 minutes a day in Second Life. Now, imagine
one company being the gatekeeper to all activities in this virtual
world. Even more so, imagine one company being in control what is even
virtually possible in this world. What would happen, or could happen,
here?
</blockquote>
It is a good point.  Go read the whole thing, which traces through the
concrete example of a small store owner.

<p>I expect that people will have an increasing online life, and so
issues like this will become important.  Ideally, places like Second
Life that form a platform for other interactions should be subject to
a democratic system much like that of a traditional government in
physical space.

<p>Similar issues apply for companies that already define parts of our
computing infrastructure.  People who use a document format should
insist it be open and not subject to overly strong influence by one
company, as Massachusetts has with its Open Document Initiative.

<p>It gets more chilling, though.  In addition to it being easy to
lose democracy in such a setting, there is a missing protection that
is absent or at least different in virtual worlds: practical
limitations on enforcement.  In physical space, if the government sets
a tax of 75% on all sales, most people simply would not pay it.  They
would simply stop reporting their sales.  If the police force is
enlarged to counteract this effect, then it still will not work,
because the police will themselves become corrupt.

<p>Likewise for restrictions on many other aspects of human life.
Imagine your favorite borderline legal issue, and imagine the law were
turned radically against the way you would wish.  Would the
enforcement work, without an enormous level of police?  Would it
work, <em>with</em> an enormous level of police?  In many cases the
answer is no.

<p>Some of these limits go away in a virtual world.  For the people
who define a system of currency and a definition of what it means to
"own" things, it is utterly trivial to additionally levy taxes on all
transactions.  For the people who define the geometry and physics of a
3-D world, it is trivial to code a restriction that person X may not
go under the same roof as person Y.  Thus in many ways, the possible
level of enforcement is much sterner than in the physical world.

<p>I do not have a strong idea of how to best to respond to these
possibilities.  One suggestion, though, is to pay a lot of attention
to the software architecture.  For example, it is much safer if the
mini-worlds within the virtual world are run on different people's
machines, because then a lot of the power over what happens in the
mini-world shifts to the mini-world's owner.  There are no simple
answers, though, that I see.  This concentration of power is simply
something to be aware of and to keep under constant vigilance.

<!--  LocalWords:  Perantatos gatekeeper sterner
 -->
]]></description></item>
<item><title>No Tomboy on OS/X</title>
<pubDate>February 1, 2008</pubDate>
<link>http://www.lexspoon.org/blog/tomboy-mac.html</link><description><![CDATA[
<p>I have searched and searched and not found a suitable replacement for
<a href="http://www.gnome.org/projects/tomboy/">Tomboy</a>.  Instead, I keep
finding <a href="http://www.frenchguys.com/wordpress/?p=114">sites
with other people looking for Tomboy on a Mac</a>.  The comments on
the above blog entry reflect my thoughts pretty well.

<p>Tomboy is a simple <a href="http://www.gnome.org">Gnomish</a>
note-taking program.  When you press a hot-key, a new note pops up in
a small text-editing window.  If you close the window, the note is
automatically saved.  You can later retrieve the note by clicking on
an icon on the bottom of your screen.  A menu pops up with the ten
most recently viewed notes, and if you want an older note, you can use
a search field to find it.  There are other things Tomboy does, but
that is the essence and you simply cannot find it for the Mac.

<p><a href="http://wiki.squeak.org/swiki/">Swikis</a> are my fall-back tool.  Even on <a href="http://www.kubuntu.com">Kubuntu</a>, I used
a Swiki for long-term notes that are more organized, saving Tomboy for
quick things I wanted to jot down.  Swikis are much more featureful,
and their only real minus is that they use a web-based interface
instead of using native windows and widgets.  For example, on a Swiki,
your text editing window is of a fixed size which is large for a
little note yet small for a large note.  Nonetheless, it is my
note-taking tool of choice right now.

<p><a href="http://www.chatelp.org/?page_id=5">Sidenote</a> is the
best of the OS/X note-taking programs I tried.  If you work only on
your laptop, then it might well be a sufficient replacement.  It has
one fatal problem for me, though: as the name would suggest, the notes
are all attached to the <em>side</em> of the screen.  This might be
workable on a 13-inch or 15-inch screen, but I do most of my work on a
large external monitor.  The notes are almost always far, far away
from the main tool I am using.  A version of Sidenote that used
movable, resizable windows instead of being stuck to the side of the
screen would probably be just what I am looking for.

<p>Meanwhile, I am left with no good alternatives.  I wish someone
would make a Tomboy clone, either natively for OS/X or as something
based on the Java platform.  Judging from the traffic I see on the
web, such a tool would have a lot of users.


<!--  LocalWords:  Tomboy blog Gnomish Swikis Kubuntu Swiki featureful Sidenote
 -->
<!--  LocalWords:  resizable
 -->
]]></description></item>
<item><title>OS/X first impressions</title>
<pubDate>January 25, 2008</pubDate>
<link>http://www.lexspoon.org/blog/osx-impressions.html</link><description><![CDATA[
<p>I recently got a MacBook Pro, after being a long-time Linux user.  I
was hoping for a machine where the productivity things would Just
Work, and the programming things would be just as slick as on Linux.

<p>Mostly that is true.  Encrypting my home directory was just a
matter of turning on the option; I know Linux can do it but it had
been on my to-do list for months.  Email, address books, sleep mode,
and many other little things really do Just Work.

<p>On the other hand, I must say that it is not vastly better
than <a href="http://www.kubuntu.com">Kubuntu</a>.  Better, yes, but
not vastly better.  I still had to install a bunch of extra
applications, and I still have occasional times when the machine does
not wake up from sleep mode.  And as a small point in Kubuntu's favor,
Firefox is the default browser, whereas on OS/X you start with Safari
but are likely to switch before long.

<p>To find applications you might like, I recommend this blog
entry: <a href="http://www.procata.com/blog/archives/2007/02/22/free-software-for-mac-os-x/">Free
Software for Mac OS X</a>.  That site sure makes me wish there was
something like a Linux distribution, but for GUI applications.  I also like
<a href="http://aquamacs.org/">Aquamacs</a>, and I agree with a recommendation from John Weathers to
snag <a href="http://iterm.sourceforge.net/">iTerm</a>
and
<a href="http://www.apple.com/downloads/macosx/development_tools/svnx.html">svnX</a>.
For chat I am using <a href="http://www.adiumx.com/">Adium</a>, and I like it
so far.

<p>The programming works fine.  All my old scripts and .el files work
the same as on Linux.  My <a href="../sbaz">sbaz</a> directory worked
with nothing extra installed, which is by design, but I had never
tested it on OS/X before.  I
use <a href="http://www.finkproject.org/">Fink</a> for grabbing
developer tools like jam and subversion.
Also, <a href="http://www.virtualbox.org">Virtualbox</a> works fine if
you ever do need access to a Linux prompt.  I still contribute a
little bit to Debian, so I need that.


<p>Overall, it's good stuff.  I am not sure it is worth the price
premium over Linux for most people, but if computers are your job they
are well worth looking into.

<!--  LocalWords:  MacBook Kubuntu Kubuntu's Firefox ications blog Aquamacs
 -->
<!--  LocalWords:  iTerm svnX Adium sbaz Virtualbox
 -->
]]></description></item>
<item><title>The preprint is out!</title>
<pubDate>December 20, 2007</pubDate>
<link>http://www.lexspoon.org/blog/scala-book-preprint.html</link><description><![CDATA[

<p>On Wednesday of last week, an early access edition
of <em>Programming in Scala</em>
<a href="http://www.artima.com/weblogs/viewpost.jsp?thread=220890">went
on sale</a>.  This book
is an effort by <a
href="http://www.artima.com/weblogs/index.jsp?blogger=modersky">Martin
Odersky</a>, myself, and <a
href="http://www.artima.com/weblogs/index.jsp?blogger=bv">Bill
Venners</a> to introduce programmers to <a
href="http://www.scala-lang.org">Scala</a>.  The full version should
go out in May 2008, but people who buy now can go ahead and download
preprints in PDF format.


<p><a href="http://www.scala-lang.org">Scala</a> is a great language,
letting you program in both functional and object-oriented styles on
the Java VM.  If you like the Java ecosystem, but you think Java could
be improved, then Scala will interest you.

<p>Personally, I have had a wonderful time being involved with Scala.
The people are great, and it is exciting to help move advanced
programming language ideas into a mainstream-accessible language.
This book is our three's effort to share that joy with other
programmers.

<p>Here is the book's summary:

<blockquote>
<p>Scala is an object-oriented programming language for the Java Virtual
Machine. In addition to being object-oriented, Scala is also a
functional language, and combines the best approaches to OO and
functional programming.

<p>In Italian, Scala means a stairway, or steps&mdash;indeed,
Scala lets you step up to a programming environment that incorporates
some of the best recent thinking in programming language design while
also letting you use all your existing Java code.

<p>Artima is very pleased to publish the first book on Scala, written by
the designer of the language, Martin Odersky. Co-authored by Lex Spoon
and Bill Venners this book takes a step-by-step tutorial approach to
teaching you Scala. Starting with the fundamental elements of the
language, Programming in Scala introduces functional programming from
the practitioner's perspective, and describes advanced language
features that can make you a better, more productive developer.
</blockquote>

<!--  LocalWords:  PrePrint Odersky Venners preprints PDF API's preprint OO VM
 -->
<!--  LocalWords:  Artima
 -->
]]></description></item>
<item><title>Building your own DVR</title>
<pubDate>December 17, 2007</pubDate>
<link>http://www.lexspoon.org/blog/mythtv-box.html</link><description><![CDATA[
If you watch a lot of television, I highly recommend that
you obtain a
<a href="http://en.wikipedia.org/wiki/Digital_video_recorder">Digital Video Recorder (DVR)</a>.
They let you
channel flip among a whole week's showings instead of just what is
playing right this moment.  They let you take a commercial break
precisely when you are ready to go to the restroom, not when the
station decides to send you one.  They really make television
much nicer to watch.

<p>I can also recommend that you not build your own DVR, because you
will spend dozens of hours tinkering around with a computer to do it.
Of course, dozens of hours tinkering with a computer sounds nice to
some people, in which case have at it!  Here are a few notes I can
share for anyone trying.  I did nothing weird, so this is more of a
description of one common working DVR setup.

<p>The main software you want is
   <a href="http://www.mythtv.org">MythTV</a>.  All other
   open-source DVR software orbits around this software base.

<p>For capture, I use a basic Hauppauge 150.  It has one tuner, it has
   a hardware MPEG encoder, and it is very well supported by MythTV.
   There are fancier and wimpier capture cards out there, but this one
   is a basic workhorse.

<p>For schedule information, I use <a
href="http://www.schedulesdirect.org">SchedulesDirect</a>.  Someone
   with more time to spend on it than me could probably work out a
   way to screen scrape web sites to get this information, but I went
   with SchedulesDirect because it is cheap and my time is limited.

<p>I had a hard time getting a remote to work.  I first played with
   IRDA, thinking that surely an advanced infrared device would be
   able to handle basic consumer IR.  While some people get that to
   work, it is real trouble.  I then tried an ATI Remote Wonder, not
   version II but the original, and while the software worked fine the
   remote seems to be badly built and I only got about three feet of
   range.  I finally settled on a common but expensive "MCE" remote,
   and the third time was the charm.  I configured it using MythTV's
   built-in <a href="http://www.lirc.org">lirc</a> support,
   which meant configuring lirc itself and then adding an
   <code>lircrc</code> file to <code>~/.mythtv</code>
   for the user running the MythTV frontend.


<p>Recording digital stations is a little tricky in the free software
   world.  The DRM madness of our day means that you cannot just get a
   tuner that will receive digital cable.  There is no technical
   reason for these problems.  They are simply fallout from the trying
   to <a href="digital-copyright.html">prevent the inevitable</a>.
   What you can do, however, is use your existing set top box and have
   MythTV change its channels.  If you have one of the popular
   Motorolla DCT2xxx devices (where xxx is any sequence of digits),
   then you can probably change its channels using a serial cable.
   Otherwise, you will have to fiddle with an IR blaster.

<p>By the way, this kind of workaround is precisely the sort of reason
   that preventing copying is impossible.  If there was no serial
   interface, and if an IR blaster did not work, someone could still
   make a device that physically pressed a remote control's buttons.
   Fundamentally, if a human can watch it, a computer can copy it.
   The legislatures can deny this reality but cannot change it.

<p>Anyway, using the set top box is not perfect.  In my house, at
   least, we only have one set top box, and we often want to use it
   ourselves instead of turning it over to the Myth box.  To
   ameliorate this, I set up Myth to only use the set top box for
   premium channels, and then we only have it record from those in the
   middle of the night or in the middle of a work day.  The approach I
   took is to set up two channel lineups on your SchedulesDirect
   account, one for analog input and one for digital input via the set
   top box.


<p>That's about it.  There are a lot of little details to take care
   of, but you will see for yourself.  As one general tip, if you get
   MythTV via Debian or Ubuntu then it will come with a rich set of
   example configuration files in <code>/usr/share/doc/myth*</doc>.
   Also, the
   <a href="http://www.mythtv.org/wiki/index.php/Main_Page">Myth wiki</a>
   is quite informative in general, even though
   some pages seem sketchy.


<p>Finally, just one word of warning.  If you put a computer in a
   common room of your house, you find yourself more concerned with
   how much noise the computer does or does not put out....

<!--  LocalWords:  DVR MythTV Hauppauge MPEG SchedulesDirect IRDA MCE MythTV's
 -->
<!--  LocalWords:  lirc frontend DRM Motorolla DCT Ubuntu
 -->
]]></description></item>
<item><title>JAOO '07</title>
<pubDate>September 24, 2007</pubDate>
<link>http://www.lexspoon.org/blog/jaoo07.html</link><description><![CDATA[
<p>I had a good time going to <a href="http://www.jaoo.dk">JAOO</a>
this year.  JAOO is a software developers' conference held in Denmark,
and I went in order to talk about <a
href="http://www.scala-lang.org">Scala</a> in the <q>Programming
Experience</q> track.



<p>JAOO is a lot less formal than conferences I am used to.  There are
no <q>banquets,</q> only <q>parties.</q>  Everywhere
names are listed, they are alphabetized by first name, not last.  For
the pre-party talk tonight, we did not hear a dry talk about the
future of software processes, but instead heard about Charles
Simonyi's <a href="http://www.charlesinspace.com">visit to space</a>.
It is really fun.


<p>The talks I saw were also enjoyable.  <a
href="http://www.objectmentor.com/omTeam/martin_r.html">Robert
C. Martin</a> preached a powerful sermon about being committed to your
profession, about writing good code, about being </em>really</em>
test-driven.  <a href="http://armstrongonsoftware.blogspot.com/">Joe
Armstrong</a> talked about the concurrency-oriented programming that
<a href="http://www.erlang.org">Erlang</a> supports.  Best of all,
though, were the photos Charles Simonyi included in his morning talk
on domain-specific languages. I am not sure about the argument in
general, but the photographs are great:

<ul>
<li><a href="jaoo07-pics/eggs1.jpg">This is how your domain looks now.</a>
<li><a href="jaoo07-pics/eggs2.jpg">This is how it looks factored into data and process.</a>
<li><a href="jaoo07-pics/eggs3.jpg">Incremental refactoring can give illusory progress.</a>
</ul>

<p>The last photo is priceless.
<!--  LocalWords:  JAOO pre Simonyi's Erlang Simonyi refactoring
 -->
]]></description></item>
<item><title>Ubuntu looks good</title>
<pubDate>September 16, 2007</pubDate>
<link>http://www.lexspoon.org/blog/ubuntu.html</link><description><![CDATA[

<p>The first time I heard about <a
href="http://www.ubuntu.com">Ubuntu</a>, I went to the web site and
was greeted by fluffy pictures of <a
href="http://web.archive.org/web/20060111100420/http://www.ubuntu.com/">children
dancing in a circle</a>.  I could not figure out what they even THINK
is good about their distribution.  I mean, sure, I like children, and
I like the world, but so do the people making all the other
distributions.  <a href="http://www.gatesfoundation.org/">Bill Gates
likes children</a>, so should I switch to Windows?  After an hour or
so of browsing around I gave up and continued using <a
href="http://www.debian.org">Debian</a>, with which I was and am
happy.

<p>Since then, I have run into a number of people who use and like
Ubuntu.  Within my <a href="http://lamp.epfl.ch">research group at
EPFL</a>, in fact, I believe it is the <em>only</em> distribution of
Linux that is in use.  Thus I decided to give it another try, and I
spent much of my recent vacation I put Ubuntu on my laptop and spent
most of my time doing that most leisurely of activities: reconfiguring
a computer.

<p>It has been about a month now, so I thought I would share my
impressions.  In general, it feels just like working on Debian, except
that many more things are configured with good defaults.  More things
Just Work.  Some specific examples:

<ul>

<li>For wireless networking, <a
href="http://www.gnome.org/projects/NetworkManager/">Network
Manager</a> is installed by default and makes it really easy to switch
between networks as you move around with your laptop.  It is just as
smooth as the wireless network browser on Windows, albeit with the
small extra perk that it also handles wired connections.

<li>Automatic mounting works out of the box, including for cameras and
flash drives.  I do not know how it is all set up, 


<li>Thinkpad audio buttons are intercepted and processed, so when I
adjust the volume or toggle the mute, that request gets passed on and
affects the low-level ALSA settings.

</ul>

<p>On the down side:

<ul>
<li>Hibernate and suspend are buggy out of the box.  Google came to
the rescue, though.  As suggested on Ubuntu forums, I now use <a
href="http://suspend.sourceforge.net/">userspace software suspend</a>
for both suspend-to-disk and suspend-to-ram, along with a few hacks to
the <a href="http://www.freedesktop.org/wiki/Software/hal">hal</a>)
scripts in <code>/etc</code>.

<li>Something is wrong in the graphics toolkit, and windows do not
always refresh when they should.  Thus, a lot of times I cannot see
the windows I am trying to click on, and have to guess where to click.

<li>My webcam Just Works, but none of the webcam-using applications
seem to use it.
</ul>


UPDATE: After another couple of weeks, it seems that Network Manager
is not really ready for prime time.  It is great when it works, but I
find myself restarting it all the time.  If it takes that amount of
effort, you may as well start and stop interfaces from the command
line.


<!--  LocalWords:  Ubuntu userspace hal
 -->
]]></description></item>
<item><title>Late Binding of Execution Order</title>
<pubDate>August 1, 2007</pubDate>
<link>http://www.lexspoon.org/blog/late-bind-order.html</link><description><![CDATA[
<p>In a statically typed language, you can get by-name parameter
passing on a parameter-by-parameter basis.  Each parameter is marked
as by name or as by value, and the compiler knows what to do with each
method invocation because it looks at the static type information.  <a
href="http://www.scala-lang.org">Scala</a>'s by name parameters are
one example in practice, and <a
href="http://www.cs.ucla.edu/~awarth/lazyj/">LazyJ</a>'s lazy types
work essentially the same way, only with lazy-binding instead of
by-name parameter passing.


<p>Surprisingly, static typing is not necessary to get this selective,
parameter-by-parameter behavior!  To see this, consider an
implementation approach where you always thunk-ize the arguments
to method invocations, just in case.  Then, when a method invocation
actually runs, it does the following:
<ol>
<li>Evaluate the receiver.
<li>Determine exactly which method that respond.
<li>Look at that method's parameters, and evaluate the parameters
    that are marked "by value".
<li>Invoke the method, passing values for the by-value parameters
    and thunks or the by-name parameters.
</ol>


<p>To see how it works, here is how you would modify lambda calculus.
Lambda calculus has functions instead of methods, but the idea works
out the same.  Recall the standard evaluation rules for <a
href="http://en.wikipedia.org/wiki/Lambda_Calculus">lambda
calculus</a>:
<blockquote>
<pre>
(\x.e) v  -->  e[x\v]   
e1 e2  -->  e1 e2'      (assuming e2 --> e2')
e v  -->  e' v          (assuming e --> e')
</pre>
</blockquote>

<p>On top of these, you can add a "by name" lambda expression,
<code>\BN x.e</code>, which has the following evaluation rule:
<blockquote>
<pre>
(\BN x.e1) e2  -->  e1[x\e2]
</pre>
</blockquote>

<p>That is all.  Note two differences between this rule and the ones for
normal, by-value lambdas.  First, you can pass an arbitrary expression
into the lambda's body, not just a value -- that's by-name evaluation.
Second, there is no recurrence for evaluating the argument.  Once it
is clear that the callee is a by-name lambda, it can go ahead and be
invoked.

<p>The net result is that an application <code>(e1 e2)</code> is
evaluated as follows.  First, <code>e1</code> is fully evaluated into
either a lambda or a by-name lambda (if it is something else,
computation stops).  Then, one of two things happens.  If
<code>e1</code> is a normal by-value lambda, then <code>e2</code> is
evaluated and then the result is passed into the lambda.  If
<code>e1</code> is a by-name lambda, then <code>e2</code> is
immediately passed into the body of that lambda.

<p>The decision is made at run time, and so the same expression might
even use a different evaluation order each time it runs.  It is
<em>late binding</em> of <em>evaluation order</em>.


<p>After thinking about all of this, I am left with two questions:

<ol>
<li>Is there a fast implementation?  Thunking every single parameter
looks expensive, but there might be better implementations.

<li>Is there <em>any</em> language feature where you need static
typing other than for checking and for speed?  I used to say
parameter-specific execution order was an example, but now I see that
it is not.  What is left?
</ol>


<!--  LocalWords:  LazyJ's TODO thunks BN Thunking LazyJ ize
 -->
]]></description></item>
<item><title>Jay Thaker and hyperlinks in news articles</title>
<pubDate>May 15, 2007</pubDate>
<link>http://www.lexspoon.org/blog/jay-thaker-link.html</link><description><![CDATA[
<p>It is surprisingly difficult to find a direct link to Jay Thaker's
iPod study, or indeed any hard evidence that it exists at all.  I
started this page intending to find the link and share it.  After
about ten minutes of Googling, I am giving up on finding the link, and
instead going to whine about the quality of news reporting on the web.

<p><a href="http://www.emaxhealth.com/80/12033.html">The study</a>
claims that iPods interfere with pace makers.  Thaker, a high school
student, worked with professional medical researchers to perform a
study on 83 people.  This is a very interesting topic, and
one I would like to read more about the details.  Here are some
key, easy questions that lept to my mind, questions that the original
paper could answer quickly:

<ol>
<li>What <em>kind</em> of pace makers did he study?
    Pace markers are not government issue and completely
    identical.

<li>Did he test pace makers standing alone, to try and find a mechanism
    for what he observed?

<li>How do the observed anomalies compare against the pace makers'
    normal inaccuracies?  Saying that x% have anomalous behavior
    is extremely interesting, but I want to know more about what the
    anomalies are.

<li>Did he verify, or at least argue, that the interference was not
    affecting the diagnostic machines?  I expect they ruled this out,
    but would like to be reassured.
</ol>

<p>The study writeup itself does not come up on Google.  More
disturbing, though, is that the news articles I read neither link to
the article, nor present an excuse for not doing so.  Hyperlinked
media is about <em>linking</em>.  If anyone knows a good news outlet
that is good about this, I would like to know.

<p>Also disturbing is the lack of fact checking going on.  I did not
run into a single article that linked even to the <a
href="http://www.heartrhythmondemand.org/webcasts/heartrhythm2007/index.html">conference
where the paper was presented</a>.  I wonder if they even bothered to
check, because in fact the conference web page does not list Thaker as
a presenter!  When they say that Thaker "presented" the article at the
conference, they must mean that he had a poster, or that he walked around
and chatted with the researchers.  If he gave a formal presentation,
it is not listed on the schedule.


<p>A good news outlet on the web ought to at least link to the
materials they are talking about.  If they discuss a study, link to
it.  If they discuss a bill before Congress, link to the bill.  If
they discuss a novel, link to the Amazon page for the novel.  It is
hard to find even this level of support from news outlets.

<p>A really good news outlet could go further, and dig up relevant
expert material.  They could offer more than the pithy one-line quote
that on-paper newspapers give you, and link to an entire expert
testimony.  For example, I would really like to know whether the
experts in this area think the level of interference Thaker found is a
surprise.

<p>Kudos to Jay for a really cool study.  I am left wishing, though,
to find a news outlet that is willing to have external hyperlinks.
Please email me if you have any pointers.


<!--  LocalWords:  Thaker's iPod Googling iPods Thaker writeup Google
 -->
<!--  LocalWords:  hyperlinks
 -->
]]></description></item>
<item><title>Linux on Dell's?</title>
<pubDate>April 6, 2007</pubDate>
<link>http://www.lexspoon.org/blog/dell-linux.html</link><description><![CDATA[

<p>I just noticed that on Dell's <a
href="http://www.ideastorm.com/">Idea Storm</a> site, quite a lot of
the proposals are about pre-installing Linux on their machines.  I
wonder if Dell will go for it?

<p>I have long been interested in the idea of pre-installed Linux
machines.  Right now, if you want to use Linux, you face two learning
curves: using Linux, and installing Linux.  Installing is actually the
larger of the two learning curves for many people.  If you plan to
simply use pre-configured stuff from <a
href="http://www.ubuntu.org">Ubuntu</a>, then time spend on
installation details is mostly wasted.  I use <a
href="http://www.debian.org">Debian</a>, on which Ubuntu is based, and
it has taken <a href="http://www.lexspoon.org/linux/t42p/">many
tweaks</a> to get my Thinkpad into a good state.


<p>So should Dell do it?  My thoughts about the good and bad
for Dell:

<ul>
<li>Good: Dell would occupy a mostly uncontested niche: laptops with
normal Linux installations.

<li>Bad: Dell would add a constraint on the hardware they include,
because it would be embarrassing to ship a Linux laptop where some of
the hardware does not have drivers.  For hardware that Just Works in
Linux, they will have a low burden.  For other hardware, they will
have to either disable it, or convince the manufacturer to develop a
driver, or get the Windows driver to work in Linux, or develop their
own driver.  This constraint can play out many ways, but the net
effect is an extra burden on Dell.

<li>Bad: The Linux side would likely be unpolished.  Dell will need
some careful spin control to keep their brand name from being dragged
down by the flaky parts.  Perhaps the line they can take is: the Linux
side is for those who want to take off the hood and get their hands
into the machine.  As an alternative: the Linux side is for those who
want to experiment with the raw future of computing.

<li>Good: "Open source" has a positive connotation much like
environmental protection or poverty relief.  Microsoft got trashed for
giving away their web browser for free; Netscape and IBM have gotten
kudos for equally predatorially [1] giving away software, but also
making that software open source.  Dell would rather be the IBM or
Netscape in this picture, not the Microsoft.
</ul>

I hope Dell goes for it, and they will not do badly if they do, but it
is not obvious to me whether they will get a net win.  Perhaps the
main reason for Dell to bet here would be that the cost is low and the
possible benefits substantial.


<hr>

[1] It is a subject for another day, but I do not really think
predatorial is a useful word here.  The companies are simply
competing.  However, "predatory companies" is held as a useful concept
by many people, much like Freudian analysis and astrology.  For
marketing purposes, you cannot ignore this.


<!--  LocalWords:  pre Ubuntu Thinkpad unpolished predatorially predatorial
 -->
]]></description></item>
<item><title>Egdorf's new Lisp Machine</title>
<pubDate>March 18, 2007</pubDate>
<link>http://www.lexspoon.org/blog/egdorf-newlisp.html</link><description><![CDATA[
H.W. Egdorf <a
href="http://p-cos.net/lisp-ecoop/submissions/Egdorf.pdf">has a
proposal</a> for something <a href="20051211-hos.html">near to my heart</a>:

<blockquote>
The Unix system has always had its user-space look and feel defined by
the Init process (typically in the program file /etc/init) which
spawns and defines the configuration of the normal expected Unix
environment. The development described here proposes to replace this
set of user-level processes with a Lisp system. This Lisp-based
environment will then be used as a new process to configure and define
an environment similar to the Lisp Machine's in the user space
provided by the Linux kernel.
</blockquote>

<p>I laud the goal, but I question the path.  Yes, there are real
advantages to intercepting init.  You get to reuse the Linux kernel,
which should be a perfectly fine kernel for something like a Lisp
Machine, and you can reuse the Lisp Machine design for your
reimplementation.

<p>However, the next step requires an ugly choice.  If you try to stay
true to the Lisp Machine design, then you get the advantage of using a
tried and true design, but you have a lot of reimplementation to do,
and you will end up with an old system that predated the rise of the
Internet.

<p>Better, you can try to design an entirely new set of low-level
utilities.  This has the downside of being a from-scratch design, and
of require quite a lot of work before you have anything you can really
use.  However, this approach is doable.  It looks a lot like designing
a new Linux distribution.


<p>My thoughts have always been, though, to implement hacker's OS by
intercepting at a higher level: the user shell.  I mean "shell" in a
general sense, as that part of the software that interacts with the
user, and thus I would include web browsers, window managers, and so
on as shells.  If you write a shell, then you can start modestly and
then progressively write and incorporate more tools in a Lisp Machine
style.  This approach is just as powerful in the end, and it avoids a
lot of costly mis-prioritized design, and it has the advantage that
you get to play immediately.

<p>So, I think of a hacker's OS as starting with something like Emacs,
or Squeak plus <a href="http://wiki.squeak.org/squeak/1914">Command Shell</a>.


<p>Anyway, I wish Egdorf the best of luck.  If he does no more than
make a Linux distribution with Lisp at the core, that would be a marvelous
step forward for personal operating systems.

<!--  LocalWords:  Egdorf Init init reimplementation mis
 -->
]]></description></item>
<item><title>PERFORM, digital copyright, and the status quo</title>
<pubDate>March 13, 2007</pubDate>
<link>http://www.lexspoon.org/blog/perform-copyright.html</link><description><![CDATA[

<p>I wrote before that <a href="digital-copyright.html">copyright is
poorly designed</a> now that digital processors are ubiquitous.  Our
current copyright law makes sense for paper books because they are
hard for individuals to copy.  They do not work well for digital
material, however, because digital material is extremely easy to copy.
There is only a slim hope of applying traditional copyright to digital
works, and that is to heavily restrict the use of all kinds of digital
devices.  Heavy restriction does not lend itself to a pleasant
society.

<p><a href="http://thomas.loc.gov/cgi-bin/bdquery/z?d110:s.00256:">The
PERFORM Act</a>, recently introduced to the U.S. Senate is an example
of propping up existing copyright approaches.  The PERFORM Act
addresses broadcast of music by digital radio stations such as <a
href="http://www.99x.com">99x.com</a>.  Currently, such stations are
free to broadcast in open formats.  The bill would require that they
use awkward formats that attempt to prevent copying.

<p>The prevention of copying is impossible, of course, so long as
playback is possible, but the act would require stations to make
"reasonable" efforts at the impossible.  The efforts are onerous for
the stations, and lead to limited and cumbersome software on the
machines of end users.

<p>We should strive to design copyright law that makes sense with
current technology.  Personal computers are here, and they are great
and copying digital data.  These are positive changes!  We should
change the law, not try to turn back technology.

<p>More information is available via the <a href="http://www.eff.org/deeplinks/archives/005078.php">
Electronic Frontier Foundation</a>.


<!--  LocalWords:  Feinstein DRM com ipod
 -->
]]></description></item>
<item><title>Real names on Wikipedia?</title>
<pubDate>February 1, 2007</pubDate>
<link>http://www.lexspoon.org/blog/real-name-wikipedia.html</link><description><![CDATA[

Mark Bernstein <a
href="http://markbernstein.org/Jan0701/WikiPolicing.html">ponders
accountability on Wikipedia</a>, and suggests that it use real names:
<blockquote>
The first, obvious step is accountability. For starters, a real
name. At some point, we are going to need more: a domain, and address,
and a footprint on the Web so we can see clearly who the police are
and what they are doing.
</blockquote>


<p>Accountability is important, but Bernstein's list of mechanisms
needs to be reconsidered. The thing you really need for accountability
is a good, unforgeable record of what an account holder has done in
the past.  I bet Wikipedia already has this.  Probably, every edit
already is logged along with who performed it.  If so, then Wikipedia
already has accountability, and "anonymous" is a misnomer.
What could be less anonymous than logging every single activity along
with the name of who did it?

<p>Looking for "real" names is a dangerous distraction.  The other
information in Mark's list is personal and frequently not
helpful.  There are exceptions; for example, you might use your
real name to establish expertise in an area.  There are even larger
grounds for prejudice, though.  Imagine you find out the human behind a
Wikipedia account and you learn that they are, say,.... a religious
fundamentalist?  ....twelve years old?  ....a political activist?

<p>Additionally, keep in mind that some people live in uncomfortable
situations.  Not everyone gets to sit in a university and pompously
declare to the world whatever is on their mind today.  Some people
need to profess the local faiths, and for them a pseudonym is the only
way they can speak freely.  If real names become mandatory, then many
good contributors will simply be unable to contribute.


<p>Overall, pseudonyms are not only acceptable on Wikipedia, but
productive.  I would go further and say they are a general feature of
online life.  If that sounds strange at first, then please consider a
more familiar concept: separating private life from business.  Is it
really so much of a stretch to separate even more lives?


<!--  LocalWords:  Wikipedia
 -->
]]></description></item>
<item><title>Guzdial on "why?"</title>
<pubDate>January 30, 2007</pubDate>
<link>http://www.lexspoon.org/blog/guzdial-on-why.html</link><description><![CDATA[
<p>Mark Guzdial, one of my graduate school advisors, just posted on
<a href="http://www.amazon.com/gp/plog/post.html/ref=cm_blog_pl?ie=UTF8&pt=personalBlog&aid=PlogMyCustomersAgent&ot=customer&pd=1169830339.676&pid=PMCA3W4CUXPE1WFNFat1169829189&iid=A3W4CUXPE1WFNF">why
computing education is important to him</a>.

<blockquote>
No, we're not about curing small children.  But we are creating the
infrastructure for a lot of important work.  Literacy is powerful.
The people who invented writing did not cure disease, but by inventing
writing, they made all of science possible, not just medicine.
Perhaps the medical researcher who first understands how autism works
will come to that understanding or will communicate it by creating a
computational model of autism.  And maybe that medical researcher is
in our introductory computing classes today.
</blockquote>


<p>His answer fits well with mine.  Computing is a new tool for
thought, all kinds of thought.  It helps scientific research,
business, education, art---anywhere a mind is active, computers have
found a way to help.  Computing will be as fundamental as writing, so
it is worth teaching the craft as we know it, and it is worth trying
to improve that craft.
]]></description></item>
<item><title>Coyote Blog on digital copyright</title>
<pubDate>January 28, 2007</pubDate>
<link>http://www.lexspoon.org/blog/coyotedigitalcopy.html</link><description><![CDATA[
Coyote Blog includes <a
href="http://www.coyoteblog.com/coyote_blog/2007/01/the_next_milest.html">a
post today about digital copyright</a>.  Computer scientists continue
to decline to propose any meaningful reform of digital copyright.  As
a result, the extension of <a href="digital-copyright.html">obsolete
copyright law</a> plays on out, an the general public is noticing more
as time goes on.  We see our computing and playback systems--a
distinction increasingly blurred--fall under limitation just because
it <em>might</em> be used to violate copyright.  We have an
increasingly difficult time using content that we have paid for.
]]></description></item>
<item><title>Copyright in the digital age</title>
<pubDate>January 2, 2007</pubDate>
<link>http://www.lexspoon.org/blog/digital-copyright.html</link><description><![CDATA[

<p>Copyright is important, but the current approach to it is out of
date now that computers make copying so cheap.  The way copyright is
designed impacts any business involving digital material, including
software, books, music, and video.

<p>In the form we currently know it, copyright is only a few hundred
years old.  Currently, if you write a book or put a string of notes in
a row, then you automatically have the sole copyright -- the right to
copy -- for that work.  You can then license permission to others to
make their own copies, typically charging them a fee for each copy.
The better your work, the more you can charge.  Thus, you get paid for
producing good material.

<p>To contrast, musicians of just a few hundred years ago had no
protection against other people copying their material.  Bach could
not and did not get rich by selling copies!  The main barrier to
copying was the sheer difficulty of making a copy at all.  Before the
days of mass production, this barrier was significant.

<p>There is no reason that we must continue with the current approach
to copyright.  Yes, existing businesses crucially rely on the current
approach to copyright.  However, this approach is based on technology
of the past.

<p>A particularly important change is that copying has become cheap
and easy.  Fifty years ago, making a copy of a book was an expensive
operation.  Now, you simply Google with "site:.ru" in your search
field and you can find a copy of the book to download.

<p>This change strikes deep at the design of copyright.  When copying
requires a major enterprise, violation for personal use is not worth
the cost, and violation on a massive scale is easy to detect.
Nowadays, however, copies of all popular works are freely available on
the Internet, even though everyone posting such works is paying the
risk of living outside the law.

<p>If we continue with the current approach to copyright, then some
outcomes are predictable.  All means of content copying and
distribution will get closer inspection.  Since all computers are also
copying devices, the devices themselves will come under legal
oversight.  People will not be able to own just any old computer any
longer, and people who buy parts for hobby machines will be viewed just
like those who today buy ingredients for bombs or for illegal drugs.
Further, popular computer software will include more attempts
at digital-rights management (DRM).  For example, Windows Vista
disables itself if it decides -- correctly or incorrectly -- that the
user is no longer allowed access.  Users do not precisely buy a copy
of Windows Vista; they lease access to it.

<p>As a result, insisting on our current approach to copyright will,
perversely, undermine our current intuition about copies.
Traditionally, people buy and own copies of a work, and they can do
with those works as they please up to the point of making and
distributing new copies.  Now that copying is cheap, however, people
will increasingly find that they do not own copies in the traditional
sense.  "Their" copies will disable themselves without the user
requesting.  "Their" copies will be uncopyable, even for purposes of
making backups.

<p>It is a major problem, and well worth careful consideration.  Let
me start by sketching just two ideas about redesigning copyright. I
hope this discussion is picked up by computer scientists and legal
theorists, so that we can design a system that will work well.

<p>As one comment, note that it is not a terrible choice to simply
abandon copyright.  After all, the current approach works best in a
world where copyable materials are generally mass produced, but that
world is passing.  As with any change to the rules, current businesses
in the area will have to majorly change or go out of business.  In
this case, big-budget, mass-produced works like Microsoft Windows and
The Matrix would no longer be profitable.  However, there would still
be plenty of software available and plenty of film.  At the least, <a
href="http://www.opensource.org">open source</a> software and <a
href="http://creativecommons.org">creative commons</a> artwork would
be available.  Art would not die, but big-budget art mostly would.

<p>The first idea is mainly meant as a starting point, an example to
show that there are copyright designs that are simple and have good
results.  If we cannot come up with some good redesign of copyright,
then we can abandon copyright entirely and do quite well.

<p>A second idea is to change the focus from the right to copy to some
other kind of right.  We would need to choose an activity that is
cheap for mass production but expensive for personal use, akin to the
way copying itself used to be expensive for personal use.  For
example, perhaps we should control the right to publicly produce a
work?  In that case, The Matrix would have a business model but
Microsoft Windows would not.  Whereas people could own DVD's of The
Matrix for free, movie theaters would have to pay to show it.  The
basic formula of traditional copyright would hold, and the system
should work out equally well.

<p>At any rate, the current design of copyright is flawed, and the
problems are only going to grow as copying gets even cheaper.
Computer scientists, who understand this material so well, should be
at the forefront of efforts to redesign copyright to match current
technology.  If we find nothing to propose, then we should expect the
trends to continue: full ownership of copies will decline, and
surveillance and control will increase for our personal machines.

<!--  LocalWords:  DRM uncopyable DVD's
 -->
]]></description></item>
<item><title>CUPS is impossible to configure</title>
<pubDate>December 31, 2006</pubDate>
<link>http://www.lexspoon.org/blog/cupsconfig.html</link><description><![CDATA[

<p>I am trying to set up my Linux laptop to print to my
fianc&eacute;e's Windows computer, and have stumbled deep into the
configuration swamp that is the <a href="http://www.cups.org">Common
Unix Printing System, CUPS</a>.


<p>At this stage, I am stuck trying to find a "PPD" file, whatever
that is, for my printer.  I had a lot of trouble finding one at all,
and finally I found a link to Lexmark's web site (which I did not find
when browsing their site directly), but the downloaded link is a shell
file that fails to extract itself.

<p>There are many reasons this process is maddening.  A big part is
due to the client needing a printer-specific driver at all.  This is
some kind of mis-design in the SMB protocol, because a good network protocol
should itself serve as the driver.  I should be able to tell the
client the server and printer name, and then the client should then be
able to ask the server for whatever it needs.  I should not need to
tell the client stuff that the server already knows.

<p>This alone would not be so terrible, if only CUPS itself were not
so difficult to configure.  There are many aspects to this difficulty,
too, but high among them is the confusing web-based configuration
tool.  I am doing one of the simplest, most common of configurations:
making a Windows printer visible on my Unix machine.  This should be
easy, but at least an hour later I am still failing.

<p>During all the googling I have done this afternoon, I found <a
href="http://catb.org/~esr/writings/cups-horror.html">an excellent
article</a> by Eric Raymond about my precise situation.  Here is one
of the central points:

<blockquote>
The meta-problem here is that the configuration wizard does all the
approved rituals (GUI with standardized clicky buttons, help popping
up in a browser, etc. etc.) but doesn't have the central attribute
these are supposed to achieve: discoverability. That is, the quality
that every point in the interface has prompts and actions attached to
it from which you can learn what to do next. Does your project have
this quality?
</blockquote>


<p>This strikes me as a great mental trick for designing this kind of
user interface.  The CUPS team may well have great technical talent,
but they could benefit greatly from having a UI designer who
concentrates on issues like this.

<p>For me, at this point, the next thing to try will be to put some
other kind of server on the Windows machine--maybe LPD, or maybe this
IPP thing CUPS keeps talking about.  This step should not be
necessary, but hopefully it will make things easy enough for CUPS that
the rest goes smoothly.

<p>I cannot escape the feeling, though, that this should all be
easier.  I also wonder, is there a better, more comprehensible
printing system for Linux than CUPS?  Emails welcome if you know of
one!
]]></description></item>
<item><title>Bizarre Substitutions in Windows Batch Files</title>
<pubDate>December 1, 2006</pubDate>
<link>http://www.lexspoon.org/blog/batch-substitution.html</link><description><![CDATA[

I have learned twice now that Windows substitutes variables in a
bizarre order with its batch files.  The latest example, found
by Keith Hodel, originally looked like this:

<blockquote>
<pre>
if "%OS%"=="Windows_NT" (
  rem ...stuff...
) else (
  set _SCALA_HOME=%SCALA_HOME%
  if "%_SCALA_HOME%"=="" goto error1
)
</pre>
</blockquote>

<p>This code sets _SCALA_HOME from SCALA_HOME, and then tests whether
_SCALA_HOME is non-empty.  You would think that if SCALA_HOME were
non-empty, then the second "if" statement would never fail.


<p>You would be wrong.  Before entering an "if" or "for" branch,
Windows goes ahead and substitutes <em>all</em> variables.  For
example, if you suppose SCALA_HOME starts as "C:\scala" and
_SCALA_HOME starts as "", then the above "else" clause would get
substituted like this:

<blockquote>
<pre>
  set _SCALA_HOME=c:\scala
  if ""=="" goto error1
</pre>
</blockquote>

<p>Notice that this second "if" will call error1 regardless of what
_SCALA_HOME gets set to!


<p>Keith figured out the following workaround:


<blockquote>
<pre>
) else (
  set _SCALA_HOME=%SCALA_HOME%
  rem The following line tests SCALA_HOME instead of _SCALA_HOME, because
  rem the above change to _SCALA_HOME is not visible within this block.
  if "%SCALA_HOME%"=="" goto error1
)
</pre>
</blockquote>


<p>I wonder how many hours of productivity have been lost around the
world due to this mystery?  We have lost about 10 man-hours internally
in the <a href="http://scala.epfl.ch">Scala group</a>, and it looks
like Keith lost another few himself.  It is indisputable that Windows
remains a viable operating system, a topic which cuts to the heart of
efforts to make better programming languages.  Leaving that topic
aside, I still wonder: how much better could Windows be if its core
scripting language had intuitive semantics?


<p>Personally, I would love to take this idea further, and see a
really nice shell language.  It seems that Windows could get a
productivity boost by simply adopting the decades-old Bourne shell
that is used in Linux distributions.  Linux users should not be
complacent, though; <a href="http://www.scsh.net">Scheme Shell</a>,
for example, can boost shell-scripting productivity for those who
adopt it.  Looking further ahead, a good shell is a crucial part of
what I think of as the <a href="20051211-hos.html">hacker's OS of the
future</a>.  A good shell is what makes <a
href="http://www.smalltalk.org">Smalltalk</a> and the <a
href="http://fare.tunes.org/LispM.html">Lisp Machine</a> be more than
just good languages, but good platforms for hacking.

<!--  LocalWords:  Hodel goto scala
 -->
]]></description></item>
<item><title>Guy Steele on Fortress</title>
<pubDate>October 25, 2006</pubDate>
<link>http://www.lexspoon.org/blog/guysteele06.html</link><description><![CDATA[

<p>I enjoyed hearing <a
href="http://en.wikipedia.org/wiki/Guy_L._Steele">Guy Steele</a> talk
this morning about his plans with Sun's new <a
href="http://research.sun.com/projects/plrg/">Fortress language</a>.
Fortress is a modern language for scientific computation.  Steele
plans to support the usual scientific-computation things efficiently,
e.g. floating point arithmetic and matrix operations, while having a
system that can support niceties of current languages such as objects
and garbage collection.


<p>Steele mentioned two interesting philosophical stances.  First,
Fortress puts things into a library instead of the compiler whenever
possible.  Second, the standard library itself is divided into
components which can be individually updated.  One audience member
asked if this arrangement will result in multiple dialects.  Steele
says YES, Fortress will have multiple dialects.  He considers this a
lesser evil than having <a href="http://java.sun.com">a rigid language
incapable of adjusting to new ideas for improvement</a>.  Besides,
Linux also has dialects via its different distributions; only a
moderate number of distributions are important enough for most Linux
users to ever learn.


<p>There are a ton of cool individual elements of Fortress.  To
mention just one, the types include unproven properties such as
"symmetric" and "associative".  This way, users can define numeric
types like rational numbers, and library routines can define
optimizations that only take effect if the arguments have the
necessary properties.  Normally such knowledge is embedded in the
compiler, giving the primitive types a major compilation advantage
over user-defined types.  Will this work out?  Who knows, but it seems
to be working so far!

<p>Finally, Fortress has syntax.  Optional terminating semicolons, a
favorite flame war within <a href="http://lamp.epfl.ch">LAMP</a>, is
only the beginning.  Fortress allows arbitrary Unicode, like Java, but
unlike Java it really embraces it.  The library routine for summation,
for example, is the Greek sigma.  If you want to talk about the real
numbers, you write a black-board R instead of the regular R.  But why
stop there?  On top of all of this, Fortress has significant white
space, and it distinguishes italics letters from boldface letters.


<p>Overall, Fortress is a very interesting language.  It is ambitious
in many ways, but if anyone can make it all work out, it is Guy Steele.
]]></description></item>
<item><title>Trip report on LCSD</title>
<pubDate>October 22, 2006</pubDate>
<link>http://www.lexspoon.org/blog/lcsd06.html</link><description><![CDATA[
<p><a href="http://lcsd.cs.tamu.edu/2006/">LCSD</a> is a workshop of <a
href="http://www.oopsla.org">OOPSLA</a> on libraries.  Libraries have
long been a core concept for practical software development, and they
are especially important as more software is built by teams
distributed around the world.  I enjoyed hearing
what other people are thinking about libraries nowadays.

<p>My talk on <a href="interfevol.html">interface evolution</a>
generated several questions and responses.  Many people seem to be
familiar with this issue!

<p>The keynote was by Sean Parent from <a
   href="http://www.adobe.com">Adobe</a>.  The theme of his talk is
   that the glue code is the code.  He went on from there to talk
   about some experiments Adobe is making with a declarative language
   for gluing together GUI environments.  It addresses the same
   problem as <a
   href="http://lambda-the-ultimate.org/node/1545">SuperGlue</a>.


<p>Several other talks I found interesting for various reasons.
Lubomir Bourdev and Jaakko Jarvi talked about the tension between
generic programming, size of compiled code, and efficiency.  They
discuss their solution in this design space, based on C++ templates.
Cosmin Oancea and Stephen Watt talked about inter-library interfaces
that have a lot of abstraction, even when your interface language is a
lowest-common-denominator system like CORBA.  The speaker plugged
Scala's triple of abstraction mechanisms for having extensible
components: type members, mixins, and GADT's.

<p>Eric Van Wyk, Derek Bodin, and Paul Huntington talked about their
system for having language extensions in libraries.  This is exciting
because the Scala group is exploring things like language extension at
the language level.  The system of Wyk, et al., is based on putting
attributed grammar fragments in the libraries.  If you import a
library, then you get access to the syntax and semantics defined in
those attribute grammar fragments.  Interesting.  To contrast,
Scala's efforts use fixed Scala syntax, and the semantic changes are
implemented in general Scala code, not in a separate attribute
language.


<!--  LocalWords:  LCSD OOPSLA SuperGlue Lubomir Bourdev Jaakko Jarvi Cosmin et
 -->
<!--  LocalWords:  Oancea CORBA Scala's mixins GADT's Wyk Bodin al
 -->
]]></description></item>
<item><title>Interface evolution</title>
<pubDate>October 13, 2006</pubDate>
<link>http://www.lexspoon.org/blog/interfevol.html</link><description><![CDATA[

<blockquote>
In Java when you add a new method to an interface, you break all
your clients....  Since changing interfaces breaks clients you should
consider them as immutable once you've published them.
--<a href="http://www.artima.com/lejava/articles/designprinciples.html">Erich
  Gamma</a>
</blockquote>

<blockquote>
<code>NoSuchMethodError</code> --Java VM, all too frequently
</blockquote>


<p>The two quotes above are problems of <em>interface evolution</em>.
The first one suggests a real problem in Java's interface approach.
At least one master designer is reluctant to use them, and indeed
Gamma has gone on the praise Eclipse's replacement of Java interfaces by
descriptors written in XML.  There is an implicit put down here:
Java's interfaces are bad enough that master designers write their
interfaces in a separate language.

<p>The second quote shows up all too frequently on <a
href="http://www.lexspoon.org/sbaz">Scala Bazaars</a>.  People
independently post compiled jar's onto a bazaar, and all too
frequently we discover that different versions of compiled jars are
incompatible with each other.  Their interfaces have shifted and are
no longer compatible.


<p>Both of these problems are caused by interface evolution.  Either
you get stuck with a bad interface, or you improve the interface and
break compatibility.


<p>There is a lot that can be done to ease the pain of interface
evolution.  One tool in the tool box is to extend the idea of
deprecation into <em>transition checking</em>.  With this approach,
you step into interface evolution carefully, and you have a checker to
help you decide when to take the plunge and make an API-breaking
change.  I will be talking about this approach at the end of the month
at the <a href="http://lcsd.cs.tamu.edu/2006/">Workshop on
Library-Centric Software Development</a>:


<blockquote>
Spoon, S. Alexander.
<a href="../packuniv/spoon06-lcsd.pdf">Anti-Deprecation:
Towards Complete Static Checking for API Evolution</a>.
Workshop on Library-Centric Software Development (LCSD) 2006.
(<a href="http://infoscience.epfl.ch/search.py?recid=90768">extended
 version with proofs</a>)
</blockquote>


<blockquote><strong>Abstract</strong>: API evolution is the process of
migrating an inter-library interface from one version to another.
Such a migration requires checking that all libraries which interact
through the interface be updated.  Libraries can be updated one by one
if there is a transition period during which both updated and
non-updated libraries can communicate through some transitional
version of the interface.  Static type checking can verify that all
libraries have been updated, and thus that a transition period may end
and the interface be moved forward safely.  Anti-deprecation is a
novel type-checking feature that allows static checking for more
interface evolutions periods.  Anti-deprecation, along with the more
familiar deprecation, is formally studied as an extension to
Featherweight Java.  This formal study unearths weaknesses in two
widely used deprecation checkers.
</blockquote>

<!--  LocalWords:  VM LCSD
 -->
]]></description></item>
<item><title>Brin on learning to program</title>
<pubDate>September 14, 2006</pubDate>
<link>http://www.lexspoon.org/blog/brin-newbielangs.html</link><description><![CDATA[

David Brin <a
href="http://www.salon.com/tech/feature/2006/09/14/basic/">gets it
exactly backwards</a> today about the ease of learning programming.  I
think he is talking about public education, not about learning to
program in general.

<p>In fact, it is far easier than ever to learn to program.  When I
started, my computers and calculators each had one or two programming
languages, and as a child I had no opportunity to add a new one.  I
got BASIC, Pascal, or a calculator's custom language, and that was it.
I cherished each scrap of example code I came across.  My textbooks
did not have program listings at all; I would have loved to have the
scraps of BASIC that Brin talks about.


<p>Nowadays, we have the Internet, and we have much better learning
languages than the BASIC interpreters Brin talks about.  The Internet
gives access to gobs of tutorial information and example code.  It
also supplies great programming systems for newbies, like <a
href="http://www.squeak.org">Squeak</a> and <a
href="http://www.drscheme.org">Dr. Scheme</a>, not to mention the various <a
href="http://en.wikipedia.org/wiki/Logo_programming_language">Logo</a>'s.


<p>A better conclusion from Brin's essay is that teachers are using
out of date text books.  BASIC was flamed decades ago as being a poor
language, and people who want to learn to program are drifting away
from it.  Whet he should conclude is that the curriculum pipeline is
poor (they chose BASIC instead of Logo) and too long (there are better
languages now).


<p>But instead of this conclusion, Brin attacks researchers:
<blockquote>
If this is a test, then Ben and I passed it, ingeniously. In contrast,
Microsoft and Apple and all the big-time education-computerizing
reformers of the MIT Media Lab are failing, miserably. For all of
their high-flown education initiatives (like the "$100 laptop"), they
seem bent on providing information consumption devices, not tools that
teach creative thinking and technological mastery.
</blockquote>

<p>Researchers always risk being out of touch.  However, Brin is
attacking their strong point.  Two of the three systems I mentioned
above are spearheaded by people on this very same <a
href="http://www.laptop.org/">$100 laptop project</a>: Alan Kay did
Squeak, and Seymour Papert did Logo.  On top of that, he explicitly
mentions the MIT Media Lab, out of which came the great <a
href="http://mindstorms.lego.com/">Lego Mindstorms</a>.  Brin is
apparently unaware of what the researchers are actually doing.


<p>The quoted comment about the $100 laptop points to where his core
argument goes wrong.  Yes, the $100 laptop is mainly an information
sharing device, but that is because it is targeted at a general
audience.  Most computer users are not programmers!

<p>And there we are.  Yes, the proportion of computer users who are
programmers is small nowadays.  However, this is only because the
increase in programmers is dwarfed by the increase in computer usage
in general.

<p>Everyone today is a computer user, and there are more programmers
than ever.


<!--  LocalWords:  Brin Brin's Papert Mindstorms
 -->
]]></description></item>
<item><title>Net Neutrality Roundup</title>
<pubDate>July 1, 2006</pubDate>
<link>http://www.lexspoon.org/blog/net-neutrality.html</link><description><![CDATA[
The U.S. Congress recently considered and dismissed legislation to
force cable and phone companies to have fair pricing for the Internet
traffic they carry, for some notion of "fair".  Proponents of this
regulation have taken the term "network neutrality", but it seems more
to me as an FCC for the Internet.



<h2>Neutrality in general</h2>

<p>I can believe that the layered nature of the Internet is one key to
its high popularity and capability.  It is tempting for network
designers to try and make networks smart in various ways.  TCP/IP,
however, mostly restricts itself to moving packets around from address
A to address B.  The one feature it offers is retransmission to ensure
reliable delivery, and that feature is optional.

<p>The result is that there is a marketplace of network services to
run on top of TCP/IP.  Anyone, anywhere in the world, can start their
own Internet service.  The good ones become Googles.  The poor ones
become Floater bridge networks.  There are a lot of good ones.


<p>Network neutrality proponents fear that this aspect of the Internet
will disappear soon.  They fear that a few companies in the
U.S. could, through offering different prices to different customers
(e.g., charging more if you appear to be wealthier), could cause
competition to be stifled.

<h2>The last mile</h2>

<p>To clarify matters, I should say from the outset that phone and
cable lines&mdash;the industry targeted by the original proposal
before Congress&mdash;typically have a <em>local</em> monopoly.  Thus,
their behavior in locales can and should be carefully regulated.

<p>The question I wish to address, though, is for <em>nationwide</em>
companies, companies like Verizon, AT&amp;T, and Cingular.  At such
scales there is no strong reason to grant a monopoly.  Any company can
lay down a new cross-country network.  There is a case for separating
inter-city networking from local networking, and the standing policy
in the U.S. for phone networks is precisely that.


<h2>Efforts in the past</h2>

<p>Since the feared problem has never occurred on the Internet, we can
only speculate about the future.  One way to do this is to look at
efforts in the past by companies to segment the Internet.


<p>Prodigy, CompuServe, MSN, and AOL are examples that leap to my
mind.  They all had their own network, and they all gave customers
only restricted access to the rest of the Internet.  What became of
these companies?

<ol>
<li>Prodigy and CompuServe are dead as far as I can tell.  They never
    changed and their customers simply left.

<li>MSN gave up network service providing and went into other
    business.

<li>AOL stopped their segmentation efforts, and now gives full
    Internet access.
</ol>

<p>The available evidence is that when network providers try to
isolate their customers, the customers leave.



<h2>Defining a solution</h2>

<p>I am at a loss to even imagine a regulatory structure that would
<em>force</em> better network neutrality than we already have.
Proponents, on the other hand, seem to find it obvious.


<p>I believe that proponents might be thinking of the Internet as
<a href="http://en.wikipedia.org/wiki/Star_topology">looking like a star</a>:
<blockquote>
<img src="http://upload.wikimedia.org/wikipedia/en/4/48/Star-Topology.gif">
</blockquote>

<p>With such a topology, you can control the Internet by controlling the
central node.  However, the Internet is actually <a
href="http://research.lumeta.com/ches/map/gallery/index.html">more
like a spiderweb:</a>
<blockquote> <img
src="http://www.cybergeography.org/atlas/lumeta_large.jpg">
</blockquote>

<p>The <em>net</em> in Internet means network.  The Internet looks
like a big spiderweb.  Who, in this web, is supposed to be regulated?
And how?  The very design of the network is to switch packets.  Each
router handles packets in its own way, and each router has easier
access to some parts of the network than others.  Since giving equal
access is impossible, what exactly would the regulation require?


<p>To rub it in, try considering some specific networks segments you
may be familiar with.  Most companies and universities, for example,
have their own internal networks plus a router connecting them to the
Internet.  The internal network is a bona fide part of the Internet,
but existing practice is to treat internal packets differently from
packets coming in and out of the institution.  That is to say, the
majority of existing networks are only <em>effectively</em> network
neutral, but <em>technically</em> they include discrimination against
different packets.  How would you tailor regulation so that the
current beneficial behavior does not become outlawed?

<p>For that matter, what about the wireless routers within
individuals' homes?  Why should they not have to provide network
neutrality themselves?


<p>Given the web-like and not star-like topology of the Internet,
controlling its behavior is difficult at best.


<h2>More likely solutions</h2>

<p>In the previous section I tried to imagine the best possible
regulation, but realistically we cannot assume that Congress will find
the best possible regulation.  Let us take a moment to look at
previous government attempts to regulate networks, to gain a more
likely picture of what they would accomplish.


<p>Consider first the <a
href="http://en.wikipedia.org/wiki/Communications_Decency_Act">Communication
Decency Act</a> (CDA).  The CDA attempted to control the content
exchanged on the Internet, but there was no practical way for most
service providers to implement the requirements.  Thus, the CDA, if it
had stayed in effect, would have forced most services like livejournal
or blogspot to disappear to go out of business.  The Supreme Court
struck down the CDA, but the CDA gives us an idea of the kind of
stifling law that Congress considers par.  They do not seem to
understand the Internet.


<p>Consider the <a
href="http://en.wikipedia.org/wiki/Digital_Millennium_Copyright_Act">Digital
Millennium Copyright Act</a> (DMCA).  The DMCA simultaneously allowed
backups of DVD's but disallowed copying DVD's.  Which is it?  These
two parts of the DMCA contradict each other, but that is acceptable to
Congress when it comes to technical matters.  Congress does not appear
to understand software.


<p>Consider the <a href="http://www.fcc.gov">Federal Communications
Commission</a> (FCC).  The FCC provides important administration of
limited wireless bandwidth.  However, in doing so, they must
inevitably make decisions about who may use that bandwidth.  Over
time, they have come to enact decency provisions analogous to the CDA.
To see the effect, compare the bland, inoffensive content on broadcast
television to the more highly varied content on cable television.  Do
we really want an FCC for the Internet?

<p>Finally, the elephant in the room is the current telephone network.
For various reasons, U.S. governments at all levels have applied a
sophisticated web of regulations to the telephone network.  Among many
other results, it is now cheaper to make a phone call over the
Internet than via the dedicated, carefully coddled phone network.  The
effort to "save" the telephone network through regulation has resulted
in a worse network than the much younger Internet.  Instead of making
the Internet more like the telephone network, perhaps we should
embrace its key differences.


<p>Can any readers point me to <em>insightful</em> network or software
regulation that Congress has passed?


<h2>Related Reading</h2>

<p>Those are the main things I want to say.  There has been much
discussion around the Internet.

<p>I like <a
href="http://econlog.econlib.org/archives/2006/06/net_neutrality.html">Arnold
Kling's take</a> as an economist, and I sympathize with Jim
Robertson's frequent snarks about an <a
href="http://www.cincomsmalltalk.com/blog/blogView?showComments=true&entry=3327518837">"FCC
for the Internet"</a>.

<p>On the flip side, there are many big names proposing regulation,
but their arguments are troublingly weak.  (Take this as a challenge,
readers&mdash;tell me about arguments you find strong, and I will link
to them.)


<p>Lawrence Lessig <a
href="http://dig.csail.mit.edu/breadcrumbs/node/132">provides one
example</a>.  Lessig first equates open source to GNU-like licenses, a
bizarre claim which means that Apache, FreeBSD, and Scala are not open
source.  Then, he claims that the GPL "regulates" software, even
though "regulation" usually applies more to government mandates than
to voluntary private agreements.  I have never seen a starker example
of <a href="http://en.wikipedia.org/wiki/Doublespeak">doublespeak</a>.


<p>Tim Berners-Lee makes an <a
href="http://dig.csail.mit.edu/breadcrumbs/node/132">eloquent and
compelling argument<a/> about layered architectures--far better than
my feeble attempt above--but he fails to address what exact kind of
regulation he would like. Indeed, he himself writes:
<blockquote>
To actually design legislation which allows creative
interconnections between different service providers, but ensures
neutrality of the Net as a whole may be a difficult task.
</blockquote>

<p>If you want flame more than light, go visit <a
href="http://www.savetheinternet.net">savetheinternet.net</a>.

<p>Finally, many, many links can be found from the <a
href="http://en.wikipedia.org/wiki/Network_neutrality">Wikipedia
article</a>.

<!--  LocalWords:  TCP IP Googles MSN bona fide CDA livejournal blogspot DMCA
 -->
<!--  LocalWords:  DVD's Kling's troublingly Lessig GPL Berners savetheinternet
 -->
<!--  LocalWords:  Wikipedia
 -->
]]></description></item>
<item><title>One more delay for Scala in Debian</title>
<pubDate>June 28, 2006</pubDate>
<link>http://www.lexspoon.org/blog/debian-scala-2.html</link><description><![CDATA[

<p>After trying to <a href="debian-scala-long.html">dodge one
potential problem</a> getting Scala into <a
href="http://www.debian.org">Debian</a>, I have now submitted a first
round of packages.  Two weeks later, I get word back that the packages
are rejected.  Why?  I am told to put them in three packages instead
of four.

<p>Okay. I like <a
href="http://people.debian.org/~terpstra/message/20060610.134938.110cf88c.en.html">my
organization</a> better, but it is not up to me.  Hopefully this is
the last major delay.
]]></description></item>
<item><title>DDP at PLDI</title>
<pubDate>June 17, 2006</pubDate>
<link>http://www.lexspoon.org/blog/ddp-at-pldi.html</link><description><![CDATA[
I read with interest <a
href="http://www.eecs.berkeley.edu/Pubs/TechRpts/2006/EECS-2006-31.html">this
PLDI paper</a> by Manu Sridharan and Ras Bodik.  They have a very
interesting analysis that, from a general perspective, uses the
overall approach of DDP: choose carefully where in the program you
focus analysis efforts, so that your analyzer can scale to large
programs but still can use context-sensitivity to unravel different
parts of the program.

<p>The authors' formulation, however, is quite different from DDP.
DDP uses a very general formulation: goals, their answers, and
dependencies among goals.  This is so general that it is not even
specific to program-analysis.  This generality is a strength and a
weakness: it means you can often improve an analysis simply by using
DDP as the base layer of the algorithm instead of the normal
demand-driven worklist algorithm.  However, because DDP is so general
at this level, it does not exploit any properties of the rules
themselves.  It is the classic trade off of generality.


<p>One really nice property of Sridharan's graph formulation is that
you can easily <em>remove</em> the "match" edges and thus cause the
algorithm to <em>improve</em> its existing results.  There is no
analog in DDP as described so far (although I am not ready to say
there <em>cannot</em> be such an analog).


<p>Overall, it is great work that is very interesting to me.  It is a
pity the authors overlooked initially <a
href="http://www.lexspoon.org/ddp">my work in the area</a>, although
we have since had a pleasant exchange in private email.  More the pity
is that the PLDI reviewers of this paper also overlooked the prior
work.  It was published in ECOOP '04, which is not obscure for
program-analysis buffs.



<!--  LocalWords:  DDP PLDI Manu Sridharan Ras Bodik downcasts Ph worklist
 -->
<!--  LocalWords:  Sridharan's ECOOP
 -->
]]></description></item>
<item><title>It's the patents, not patent-trolling companies</title>
<pubDate>May 16, 2006</pubDate>
<link>http://www.lexspoon.org/blog/patent-trolls.html</link><description><![CDATA[

<p>Patent-troll companies have a business model where they acquire
patents and then sue anyone who is using the patented idea.  Such
companies are popular to discuss lately.

<p>Such companies are a symptom, not a problem, and they should be
left alone.  If a patent has been properly acquired, then its owner
should be allowed to sue people who infringe on it.  That is what a
patent is.  If someone sells their patent to another company who does
the dirty work for them, then that is fine too---after all, we live
in a specialized society, and not everyone is cut out to be lawyers.

<p>The real problem is not patent-trolling companies, but bad patents
themselves.  In software in particular, where practically all
businesses use copyright to cover their intellectual property,
patents simply do not solve any real problem that we have.

<p>In software, the best solution to dealing with patents is to
abolish them.  Leave patents for domains where they solve some
problem.
]]></description></item>
<item><title>Exim lecturing its users</title>
<pubDate>April 29, 2006</pubDate>
<link>http://www.lexspoon.org/blog/exim-ssmtp.html</link><description><![CDATA[
<p>It is frustrating when programmers decide to lecture their users
instead of supporting them.  I just spent over an hour trying to get
my mail to relay through <a href="http://www.epfl.ch">EPFL</a>'s mail
servers using <a href="http://mailwww.epfl.ch/intranet.html">the
restrictive channels EPFL allows</a>, only to find that <a
href="http://www.exim.org">Exim</a> has <a
href="http://www.exim.org/mail-archives/exim-users/Week-of-Mon-20050620/msg00258.html">its
own restrictions</a>.  The two sets of restrictions are workable by
themselves but do not have a solution together.  The only way to make
Exim and EPFL both happy is for them not to talk to each other.
Bleh.  I think I will stick with EPFL and replace Exim. 


<p>The specific constraints, for the morbidly curious and the
technologically perverse:

<ol>
<li>Some of the EPFL mailing lists I need to use only allow
    mails from on campus.

<li>I use this thing called the Internet, though, and do a lot
    of my work away from campus.

<li>EPFL's IT, recognizing that 1 and 2 together are a problem, keeps #1
    but adds an extra on-campus relay server to work around the problem.

<li>Alas, port 25 is blocked when trying to connect to the relay
    server.  The university firewall says no, for some reason.


<li>EPFL's IT, recognizing that 1-4 are a problem together, provides a
    workaround for the workaround that is blocked: it lets you connect
    to port 465 instead of 25.

<li>However, on port 465 the relay server only offers the semi-standard
    SSMTP protocol, not vanilla SMTP.

<li>Exim, as flexible as it is, can talk SSMTP.

<li>However, it will only speak it to clients, not to servers, because
    "ssmtp is a legacy protocol (and has been for some time)".

</ol>

<p>I wish EPFL's networking were more permissive, that it erred
towards working instead of erring towards making its users work
harder.  I wish Exim's authors would swallow their taste, that they
would support the Internet as it is instead of the Internet they wish
for.  I wish I had a slice of pie.

<!--  LocalWords:  Exim Bleh EPFL's SSMTP SMTP ssmtp Exim's
 -->
]]></description></item>
<item><title>Weaken DMCA, not extend it!</title>
<pubDate>April 25, 2006</pubDate>
<link>http://www.lexspoon.org/blog/super-dmca.html</link><description><![CDATA[
<p>Americans should not <a
href="http://news.zdnet.co.uk/business/0,39020645,39265310,00.htm">extend
the copyright protections of the DMCA</a>.  Leaving aside philosophy for a
moment, just consider a couple of practical problems:

<ol>
<li>All computers are copying devices.  On a computer, it is actually
easier for the machine to copy content than to view it.  Therefore,
any legislation that targets copying devices, essentially targets
computers in general.  Everyone becomes guilty.

<li>We have reached the absurd position where, for many people, it is
against the law to play their own DVD's on their own DVD players.
This is a basic sort of fair use that a free country should allow.
</ol>


<p>More philosophically, we should not be surprised to see the march
of progress render some industries different or even non-existent.
Automobiles have replaced horses and carriages, and that is perfectly
normal.  We should not legislate horse and carriages back into
economic relevance, and nor should we clamp down on private computing
just so that content providers can avoid change.  Fighting progress is
no reason to give up our freedom.

<p>For more information, go visit the <a
href="http://www.eff.org">Electronic Frontier Foundation</a>.
Particularly interesting to me is their enumeration of <a
href="http://www.eff.org/IP/DMCA/?f=unintended_consequences.html#Section4">fair
use rights that are under threat by DMCA</a>.  We need <a
href="http://en.wikipedia.org/wiki/DMCRA"> less of this</a>, not more.

<!--  LocalWords:  DMCA DVD's
 -->
]]></description></item>
<item><title>Debasish Ghosh blogging about Scala</title>
<pubDate>April 3, 2006</pubDate>
<link>http://www.lexspoon.org/blog/debasishg.html</link><description><![CDATA[
Debasish Ghosh is a very experienced programmer who blogs about
programming languages.  Lately he is <a
href="http://debasishg.blogspot.com/">blogging about Scala</a>.  Check
it out, if you want the perspective of a practitioner.

<!--  LocalWords:  Debasish Ghosh blogging blogs
 -->
]]></description></item>
<item><title>Why a Debian package of Scala is taking so long</title>
<pubDate>April 2, 2006</pubDate>
<link>http://www.lexspoon.org/blog/debian-scala-long.html</link><description><![CDATA[

<p>A great thing about <a href="http://www.debian.org">Debian</a> is
that it welcomes anyone to become a volunteer on the project.  As a
result, it has over 900 developers and over 10,000 packages available.

<p><a href="http://scala.epfl.ch">Scala</a> is not yet packaged for
Debian.  Every time I think, "all I need to do is tar up some files",
I run into a discussion like <a
href="http://www.webservertalk.com/archive97-2004-4-178851.html">this
one</a>.  While Debian developers are welcoming, they are also
extremely nitpicky!

<p>In this particular case, I actually think that <a
href="http://lamp.epfl.ch">LAMP</a>'s release of Scala should be a
"native package", as Debian calls it, which means that the source code
for the Debian package is the exactly, bit-for-bit the same as the
source code of the "upstream" package.  That is in fact how the
planned distribution would work: at the same time a LAMP release of
Scala happens, there would be Debian packages created out of the same
source tree.  Bit for bit.

<p>However, many experienced Debian developers seem extremely opposed
to native packages, so I keep revisiting the decision.  The result is
that nothing happens at all.  I have to wonder: is this really a big
deal?  The use cases cited in the above seem relatively unimportant
when you consider that the absolute worst case is that someone does a
diff themselves and observes that it is, in fact, empty.

<p>Debian would be better if it had a way to upload non-nitpicked
packages, especially to its unstable branch.  Insisting on policy
perfection before even uploading the first version means that it takes
a long time to get the first version out.  It is as if many Debian
enthusiasts would rather talk about packages than actually build,
distribute, and use packages.


<p>As it is, Debian users who want Scala will simply have to use a
generic installer.
]]></description></item>
<item><title>Debian Election 2006</title>
<pubDate>March 26, 2006</pubDate>
<link>http://www.lexspoon.org/blog/debian-2006.html</link><description><![CDATA[
<p>The <a href="http://www.debian.org">Debian</a> Linux distribution
is currently <a
href="http://www.us.debian.org/vote/2006/vote_002">electing its
project leader for 2006</a>.  Debian uses secret ballots, but I am
going to post my votes online here nonetheless.

<p>In general, it is a real pleasure reading the platforms and
rebuttals of so many thoughtful and enthusiastic people.  Software
distributions are a core part of people's computing experiences, and
Debian thus fills a vital role.  Debian is my favorite Linux
distribution, because it allows new people to contribute relatively
easily, and thus it has grown to 900 developers (at last count) who
maintain over 10,000 packages.


<p>I am personally a very minor Debian developer, contributing just
enough that I do in fact get a vote.  While I like working on Debian,
I usually have plenty of neglected research projects that can soak up
any spare hours I find.


<p>My desiderata for a project leader are:

<ol>

<li>Someone who thinks of Debian as producing a Linux distribution.
This sounds obvious, but most of the leaders' platforms are about
bureaucratic procedures.  The fact that Ubuntu is making a good
distribution for desktop users is a fringe discussion topic not even
mentioned by many of the candidates.  I favor candidates who make it
the main topic.  Remember the goal!


<li>Debian's legal decisions are amateurish and extreme.  The
debian-legal list is happy to wax about law theories and legal hair
splitting, e.g.  the difference between contracts and agreements.  At
the end of this "process", they reject software that is perfectly well
free for all practical purposes.  This is an important subtopic of
point 1: as a Linux distribution, you need to get used to the idea of
distributing existing free Linux software.  I would like a project
leader who pushes for realistic and practical legal decisions, instead
of trying to make Debian to spend its time practicing amateur law.

<li>Leaders should be good leaders.  For example, they should have a
lot of experience with the project, not just interesting ideas.  They
should be good at working with people, including when they disagree.


<li>The "DLT" is a bad idea.  The idea is something like, a subgroup
of the Debian Developers have secret meetings and then make things
happen when the general group is too slow to make it happen.  I love
the idea of having vital subgroups.  I <em>intensely</em> dislike
giving any such group an official status, however.  There should be
many DLT's, not one, and they should all have to air their ideas in
public before making any decisions that affect the group.  This is a
subpoint of point 3: Anyone who pushed for the DLT is not following
good leadership.

</ol>


<p>Not a soul cares about my point 2.  Debian developers of today seem
happy to browbeat open-source developers for not being open-source
enough.  Yuck--this may motivate me to leave the project.  In the
meantime, the focus is on the other three:



<p>Finally, here is my (Condorcet) vote:

<ol>

<li>Anthony Towns.  He has been a release manager for the project.  He
    thus has in-depth knowledge of what is in the project and what it
    takes to actually produce a Linux distribution (see point 1!).
    His writing comes off as very friendly, and the other leader
    nominees all say they can work with him (did I mention that Debian
    includes many of honest and forthright people?).


<li>Steve McIntyre.  His experience with making Debian CD's is
    positive in my accounting (point 1).  An the other hand, he is a
    heavy proponent of a <a href="debian-conductcode.html">code of
    conduct</a>.  I admire his attention to improving communication,
    but I do not know if a code of conduct is the right kind of
    procedure to implement.


<li>Jeroen van Wolffelaar.  He does not have lengthy experience, but
    that experience is intense.  Unfortunately, that experience is
    part of the DLT.  I promote him nonetheless because he appears to
    be a good leader otherwise: he wants to facilitate communication,
    and otherwise (from my quick reading) not to do much else as the
    project leader.


<li>Andreas Schuldei.  He really likes the DLT.  As good of a
    candidate as he is otherwise, I really think that DLT's undermine
    the Debian's democratic system.  If he comes up with another
    organization for the DLT, I could happily rank him higher next
    year.

<li>Bill Allombert.  He is openly more interested in the "political
    significance" of Debian than the actual work of it.  See my point
    1.  I enjoy reading Mr. Allombert's thoughts, but I would prefer
    for the project leader someone who focuses on getting things
    done.

<li>Ted Walther.  Ted rocks.  He is very fun to read.  He would be an
    awful leader.

<li>Ari Pollak.  As snarky as I am feeling this morning, I would not
    vote a cat ahead of a human.  Shame on anyone who did.  Commentary
    is fun and all, but actual votes should be taken seriously.

</ol>


<!--  LocalWords:  online Ubuntu debian DLT DLT's subpoint CD's Jeroen Schuldei
 -->
<!--  LocalWords:  Wolffelaar Allombert Allombert's Pollak snarky
 -->
]]></description></item>
<item><title>Debian is Too Large to be Polite?</title>
<pubDate>March 26, 2006</pubDate>
<link>http://www.lexspoon.org/blog/debian-conductcode.html</link><description><![CDATA[
A lot of the discussion at <a
href="http://www.us.debian.org/vote/2006/vote_002">this year's Debian
leader election</a> is about people on the mailing list being rude and
crude.  Apparently, the group has grown a little large for fully
informal procedures.


<p>Some candidates propose applying a code of conduct around the
mailing lists.  On its face this sounds counterproductive to me -- a
mailing list is <em>supposed</em> to allow all opinions, are they not?
With 900 people speaking, you fundamentally need to prepare yourself
to get shocked once in a while.

<p>Additionally, many of the people proposing such codes of conduct
have not been careful to say how they will enact it.  Censorship (why
beat around the bush?) can be helpful, sure, but it is important to be
woefully careful about it if you want your organization to stay
healthy.

<p>Most importantly, though, focusing on crude comments misses the
main issue.  The issue is for the team to work together to enrich each
others' understandings and to make decisions that everyone feels is a
fair reflection of the groups' desires.  Here are some directions,
taken from existing democratic political organizations, that seem
likely to help:


<ul>

<li>When crafting a general resolution, Debian's closest thing to law,
follow a sort of parliamentary procedure that has been adapted to the
Internet.  That is, everyone gets a round to speak before the next
round of rebuttals comes in, etc.  I am sure there are clever people
in the project who could devise a good protocol.

<li>Branch off special-interest groups when possible so that the
number of people to coordinate in a discussion is manageable.  When
they are done, they can bring their ideas to the general group for a
larger-scale discussion.

<li>For yes/no legal decisions, such as those discussed on
debian-legal, use a judicial system.  Have someone advocating each
side, and have a judge mediate the back and forth argument.  The
current situation on debian-legal is essentially mob rule.  The
popular folks simply drive through what they want and drive out
people they do not like.

</ul>


<!--  LocalWords:  debian
 -->
]]></description></item>
<item><title>Scala or XML for Documents?</title>
<pubDate>March 24, 2006</pubDate>
<link>http://www.lexspoon.org/blog/scala-as-xml.html</link><description><![CDATA[
<p>I have used <a href="http://www.docbook.org">DocBook</a> in the
past for documents where I would like to distribute both HTML and for-print
versions.  It works reasonably well, but there are three major
shortcomings:
<ol>
<li>There are no subroutines or macros.  If you do something
    twenty times, you have to repeat yourself.
<li>It does not look as nice as a carefully written <a
href="http://www.latex-project.org">Latex</a> file.
<li>It does not handle math formulas, where Latex remains king.
</ol>


<p>I have long yearned for a Turing-complete language to use instead
of XML.  It turns out that <a href="http://scala.epfl.ch">Scala's case
classes</a> are about equally as expressive, while addressing most of
these issues.  The first issue goes away entirely.  The second is
actually reduced, but only because I wrote my own style sheets instead
of relying on Docbook.  (As an aside, why in the world do the standard
Docbook styles generate such bad for-print versions?  Latex's simple
article style looks much better.)  Only the third is left untouched.


<p>Enough said.  The implementations are about equally long,
if you discount the style sheets.  Here's the original file
and counts:
<ul>
<li><code><a href="scala-as-xml/manual.xml">manual.xml</a></code>: 
    795 lines, 33kb
</ul>
And here are the new files:
<ul>
<li><code><a href="scala-as-xml/Manual.scala">Manual.scala</a></code>:
    720 lines, 32kb
<li><code><a href="scala-as-xml/Documents.scala">Documents.scala</a></code>:
    41 lines, 1.5kb
<li><code><a href="scala-as-xml/EmitHtml.scala">EmitHtml.scala</a></code>:
    115 lines, 2kb
<li><code><a href="scala-as-xml/EmitLatex.scala">EmitLatex.scala</a></code>:
    138 lines, 3kb
<li><stronge>Total:</strong>  1014 lines, 38kb
</ul>


<p>Finally, here's the output.  I think it all looks so so, although
   naturally I mildly prefer both of my versions to the Docbook ones.
<ul>
<li>original: <a href="scala-as-xml/orig.html">orig.html</a>
              <a href="scala-as-xml/orig.pdf">orig.pdf</a>
<li>new: <a href="scala-as-xml/new.html">new.html</a>
         <a href="scala-as-xml/new.pdf">new.pdf</a>
</ul>
]]></description></item>
<item><title>The Insidious Eval Button</title>
<pubDate>March 20, 2006</pubDate>
<link>http://www.lexspoon.org/blog/evalbutton.html</link><description><![CDATA[
<h2>Overview</h2>

<p>In general, simplified theory is a powerful tool: it allows people
to accomplish more with less mental effort.  Sometimes, however, the
simplification is overly strict, removing possibilities that are
useful.  This article focuses on an insidious assumption I think is
overly restrictive: the assumption of an ever-present <em>eval button</em>.

<p>The eval button is the step that converts a human-readable computer
program into a computer-executable one.  There is an inherent need to
have some kind of divide between static program and dynamic execution.
However, eval-button environments and theories make this divide
absolute: there are programs, and there are executions, and the two do
not mix.  Likewise, if you change your mind and change the source
program, then an eval-button environment makes you abandon any
executions corresponding to the original version of the program.

<p>The eval button shows up in a number of places:
<ul>

<li>In theory, it shows up in semantics that assume the program is
    fixed.  If someone's language semantics is summarized by
    <code>E(P) = v</code>, then this "E" function is the eval button.
    Such theories quietly assume that the program does not change
    during execution; they make it impossible to even discuss such a
    thing.

<li>In programming environments, the eval button shows up as the
    files+compilers arrangement and the corresponding edit-compile-run
    cycle.  Such environments deeply assume that if you change the
    program, you should expect to abandon any running execution.

<li>In programming language design, the eval button appears as heavy
    static semantics.  The motto of the eval-button language designer
    is, "If it does not type check, it is not a program".  In order to
    achieve a programming environment without the eval button
    assumption, it is likely necessary that the programming language
    be flexible enough to allow for slop.

</ul>

In this article, I will take a look at the eval button for both
programming environments and language theory.

<h2>No Reboots!</h2>

<p>"No Reboots!" is the rallying cry for a no-reboot programming
environment.  Eval-button environments insidiously presume that the
running program corresponds exactly to the source code that spawned
it.  If the program changes, the executing process must necessarily be
discarded.  Stopping a program and then restarting it from scratch is
nothing less than a reboot.


<h2>Example 1: Backwards Clock</h2>

<p>I will now try, as best as possible on a web page, to show how
no-reboot environments are useful to practitioners.  The below
examples are all done in <a
href="http://www.squeak.org">Squeak</a>. Demonstrating on a web
page is difficult, because the
interaction is the point.  What I have tried here is to insert large
numbers of screenshots so that the reader can hopefully picture the
interaction.  If it is not enough, you might also want to download
<a href="http://www.cincomsmalltalk.com/userblogs/buck/blogView?showComments=true&entry=3318572077">David Buck's video of a Smalltalk interaction</a>.


<p>The first example is to modify a graphical widget.  I picked at
random the "watch morph" widget which displays an analog clock.  My
first choice for a modification was to change the display to using
roman numerals, but that modification has already been implemented!
As a second choice, let's make a clock that runs backwards.


<p>The original watch morph <a href="evalbutton-pics/watchmorph.png">looks like this</a>.  We start by
<a href="evalbutton-pics/duplicate.png">making a duplicate</a> of the watch morph and then telling it to be
an <a href="evalbutton-pics/ownsubclass.png">instance of a new class</a>.  The new class is a subclass
of WatchMorph that has no new methods.  Thus, it begins by behaving
exactly like the original.  Now we can make some changes without
affecting normal WatchMorph's.
(Incidentally, this kind of interaction is one of the most compelling
reasons, to me, to have subclassing.  If the modification is planned
in advance, then delegation usually works better.  It is for these
after-the-fact ad-hoc modifications where subclassing is really
helpful.)


<p>To succeed in the modification, we first need to understand the
original class.  We can open a <a href="evalbutton-pics/browseorig.png">browser
on the original class</a> and look through its methods for what needs
changing.  If we <a href="evalbutton-pics/drawOn.png">look at
<code>drawOn:</code></a>, the method for refreshing the drawn
appearance of the morph whenever necessary, we can see three calls at
the top to a method called <code>radius:hourAngle:</code>.  These
three calls are trying to decide where to draw the hour, minutes, and
seconds hands of the watch.  The method appears to convert a
(radius,angle) pair into screen coordinates.

<p>It appears that <code>WatchMorph</code> is factored so that
watch-like (radius,angle) coordinates are consistently transformed via
the <code>radius:hourAngle:</code> method.  To quickly test this
theory, we can <a href="evalbutton-pics/inspectOrig.png">open an
inspector</a> on our morph and <a
href="evalbutton-pics/tryRadiusMethod.png">try some sample
calculations</a>.  These experiments are too fidgety to display very
well on a web page; I will leave you with just one example--testing
out radius 0.5 and hour angle 3 (for 3:00).  The feel of this is just
like jiggling around a physical apparatus to get a rough feel for how
it works: the information is not conclusive, but you still like being
able to do it.

<p>This <code>radius:hourAngle:</code> method seems to be a key
modification needed for <code>BackwardsWatchMorph</code>.  We need to
change it so that the angle is interpreted in a counter-clockwise
direction instead of clockwise.  We can <a
href="evalbutton-pics/radhourmeth-old.png">browse to the original
method</a> in <code>WatchMorph</code>.  This needs only slight
modification for the purposes of <code>BackwardsWatchMorph</code>.  I
will not post an explanation, in case you want to try figuring it out
yourself.  In <a href="evalbutton-pics/radhourmeth-new.png">the
modified version</a>, I have highlighted the part that changes.

<p>This modification actually turns out to be all that is necessary.
<code>WatchMorph</code> is already well factored to consistently use
this method in all the places that a time is mapped to screen
coordinates!  You simply have to resize the morph in order for the
morph and the system to clear some caches, and the new morph is
complete.

<p>The final things the programmer should do are to try out the new
<code>BackwardsWatchMorph</code> <a
href="evalbutton-pics/workspace-trybwm.png">from scratch</a>, and to <a
href="evalbutton-pics/changes-bwm.png">browse through the list of changes</a> we
have performed along the way.  It is possible that the sequence of
incremental changes worked, but that some kind of bootstrapping issue
was overlooked.  In this case, there is no problem, and the code is
finished as is, but it's a good for good software engineering.



<h2>Example 2: Police Chase!</h2>

<p>The previous example shows how a no-reboots environment can let the
programmer leap seamlessly between code and object modification and
browsing.  Let us look at a more complicated example.

<p>Police Chase! is a computer game where you race a police car down
the highway trying to catch a bad guy.  This example focuses on the
police car itself.  It is an interesting example because starting the
game takes a minute or two <a href="evalbutton-pics/loading.png">while it loads
textures</a>.


<h3>Example 2a: Rate of Blinking</h3>

<p>The <a href="evalbutton-pics/policechase.png">police car</a> has flashing
lights on top of it.  The <a href="evalbutton-pics/lightscode.png">code the
causing the lights to flash</a> on and off is straightforward.
However, there is a question that is unanswerable at the command
prompt: how fast should the lights blink?  That is, what should the
<code>cycleTime</code> variable be set to?  This is an aesthetic
question that can only be answered by trial and error.

<p>In a no-reboot environment, it is no problem to adjust the rate as
the program runs.  Simply <a href="evalbutton-pics/inspect-policeCar.png">open an
inspector on the car</a> and adjust it until it looks correct.  Once a
good value is chosen, <a href="evalbutton-pics/instVarDefs.png">go back</a> and
change it <a href="evalbutton-pics/changeCycleTime.png">in the original source
code</a>.  Remember to eventually test from scratch again.

<p>Instead of rebooting after trial flashing rate, the no-reboot
environment allows programmers to delay rebooting until they are ready
to test the bootstrapping code itself.


<h3>Example 2b: A Duration Class</h3>

<p>The flashing rate is currently stored as an integer representing a
number if milliseconds.  Suppose we have decided that this number is
used frequently enough that it is worth changing it to use an instance
of class <code>Duration</code> to represent the time delay, instead of
using an integer.  That is, we want to change the type of variable
<code>cycleTime</code> but not its semantics.

<p>Code browsing tools can <a href="evalbutton-pics/instVarRefs.png">show all
references to the variable</a>.  One or the other of these references
must be changed first!  Suppose we start by <a
href="evalbutton-pics/changeCycleTime.png">changing the definer</a>.  Instead of
restarting the program, we can also change the value of the running
instance <a href="evalbutton-pics/duration-inspector.png">using an inspector</a>.
Naturally, this last step causes a <a
href="evalbutton-pics/lightsCrashed.png">message-not-understood error</a>.  Parts
of the code assume that <code>cycleTime</code> holds an integer, but
now they see a <code>Duration</code> instead.

<p>It is worth pausing a moment to consider the state of execution at
this point.  This is the state that eval-button proponents fear as if
it were Armageddon come early.  Let us take a deep breath, however,
and observe the brokenness more camly--after all, broken code is part
of development!

<p>In this particular broken state, the lights of the car have stopped
flashing, naturally enough.  A debugger window has appeared offering a
deeper look into the exact way that the code broke.  Unrelated parts
of the program still run, however!  The road continues to flow by, as
does traffic for the police car to dodge.  The backwards watch morph
created in the previous example continues to tick.  The IDE itself is
perfectly usable.


<p>To continue onward, there is only one code patch that is necessary:
the method pointed out by the debugger needs to have <a
href="evalbutton-pics/addAsMilli.png">two calls to
<code>asMilliSeconds</code> inserted</a>. The system should then be
told to <a href="evalbutton-pics/startSteppingAgain.png">resume
executing the police car</a>.


<h2>Missing Theory</h2>

<p>As far as I know, no-reboot programmers operate right now in a
theoretical vacuum.  That is a pity.  Theory should give a simplified
and reliable foundation to our best practices.  Let me sketch a few
places where theory currently gets uncomfortable, where better theory
could help us talk about and understand no-reboot environments:

<ul>

<li><em>What is the semantics?</em> In general, most language
semantics do not accommodate the program changing as it progresses.  We
should develop fundamental semantics that account for changes in the
program, including changes that invalidate portions of the existing
data.

<li><em>Type checking?</em> How should one think about type checking
when the program might change after it is checked?  What about the
specific case where P checks, and P' checks, but P' is expected to
keep executing with P's data still alive?

<li><em>Defining program changes.</em> How should program changes be
defined?  Ideally, they are not defined only as changes in the static
program, but also in the dynamic execution state.

<li><em>Refactoring and other nice changes.</em> What does
"refactoring" mean for changes that affect not only the program but
also the execution state?  Furthermore, what other well-behaved
subsets of changes are worth defining?

<li><em>Scope of effects.</em> Intuitively, some changes to a program
have effects that are limited.  Changing an instance variable only
affects code that accesses the variable.  Is there any stronger notion
of effect that is worth defining and supporting?

</ul>

<p>These are just a few ideas that sketch out this rich area of research.


<h2>Summary</h2>

<p>I have described the "Insidious Eval Button", the "no reboot"
environments that avoid it, and possible theory directions to talk
about no-reboot environments.  Personally, I would love one day to
address no-reboot environments in my own work.  Meanwhile, the first
step is to identify the issue and to recognize it is missing from our
environments and our theory.

<!--  LocalWords:  Eval eval someone's screenshots WatchMorph subclassing hoc
 -->
<!--  LocalWords:  resize Refactoring refactoring
 -->
]]></description></item>
<item><title>The Components Utopia</title>
<pubDate>February 9, 2006</pubDate>
<link>http://www.lexspoon.org/blog/components-utopia.html</link><description><![CDATA[

<p>The components utopia is a mythical components system that allows
any two components that should be able to work together, to in fact
work together without any modification.  Such a system is impossible,
but its idea is as seductive as a perfect halting-problem detector or
a perfect OS scheduler.

<p>Components utopians say things like, different components may have
been compiled against different versions of their dependencies.
Therefore, any decent components system ought to support
simultaneously loading different versions of the depended-on
components.  Non-utopians say things like, we should <em>consider</em>
supporting multiple versions, but we are also free to say that if two
components depend on different versions of another component, then
those two components simply do not work together.  Utopians work with
a series of ultimatums in a design space that, in the end, is empty.
Non-utopians admit that some components do not work together, and
thereby explore a rich, non-empty design space.


<p>It is fundamentally impossible to completely isolate two components
from each other, such that they cannot possibly cause each other harm,
while still allowing them to work together.  Components are supposed
to work with each other--after all, if I install a library, I
<me>want</em> the other programs on my system to use that library.

<p>Thus, you have to leave up some channels of interaction between
components, and every such channel is a possibility for components to
harm each other.  Even speaking through a perfectly type-checked API
leaves open questions like, is 0 a valid argument for this or that
method?  Even if you use a theorem prover on all of your components,
you merely defer the problems to problems of specifying what
properties, exactly, have been proven.  Components that should work
together sometimes simply are not going to.  You have to have some
mechanism for dealing with this situation and tweaking one package or
the other so that they work together.

<p>Components utopians hope that this override mechanism is not needed.
They leave it out, thus causing every possible form of conflict to be
a show stopper.  They notice that different components have been
compiled against different versions of each other, and they conclude
that their system <em>has</em> to allow different versions of
components to be simultaneously installed.  They notice that sometimes
they might make conflicting changes to a global namespaces, and thus
conclude that you cannot have <em>any</em> global namespace at all.
The list of possible sources of incompatibility is unending, and thus
components utopians explore an empty design space.  No system can
possibly prevent all harms.

<p>Therefore, a components system should include an override mechanism
from the beginning!  You immediately arrive at a working (though not
necessarily convenient) system, because any compatibility problem can
be resolved via the human override mechanism.  Further, the ultimatums
that components utopians face, turn into design possibilities.  Instead
of <em>having</em> to support multiple simultaneous versions of
packages, one <em>can</em> support it.  Whether to do so or not
becomes a matter of trade offs.  Is it more hassle to support multiple
simultaneous versions, or to manually fix up the components so they
can all work with one canonical "current" version?  The answers to
such questions are not obvious.


<p>The <a href="20060113-pu.html">package universes architecture</a>
incorporates an override mechanism based on human packaging efforts.
Packages in Debian/unstable work together because humans do not post a
package until they have made any small corrections that are necessary
for the package to coexist with existing packages in the repository.
Carefully written packages are careful with their use of the
filesystem's namespace and are careful in how they update their API,
and thus are installable in many Linux distributions with relatively
minor repackaging efforts.  Sloppily written packages are more
difficult to work with, but they can still be posted -- the
repackaging effort is simply greater.

<p>The package universes architecture by itself does not specify nor
rely on any of the interesting mechanisms that component system
designers have devised--it only insists that there is some notion of
installing and uninstalling a package.  However, the architecture can
very well take advantage of them.  It becomes a question of
optimization: Better component systems reduce the effort of
repackaging, but you can get by with a poor one.

<!--  LocalWords:  utopians proven namespaces namespace filesystem's
 -->
<!--  LocalWords:  uninstalling
 -->
]]></description></item>
<item><title>Paying if you spam</title>
<pubDate>February 6, 2006</pubDate>
<link>http://www.lexspoon.org/blog/20060206-yahoostamp.html</link><description><![CDATA[
Interesting, <a
href="http://www.techtree.com/techtree/jsp/article.jsp?article_id=71165&cat_id=643">anonymous
sender payment</a> is starting to show up in email.  This is the most
plausible way to deal with spam I have heard of.  The general idea is,
you set your spam filter to be very suspicious of senders you have
never heard of, possibly going to the extreme of not allowing unknown
mail at all.  Senders who do not make it through the spam filter can
then pay a few pennies to send you email.  The idea is that instead of
stopping spam through direct force, you make it costly.  People can
still send you email you do not want, but they have to pay you.

<p>There are plenty of clean ups possible once this basic framework is
in place.  For example:

<ul>
<li>People who use cryptographic signatures can better convince
    an email filter that they are who they are.  In turn, once
    they have the setup to use signatures, they can also accept
    encrypted email, which should probably be the norm anyway.

<li>There could be a universal stamping service developed, that all
    email services can use to accept payment.  The stamps would simply
    be text inserted into the (encrypted) text of the email.  This
    would enable competition between stamp providers, and interoperability
    between different email servers that require payment.
</ul>

]]></description></item>
<item><title>Private Universes of Package Distribution</title>
<pubDate>January 13, 2006</pubDate>
<link>http://www.lexspoon.org/blog/20060113-pu.html</link><description><![CDATA[
<p>The Internet allows many kinds of sharing, and one of them is in
the form of <em>packages</em>: clumps of content that can be installed
and uninstalled, that are updated with new revisions over time, that
depend on each other to function and yet potentially interfere with
each other.  The problem is clearest for Unix distributions like <a
href="http://www.debian.org">Debian</a>, <a
href="http://fink.sourceforge.net">Fink</a>, and <a
href="http://www.freebsd.org/ports">FreeBSD ports</a>, but it shows up
for other kinds of content as well, e.g. <a
href="http://www.ctan.org">CTAN for TeX</a>.


<p>How should such systems be built?  I'm leaning toward the following
principle:

<blockquote>
  <strong>Principle</strong>: Packages of content should assume they
  will only be co-installed with packages from a known group of packages.
</blockquote>

<p>Many authors dismiss this approach quickly.  However, avoiding it
means that packages are intended to be loadable along with packages
that were developed completely independently.  It would seem
inevitable, with this opposing approach, to eventually find packages
that (1) expose new bugs due combination, that were not present in the
packages alone, and (2) that packages will be configured reasonably
but in incompatible ways with each other.  Users of the RPM format <a
href="http://www.germane-software.com/~ser/Files/Essays/RPM_Hell.html">are
familiar with issue 2</a> in particular.

<p>To contrast, the above principle does not seem onerous in practice.
Debian works that way, with most of its packages being repackaged from
foreign code bases.  Further, following the above principle gives a
number of simplifications in other aspects of package distribution,
because packages no longer have to be completely bullet-proof against
each other.  They no longer have to insert extra indirections
everywhere simply because of the obscure possibility that some other
unknown package might conflict in the most horrific way imaginable.


<p>To read more about the idea, read the <a
href="http://lamp.epfl.ch/~spoon/sbaz/architecture.pdf">Package
Universes Architecture</a> document, which describes an abstract
package-distribution system based on the principle of
repository-specific packages.  <a
href="http://lamp.epfl.ch/~spoon/sbaz/">Scala Bazaars</a> is an
evolving implementation used by the <a
href="http://scala.epfl.ch">Scala</a> open-source community.
]]></description></item>
<item><title>David Chisnall on Where Unix Sucks</title>
<pubDate>December 14, 2005</pubDate>
<link>http://www.lexspoon.org/blog/20051214-unixsucks.html</link><description><![CDATA[
<p>David Chisnall has written a <a
href="http://www.informit.com/articles/article.asp?p=424451">good
article</a> on limitations of Unix.  It is well worth a read if you
want to think about the limitations of a good, mature operating
system.  From the thinking I've done about it, David's analysis
seems quite on.

<p>Many of the followup comments show a shallow reading that I hope is
not representative.  Unix is good, but David's suggestions seem accurate.


<p>On a particular couple of points that were dismissed
in the comments:
<ul>

<li>It is great that "everything is a foo", but why does "foo" have to
mean a stream of bytes?  Read, write, seek?  Is this the right
abstraction over all OS data structures?  Does it match well to
sockets?  TCP sockets have out-of-band data, but due to the Unix
abstraction to files it is awkward to access it.  How about processes
and process lists?  Directories in the filesystem?

<li>On that note, the stream-of-bytes idea is a very low-level way to
interoperate, and the ubiquitous lines-of-text semistructured
reperesentation doesn't work well for a lot of applications.
Something like s-expressions or XML would seem to work better.
Something high-level like objects might also work out pretty well.

<li>The X11 design decision of network transparency is pretty, but it
has turned out to be a useless feature plus a heavy constraint.
Almost no one uses X11 that way, because it doesn't work well that
way.  But because of that design decision, there is a wedge between
programs and the display.  The first thing you have to do to get
reasonable performance is use things like Xshm to undo this wedge.
This feature is expensive in performance, in design effort, and in
lost features, and I hope that the next popular open source graphics
framework does not make the same mistake.  

</ul>

<p>Additionally, I have to disagree with types per se as the way
forward.  If you take Smalltalk and treated it as an operating system,
then most of David's requests would be answered immediately.  The
answer, it seems to me, is more about using <em>language</em> instead
of types per se.  It just so happens that a big chunk of language
researchers these days are type enthusiasts.


<p>Finally, the best way forward seems to involve POSIX compatibility.
Swapping in a microkernel at a low level sounds helpful, because then
existing programs could run but smarter programs could use the better
interaction mechanisms.  Another trick that is worth thinking about is
that some Unices, including Linux, now allow using /dev/fd/nnn
pseudofiles as a way to convert between file names and file
descriptors.  File descriptors allow richer interactions between
programs than stdin/stdout, but many existing programs want to see
file names instead of descriptors, so this provides a way forward.

<p>But the most important thing of all for moving forward is that the
people spending their time building tools need to be aware of what is
possible and what the limitations are.  Posts like David's are
essential to spread this awareness.
]]></description></item>
<item><title>The Hacker's OS of Today</title>
<pubDate>December 11, 2005</pubDate>
<link>http://www.lexspoon.org/blog/20051211-hos.html</link><description><![CDATA[
Where is the hacker's operating system of today?  What is the
computing environment chosen by discriminating hackers?  As best as I
can tell, today that means a <a href="http://distrowatch.com/">Linux
distribution</a>, possibly running <a
href="http://fink.sourceforge.net/">on top of OS/X</a>.  It means
source tarballs, makefiles, packages, and package distribution tools.
It means <a
href="http://www.gnu.org/software/emacs/emacs.html">emacs</a> and <a
href="http://subversion.tigris.org">Subversion</a>, <a
href="http://www.sourceforge.net">SourceForge</a> and <a
href="http://www.wiki.org">Wikis</a>, <a
href="http://www.perl.org">Perl</a> and <a
href="http://www.python.org">Python</a> and <a
href="http://www.ruby-lang.org">Ruby</a>.


<p>Not shabby.  However, if you have any experience working in <a
href="http://www.smalltalk.org">Smalltalk</a>, or if you've heard the
tales of the <a href="http://fare.tunes.org/LispM.html">Lisp
Machine</a>, then the current state of the art pales in comparison to
what we've had in the past.

<p>In today's terms, I'd like to be able to pop open a debugger on the
text editor I am using to type in this essay, make some changes,
<em>save</em> those changes, and have them stick the next time I run
the editor.  If I change my mind, I'd like to invoke the version
control system and undo my changes.  If I like it, I'd like to be able
to extract my diff, pretty it up, and send it upstream to the developers
of the editor.

<p>If I see an interesting library in <code>/usr/lib</code>, I
should not have to do a web search in order to find its API and its
documentation.  My tools should know how to do that automatically.
And they should do more.  I should be able to ask for "all users of"
the specified library, both in a static and dynamic sense, and see
respectively all programs and all processes that are using the
library.  For the processes, I should be able to poke around at the
data structures it is using and even call functions on them to see
what happens.

<p>When I want to experiment with a library, I should be able to call
functions in the API without needing major effort to create a driver
program to bootstrap.  In fact, I should be able to play with the API
by using data structures and code snippets I found via "all users of"
queries.  I should have a <em>workspace</em>, in Smalltalk parlance,
whose variable references point into bits and pieces of programs,
processes, and libraries all over my system.

<p>Smalltalk and the Lisp Machine prove that all of the above is
possible.  In fact, given their leading examples, none of it is even
seems particularly difficult.


<p>So why are we trapped in the current steady state?  Why did Smalltalk
and the Lisp Machine emerge in a time when hackers were a much rarer
bread, but now, when computers and CS majors are ubiquitous, hackers
use something so much klunkier?

<p>My best bet is a breach in awareness and communication between today's
Linux development communities and the relative graybeards who grok
either Smalltalk or Lisp Machines.  Thus, when they think of ways to
make a nicer user interface for Linux, they have no better ideas than
to <a href="http://www.gnome.org">copy interfaces</a> <a
href="http://www.kde.org">meant for non-hackers</a>.  These are excellent
at what they do, but where is the <em>hacker's</em> operating system?

]]></description></item>
<item><title>WCRE Trip Report</title>
<pubDate>November 11, 2005</pubDate>
<link>http://www.lexspoon.org/blog/20051111-wcre.html</link><description><![CDATA[

<p>It is fun hanging out with people who toss around "3 million lines
of code" like it is nothing special.  For the crowd at <a
href="http://www.rcost.unisannio.it/wcre2005/">WCRE</a>, such large
programs are the norm.  These guys work with big programs, spewed out
by bright-eyed coders from the distant past, that have now grown too
useful to be thrown away.  Dealing with these heaping piles of
often-mediocre code has given the attendees a gritty, realistic
outlook.  Likewise, whenever these guys actually succeed with these
programs, e.g. effectively reclustering the modules of a program, or
translating the entire code base to a newer language, they deserve
to boast a little about the accomplishment.

<p>WCRE has the warm, pleasant feel of small conferences.  There are
few enough people present that you get to talk with all of them, and
there are few enough papers accepted that you can attend all of the
presentations.  The conference itself was run admirably.  Everything
was close and convenient, there was free wireless Internet everywhere,
the food was great, and the coffee and tea never stopped flowing.

<p>This year the conference was co-held with WICSA, an architecture
conference.  The integration was quite smooth--attendees of either
conference could attend the vast majority of the other one as well.
The WICSA crowd also made be jealous with their <a
href="http://wwwp.dnsalias.org/wiki/">nice wiki</a>.

<p>All conferences should have such a wiki nowadays, so WICSA is ahead
of the game.  A wiki is a great place for all kinds of things
attendees might want to share with each other.  Just a few examples
are:
<ul>
<li>continuations of discussions started after the talks or over drinks
<li>links to web sites that came up in conversation
<li>practical local information, like where is good to eat
</ul>

<p>As an example of the last item, for the first few days I kept
hearing non-locals asking where to get prepaid phone cards.
Apparently the in-hotel convenienc store had run out.  It would have
been great if folks could post locations they found on a wiki so that
other attendees would know where to look.

<p>If WCRE does take WICSA's example of setting up a wiki next year, I
suggest they do not follow their lead in password management.  It took
me a couple of days to be able to log into the WICSA wiki.  I did not
previously have an account, and I had to find someone off line who had
the authority to create an account for me.  Just make it a wiki,
already, and leave it open to editing.  Either that, or have a single,
bulk password that is posted prominantly around the conference.  The
security of restricting access to attendees only was more hassle than
it is worth.  Besides, it is an open conference, is it not?
"Outsiders" participating on the wiki should only enrich the
conversation.

<p>On the technical material, I enjoyed the paper by Kuhn, et al., on
performing cluster analysis using the text of identifiers and
comments.  Human language is content, too, but most reverse
engineering tools ignore them because they do not have formal meanings
to computers.  Cluster analysis does not actually need to know the
meaning of the terms, though.  The analyzer can simply look for
patterns in word usage.


<p><em>Technical debt</em> is a great term that James Highsmith tossed
out during his <a href="http://reengineer.org/stevens/">Stevens Award
Lecture</a>.  The concept is that before you can add new features or
otherwise improve a program, you have to spend time coping with short
cuts that the programmers have taken in the past.  These are things I
flag with "XXX" in my own code, and indeed, there tend to be
embarassing numbers of them floating around if I end up rushing to
make a demo.

<p>The concept of technical debt is fascinating to think about and
leaves a lot of open questions.  How do you distinguish technical debt
from simply programming something in a simpler way?  Once you figure
out the distinction, is there any way to measure how much of it you
have?  And whether or not you can measure it, how can it be measured?


<p>Mary Shaw received the other Stevens Award this year.  She gave a
fun talk about her long career of paying close attention to
uncomfortable disconnects between theory and practice.  She includes
many examples from her thoughts over the years, including hard-line
pure functional programming and the (non-) use of proofs and formal
specification to achieve correct software.

<p>Finally, a couple of professional reengineers showed us what they
do.  Sneed talked about using metrics on an existing system to estimate
costs of reengineering.  He gets much more accurate estimates than
with estimates for a new system, because the existing code gives a
reliable way to understand the complexity of what is there and what
will need changing.  Akers talked about using automatic rewriting tools
to reengineer.  F