<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>rc98.net</title>
  <updated>2010-02-22T10:41:57-05:00</updated>
  <link rel="alternate" type="text/html" href="http://rc98.net"/>
  <link rel="self" type="application/atom+xml" href="http://rc98.net/index_feed"/>
  <author>
    <name>Gabriel Farrell</name>
  </author>
  <generator uri="http://rc98.net/artsy" version="0.1">artsy</generator>
  <entry>
    <title>Code4Lib 2010</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/c4l2010"/>
    <updated>2010-02-22T10:41:57-05:00</updated>
    <published>2010-02-22</published>
    <summary>Notes from the Code4Lib 2010 conference in Asheville, NC.</summary>
    <content type="html">&lt;h2&gt;Solr blackbelt preconf&lt;/h2&gt;
&lt;p&gt;Use &quot;raw&quot; LocalParams for facet queries. From &lt;a href=&quot;http://wiki.apache.org/solr/SolrQuerySyntax&quot;&gt;SolrQuerySyntax&lt;/a&gt;:
&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;raw term query, useful for avoiding query parser escaping madness 
   when drilling into facets via fq parameters.&lt;br /&gt;

   &lt;code&gt;&amp;amp;fq={!raw f=field_name}crazy+\&quot;field+value&lt;/code&gt;
&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;Also, edismax still looks good.
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>Decentralized Energy</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/decenergy"/>
    <updated>2009-11-06T14:44:24-05:00</updated>
    <published>2009-11-06</published>
    <summary>Hit the nail on the head he did.</summary>
    <content type="html">&lt;p&gt;Al Gore said it Wednesday night on the Daily Show (&lt;a href=&quot;http://www.hulu.com/watch/106761/the-daily-show-with-jon-stewart-wed-nov-4-2009?c=1071:1137&quot;&gt;clip if you're in 
the US&lt;/a&gt;):
&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Al: Well the problem is that some very powerful corporations do make
   their money from the old ways of burning coal and oil.
&lt;/p&gt;
&lt;p&gt;Jon: That's the thing.  Who?  Give me a name.
&lt;/p&gt;
&lt;p&gt;Al: You mentioned one.  Exxon Mobil.
&lt;/p&gt;
&lt;p&gt;Jon: So give them, say, &quot;You've got the solar thing.  You're done.  Have
   the sun!  It's yours!&quot;
&lt;/p&gt;
&lt;p&gt;Al: Because if we switch over to renewable energy then all the money 
   they're making from the old, dirty fuels, they're not gonna make as much 
   anymore, and that's why they're fighting against it. ... A lot of these 
   new technologies are not ones that are naturally controlled by one or a 
   few big corporations.&lt;br /&gt;

&lt;/p&gt;
&lt;p&gt;Jon: Well, they will be.&lt;br /&gt;

&lt;/p&gt;
&lt;p&gt;Al: But solar panels, the sun shines everywhere, and you can put solar 
   panels on the roofs of homes and buildings, and it's widely dispersed.
   Same with wind power, same with a lot of the new approaches, and so the 
   older companies that established control of the old patterns, they don't 
   want to change.
&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;That's why the big companies push nuclear, clean coal, and natural gas as 
   the solutions in our clean, green energy future.  They've established control
   over these resources, and they would take the sun if they could.  Just like 
   &lt;a href=&quot;http://www.hulu.com/watch/22244/the-simpsons-sun-block-burns&quot;&gt;Burns&lt;/a&gt;.&lt;br /&gt;

&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>Free Software and Kittehs</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/kitteh"/>
    <updated>2009-11-04T12:18:32-05:00</updated>
    <published>2009-11-04</published>
    <summary>Is there a connection?</summary>
    <content type="html">&lt;p&gt;Seeing &lt;a href=&quot;http://noehr.org/2009/07/18/dumpster-kitten/&quot;&gt;Jesper's post on the kitten he found&lt;/a&gt; reminded me of 
   &lt;a href=&quot;http://www.alatechsource.org/blog/2007/01/it-and-sympathy.html&quot;&gt;Karen's &quot;free as in free kittens&quot; analogy&lt;/a&gt;.  Makes me wonder
   if some free software developers like to care for little things
   that might not otherwise make it in this cruel world.
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>Access 2009</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/access2009"/>
    <updated>2009-10-03T12:13:23-05:00</updated>
    <published>2009-09-30</published>
    <summary>Access, Canada's premier library technology conference. This year in Charlottetown, PEI.</summary>
    <content type="html">&lt;h2&gt;Hackfest&lt;/h2&gt;
&lt;p&gt;Cory Doctorow spoke with us about copyright.  Holding action is beneficial as
   the technology gets better.  Get your law schools involved in showing cover
   images and other copyright issues -- a consortium can save over paying Bowker.
   As an artist, charge for the bits that aren't easily copied: the performance.
   Ebooks as a privacy risk?  Do those companies keep patron reading lists?
&lt;/p&gt;
&lt;p&gt;Linked data in your OPAC/ILS.  Pulling linked data into your system versus 
   exposing your data as linked.
&lt;/p&gt;

&lt;h2&gt;Day 1&lt;/h2&gt;
&lt;p&gt;Cory Doctorow spoke with us about copyright.  Again.  Some more depth this 
   time, and better stories.  Backchannel discussion led me to &lt;a href=&quot;http://www.boingboing.net/2007/09/23/mark-twains-nutty-19.html&quot;&gt;this post of
his on Mark Twain&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;Richard spoke about http://data.vancouver.ca and the need to free our data.
   How do we connect to superpatrons who might do mashups.  Right now there's
   a lot of value just in releasing your data.  APIs versus raw data == control
   versus unimagined uses.
&lt;/p&gt;
&lt;p&gt;Dan Chudnov talked about the Library of Congress.  His team was the first at
   the LoC to release software under an opensource license.  The vision of
   incorporating digitally rests on linked data.  http://id.loc.gov
&lt;/p&gt;
&lt;p&gt;Paul Pound talked about Islandora Drupal and Fedora work.
&lt;/p&gt;
&lt;p&gt;Roy Tennant spoke about OCLC Product Works (http://oclc.org/productworks/).
   Mike Rylander spoke about open source, cloud computing, and Evergreen as 
   PaaS. 
&lt;/p&gt;
&lt;p&gt;Stevan Harnad spoke from far away about Open Access and the evidence showing
   the real value of mandates.  The mandate should be to deposit all articles
   in the institutional repository immediately upon acceptance for publication.
&lt;/p&gt;

&lt;h2&gt;Day 2&lt;/h2&gt;
&lt;p&gt;Peter Rukavina spoke about digital and real data.
&lt;/p&gt;
&lt;p&gt;Cary Gordon did a birds-eye of Drupal in libraries.
&lt;/p&gt;
&lt;p&gt;Good thunder talks.  Schools using Drupal.  Bess on GIS at UVA.  Canadensys
   and flat plants.  Libraryh3lp on Google Android.
&lt;/p&gt;
&lt;p&gt;Hackfest talks.  Human-readable bibliography in Evergreen.  Linked data in
   catalogs.
&lt;/p&gt;
&lt;p&gt;Dorothea Salo spoke about data and our researchers, and how they dig around
   in the sand to build castles of knowledge.  We made this mess and we need to
   clean it up.  These Taylorist processes are not serving us well.  IRs present
   everything as a PDF paper.&lt;br /&gt;

&lt;/p&gt;
&lt;p&gt;Roy Tennant spoke about the Hathi Trust workflow and outlook.  He also 
   played a video of Roy Tennant coding that featured Stan Rogers's &quot;White 
   Collar Holler&quot;.&lt;br /&gt;

&lt;/p&gt;
&lt;p&gt;Bess Sadler spoke about Blacklight and heterogeneous collections.  Librarians
   write acceptance tests for the search interface.
&lt;/p&gt;
&lt;p&gt;Andrew Nagy described the progression of computing toward smaller and faster 
   devices.
&lt;/p&gt;

&lt;h2&gt;Day 3&lt;/h2&gt;
&lt;p&gt;Mark Leggot showed off UPEI's fancy Drupal/Fedora research support project.
&lt;/p&gt;
&lt;p&gt;Cathy Hartman and Mark Phillips spoke about UNT's Texas History Portal.&lt;br /&gt;
Pulling in objects from all over Texas and beyond.  Nice ability to view 
   newspapers.  http://beta.texashistory.unt.edu&lt;br /&gt;

&lt;/p&gt;
&lt;p&gt;After the break, Jan Dawson gave a quick tour of roller derby.
&lt;/p&gt;
&lt;p&gt;Gwendolyn MacNairn spoke about Zotero easing the burden of citations.
&lt;/p&gt;
&lt;p&gt;William J. Turkel gave a talk titled &quot;&amp;gt; hacking as a way of knowing&quot;.&lt;br /&gt;
He spoke of the need for a rich backchannel, for casual participation.
   He admitted he was preaching to the choir on many points.  Imagine a 
   history spray that produced a cloud of the past that you could feel.
   Like aquanet lets you touch the 80s.
&lt;/p&gt;
&lt;p&gt;Declan Fleming won the laptop and Mark Leggot wrapped it up.
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>A bit about Linked Open Data</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/lod"/>
    <updated>2009-08-18T09:24:21-05:00</updated>
    <published>2009-08-18</published>
    <summary>Some notes for a basic talk on Linked Open Data.</summary>
    <content type="html">&lt;p&gt;From &lt;a href=&quot;http://www.w3.org/DesignIssues/LinkedData.html&quot;&gt;TBL's page on Linked Data&lt;/a&gt; (the springboard):
&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;The Semantic Web isn't just about putting data on the web. It is about making links, so that a person or machine can explore the web of data.  With linked data, when you have some of it, you can find other, related, data.
&lt;/p&gt;
&lt;p&gt;...
&lt;/p&gt;
&lt;ol&gt;
 &lt;li&gt;
     Use URIs as names for things
 &lt;/li&gt;

 &lt;li&gt;
     Use HTTP URIs so that people can look up those names.
 &lt;/li&gt;

 &lt;li&gt;
     When someone looks up a URI, provide useful information, using the standards (RDF, SPARQL)
 &lt;/li&gt;

 &lt;li&gt;
     Include links to other URIs. so that they can discover more things.
 &lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;&lt;p&gt;From the &lt;a href=&quot;http://www.w3.org/TR/REC-rdf-syntax/&quot;&gt;RDF Primer&lt;/a&gt; (visit the EM ex.):
&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;The Resource Description Framework (RDF) is a language for representing
   information about resources in the World Wide Web.
&lt;/p&gt;
&lt;p&gt;...
&lt;/p&gt;
&lt;p&gt;Unlike triples, which are intended as a shorthand notation, RDF/XML is 
   the normative syntax for writing RDF.
&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;See the known world of linked data in the graph at &lt;a href=&quot;http://linkeddata.org/&quot;&gt;linkeddata.org&lt;/a&gt;.  Resources of note are &lt;a href=&quot;http://dbtune.org/last-fm/&quot;&gt;AudioScrobbler&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/&quot;&gt;DBpedia&lt;/a&gt;, &lt;a href=&quot;http://www.freebase.com/&quot;&gt;Freebase&lt;/a&gt;, and &lt;a href=&quot;http://www.rdfabout.com/demo/census/&quot;&gt;US Census Data&lt;/a&gt; (working SPARQL endpoint).
&lt;/p&gt;
&lt;p&gt;And in libraries: &lt;a href=&quot;http://id.loc.gov&quot;&gt;id.loc.gov&lt;/a&gt; and &lt;a href=&quot;http://blog.libris.kb.se/semweb/?p=7&quot;&gt;LIBRIS&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;LOD is rough around the edges, full of broken links and draft papers.  Nonetheless, it's a beginning.
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>Debian on the ideapad S10e</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/ideapad"/>
    <updated>2010-02-11T21:16:33-05:00</updated>
    <published>2009-08-17</published>
    <summary>The central depository for my trials with Debian on the ideapad S10e.</summary>
    <content type="html">&lt;h2&gt;Getting wireless working with kernel 2.6.30&lt;/h2&gt;
&lt;p&gt;I upgraded the kernel and lost wireless.  Thought I had it working with the
   b43-fwcutter package.  Turns out that doesn't support the BCM4312 in this guy.
   What I needed was broadcom-sta-modules-2.6-686.  Then I needed to rmmod b43 and
   modprobe wl.  Oh, and also modprobe lib80211_crypt_tkip.  But not in that
   order.  So altogether it goes:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# apt-get install broadcom-sta-modules-2.6-686
...
# modprobe -r b43
# modprobe lib80211_crypt_tkip
# modprobe wl
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Problem was I had to do the modprobe business every time I rebooted.  I added
   b43 to the /etc/modprobe.d/blacklist.conf and added lib80211_crypt_tkip and wl
   to /etc/modules, but ifconfig still revealed no eth1 interface at boot.  I ran
   depmod.  I removed the b43-fwcutter package.  Nothing changed.  I even tried
   removing b43.ko from the kernel drivers.  Thereafter, &lt;code&gt;modprobe -r b43&lt;/code&gt; would
   complain that it wasn't found, as it should, but no amount of modprobing wl or
   otherwise would bring up the eth1 interface until I returned b43.ko to its
   rightful place.
&lt;/p&gt;
&lt;p&gt;Finally, this &lt;a href=&quot;http://ubuntuforums.org/showthread.php?t=959451&quot;&gt;Ubuntu forum&lt;/a&gt; prompted me to try the following for 
   /etc/modprobe.d/wl.conf:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;install wl /sbin/modprobe -r b43; /sbin/modprobe lib80211_crypt_tkip; /sbin/modprobe --ignore-install wl
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That made &lt;code&gt;modprobe wl&lt;/code&gt; work to bring up the eth1 interface.  I put wl back in
   /etc/modules (having removed it by then) and wireless finally worked again at
   boot.
&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;update&quot;&gt;Update 2010-02-11:&lt;/span&gt; There's no broadcom-sta-modules
   for 2.6.32, so I installed broadcom-sta-source, and
   /usr/share/doc/broadcom-sta-source/README.Debian told me I should use
   b43-fwcutter instead.  Once I fetched and extracted the firmware and ran
   &lt;code&gt;modprobe b43&lt;/code&gt;, however, I started getting &lt;code&gt;b43-phy0 ERROR: Fatal DMA error&lt;/code&gt;
   messages, so I went back to broadcom-sta and ran the module-assistant commands
   suggested in that README.  The broadcom-sta-common package created 
   /etc/modprobe.d/broadcom-sta-common.conf with the following:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cat /etc/modprobe.d/broadcom-sta-common.conf
# wl module from Broadcom conflicts with ssb
# We must blacklist the following modules:
blacklist b44
blacklist b43legacy
blacklist b43
blacklist ssb
install wl /sbin/modprobe lib80211_crypt_tkip; /sbin/modprobe --ignore-install wl $CMDLINE_OPTS
$
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Except I inserted the bit about lib80211_crypt_tkip.  It didn't work before
   I did that.
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>A couple of thoughts on Wolfram Alpha</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/wolfram"/>
    <updated>2009-03-10T13:49:31-05:00</updated>
    <published>2009-03-10</published>
    <summary>A quick outlet for my initial reaction to some of the buzz.</summary>
    <content type="html">&lt;p&gt;In &lt;a href=&quot;http://www.twine.com/item/122mz8lz9-4c/wolfram-alpha-is-coming-and-it-could-be-as-important-as-google&quot;&gt;his article on Wolfram Alpha&lt;/a&gt;, Spivack says the following:
&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;The Big Deal is that Wolfram Alpha doesn't merely look up
   the answers like Google does, it computes them using at
   least some level of domain understanding and reasoning, plus
   vast amounts of data about the topic being asked about.
&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;This is untrue.  Google doesn't merely look up answers.  A search for
   &quot;philadelphia pizza&quot; (sans quotes) returns a Google Local result set.  Simple
   calculation and exchange rates can also be done.  There's even a &lt;a href=&quot;http://www.google.com/intl/en/help/features.html&quot;&gt;list of such
features&lt;/a&gt; that demonstrate computation and domain understanding.
&lt;/p&gt;
&lt;p&gt;I'm not saying Google is perfect, but it's done some things right.  It first
   built up huge indexes of information, then added clever ways beyond a simple
   search (and at this point even &quot;simple&quot; searches in Google are actually
   anything but).  There may be some tricks to be cribbed from &lt;a href=&quot;http://www.wolframalpha.com/&quot;&gt;Wolfram Alpha&lt;/a&gt; and &lt;a href=&quot;http://start.csail.mit.edu/&quot;&gt;START&lt;/a&gt; and other &lt;a href=&quot;http://en.wikipedia.org/wiki/Desk_Set&quot;&gt;Emerac&lt;/a&gt; wannabes, but Google, with its
   massive data stores and computational power, is well situated to do so.
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>How I do backups</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/bkups"/>
    <updated>2009-05-05T14:50:34-05:00</updated>
    <published>2009-03-05</published>
    <summary>Notes on my setup for handling backups of my servers.</summary>
    <content type="html">&lt;p&gt;The server, we'll call it BOB, has two disks of the same size, and each night
   one gets rsynced to the other.  Its /etc/fstab looks like this:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/dev/xvda       /       ext3    defaults                0 1
/dev/xvdb       none    swap    sw                      0 0
proc            /proc   proc    defaults                0 0
/dev/xvdc       /backup ext3    noauto                  0 0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The root crontab includes the lines:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;30 3 * * *  /root/nightly-rsync
12 4 * * *  /root/nightly-rdiff
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;With /root/nightly-rsync containing the following:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mount -v /backup
/etc/init.d/apache2 stop
/etc/init.d/postgresql-8.3 stop
rsync -vaxE --del / /backup/ 
/etc/init.d/postgresql-8.3 start 
/etc/init.d/apache2 start 
umount -v /backup
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Later in the night, the synced backup gets rdiff-backuped to another machine,
   which we'll call SUE.  The /root/.ssh/config file on BOB contains the
   following:
&lt;/p&gt;
&lt;p&gt;host sue-bob
       hostname sue
       user bob
       identityfile /root/.ssh/backup_id_rsa
       compression yes
       protocol 2
&lt;/p&gt;
&lt;p&gt;A user &quot;bob&quot; has been created on SUE and ssh-keygen run to create a
   passwordless keypair for that user.  The backup_id_rsa file on BOB is the
   created private key, with the public key added to the
   /home/bob/.ssh/authorized_keys file on SUE.  The following lines are in
   /root/excluded-backup:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/backup/backup
/backup/dev
/backup/mnt
/backup/proc
/backup/sys
/backup/tmp
/backup/var/tmp
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;/root/nightly-rdiff looks like this:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mount -v /backup
rdiff-backup -v5 --exclude-globbing-filelist /root/excluded-backup /backup sue-bob::backup
umount -v /backup
rdiff-backup -v5 --remove-older-than 2M --force sue-bob::backup
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;An incremental backup of BOB going back 2 months will be in /home/bob/backup on
   SUE.  &lt;span class=&quot;update&quot;&gt;Update 2009-05-05:&lt;/span&gt; Added &lt;code&gt;--force&lt;/code&gt; to the remove-older-than line to remove multiple old backups when necessary.
&lt;/p&gt;
&lt;p&gt;Some final notes: Make sure to make nightly-rdiff and nightly-rsync executable.
   Also, both BOB and SUE must have rdiff-backup installed.  Oh, and you'll want
   to &lt;code&gt;ssh sue-bob&lt;/code&gt; once to add SUE's fingerprint to the known_hosts file.  When
   I'm feeling fairly certain the backups are working, I'll lower the verbosity. 
&lt;/p&gt;
&lt;p&gt;I was influenced on the rsync end by &lt;a href=&quot;http://jwz.livejournal.com/801607.html&quot;&gt;jwz's PSA on backups&lt;/a&gt; and on the
   rdiff-backup end by &lt;a href=&quot;http://www.arctic.org/~dean/rdiff-backup/unattended.html&quot;&gt;unattended rdiff&lt;/a&gt;.
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>Carl Malamud for head of the GPO</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/carl4gpo"/>
    <updated>2009-03-08T16:48:13-05:00</updated>
    <published>2009-03-05</published>
    <summary>I support Carl Malamud's bid for the head of the Government Printing Office.</summary>
    <content type="html">&lt;p&gt;&lt;a href=&quot;http://yeswescan.org/&quot;&gt;Carl Malamud wants to run the GPO&lt;/a&gt;. I can't imagine a better person 
   for the job.
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>Code4Lib 2009</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/c4l2009"/>
    <updated>2009-03-01T14:37:57-05:00</updated>
    <published>2009-02-23</published>
    <summary>Notes from the Code4Lib 2009 conference in Providence, RI.</summary>
    <content type="html">&lt;p&gt;What follows is my sparse notes (increasingly so as the conference went on)
   from code4lib 2009. 
&lt;/p&gt;

&lt;h2&gt;Linked data preconf&lt;/h2&gt;
&lt;p&gt;rdf+xml == teh suxxor (lbjay). see ntriples with
   http://www.mindswap.org/2002/rdfconvert/. dchud: eliminate custom software.
   cache linked data so your links don't break. distribute and decentralize
   the data.
&lt;/p&gt;

&lt;h2&gt;Keynote: Stefano Mazzochi&lt;/h2&gt;
&lt;p&gt;Reduction of marginal costs with each transition to a new technology. The
   marginal cost is the cost to create the product again.
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     speech: synchronous, no lasting record
 &lt;/li&gt;

 &lt;li&gt;
     cave drawings: can't take it with you, marginal cost is 1
 &lt;/li&gt;

 &lt;li&gt;
     clay tablets: portable, heavy, marginal cost is 1
 &lt;/li&gt;

 &lt;li&gt;
     fiber inscribing: portable, light, marginal cost is 1
 &lt;/li&gt;

 &lt;li&gt;
     fiber printing: marginal cost &amp;lt; 1, but still &amp;gt; 0 (production,
       consumption, storage, organization)
 &lt;/li&gt;

 &lt;li&gt;
     electronic publishing: asynchronous and synchronous, marginal cost ~ 0
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Electronic publishing presents a degraded consumption experience. We lack
   the hundreds of years of experience of the paper publishing industry.
   Batteries are needed.
&lt;/p&gt;
&lt;p&gt;Libraries versus museums of books. Managing physical non-unique copies of
   books will be non-economical. With nearly infinite storage space, can we
   justify filtering? Is metadata still needed? From books of pages to journals
   of articles to networks of relational assertion (web of data).  Questions to
   answer from freebase. A little reminiscent of EMERAC. David Huynh has been
   working on &quot;sliding&quot; -- moving from one dataset to another. Freebase currently
   tries to fit all sets, so doesn't display for a particular set well. 
&lt;/p&gt;
&lt;p&gt;Acre is a javascript framework for writing freebase apps. Example app:
   http://genderizer.freebaseapps.com
&lt;/p&gt;

&lt;h2&gt;Why libraries should embrace linked data&lt;/h2&gt;
&lt;p&gt;Stories from Libris, the National Library of Sweden. Started building a new
   user interface in December 2007. Design a library catalog within the
   context of the web, and ask what it could become. APIs suck, too much
   control in the hands of the producer (dependent on the producer's world
   view), but we have created some APIs anyway. Linked open data turns the web
   into an API (Corey Harper). 
&lt;/p&gt;

&lt;h2&gt;Jangle&lt;/h2&gt;
&lt;p&gt;Jangle core sends AtomPub to clients, speaks to connectors via JSON.
&lt;/p&gt;

&lt;h2&gt;RESTafarian&lt;/h2&gt;
&lt;p&gt;Looked at the Sinatra Ruby framework. Java debugging with services
   depending on services depending on services. Ugh. You start developing for
   20 years ahead of you and it ends up being totally overengineered. We got
   sucked into every standard. Sword, METS. I need a METS profile to copy a
   PDF from here to there? 
&lt;/p&gt;

&lt;h2&gt;Dashboard Initiative&lt;/h2&gt;
&lt;p&gt;Hard to build in delivery of numbers when you're working on delivery of
   services. Dashboard of a car gives overview of current flows. It's a simple
   way to provide library data flow to managers and administrators. 
&lt;/p&gt;

&lt;h2&gt;Open up your repository with a SWORD&lt;/h2&gt;
&lt;p&gt;What is a repository? OAI-PMH co-evolved with these repository systems. 
&lt;/p&gt;

&lt;h2&gt;Djatoka&lt;/h2&gt;
&lt;p&gt;JPEG2000
&lt;/p&gt;

&lt;h2&gt;Lightning Talks&lt;/h2&gt;
&lt;p&gt;tinyurl.com/XCwebcast. Scriblio at Collingswood Public. enjoysthin.gs. zoia
   and foaf. 
&lt;/p&gt;

&lt;h2&gt;Biblios&lt;/h2&gt;
&lt;p&gt;No Galen Charlton, but Josh Ferraro gave a good overview. Chris Catalfo came 
   next with a more &quot;in the guts&quot; view (including some couchdb goodness).
&lt;/p&gt;

&lt;h2&gt;FRBR&lt;/h2&gt;
&lt;p&gt;All about relationships.
&lt;/p&gt;

&lt;h2&gt;Solr&lt;/h2&gt;
&lt;p&gt;Erik Hatcher catches us up on developments in Solr.
&lt;/p&gt;

&lt;h2&gt;Ian Davis&lt;/h2&gt;
&lt;p&gt;If you love your data, set it free.
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>New England Code4Lib</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/necode4lib"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2008-12-09</published>
    <summary>Notes from the December 9th, 2008 meeting of New England Code4Lib in Boston.</summary>
    <content type="html">&lt;div class=&quot;thumbs&quot;&gt;
  &lt;a href=&quot;http://www.flickr.com/photos/moil/3097440564/&quot; title=&quot;first necode4lib&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3135/3097440564_a452b5e64a_t.jpg&quot; width=&quot;80&quot; height=&quot;100&quot; alt=&quot;first necode4lib&quot; /&gt;&lt;/a&gt;
  &lt;a href=&quot;http://www.flickr.com/photos/moil/3096600661/&quot; title=&quot;Image004 by gsf747, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3225/3096600661_c1b9e19e2c_t.jpg&quot; width=&quot;80&quot; height=&quot;100&quot; alt=&quot;Image004&quot; /&gt;&lt;/a&gt;
  &lt;a href=&quot;http://www.flickr.com/photos/moil/3096600551/&quot; title=&quot;Image003 by gsf747, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3016/3096600551_e124a2fef7_t.jpg&quot; width=&quot;80&quot; height=&quot;100&quot; alt=&quot;Image003&quot; /&gt;&lt;/a&gt;
  &lt;a href=&quot;http://www.flickr.com/photos/moil/3097440120/&quot; title=&quot;Image000 by gsf747, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3077/3097440120_39f4a84b35_t.jpg&quot; width=&quot;80&quot; height=&quot;100&quot; alt=&quot;Image000&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;First, Jay Luker talked about CiteULike and the Pylons stuff he's written to
   access their API.
&lt;/p&gt;
&lt;p&gt;People from WGBH talked about media metadata and using the LCSH dump from
   LCSH.info.  They have a typeahead prompt for users to add subjects that
   encourages the use of LCSH, but doesn't limit to it.
&lt;/p&gt;
&lt;p&gt;Jodi Schneider talked about Zotero and the possibilities of the semantic
   web.  Discussion landed on the positives and negatives of an in-browser
   tool.  Casey Bisson made the point that it lives in the browser because our
   resources are inaccessible from the web at large.  &lt;del&gt;Michael Klein said
   the ideal would be an in-browser tool with shared data storage, which is
   what Zotero Commons will be.&lt;/del&gt; &lt;span class=&quot;update&quot;&gt;Update 2008-12-10
   from Michael Klein:&lt;/span&gt; &quot;Correction: What I want is a browser tool for
   scraping/harvesting (like we have now), but a cloud-based browser interface
   to read, manage, format, and export records.  So you need the plugin to
   create your research pile, but you can do your research, cite your
   references, and create your bibliography from any browser, with or without
   the plugin.&quot;
&lt;/p&gt;
&lt;p&gt;Casey Bisson and Kelly talked about Scriblio and 
   &lt;a href=&quot;http://archives.colby-sawyer.edu&quot;&gt;http://archives.colby-sawyer.edu&lt;/a&gt;.  Scriblio will merge records as they're
   loaded in.  Also looked at &lt;a href=&quot;http://beyondbrownpaper.plymouth.edu&quot;&gt;http://beyondbrownpaper.plymouth.edu&lt;/a&gt; and
   &lt;a href=&quot;http://collingswoodlib.org/&quot;&gt;http://collingswoodlib.org/&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;Michael Klein talked about BPL Digital Initiatives, including XForms and
   MODS.  Includes a browsable thesaurus resting on Solr.  Also includes 1300
   lines of XML pain.
&lt;/p&gt;
&lt;p&gt;Just before lunch, Jay Luker did a quick overview of unAPI.  Casey brought 
   up the point that unAPI creates a separate URL for a resource, against the
   objectives of the microformat people.
&lt;/p&gt;
&lt;p&gt;After lunch, Sands Fish spoke about Simile, RDF, and ontologies.  Now
   looking at author citation metadata for Longwell.  Facade is Future-proofing
   Architectural Computer-Aided DEsign.  Timeline is the more popular one
   (sometimes called Simile, but that's the name of the whole project).
   Exhibit is another one, written entirely in JavaScript, using the in-browser
   database and JSON (or a close relation to JSON).  The Simile funding has
   ended, but the project code lives on at
   &lt;a href=&quot;http://code.google.com/p/simile-widgets/&quot;&gt;http://code.google.com/p/simile-widgets/&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;I tried to help Jay install FBO, which led to a quick temporary fix for 
   loading MARCXML data and a couple of other changes, but he had some Solr
   issues that got in the way of things.  Afterward, we went to Bukowski's.
&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;update&quot;&gt;Update 2008-12-11:&lt;/span&gt; New England Code4Lib can be
   found at &lt;a href=&quot;http://ne.code4lib.org&quot;&gt;http://ne.code4lib.org&lt;/a&gt;.
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>Installing Debian from a USB key</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/debusb"/>
    <updated>2009-05-18T12:33:24-05:00</updated>
    <published>2008-10-17</published>
    <summary>How I installed Debian (amd64, in this case) from a USB key.</summary>
    <content type="html">&lt;p&gt;Not wanting to use up another CD, I decided to try to install Debian with a
   USB key.  I followed the instructions at the &lt;a href=&quot;http://www.debian.org/releases/testing/amd64/ch04s03.html.en&quot;&gt;Debian testing docs&lt;/a&gt; and downloaded boot.img.gz and the iso from the links at
   &lt;a href=&quot;http://www.debian.org/devel/debian-installer/&quot;&gt;debian-installer&lt;/a&gt;.  &lt;span class=&quot;update&quot;&gt;Update 2005-15-09:&lt;/span&gt; 
   The daily build hd-media builds are erroring out right now, so I had to 
   download boot.img.gz and an iso from the lenny page.&lt;br /&gt;
Here are the commands:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;root@stubberud:~# zcat /home/gsf/boot.img.gz &amp;gt; /dev/sda
root@stubberud:~# mkdir /media/usbkey
root@stubberud:~# mount -t vfat /dev/sda /media/usbkey/
root@stubberud:~# cp /home/gsf/debian-LennyBeta2-amd64-netinst.iso \
/media/usbkey/
root@stubberud:~# umount /media/usbkey/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Popped it in and it worked!
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>Mail setup</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/mail"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2008-10-14</published>
    <summary>My mail setup for IMAP and SMTP on a client machine.</summary>
    <content type="html">&lt;p&gt;Important bits for .muttrc (need public-key crypto set up for ssh):
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;set folder=imap://gsf@breaksalot.org/
set tunnel=&quot;ssh -q breaksalot.org /usr/sbin/dovecot --exec-mail imap&quot;

my_hdr From: Gabriel Farrell &amp;lt;gsf@breaksalot.org&amp;gt;
set envelope_from=yes

mailboxes /var/mail/gsf + +archives +debian +django +dspace-tech

folder-hook . set record=&quot;+archives&quot;
folder-hook . save-hook . &quot;+archives&quot;
folder-hook . set postponed=&quot;+drafts&quot;

set sort=threads
set move=no
set delete=yes
set fast_reply=yes
set confirmappend=no
set mailcap_path=~/.mutt/mailcap
set smart_wrap
unset markers
set simple_search=&quot;~f %s | ~s %s | ~C %s&quot;
set certificate_file=~/.mutt_certificates

set index_format=&quot;%4C %Z %{%b %d} %-15.15F (%4l) %s&quot;
set alias_file=~/.mutt/aliases

# simpler headers
ignore *
unignore from cc to date subject
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Install Postfix as &quot;Satellite system&quot; and set &quot;breaksalot.org&quot; as the SMTP 
   relay host.  Defaults on everything else.
&lt;/p&gt;
&lt;p&gt;Add the following to the bottom of /etc/postfix/main.cf:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Create /etc/postfix/sasl_passwd with the following line (substitute 
   &quot;passwd&quot;):
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;breaksalot.org gsf:passwd
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Run &lt;code&gt;postmap /etc/postfix/sasl_passwd&lt;/code&gt;, then &lt;code&gt;/etc/init.d/postfix reload&lt;/code&gt;.&lt;br /&gt;

&lt;/p&gt;
&lt;p&gt;On one laptop I was getting the following error in /var/log/mail.log when
   trying to send:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(SASL authentication failed; cannot authenticate to server 
breaksalot.org[207.192.69.239]: no mechanism available)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That problem was solved by installing libsasl2-modules.
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>Guido on importing in Python</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/importstyle"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2008-08-22</published>
    <summary>A snippet from django-developers in which Guido van Rossum mentions his preferred import style.</summary>
    <content type="html">&lt;p&gt;From &lt;a href=&quot;http://groups.google.com/group/django-developers/msg/8991d2a2d6d87873&quot;&gt;http://groups.google.com/group/django-developers/msg/8991d2a2d6d87873&lt;/a&gt;:
&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;I'm totally in favor of dropping the packages from the path; but I
   personally have grown very fond of Google's style convention of always
   importing modules, never classes or functions. 
&lt;/p&gt;
&lt;/blockquote&gt;</content>
  
  </entry>
  <entry>
    <title>Transferring files between Debian and a Nokia 6555 cell phone</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/cellxfer"/>
    <updated>2009-01-27T18:11:02-05:00</updated>
    <published>2008-07-04</published>
    <summary>A short howto describing the way I figured out how to move files via bluetooth between my Nokia 6555 cell phone and my Thinkpad X31 running Debian GNU/Linux.</summary>
    <content type="html">&lt;p&gt;After some frustration I got some great help from &lt;a href=&quot;http://hanishkvc.wordpress.com/2007/05/16/short-and-simple-commandline-bluetooth-in-any-new-linux-distros/&quot;&gt;HanishKVC&lt;/a&gt; on getting
   things going.  It seems a lot depends on gnome, and figuring out how to do
   bluetooth in XFCE, etc., proves difficult.
&lt;/p&gt;
&lt;p&gt;First I enabled bluetooth on my phone (via Settings -&amp;gt; Connectivity) and 
   enabled it on my laptop:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;magnum:~# echo enable &amp;gt; /proc/acpi/ibm/bluetooth
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I was able to see the phone:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gsf@magnum:~$ hcitool scan
Scanning ...
        00:1B:AF:D5:CA:1C       Nokia 6555b
gsf@magnum:~$
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I installed obexftp and tried to check some files, but failed:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gsf@magnum:~$ obexftp -b 00:1B:AF:D5:CA:1C -l
Browsing 00:1B:AF:D5:CA:1C ...
Channel: 10
Connecting...failed: connect
Still trying to connect
Connecting...failed: connect
Still trying to connect
Connecting...failed: connect
Still trying to connect
gsf@magnum:~$
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Each time, the phone asked for a passcode/passkey and I put in the one I had in
   &lt;code&gt;/etc/bluetooth/hcid.conf&lt;/code&gt; (&quot;1234&quot;), but it failed to pair.  I was finally able
   to get past it by building passkey-agent (note that on a really stripped-down 
   machine I had to install libdbus-1-dev for the &lt;code&gt;make&lt;/code&gt; to work):
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;magnum:~# cd /usr/share/doc/bluez-utils/examples/
magnum:/usr/share/doc/bluez-utils/examples# gunzip passkey-agent.c.gz 
magnum:/usr/share/doc/bluez-utils/examples# make
cc `pkg-config --libs --cflags dbus-1` -DDBUS_API_SUBJECT_TO_CHANGE
-DVERSION=&quot;\&quot;unknown\&quot;&quot; -o passkey-agent passkey-agent.c 
magnum:/usr/share/doc/bluez-utils/examples# mv passkey-agent /usr/bin/
magnum:/usr/share/doc/bluez-utils/examples#
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I also had to set a default key:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gsf@magnum:~$ passkey-agent --default 1234 &amp;amp;
[1] 18890
gsf@magnum:~$
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;When I tried again, the passcode worked:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gsf@magnum:~$ obexftp -b 00:1B:AF:D5:CA:1C -l
Browsing 00:1B:AF:D5:CA:1C ...
Channel: 10
Connecting...Passkey request for device 00:1B:AF:D5:CA:1C
done
Receiving &quot;(null)&quot;...\&amp;lt;?xml version=&quot;1.0&quot;?&amp;gt;
&amp;lt;!DOCTYPE folder-listing SYSTEM &quot;obex-folder-listing.dtd&quot;
 [ &amp;lt;!ATTLIST folder mem-type CDATA #IMPLIED&amp;gt; ]&amp;gt;
&amp;lt;folder-listing version=&quot;1.0&quot;&amp;gt;
    &amp;lt;folder name=&quot;Graphics&quot; created=&quot;20060101T000000&quot; user-perm=&quot;R&quot; mem-type=&quot;DEV&quot;/&amp;gt;
    &amp;lt;folder name=&quot;Themes&quot; created=&quot;20060101T000000&quot; user-perm=&quot;R&quot; mem-type=&quot;DEV&quot;/&amp;gt;  
    &amp;lt;folder name=&quot;Tones&quot; created=&quot;20060101T000000&quot; user-perm=&quot;R&quot; mem-type=&quot;DEV&quot;/&amp;gt;   
    &amp;lt;folder name=&quot;Video clips&quot; created=&quot;20060101T000000&quot; user-perm=&quot;R&quot; mem-type=&quot;DEV&quot;/&amp;gt;
    &amp;lt;folder name=&quot;Music files&quot; created=&quot;20060101T000000&quot; user-perm=&quot;R&quot; mem-type=&quot;DEV&quot;/&amp;gt;
    &amp;lt;folder name=&quot;Images&quot; created=&quot;20070101T000000&quot; user-perm=&quot;R&quot; mem-type=&quot;DEV&quot;/&amp;gt;  
    &amp;lt;folder name=&quot;Audio&quot; created=&quot;20070101T000000&quot; user-perm=&quot;R&quot; mem-type=&quot;DEV&quot;/&amp;gt;   
    &amp;lt;folder name=&quot;Received files&quot; created=&quot;20070101T000000&quot; user-perm=&quot;R&quot; mem-type=&quot;DEV&quot;/&amp;gt;
&amp;lt;/folder-listing&amp;gt;
done
Disconnecting...done
gsf@magnum:~$
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Once the device is paired, I no longer need the passkey-agent to be running to
   connect.
&lt;/p&gt;
&lt;p&gt;To pull down multiple files from my phone, I use a bash command such as this:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gsf@magnum:~$ for a in `seq 10 38`; do obexftp -b 00:1B:AF:D5:CA:1C -g \
Images/Image0$a.jpg; done
&lt;/code&gt;&lt;/pre&gt;</content>
  
  </entry>
  <entry>
    <title>My Django and WSGI Setup</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/django_wsgi"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2008-06-19</published>
    <summary>A description of the setup I use for Django and WSGI.</summary>
    <content type="html">&lt;p&gt;The info at both &lt;a href=&quot;http://code.google.com/p/modwsgi/wiki/IntegrationWithDjango&quot;&gt;modwsgi's &quot;Integration With Django&quot;&lt;/a&gt; and
   &lt;a href=&quot;http://code.djangoproject.com/wiki/django_apache_and_mod_wsgi&quot;&gt;Django's &quot;How to use django with mod_wsgi&quot;&lt;/a&gt; are useful, but I'm
   hoping to cut to the chase here with a short and sweet example of how things
   work for me.  I'll just go ahead and leave in the name of the project (lisinfo)
   the setup is for, but you should get the idea about where to change things.
   Okay, I'll start cutting and chasing now, then.
&lt;/p&gt;
&lt;p&gt;First, my Apache configuration, which, this being a Debian box, lives at
   &lt;code&gt;/etc/apache2/sites-available/lisinfo.breaksalot.org&lt;/code&gt;:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;VirtualHost *&amp;gt;
    ServerName lisinfo.breaksalot.org
    ServerAdmin &quot;the comptroller, and Miss Piggy&quot;

    WSGIDaemonProcess lisinfo
    WSGIProcessGroup lisinfo

    WSGIScriptAlias / /var/www/lisinfo/django.wsgi
    &amp;lt;Directory /var/www/lisinfo/&amp;gt;
        Order deny,allow
        Allow from all
    &amp;lt;/Directory&amp;gt;
    Alias /media /var/www/lisinfo/media/
    &amp;lt;Directory /var/www/lisinfo/media&amp;gt;
        Order deny,allow
        Allow from all
    &amp;lt;/Directory&amp;gt;
    Alias /admin/media /usr/local/django/django/contrib/admin/media/
    &amp;lt;Directory /usr/local/django/django/contrib/admin/media&amp;gt;
        Order deny,allow
        Allow from all
    &amp;lt;/Directory&amp;gt;
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The WSGIDaemonProcess and WSGIProcessGroup bits allow me to touch django.wsgi
   (the insides of which we'll get to in a sec) to kill and restart any processes
   associated with lisinfo, so code changes can be made visible without restarting
   Apache.  This feature of the mod_wsgi setup is probably the one that makes the
   most positive difference for me.  It makes developing almost as fast as with
   the built-in server.  There's documentation on this stuff at &lt;a href=&quot;http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives&quot;&gt;modwsgi
Configuration Directives&lt;/a&gt; if you're interested.
&lt;/p&gt;
&lt;p&gt;The django.wsgi script lives at &lt;code&gt;/var/www/lisinfo/django.wsgi&lt;/code&gt;, the root of the
   lisinfo project, along with settings.py, urls.py, etc.  It's short and sweet:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import os, sys

# path is the parent directory of this script ('/var/www' in this case)
path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# we check for path because we're told to at the tail end of
# http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIReloadMechanism 
if path not in sys.path:
    sys.path.append(path)

os.environ['DJANGO_SETTINGS_MODULE'] = 'lisinfo.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Update 2008-08-01&lt;/strong&gt;: The steps below are no longer necessary as of &lt;a href=&quot;http://code.djangoproject.com/changeset/8015&quot;&gt;r8015&lt;/a&gt;
   and &lt;a href=&quot;http://code.djangoproject.com/changeset/8032&quot;&gt;r8032&lt;/a&gt;.  Also, those changes have obviated the need to put your non-root
   script alias in the urls.py.  Many thanks to Malcolm Tredinnick for the fix.
&lt;/p&gt;
&lt;p&gt;Okay, so far, so good, huh?  That's all you need to do if your WSGIScriptAlias
   is at the document root, i.e. just '/'.  If it has a non-root path then you
   need to apply the patch I submitted to &lt;a href=&quot;http://code.djangoproject.com/ticket/3414&quot;&gt;ticket #3414&lt;/a&gt;, which looks like
   this:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Index: django/core/handlers/wsgi.py
===================================================================
--- django/core/handlers/wsgi.py        (revision 7534)
+++ django/core/handlers/wsgi.py        (working copy)
@@ -75,7 +75,7 @@
 class WSGIRequest(http.HttpRequest):
     def __init__(self, environ):
         self.environ = environ
-        self.path = force_unicode(environ['PATH_INFO'])
+        self.path = force_unicode(environ['SCRIPT_NAME'] + environ['PATH_INFO'])
         self.META = environ
         self.method = environ['REQUEST_METHOD'].upper()
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That seems to make it work for me.  I hope I haven't missed anything.  Happy
   hacking!
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2008-08-26&lt;/strong&gt;: Some looking around at things today taught me some new
   stuff.  Graham Dumpleton actually recommends MPM Worker over Prefork, as noted
   in &lt;a href=&quot;http://groups.google.com/group/modwsgi/browse_thread/thread/15f94568d0c25ad7/5074e68b52530c28&quot;&gt;this informative thread&lt;/a&gt;.  Also, I wanted to make a note here
   that on one of our servers the setting of maximum-requests=10000 on the
   WSGIDaemonProcess, as suggested in the Defining Process Groups section in the
   &lt;a href=&quot;http://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines&quot;&gt;Configuration Guidelines&lt;/a&gt;, has helped some memory issues.
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>Solr init script</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/solrinit"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2008-05-30</published>
    <summary>An init script to start up, stop, and restart Solr.</summary>
    <content type="html">&lt;p&gt;I cobbled together the following init script for Solr, using the Jetty it 
   comes with, with a little help from various other init.d scripts and &lt;a href=&quot;http://www.digital39.com/programming/solr-chkconfig-and-startstop-scripts/&quot;&gt;Pete's
example&lt;/a&gt;:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/sh -e

# Starts, stops, and restarts solr

SOLR_DIR=&quot;/usr/local/solr/example&quot;
JAVA_OPTIONS=&quot;-Xmx1024m -DSTOP.PORT=8079 -DSTOP.KEY=stopkey -jar start.jar&quot;
LOG_FILE=&quot;/var/log/solr.log&quot;
JAVA=&quot;/usr/bin/java&quot;

case $1 in
    start)
        echo &quot;Starting Solr&quot;
        cd $SOLR_DIR
        $JAVA $JAVA_OPTIONS 2&amp;gt; $LOG_FILE &amp;amp;
        ;;
    stop)
        echo &quot;Stopping Solr&quot;
        cd $SOLR_DIR
        $JAVA $JAVA_OPTIONS --stop
        ;;
    restart)
        $0 stop
        sleep 1
        $0 start
        ;;
    *)
        echo &quot;Usage: $0 {start|stop|restart}&quot; &amp;gt;&amp;amp;2
        exit 1
        ;;
esac
&lt;/code&gt;&lt;/pre&gt;</content>
  
  </entry>
  <entry>
    <title>Autocomplete and history in the Python interpreter</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/pystartup"/>
    <updated>2009-08-08T09:53:39-05:00</updated>
    <published>2008-05-01</published>
    <summary>Souping up the Python interpreter with .pystartup.</summary>
    <content type="html">&lt;p&gt;I ran across this page of &lt;a href=&quot;http://docs.python.org/tut/node15.html&quot;&gt;tips for the interactive Python
interpreter&lt;/a&gt; the other day.  It's part of the official Python
   documentation, but kinda buried in searches for &quot;pythonrc&quot; and &quot;python
   interpreter&quot;, maybe because the example uses &quot;.pystartup&quot; for the name
   of the configuration file (a practice I'll follow as well, seeing as
   pythonrc is &lt;a href=&quot;http://docs.python.org/lib/module-user.html&quot;&gt;used for other things&lt;/a&gt;).  I'm rambling on about
   it here so I don't lose or forget about it down the road.  I realize
   ipython does everything that's described therein, but, frankly, it's
   too flashy for me, and I like being able to copy and paste into my
   docstrings for doctests.
&lt;/p&gt;
&lt;p&gt;I've been using the &lt;code&gt;'tab: complete'&lt;/code&gt; mapping for a few days, and I
   like it.  It's kind of a bummer to have to hit the spacebar four times
   for each indent (and I agree with the commentary at the bottom that
   the interpreter should suggest proper indentation), but it's not a big
   deal for me.  The default, mapping autocomplete to the Esc key, just
   feels weird.  I tried &lt;code&gt;'`: complete'&lt;/code&gt; (mapping the backtick to
   autocomplete), and that works, but tab-completion is so ingrained in
   me that I don't really want to train myself on another key (though I
   have adapted to Ctrl-P in vim).
&lt;/p&gt;
&lt;p&gt;Ooh, and a saved history between sessions is really the only other
   thing I like about ipython.  Glad to see it can be done in the boring
   old, plain old interactive interpreter session.
&lt;/p&gt;
&lt;p&gt;My .pystartup, then, looks much like the example in the Python docs:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Add auto-completion and a stored history file of commands to your Python
# interactive interpreter. Requires Python 2.0+, readline. Autocomplete is
# bound to the Esc key by default (you can change it - see readline docs).
#
# Store the file in ~/.pystartup, and set an environment variable to point
# to it:  &quot;export PYTHONSTARTUP=/home/gsf/.pystartup&quot; in bash.
#
# Note that PYTHONSTARTUP does *not* expand &quot;~&quot;, so you have to put in the
# full path to your home directory.

import atexit
import os
import readline
import rlcompleter
import sys

# change autocomplete to tab
readline.parse_and_bind(&quot;tab: complete&quot;)

historyPath = os.path.expanduser(&quot;~/.pyhistory&quot;)

def save_history(historyPath=historyPath):
    import readline
    readline.write_history_file(historyPath)

if os.path.exists(historyPath):
    readline.read_history_file(historyPath)

atexit.register(save_history)

# anything not deleted (sys and os) will remain in the interpreter session
del atexit, readline, rlcompleter, save_history, historyPath
&lt;/code&gt;&lt;/pre&gt;</content>
  
  </entry>
  <entry>
    <title>Wrapper Class for Paramiko</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/paramiko"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2008-03-19</published>
    <summary>A wrapper I wrote for paramiko to make things just a little easier.</summary>
    <content type="html">&lt;p&gt;I used &lt;a href=&quot;http://www.lag.net/paramiko/&quot;&gt;paramiko&lt;/a&gt; for a project a while ago and wrote the following,
   called sftp_wrapper.py, to help with things:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;'''
sftp_wrapper.py is a wrapper class for the sftp portion of the 
paramiko library.
'''

import paramiko

class Session(object):
    def __init__(self, hostname, username, password):
        self.tunnel = paramiko.Transport((hostname, 22))
        hostkeys = paramiko.util.load_host_keys('known_hosts')
        hostkey = hostkeys[hostname]['ssh-rsa']
        self.tunnel.connect(username=username, password=password,
            hostkey=hostkey)
        self.sftp = paramiko.SFTPClient.from_transport(self.tunnel)

    def open(self, filename, mode='r'):
        return self.sftp.open(filename, mode=mode)

    def chdir(self, dir):
        self.sftp.chdir(dir)

    def get(self, remote, local=None):
        if not local:
            local = remote
        self.sftp.get(remote, local)

    def put(self, local, remote=None):
        if not remote:
            remote = local
        self.sftp.put(local, remote)

    def listdir(self, remote):
        return self.sftp.listdir(remote)

    def remove(self, remote):
        self.sftp.remove(remote)

    def close(self):
        self.tunnel.close()
&lt;/code&gt;&lt;/pre&gt;</content>
  
  </entry>
  <entry>
    <title>Code4lib Conference 2008 Report</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/c4l2008"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2008-03-14</published>
    <summary>Report back on code4libcon2008.</summary>
    <content type="html">&lt;p&gt;The 2008 code4lib conference, also known as &lt;a href=&quot;http://code4lib.org/conference/2008/&quot;&gt;code4libcon2008&lt;/a&gt;, took
   place February 25-28, 2008, in Portland, Oregon.
&lt;/p&gt;
&lt;p&gt;Links of interest:
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     &lt;a href=&quot;http://demo.openlibrary.org/&quot;&gt;http://demo.openlibrary.org/&lt;/a&gt;
 &lt;/li&gt;

 &lt;li&gt;
     &lt;a href=&quot;http://www.zotero.org/&quot;&gt;http://www.zotero.org/&lt;/a&gt;
 &lt;/li&gt;

 &lt;li&gt;
     &lt;a href=&quot;http://demo.gapines.org/&quot;&gt;http://demo.gapines.org/&lt;/a&gt;
 &lt;/li&gt;

 &lt;li&gt;
     &lt;a href=&quot;http://code4lib.org/&quot;&gt;http://code4lib.org/&lt;/a&gt;
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(Notes to be added later.)
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>Kobold Chieftain Talk</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/kctalk"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2008-02-27</published>
    <summary>Kobold Chieftain lightning talk.</summary>
    <content type="html">&lt;p&gt;I gave a lightning talk at &lt;a href=&quot;http://code4lib.org/conference/2008/&quot;&gt;code4libcon2008&lt;/a&gt; with Mark A. Matienzo.  It 
   was really just a bunch of links (some images), tenuously strung together:
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     &lt;a href=&quot;http://icanhascheezburger.files.wordpress.com/2008/02/funny-pictures-kitten-watches-tv.jpg&quot;&gt;http://icanhascheezburger.files.wordpress.com/2008/02/funny-pictures-kitten-watches-tv.jpg&lt;/a&gt;
 &lt;/li&gt;

 &lt;li&gt;
     &lt;a href=&quot;http://code.google.com/p/fac-back-opac/&quot;&gt;http://code.google.com/p/fac-back-opac/&lt;/a&gt;
 &lt;/li&gt;

 &lt;li&gt;
     &lt;a href=&quot;http://fruct.us/trac/fbo&quot;&gt;http://fruct.us/trac/fbo&lt;/a&gt;
 &lt;/li&gt;

 &lt;li&gt;
     &lt;a href=&quot;http://library.paulsmiths.edu/catalog/&quot;&gt;http://library.paulsmiths.edu/catalog/&lt;/a&gt;
 &lt;/li&gt;

 &lt;li&gt;
     &lt;a href=&quot;http://manheim.library.drexel.edu/helios/&quot;&gt;http://manheim.library.drexel.edu/helios/&lt;/a&gt;
 &lt;/li&gt;

 &lt;li&gt;
     &lt;a href=&quot;http://www.tricyclebicyclecycle.org/dys/mg.jpg&quot;&gt;http://www.tricyclebicyclecycle.org/dys/mg.jpg&lt;/a&gt;
 &lt;/li&gt;

 &lt;li&gt;
     &lt;a href=&quot;http://images.epilogue.net/users/chumart/kobold_chief.jpg&quot;&gt;http://images.epilogue.net/users/chumart/kobold_chief.jpg&lt;/a&gt;
 &lt;/li&gt;

 &lt;li&gt;
     &lt;a href=&quot;http://test.matienzo.org/facetcat.jpg&quot;&gt;http://test.matienzo.org/facetcat.jpg&lt;/a&gt;
 &lt;/li&gt;
&lt;/ul&gt;</content>
  
  </entry>
  <entry>
    <title>Single Transferable Vote</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/stv"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2008-01-25</published>
    <summary>Some ramblings on STV and project ideas.</summary>
    <content type="html">&lt;p&gt;Voting's on my mind again because of some recent topics in #code4lib
   and on the mailing list, so I looked into Borda Count, etc.  This time
   I landed on &lt;a href=&quot;http://en.wikipedia.org/wiki/Single_transferable_vote&quot;&gt;STV&lt;/a&gt;.  I like that &lt;a href=&quot;http://en.wikipedia.org/wiki/Instant-runoff_voting&quot;&gt;IRV&lt;/a&gt; is merely STV with a single
   winner.  So a system that supports STV should support IRV without any
   modification.&lt;br /&gt;

&lt;/p&gt;
&lt;p&gt;On the software side of things, &lt;a href=&quot;http://stv.sourceforge.net/&quot;&gt;OpenSTV&lt;/a&gt; looks pretty cool in that
   it's a desktop app written in Python.  I'm thinking it would be great
   to have a portable Django STV app, for which I might steal some of the
   OpenSTV code (with attribution, of course).
&lt;/p&gt;
&lt;p&gt;Also, the home page of OpenSTV currently links to &lt;a href=&quot;http://www.votingmatters.org.uk/ISSUE24/INDEX.HTM&quot;&gt;Issue 24 of
&lt;cite&gt;Voting matters&lt;/cite&gt;&lt;/a&gt;, in which the creator of OpenSTV
   has articles on STV in Northern Ireland and the Droop quota.  I've
   printed it out for my bus ride to NYC.
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>Conversation with father</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/daddy"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2008-01-18</published>
    <summary>The 'Daddy, are you a terrorist?' poster.</summary>
    <content type="html">&lt;p&gt;The &lt;a href=&quot;http://safetystate.com/ss.cgi?action=material&amp;amp;id=13&quot;&gt;&quot;Daddy, are you a terrorist?&quot;&lt;/a&gt; poster is a nice little slice
   of a moment.
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>Single-pass multiple replace</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/multiple_replace"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2007-12-18</published>
    <summary>Replace multiple patterns in a single pass with Python.</summary>
    <content type="html">&lt;p&gt;I came across the desire, once again, to replace multiple patterns in a single
   pass, and feeling something just missing from or put too complicated in both
   the &lt;a href=&quot;http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/81330&quot;&gt;solution at ASPN&lt;/a&gt; and the one in the &lt;a href=&quot;http://www.oreilly.com/catalog/pythoncook2/&quot;&gt;print version of the Python
Cookbook&lt;/a&gt;, I put my version of it here:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import re

text = 'i ran from the bob.  after all, he\'s a large mother.'
subs = {
    'bob': 'panda',
    'mother': 'bear',
}

compiled = re.compile('|'.join(map(re.escape, subs)))
def lookup(match):
    return subs[match.group(0)]
new_text = compiled.sub(lookup, text)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It could only get simpler if I replaced &lt;code&gt;lookup&lt;/code&gt; with a lambda, but I'm not a
   fan.  I don't mind using &lt;code&gt;re&lt;/code&gt; directly, but it is a bit hard on the eyes.
   Unnecessarily so if I might use it more than once in the same project.  For
   that situation, I'd use the closure version from the second edition of the
   Python Cookbook.  It reads as follows:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def make_xlat(*args, **kwds):
    adict = dict(*args, **kwds)
    rx = re.compile('|'.join(map(re.escape, adict)))
    def one_xlat(match):
        return adict[match.group(0)]
    def xlat(text):
        return rx.sub(one_xlat, text)
    return xlat
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;As described in the book, a translater for a particular dictionary can then be
   created with a simple &lt;code&gt;translate = make_xlat(adict)&lt;/code&gt;.  Finally, I prefer the
   class version in the book to the one at ASPN because it's a &quot;drop-in
   replacement&quot; for the closure, and because the names make more sense to me.
   Here it is:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class make_xlat:
    def __init__(self, *args, **kwds):
        self.adict = dict(*args, **kwds)
        self.rx = self.make_rx( )
    def make_rx(self):
        return re.compile('|'.join(map(re.escape, self.adict)))
    def one_xlat(self, match):
        return self.adict[match.group(0)]
    def __call__(self, text):
        return self.rx.sub(self.one_xlat, text)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This recipe is a great example of the easy adaptability of Python for similar,
   but subtly different purposes.  It's also a great example of just how
   educational each one of the recipes in the Python Cookbook can be.  Damn that's
   a fine tome.
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>Mirroring a Google Code Subversion Repository for Trac</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/googsvnsync"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2007-12-10</published>
    <summary>Notes on the mirroring of a Google Code Subversion repository to another server so I can run Trac on it.</summary>
    <content type="html">&lt;p&gt;Some of us working on the &lt;a href=&quot;http://fac-back-opac.googlecode.com/&quot;&gt;FBO/Helios project&lt;/a&gt; couldn't live with the
   ticket tracking and source browsing at Google Code, so I decided to set up a
   Trac instance for the project on my server at &lt;a href=&quot;http://fruct.us/trac/fbo&quot;&gt;fruct.us&lt;/a&gt;.  Problem is, Trac
   can't access remote repositories, so I had to mirror the one at Google over to
   fruct.us.&lt;br /&gt;

&lt;/p&gt;
&lt;p&gt;I looked at both svk and svnsync, and decided svnsync was the tool for the job.
   I created a repository at /home/svn/fbo-sync, set up the hook scripts, and ran
   &lt;code&gt;svnsync&lt;/code&gt; as described in the &lt;a href=&quot;http://svnbook.red-bean.com/en/1.4/svn.reposadmin.maint.html#svn.reposadmin.maint.replication&quot;&gt;SVN book at red-bean&lt;/a&gt;.  The svnsync 
   commands looked like this:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ svnsync init file:///home/svn/fbo-sync http://fac-back-opac.googlecode.com/svn
$ svnsync sync file:///home/svn/fbo-sync
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I watched as each revision from the repo at Google Code was checked into
   fbo-sync.  To keep the two in sync, it would have been nice to add a
   post-commit hook to the Google Code repo that syncs the two whenever there's a
   commit.  Since I don't have access to the hook scripts at Google, I set up a
   cron job on fruct.us to sync every five minutes:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# crontab for svn
# m h  dom mon dow   command
*/5 * * * * /usr/bin/svnsync --non-interactive sync file:///home/svn/fbo-sync
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That's it for the syncing.&lt;br /&gt;

&lt;/p&gt;
&lt;p&gt;The trac setup was pretty standard.  I pointed my trac install at the fbo-sync
   repo and it treated it as it would any other SVN repository.  The tricky bit
   was getting the &lt;a href=&quot;http://trac.edgewall.org/browser/trunk/contrib/trac-post-commit-hook&quot;&gt;trac-post-commit-hook script&lt;/a&gt; to work.  I put the shell
   script suggested in the comment section of that file (well, a slightly altered
   version -- see &lt;a href=&quot;http://trac.edgewall.org/ticket/6445&quot;&gt;the ticket I filed&lt;/a&gt;) at
   &lt;code&gt;/home/svn/fbo-sync/hooks/post-commit&lt;/code&gt;, made it executable, and ran a test
   commit with a &lt;code&gt;refs #1&lt;/code&gt; in the commit message.  Nothing happened in the trac
   instance.  Then I remembered to include the &lt;code&gt;#!/bin/bash&lt;/code&gt; at the top of the
   hook script.  I ran another test commit and it worked.  I noticed, however,
   that the user &quot;svn&quot;, under whom &lt;code&gt;svnsync&lt;/code&gt; ran, was getting credit for the
   commit.  I banged my head on the keyboard until I realized that svnsync makes
   the commit as &quot;svn&quot;, then changes the revision properties to reflect the source
   repository.  How could I tell the post-commit hook to wait until after the
   revision properties had been modified?
&lt;/p&gt;
&lt;p&gt;I couldn't, of course.  A post-commit hook follows a commit, and must execute
   before the properties are modified.  My first attempt at a solution was to
   remove the hook and instead parse the committed revision numbers from the
   output of the svnsync script.  I replaced the svnsync line in svn's crontab
   with a pointer to the following script:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash

SVN_OUT=`svnsync sync file:///home/svn/fbo-sync`

if [ -n &quot;$SVN_OUT&quot; ]; then
    REV=`echo $SVN_OUT | grep -o '[0-9]*' -m 1`
    echo 'trac-post-commit-hook processing ...'
    /home/svn/trac-post-commit-hook -p '/home/trac/sites/fbo' -r $REV
    echo 'done.'
fi
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This worked, but I really don't like the thought of parsing output scripts as
   an API.  So fragile.  What if more than one commit occurs in a five-minute
   interval?  I could have extended it to handle that case, but that way lies
   madness.  Instead, I decided to use a post-revprop-change hook on the
   repository.  I wrote the following, at
   &lt;code&gt;/home/svn/fbo-sync/hooks/post-revprop-change&lt;/code&gt;, for testing:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash

REPOS=&quot;$1&quot;
REV=&quot;$2&quot;
USER=&quot;$3&quot;
PROPNAME=&quot;$4&quot;
ACTION=&quot;$5&quot;

echo &quot;repos:&quot; $REPOS &quot;rev:&quot; $REV &quot;user:&quot; $USER &quot;propname:&quot; $PROPNAME \
        &quot;action:&quot; $ACTION &amp;gt;&amp;gt; /home/svn/svnrevprop.log
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;svnrevprop.log looked like this:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;repos: /home/svn/fbo-sync rev: 0 user: svn propname: svn:sync-lock action: A
repos: /home/svn/fbo-sync rev: 0 user: svn propname: svn:sync-lock action: D
repos: /home/svn/fbo-sync rev: 0 user: svn propname: svn:sync-lock action: A
repos: /home/svn/fbo-sync rev: 0 user: svn propname: svn:sync-currently-copying action: A
repos: /home/svn/fbo-sync rev: 96 user: svn propname: svn:log action: M
repos: /home/svn/fbo-sync rev: 96 user: svn propname: svn:author action: M
repos: /home/svn/fbo-sync rev: 96 user: svn propname: svn:date action: M
repos: /home/svn/fbo-sync rev: 0 user: svn propname: svn:sync-last-merged-rev action: M
repos: /home/svn/fbo-sync rev: 0 user: svn propname: svn:sync-currently-copying action: D
repos: /home/svn/fbo-sync rev: 0 user: svn propname: svn:sync-lock action: D
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The first two lines of that example are the result of an svnsync without a
   revision update.  The rest describe svnsync's processing of revision 96.  Of
   importance is the order in which properties on that revision are modified.
   Further tests showed that they always occur in the same order (log, author,
   date).  I replaced the post-revprop-change script above with the following: 
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash

TRAC_ENV=&quot;/home/trac/sites/fbo&quot;
REV=&quot;$2&quot;
PROPNAME=&quot;$4&quot;

if [ $PROPNAME = &quot;svn:date&quot; ]; then
    /usr/bin/python /home/svn/trac-post-commit-hook -p &quot;$TRAC_ENV&quot; -r &quot;$REV&quot;
fi
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This script executes trac-post-commit-hook after each svn:date revprop
   modification.  Because that is the last change svnsync makes on each revision,
   the trac instance is updated as expected, crediting the user who made the
   original commit to the repository at Google Code.
&lt;/p&gt;
&lt;p&gt;This is also fragile.  If the order of the revprop changes were to switch, it
   would break.  I'm trying to imagine what the ideal solution would be, but
   nothing comes to mind.  In any case, the post-revprop-change script solves the
   problem at present.&lt;br /&gt;

&lt;/p&gt;
&lt;p&gt;p.s. At some point in my testing, I ran into the &quot;Failed to get lock on
   destination repos&quot; error after an aborted sync.  I followed the advice in the
   &lt;a href=&quot;http://journal.paul.querna.org/articles/2006/09/14/using-svnsync/&quot;&gt;&quot;using svnsync&quot; article at Paul's Journal&lt;/a&gt; and ran:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ svn propdelete svn:sync-lock --revprop -r 0 file:///home/svn/fbo-sync
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That worked for me as it did for him.  Many thanks.
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>Releasing the Law to the Public</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/freelaw"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2007-11-14</published>
    <summary>A note about Public.Resource.Org's press release about the to-be-released free archive of federal case law.</summary>
    <content type="html">&lt;p&gt;Brett brought &lt;a href=&quot;http://public.resource.org/case_law_announcement.html&quot;&gt;Public.Resource.Org's press release&lt;/a&gt; to my
   attention.  Notable for both the challenge to the Westlaw and
   LexisNexis duopoly as well as the new Creative Commons mark.&lt;br /&gt;

&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>WoW and SL</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/wowsl"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2007-11-07</published>
    <summary>A little comparison of World of Warcraft and Second Life.</summary>
    <content type="html">&lt;p&gt;I've been pondering the differences between WoW and SL, wondering what
   makes WoW more addictive for me, and today I ran across &lt;a href=&quot;http://maisonbisson.com/blog/post/11973/object-based-vs-ego-based-social-networks-vs-wow-and-second-life&quot;&gt;Casey's post
on social networks&lt;/a&gt;.  I like Stutzman's ego/object-centric
   dichotomy that Casey explores, but I think I'm disagreeing with him by
   saying both WoW and SL are &quot;ego-centric&quot; (I'm not sure which camp he
   puts WoW into).  WoW is all about creating a kick-ass character, and I
   imagine that same sense of accomplishment in building a new person is
   what drives the hardcore SL fans.  The two big differences I can
   identify are as follows:
&lt;/p&gt;
&lt;ol&gt;
 &lt;li&gt;&lt;p&gt;WoW provides a framework, as Casey mentions, and I like the story
   it tells and the mythology behind it.  I think part of the reason I
   escape into games is that life has too many choices, and I like being
   in a place where your objectives (quests) are listed out for you.
   (Consequently, I've been writing down more lists for my day-to-day
   stuff, and hey, they're useful!)&lt;br /&gt;

&lt;/p&gt;

 &lt;/li&gt;

 &lt;li&gt;&lt;p&gt;I've always preferred human vs. machine games over human vs. human.
   WoW provides both, and the human vs. machine one incorporates
   cooperation as a nice bonus.  In other words, I could play WoW without
   the social aspect and still enjoy it.  SL, on the other hand, has a
   little bit of the &quot;beat the machine&quot; in figuring out how to make
   objects and program them to do stuff, but if I'm going to be
   programming I'd rather be getting paid to do it.  I'd rather be
   creating and fixing stuff that will be of use to people outside of SL,
   which is still a bigger community than inside, even considering SL's
   impressive numbers.  I'd rather be working on something open source
   that's not constrained to a particular company's framework.  And I'd
   rather be doing it in Python.
&lt;/p&gt;

 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;But I digress.  Looking at Casey's post again, it occurs to me that
   the way I play WoW isn't really an ego-centric social experience.  In
   fact, it's not social at all.  Okay, maybe it's a little social, like
   when I get help on a quest, but my goal isn't
   &quot;network-(re)establishment&quot;.  I'm there to beat the game.  As long as
   I feel there's more of the game to beat, the &quot;What's next?&quot; is
   answered.  For some people, WoW is more social, and more like SL, but
   not for me.
&lt;/p&gt;
&lt;p&gt;And that might be the reason why I'm not a big fan of SL or social
   networking sites in general.  While I appreciate the networks I have
   in my life (my neighbors, colleagues, friends, and family), I'm not
   one who looks forward to reestablishing those networks in a bunch of
   walled-off environments like Friendster, MySpace, Facebook, Orkut, and
   Second Life that each offer some variation on connecting to others on
   line.  What interest I do have only holds if the benefit of the
   connecting tool outweighs the chore of setting up and maintaining a
   new network.
&lt;/p&gt;
&lt;p&gt;This reestablishment weariness isn't only true for ego-centric social
   networking sites.  It's kind of a bummer having to reconnect with
   everyone to share bookmarks on del.icio.us and images on Flickr, as
   well.  Which brings me to &lt;a href=&quot;http://www.nytimes.com/2007/11/04/technology/04digi.html&quot;&gt;the article&lt;/a&gt; I read last night that's
   obviously affecting my train of thought here.  Google is pushing
   something they're calling &quot;OpenSocial&quot;, which seems to be some kind of
   standard or set of standards for social-networking site APIs.  Sounds
   like a good idea.  Standards are good.
&lt;/p&gt;
&lt;p&gt;Standards are great.  Standards give me independence and control.
   That's another reason I don't get into the social-networking sites.  I
   know how to make my own website, send email, and instant relay chat,
   and I don't have to rely on any one company or organization to
   continue doing those things.  If OpenSocial lets me take my networks 
   with me (maybe in cooperation with something like &lt;a href=&quot;http://openid.net/&quot;&gt;OpenID&lt;/a&gt;), then I'm
   all for it.
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>So Long, and Thanks for All the Edits</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/theguide"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2007-11-06</published>
    <summary>In the reflection of the hoi polloi -- Wikipedia and The Hitchhiker's Guide to the Galaxy.</summary>
    <content type="html">&lt;p&gt;It dawned on me some morning in one of the last few years that Wikipedia is now
   and may forever be the closest thing we'll get to a real &lt;cite&gt;Hitchhiker's
   Guide to the Galaxy&lt;/cite&gt;.  Today that was confirmed by one Oliver Lardner,
   who, in the comment sent along with his $50 donation to Wikipedia, said,
   simply, &quot;don't panic.&quot;  I happened upon it while glancing through the list of
   publicly viewable recent contributions, a list full of hope and humor written
   in myriad languages by people around the world.
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>Access 2007</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/access2007"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2007-10-12</published>
    <summary>Access, Canada's premier library technology conference. This year in Victoria, B.C.</summary>
    <content type="html">&lt;p&gt;Hackfest was great.  It seemed more productive this year than last, both
   personally and for others I talked to.  Part of my productivity was due to my
   intent to work on a project I suggested: &lt;a href=&quot;http://triton.library.uvic.ca/hackfest/hidden.php?item=27&quot;&gt;Refactoring Fac-Back-OPAC&lt;/a&gt;.  We got a new branch created and did some code cleanup and
   merging with Helios, and I signed Birkin, Harish, and Mark up as committers on
   the &lt;a href=&quot;http://code.google.com/p/fac-back-opac/&quot;&gt;code repository&lt;/a&gt;.  I didn't take any photos, but I did &lt;a href=&quot;/access2007/mvi_4503.avi&quot;&gt;one
small video&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;From &quot;Observing Student Researchers in their Native Habitat&quot;: &quot;Students do not
   know the difference between electronic resources and what's in the OPAC....
   That's the biggest disconnect that we found.  If you have a federated searching
   tool, put it up front.&quot;
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>Koha Demo</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/koha"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2007-04-30</published>
    <summary>Notes from Koha Demo at Jenkins Law.</summary>
    <content type="html">&lt;p&gt;Koha initially developed by Katipo Communications for Horowhenua Library Trust
   in New Zealand in 2000.  Joshua Ferraro was at Nelsonville Public Library when
   it was adopted there in 2001.
&lt;/p&gt;
&lt;p&gt;Demonstration of OPAC at Nelsonville -- good searching capabilities (try &quot;it&quot;
   and &quot;o&quot;) -- great sorting features -- &quot;refine your search&quot; faceting.&lt;br /&gt;
Everything is over the web.  Not just OPAC, but all staff modules.
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://library.neu.edu.tr/cgi-bin/koha/opac-main.pl&quot;&gt;NEU Grand Library&lt;/a&gt; has image maps to books in the library.
&lt;/p&gt;
&lt;p&gt;Koha allows any encoding, but uses unicode internally.  See
   http://opac.liblime.com &quot;change language&quot; dropdown for translation examples.
&lt;/p&gt;
&lt;p&gt;KohaZOOM OPAC demo at http://zoomopac.liblime.com/.
&lt;/p&gt;
&lt;p&gt;Koha's OPAC is just a Z39.50 client, and the backend is a Z39.50 server, which
   is why it's easy to integrate with &lt;a href=&quot;http://masterkey.indexdata.com/&quot;&gt;Masterkey&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;We might have difficulty laying KohaZOOM over III because III's Z39.50 server
   is slow and unstable.  Most likely we'll need to pull everything out of the
   catalog and drop it in an indexer -- probably either Zebra or Solr.
&lt;/p&gt;
&lt;p&gt;We tossed around ideas for global updates.  Cataloging interface fills in 
   field defaults upon select.&lt;br /&gt;

&lt;/p&gt;
&lt;p&gt;Uses HTML::Template for templates.
&lt;/p&gt;
&lt;p&gt;Many thanks to &lt;a href=&quot;http://web2learning.net/&quot;&gt;Nicole Engard&lt;/a&gt; for putting the event together.
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>XML in Python</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/python_xml"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2007-04-24</published>
    <summary>A few notes on XML in Python.</summary>
    <content type="html">&lt;p&gt;After looking around (see links at bottom) I've come to the conclusion that,
   for now, the simplest, yet mostly successful, way to safely include input from
   various places is with &lt;code&gt;xml.sax.saxutils&lt;/code&gt; and &lt;code&gt;encode('ascii',
'xmlcharrefreplace')&lt;/code&gt;, like so:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; from xml.sax import saxutils
&amp;gt;&amp;gt;&amp;gt; xml_snippet = u'ö &amp;lt; på &amp;gt; &amp;amp; бб лн'
&amp;gt;&amp;gt;&amp;gt; xml_snippet
u'\xf6 &amp;lt; p\xe5 &amp;gt; &amp;amp; \u0431\u0431 \u043b\u043d'
&amp;gt;&amp;gt;&amp;gt; saxutils.escape(xml_snippet)
u'\xf6 &amp;amp;lt; p\xe5 &amp;amp;gt; &amp;amp;amp; \u0431\u0431 \u043b\u043d'
&amp;gt;&amp;gt;&amp;gt; saxutils.escape(xml_snippet).encode('ascii', 'xmlcharrefreplace')
'&amp;amp;#246; &amp;amp;lt; p&amp;amp;#229; &amp;amp;gt; &amp;amp;amp; &amp;amp;#1073;&amp;amp;#1073; &amp;amp;#1083;&amp;amp;#1085;'
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The conversion of &lt;code&gt;&amp;gt;&lt;/code&gt; to &lt;code&gt;&amp;amp;gt;&lt;/code&gt; is not required, but I prefer it, so I'm glad
   it's the default in saxutils.  Also, we could encode to iso-8859-1 instead of
   ascii, but, as Mr. Lundh points out in [3], it's still safer to use ascii.
&lt;/p&gt;

&lt;h2&gt;links&lt;/h2&gt;
&lt;p&gt;[1] http://www.xml.com/pub/a/2005/06/15/py-xml.html
   [2] http://www.diveintopython.org/xml_processing/unicode.html
   [3] http://online.effbot.org/2003_10_01_archive.htm#20031016
   [4] http://boodebr.org/main/python/all-about-python-and-unicode
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>Quick Commenting of Blocks in Vim</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/vimcomment"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2007-02-02</published>
    <summary>How to comment and uncomment blocks in Vim.</summary>
    <content type="html">&lt;p&gt;For a long time I have struggled with vim to comment blocks for any
   language or configuration file that only provides single line
   commenting (for me, usually python).  Today a light turned on
   somewhere (and I got some help in code4lib from decasm), and I
   realized that to comment 4 lines all I have to do is
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;0 Ctrl-V jjj I # Ctrl-C
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;Ctrl-C&lt;/code&gt; could be &lt;code&gt;Esc&lt;/code&gt;, of course, but I'm used to &lt;code&gt;Ctrl-C&lt;/code&gt; by
   now and there's an odd pause when I use &lt;code&gt;Esc&lt;/code&gt;.  To uncomment that
   text, do
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;0 Ctrl-V jjj d
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;d&lt;/code&gt; could be substituted by an &lt;code&gt;x&lt;/code&gt;, of course.
&lt;/p&gt;
&lt;p&gt;Ah, Vim.  A minute to learn, a lifetime to master.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: As noted in &lt;a href=&quot;http://groups.google.com/group/vim_dev/browse_thread/thread/6f172e6d903b66a0/6d96da9b98ed8af2&quot;&gt;my unanswered message on the vim-dev list&lt;/a&gt; (maybe &quot;bug or a feature&quot; sounded too flippant), &lt;code&gt;Ctrl-C&lt;/code&gt; no
   longer works here.  Too bad, as it's about the only time I hit &lt;code&gt;Esc&lt;/code&gt;
   in vim.
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>SRW installation on the DSpace server</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/dspace_srw"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2007-01-19</published>
    <summary>Record of steps for installation of OCLC's SRW/U Server on Drexel's DSpace machine.</summary>
    <content type="html">&lt;p&gt;Went to the &lt;a href=&quot;http://pubserv.oclc.org/srw/Installation.html&quot;&gt;OCLC Research SRW Server 2.0 Installation Instructions&lt;/a&gt;
   and downloaded SRW.zip and unpacked it in /usr/local/, then 
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# cd /usr/local/SRW-2.0/
# chown -R dspace:dspace .
# chmod -R g+w .
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then as user dspace I edited &lt;code&gt;conf/SRWServer.props&lt;/code&gt; to change
   &lt;code&gt;db.DSpace.home=d:/dspace/&lt;/code&gt; to &lt;code&gt;db.DSpace.home=/dspace/&lt;/code&gt; and the
   &lt;code&gt;db.DSpace.configuration&lt;/code&gt; line to
   &lt;code&gt;db.DSpace.configuration=config/DSpace.SRWDatabase.props&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;Then I copied &lt;code&gt;conf/DSpace.SRWDatabase.props&lt;/code&gt; to &lt;code&gt;/dspace/config&lt;/code&gt;.  Edited
   lines in that to brand the site and set administrator and added this important
   line: 
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;indexSynonym.cql.serverChoice=default
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That line sets the default query (e.g. query=horses) to search the &quot;default&quot;
   field in lucene, which is the same one that's searched in the &quot;simple search&quot;
   on the DSpace site.
&lt;/p&gt;
&lt;p&gt;Then I ran 
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ../apache-tomcat-5.5.17/bin/shutdown.sh
$ ant deploy
$ rm -Rf ../apache-tomcat-5.5.17/webapps/SRW
$ ../apache-tomcat-5.5.17/bin/startup.sh
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then later (much later) I figured out I had to edit
   &lt;code&gt;/usr/local/SRW-2.0/build.properties&lt;/code&gt; and change the beginning of it to read: 
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# specify the name of the webapp.  Some sites use SRW in lower case.
webappName=SRW

# if you want the &quot;deploy&quot; ant target to work, you need to specify the location
# of your tomcat server below

serverPath=/usr/local/apache-tomcat-5.5.17/

# if you want support for DSpace included within the SRW server, provide
# the path to the directory that has the dspace, lucene and postgresql jars.
# if this property is not defined, then DSpace support will not be included.

dspaceLib=/dspace/lib
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Instructions to edit the build.properties file are hidden in the very beginning
   of the Installation Instructions.
&lt;/p&gt;
&lt;p&gt;Also, I noticed &lt;code&gt;D:\Apache Tomcat 4.1\webapps&lt;/code&gt; was showing up in
   weird places in the filesystem -- found it in conf/server-config.wsdd and
   replaced it with &lt;code&gt;/usr/local/apache-tomcat-5.5.17/webapps&lt;/code&gt; -- 
   but they're still showing up.
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>DSpace in SVN</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/dspace_svn"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2007-01-19</published>
    <summary>My use of SVN to handle updates and patches to DSpace.</summary>
    <content type="html">&lt;p&gt;My DSpace code is in an SVN repository for the library, signified here by
   $SVNHOME.  Our live machine runs off the code in &lt;code&gt;projects/dspace/trunk&lt;/code&gt;.  Any
   modifications to our local DSpace instance are checked into trunk.&lt;br /&gt;

&lt;/p&gt;
&lt;p&gt;The official releases from dspace.org go in
   &lt;code&gt;projects/dspace/branches/official&lt;/code&gt;.  What I mean by this is that the
   &quot;official&quot; branch (as well as trunk) started as an exact copy of the
   dspace-1.4-source released by dspace.org.  Each time a new version is released
   (e.g. 1.4.1, 1.4.2, etc.), I copy that release over whatever's in
   &lt;code&gt;projects/dspace/branches/official&lt;/code&gt; and then remove extra files until the
   following returns nothing:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ diff -r src/dspace-1.4.2-source/ svn/library/projects/dspace/branches/official/ | grep -v .svn$
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then I commit that as the update to the official branch.
&lt;/p&gt;
&lt;p&gt;The log looks like so:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gsf@manheim:~/svn/library/projects/dspace/branches/official$ svn log
------------------------------------------------------------------------
r171 | gsf24 | 2007-07-26 12:53:39 -0400 (Thu, 26 Jul 2007) | 1 line

official update 1.4.2-beta to 1.4.2
------------------------------------------------------------------------
r168 | gsf24 | 2007-05-08 18:28:03 -0400 (Tue, 08 May 2007) | 1 line

official update 1.4.1 to 1.4.2-beta
------------------------------------------------------------------------
r131 | gsf24 | 2007-01-24 17:11:07 -0500 (Wed, 24 Jan 2007) | 1 line

moved dspace/branches/dspace-official to dspace/branches/official
------------------------------------------------------------------------
r94 | gsf24 | 2007-01-19 14:52:27 -0500 (Fri, 19 Jan 2007) | 1 line

dspace-official update from 1.4 to 1.4.1
------------------------------------------------------------------------
r92 | gsf24 | 2007-01-19 12:27:02 -0500 (Fri, 19 Jan 2007) | 1 line

import dspace-1.4-source into branches/dspace-official
------------------------------------------------------------------------
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;To upgrade the trunk, which includes local changes, from 1.4.1 to 1.4.2-beta,
   for example, I would then execute the following from within a working copy of
   the trunk:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ svn merge -r 167:168 $SVNHOME/projects/dspace/branches/official
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;svn st&lt;/code&gt; should then list a large number of modified files, and possibly a few
   conflicting ones.  I go in and resolve the conflicts, commit that to trunk,
   and, ta-da, my local instance has been upgraded.
&lt;/p&gt;
&lt;p&gt;As an aside, this technique obviates the need for JSPs in jsp/local/.  Local
   JSPs would just need to be modified upon upgrade to take advantage of UI
   advances anyway, so I prefer to edit the general JSPs and resolve conflicts.
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>Debian -- Missing Public Keys</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/misskey"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2006-11-21</published>
    <summary>A couple of notes on grabbing keys when Debian's debian-archive-keyring is missing them.</summary>
    <content type="html">&lt;p&gt;Recent &lt;code&gt;aptitude update&lt;/code&gt; replied with 
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;...
W: There are no public key available for the following key IDs:
A70DAF536070D3A1
W: You may want to run apt-get update to correct these problems
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Checking the recent archives for the debian-user mailing list, I found &lt;a href=&quot;http://lists.debian.org/debian-user/2006/11/msg02313.html&quot;&gt;this
thread&lt;/a&gt;, with the easiest answer being
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# gpg --recv-key A70DAF536070D3A1
# gpg --export A70DAF536070D3A1 | apt-key add -
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I'm guessing that works because the key is in the key server (subkeys.pgp.net
   for me), but it hasn't been added to the debian-archive-keyring package yet.
   &lt;a href=&quot;http://lists.debian.org/debian-user/2006/11/msg02318.html&quot;&gt;This email&lt;/a&gt; led me to that conclusion.
&lt;/p&gt;
&lt;p&gt;Update 2007-07-04: The recv-key line may include the keyserver, like so:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# gpg --keyserver keyring.debian.org --recv-key A70DAF536070D3A1
&lt;/code&gt;&lt;/pre&gt;</content>
  
  </entry>
  <entry>
    <title>Access, Day Two</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/access2006.2"/>
    <updated>2009-10-15T14:29:19-05:00</updated>
    <published>2006-10-13</published>
    <summary>Notes from Day 2 of the Access 2006 conference.</summary>
    <content type="html">&lt;p&gt;Roy: two click solution (attributed to Jeremy Frumkin) -- one click to search,
   one to get.  Easier to find the book &lt;em&gt;Before Taliban&lt;/em&gt; through Google, but only
   available through &quot;snippet view&quot;.  NCSU Catalog Availability Prototype.  Need
   to be ready for people coming from Google.  Need to provide better discovery of
   open content (even Google doesn't do such a bang-up job).  OpenURL resolvers
   are one step -- need to go further.  Why take them to a catalog screen when
   it's available full-text.  Why show them ILL, for crying out loud!  Umlaut and
   GUF.  Google-like experience.  OpenURL resolver.  Aggregators -- more important
   as IRs grow.
&lt;/p&gt;
&lt;p&gt;(Here's an idea: a centralized service that points at freely available
   full-text books.  Users can add sources, of course.  Maybe some added eye candy
   to pull people to the site -- an ajaxy reader or something.  But the real value
   is a web service that libraries, etc. can point at to provide links for
   full-text entries in the catalog.)
&lt;/p&gt;
&lt;p&gt;Anne Christensen -- library chatbots.  http://www.sub.uni-hamburg.de/ Stella.
&lt;/p&gt;
&lt;p&gt;Annette Bailey -- LibX.  Firefox extension that integrates library resources
   into the browser.&lt;br /&gt;

&lt;/p&gt;

&lt;h2&gt;Thunder talks&lt;/h2&gt;
&lt;ul&gt;
 &lt;li&gt;
     Ross Singer -- Umlaut and U.  Link resolvers are a closed door leading to a
       room full of closed doors.  Came from Communicat.&lt;br /&gt;

 &lt;/li&gt;

 &lt;li&gt;
     Mark Jordan -- Drupal Hacks.  http://drupalib.interoperating.info/  Content
       Creation Kit -- create your own fields.
 &lt;/li&gt;

 &lt;li&gt;
     Peter Binkley -- faceted search with Solr.  Bitsets.&lt;br /&gt;

 &lt;/li&gt;

 &lt;li&gt;
     William Oldfield -- http://etheses.uwaterloo.ca/
 &lt;/li&gt;

 &lt;li&gt;
     Dan Chudnov -- lots of talks.  Dialtone.  (todo: zeroconf)&lt;br /&gt;

 &lt;/li&gt;

 &lt;li&gt;
     Grant Gelinas-Brown -- Get over it, Fanboy.  Get into something, roll up your
       sleeves, and do it.
 &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Nora Young, &lt;em&gt;Access to information in an age of social media&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;How do kids use the internet?  MySpace.&lt;br /&gt;

&lt;/p&gt;

&lt;h2&gt;Cynthia Carlton,  &lt;em&gt;eXtensible Catalog&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;Rochester, Mellon Grant.  http://www.extensiblecatalog.info
   http:///www.library.rochester.edu/access
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2006-11-21:&lt;/strong&gt; The only snippet I managed to catch from Day 3 was Cliff
   Lynch saying, &quot;For the University of Michigan, Google is the first backup
   strategy ever implemented.&quot;  Audio of all of the talks, as well as links to
   many of the slides, and results from the hackfest, are up at &lt;a href=&quot;http://www.access2006.uottawa.ca/&quot;&gt;the University of
Ottawa Access 2006 site&lt;/a&gt;.  Also, I've put on line &lt;a href=&quot;/slides/access2006/show.html&quot;&gt;the presentation
I gave at Drexel&lt;/a&gt;.
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>At Access</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/access2006.1"/>
    <updated>2009-10-15T14:29:19-05:00</updated>
    <published>2006-10-12</published>
    <summary>In the morning, day one of Access 2006, in a large room with a lot of tables and chairs.</summary>
    <content type="html">&lt;p&gt;9:15-10:00 -- Art Rhyno and Walter Lewis spoke on Knowledge Ontario, Ty Cobb,
      and Lucene.  A highlight was the added value of user comments in records.
      Overall, nice connections drawn between local history (stories found only in
      archives when disparate records can be collated through metadata)
&lt;/p&gt;
&lt;p&gt;10:30-11:00 -- Tito Sierra spoke about &lt;a href=&quot;http://www.lib.ncsu.edu/endeca/&quot;&gt;using Endeca at NCSU Libraries&lt;/a&gt;  Searching (and finding) is the unofficial theme of the 
      conference.
&lt;/p&gt;
&lt;p&gt;11:00-12:00 -- Lightning Talks.  Zebra used to allow searching the University of
      Victoria Library catalog during a four-day Voyager upgrade.&lt;br /&gt;
&lt;a href=&quot;http://lucene-ws.net/&quot;&gt;Lucene-ws&lt;/a&gt; --
      wanted to do indexing in Perl -- the web service allowed the client to be
      written in whatever, as long as it could do atom (Brian Cassidy).
    &lt;br /&gt;
&lt;a href=&quot;http://search.library.oregonstate.edu/metaSearch/index.php&quot;&gt;LibraryFind&lt;/a&gt; at OSU and caching federated searching -- PHP/MySQL for now,
      soon to be Ruby on Rails -- jaf and Mr. T (Jeremy Frumkin).  Georgia PINES
      and Evergreen
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>Installing Debian on the Thinkpad X31</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/x31install"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2006-10-03</published>
    <summary>Installing Debian (testing) on my Thinkpad x31.</summary>
    <content type="html">&lt;p&gt;My X31 is the 2672-RHU model.  I'm using the &lt;a href=&quot;http://www.newegg.com/Product/Product.asp?Item=N82E16827106011&quot;&gt;Lite On external USB DVD
R/RW&lt;/a&gt; I mention on &lt;a href=&quot;x31&quot;&gt;x31&lt;/a&gt;.  This thinkpad boots off this with no
   problems.  The install disk I'm using is Debian Netinst 3.1r1a.&lt;br /&gt;

&lt;/p&gt;

&lt;h2&gt;Basic Installation&lt;/h2&gt;
&lt;p&gt;I hit enter at the prompt, then on the install screens I
&lt;/p&gt;
&lt;ol&gt;
 &lt;li&gt;
     choose English
 &lt;/li&gt;

 &lt;li&gt;
     United States
 &lt;/li&gt;

 &lt;li&gt;
     Dvorak
 &lt;/li&gt;

 &lt;li&gt;
     hostname: magnum
 &lt;/li&gt;

 &lt;li&gt;
     domain: touretteskimo.com (not the real domain, but that doesn't matter)
 &lt;/li&gt;

 &lt;li&gt;
     Erase entire disk: IDE1 master (hda) - 40.0 GB IC25N040ATCS04-0
 &lt;/li&gt;

 &lt;li&gt;
     All files in one partition
 &lt;/li&gt;

 &lt;li&gt;
     Finish partitioning and write changes to disk
 &lt;/li&gt;

 &lt;li&gt;
     &lt;code&gt;&amp;lt;Yes&amp;gt;&lt;/code&gt;
 &lt;/li&gt;

 &lt;li&gt;
     Now I wait for it to install the base system.  While we wait, I'll mention
        that I was kinda thinking about dual-booting Debian and FreeBSD, but really
        I'm so deep into Debian at this point and I just don't want to bother
        learning another distribution/operating system when it seems there are better
        things I could be doing with my time.  (What they are, I'm still figuring
        out.)  Also, if I really want to try something else, that's the perfect time
        to check out this virtualization thing everyone's been talking about.
 &lt;/li&gt;

 &lt;li&gt;
     &lt;code&gt;&amp;lt;Yes&amp;gt;&lt;/code&gt; to install the GRUB boot loader in the master boot record.
 &lt;/li&gt;

 &lt;li&gt;
     Let the cd eject, hit &lt;code&gt;&amp;lt;Continue&amp;gt;&lt;/code&gt;
 &lt;/li&gt;

 &lt;li&gt;
     Watch it reboot.
 &lt;/li&gt;

 &lt;li&gt;
     At the &quot;Welcome to your new Debian system! blah blah blah&quot; page hit &lt;code&gt;&amp;lt;Ok&amp;gt;&lt;/code&gt;
 &lt;/li&gt;

 &lt;li&gt;
     Yes to hardware clock set to GMT (even if it's not now, I'll do it later).
 &lt;/li&gt;

 &lt;li&gt;
     time zone: Eastern
 &lt;/li&gt;

 &lt;li&gt;
     set Root password: &lt;code&gt;******&lt;/code&gt;
 &lt;/li&gt;

 &lt;li&gt;
     full name for the new user: Gabriel Farrell
 &lt;/li&gt;

 &lt;li&gt;
     username: gsf
 &lt;/li&gt;

 &lt;li&gt;
     password: &lt;code&gt;******&lt;/code&gt;
 &lt;/li&gt;

 &lt;li&gt;
     Archive access method for apt: http (ethernet card already plugged in)
 &lt;/li&gt;

 &lt;li&gt;
     United States
 &lt;/li&gt;

 &lt;li&gt;
     ftp.debian.org
 &lt;/li&gt;

 &lt;li&gt;
     no proxy
 &lt;/li&gt;

 &lt;li&gt;
     wait for it to connect and download package lists, and install mdetect (it
        seems to be pausing to resolve the name -- maybe because of ipv6?  okay, now
        it's stuck, waiting to download mdetect -- I try ^C, but it's a stubborn
        bastard.  It gives up on mdetect and tries for read-edid.  Now this is
        getting interesting.  Can't connect to ftp.debian.org, even though it did a
        minute ago to download the package lists.  I jump over to another virtual
        terminal with LeftAlt+RightArrow and ping ftp.debian.org and I get immediate
        pongs from debian-mirror.mirror.umn.edu.  Maybe the mirror I got for mdetect
        and read-edid was busted.  Doesn't matter, I'll be updating everything
        anyway.)
 &lt;/li&gt;

 &lt;li&gt;
     leave nothing checked in Debian software selection -- I'll do that later
 &lt;/li&gt;

 &lt;li&gt;
     wait while more core system stuff, like libc6, is downloaded and installed
 &lt;/li&gt;

 &lt;li&gt;
     I get a prompt for Configuring Exim v4 (exim4-config) and select local
        delivery only
 &lt;/li&gt;

 &lt;li&gt;
     root and postmaster mail recipient: gsf
 &lt;/li&gt;

 &lt;li&gt;
     at &lt;code&gt;Thank you for choosing Debian!&lt;/code&gt; hit &lt;code&gt;&amp;lt;Ok&amp;gt;&lt;/code&gt;
 &lt;/li&gt;

 &lt;li&gt;
     plopped down onto the terminal login, I log in and su to root (now comes the
        fun stuff)
 &lt;/li&gt;

 &lt;li&gt;
     first thing to do is &lt;code&gt;vi /etc/apt/sources.list&lt;/code&gt; and add matching &lt;code&gt;testing&lt;/code&gt;
   lines for each line in the file, except the &lt;code&gt;#deb file:///cdrom/ sarge main&lt;/code&gt;,
   which can be deleted.  It's important to leave the sources pointing at
 &lt;br /&gt;
&lt;code&gt;stable&lt;/code&gt; because a few packages still reside only in stable, and upgrades are
   messier if you don't have that package list at your disposal.  I could save
   myself some of these steps if I had a &lt;a href=&quot;http://www.debian.org/devel/debian-installer/&quot;&gt;netinst cd for the testing
   distribution of Debian&lt;/a&gt;.  I thought I had one lying around.  Oh
   well.
 &lt;/li&gt;

 &lt;li&gt;
     &lt;code&gt;# aptitude&lt;/code&gt;, then &lt;code&gt;u&lt;/code&gt;, &lt;code&gt;U&lt;/code&gt;, and &lt;code&gt;g&lt;/code&gt;.  I check out everything to be upgraded,
   select a couple in the recommended area -- most importantly
 &lt;br /&gt;
&lt;code&gt;debian-archive-keyring&lt;/code&gt;, which will keep aptitude from thinking it's
   downloading unspecial packages.  Hit &lt;code&gt;g&lt;/code&gt;.
 &lt;/li&gt;

 &lt;li&gt;
     Default answers to everything 
 &lt;/li&gt;

 &lt;li&gt;
     got errors about my locale not being set or something, and a bunch of
        packages didn't install (this is exciting!).  Tried to do &lt;code&gt;dpkg-reconfigure
   base-config&lt;/code&gt; but I was told it is broken, so I ran &lt;code&gt;aptitude dist-upgrade&lt;/code&gt;,
   and had to say yes to downloading &quot;unsafe&quot; packages (since I haven't done an
   aptitude update with the new, safety-checking aptitude I just installed).
   Looks like everything installed okay this time.  Along the way I was told to
   purge hotplug, so when it finished I did &lt;code&gt;aptitude purge hotplug&lt;/code&gt;.
 &lt;/li&gt;

 &lt;li&gt;
     Ran &lt;code&gt;aptitude update&lt;/code&gt; again, and all looked good.  That's the end of the
   basic installation.  I'll work on getting everything else and configuring
   stuff like X and alsa and bluetooth and etc. tomorrow.
 &lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Making it Fancy&lt;/h2&gt;
&lt;p&gt;Now it's time to amp up the system and get a bunch of toys.  Oh wait, but first,
   a couple more little things.&lt;br /&gt;

&lt;/p&gt;
&lt;ol&gt;
 &lt;li&gt;
     Add &lt;code&gt;blacklist ipv6&lt;/code&gt; to the bottom of &lt;code&gt;/etc/modprobe.d/blacklist&lt;/code&gt; to make the
   internet fast.
 &lt;/li&gt;

 &lt;li&gt;
     In &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt; change &lt;code&gt;PermitRootLogin&lt;/code&gt; to no.  This shouldn't
   ever really be a problem, but better safe.
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Okay, on to the fun stuff.  Going into aptitude again, I hit &lt;code&gt;u&lt;/code&gt; and select the
   following packages for install (in the order I think of them):
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     vim (can't really live without this one)
 &lt;/li&gt;

 &lt;li&gt;
     linux-image-2.6-xen-686 (need to update that kernel, and I'm thinking about
       virtualization)
 &lt;/li&gt;

 &lt;li&gt;
     gpm (handy for selecting text on the console)
 &lt;/li&gt;

 &lt;li&gt;
     screen (can't much live without this, either)
 &lt;/li&gt;

 &lt;li&gt;
     xorg (for gui stuff)
 &lt;/li&gt;

 &lt;li&gt;
     xfce4 (ditto)
 &lt;/li&gt;

 &lt;li&gt;
     lynx (I'm just more used to it than w3m)
 &lt;/li&gt;

 &lt;li&gt;
     firefox (unfortunately, can't really live without that.  No dissing firefox,
       it's amazing, it's design is good in a lot of ways (extensions++), but it's
       just such a monster.  What with the web becoming &lt;em&gt;Your Networked Operating
  System&lt;/em&gt; these days, I feel the need for options.  I guess it's just not indie
  enough for me.)
 &lt;/li&gt;

 &lt;li&gt;
     backup2l (been using this to back up to the external and it works great)
 &lt;/li&gt;

 &lt;li&gt;
     cplay (the best music app I've found)
 &lt;/li&gt;

 &lt;li&gt;
     tpb (for the fancy osd)
 &lt;/li&gt;

 &lt;li&gt;
     wireless-tools (no-string-attached goodness)
 &lt;/li&gt;

 &lt;li&gt;
     bluez-tools (ditto)
 &lt;/li&gt;

 &lt;li&gt;
     xfonts-terminus (better fonts for x terminals)
 &lt;/li&gt;

 &lt;li&gt;
     xli (for pictures)
 &lt;/li&gt;

 &lt;li&gt;
     firefox-webdeveloper (that's a good one)
 &lt;/li&gt;

 &lt;li&gt;
     firefox-dom-inspector (another good one)
 &lt;/li&gt;

 &lt;li&gt;
     firefox-sage (what the hell, we'll try that too)
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Okay, I'm sure I've forgotten a bunch, but that's plenty enough for now.  Hit
   &lt;code&gt;g&lt;/code&gt; and select a couple more from the suggested area.
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     a2ps (make sure I can print things)
 &lt;/li&gt;

 &lt;li&gt;
     menu (keep menus in sync in xfce)
 &lt;/li&gt;

 &lt;li&gt;
     python-id3 (for cplay to see id3)
 &lt;/li&gt;

 &lt;li&gt;
     sox (also for cplay, for wav files)
 &lt;/li&gt;

 &lt;li&gt;
     mpg321 (cplay, mp3)
 &lt;/li&gt;

 &lt;li&gt;
     sudo (need this for the gui shutdown in xfce)
 &lt;/li&gt;

 &lt;li&gt;
     vim-doc (I utilize the vim docs often)
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Okay, hit &lt;code&gt;g&lt;/code&gt; again and watch it go.  Went with all the defaults when prompted.
   (Prompted for X stuff twice -- maybe because of xorg and x11-common?)  (No, make
   that thrice.  Huh.)
&lt;/p&gt;
&lt;p&gt;tpb told me to put users in the nvram group, so after I quit aptitude I
   &lt;code&gt;addgroup gsf nvram&lt;/code&gt;.  Now lets reboot to see what this new kernel image does
   for us.&lt;br /&gt;

&lt;/p&gt;
&lt;p&gt;Oh wait, it's not here, in the boot menu -- just the old 2.4.27 one.  What did I
   miss?  Go back into aptitude and check out linux-image-2.6-xen-686.  It's
   installed, and so is linux-image-2.6.17-2-xen-686.  Quit aptitude and &lt;code&gt;lynx
/usr/share/doc/&lt;/code&gt; and look at the linux-image directories.  Nothing there.  Hmm.
   &lt;code&gt;/boot&lt;/code&gt; contains the 2.6.17 files, but &lt;code&gt;/boot/grub/menu.lst&lt;/code&gt; wasn't updated.
&lt;/p&gt;
&lt;p&gt;Looking around the web I see &lt;a href=&quot;http://kitenet.net/~joey/blog/entry/debian_xen.html&quot;&gt;Joey Hess talking about the need for a
Debian-specific guide for Xen&lt;/a&gt; and &lt;a href=&quot;http://julien.danjou.info/xen.html&quot;&gt;Julien Danjou talking about installing
xen&lt;/a&gt;.  My conclusion: wait on Xen and devote some days and separate
   posts to it later.  So I installed good old 
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     linux-image-2.6-686&lt;br /&gt;

 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Looks like it updated &lt;code&gt;/boot/grub/menu.lst&lt;/code&gt;.  Quit aptitude and reboot again.
&lt;/p&gt;
&lt;p&gt;And we're up.  Looks good.  Oh, for wireless we also need 
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     ieee80211-modules-2.6-686
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;and I also want
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     ntp (for keeping the clock right)
 &lt;/li&gt;

 &lt;li&gt;
     comixcursors (the cursor theme I can't live without -- see my page on
     &lt;br /&gt;
&lt;a href=&quot;mousecursor&quot;&gt;changing the mouse cursor&lt;/a&gt;)
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Those installed without a hitch.  I've noticed I keep hitting the Thinkpad back
   and forward buttons (by the arrow keys) to switch consoles, but they're not set
   up.  I take a look at the &lt;a href=&quot;http://thinkwiki.org/wiki/How_to_get_special_keys_to_work&quot;&gt;thinkwiki help for setting the special
keys&lt;/a&gt; to refresh my memory and add the following lines to
   &lt;code&gt;/etc/console/boottime.kmap.gz&lt;/code&gt;:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;keycode 158 = Decr_Console
keycode 159 = Incr_Console
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Executing &lt;code&gt;loadkeys /etc/console/boottime.kmap.gz&lt;/code&gt; shows it works.
&lt;/p&gt;
&lt;p&gt;While I'm at it, I'll &lt;code&gt;vim ~/.Xmodmap&lt;/code&gt; as gsf and add 
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;! Access IBM button
keycode 159 = XF86LaunchA
! Back button
keycode 234 = F19
! Forward button
keycode 233 = F20
! Fn button
keycode 227 = F35
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Okay, let's try starting up X with &lt;code&gt;startx&lt;/code&gt; (as gsf).  Not a hitch!  The display
   is good, we got the mouse cursor, the flashing xfce rodent, all right.  First
   thing I do is some basic configuration.  Move the clock to the upper right
   corner.  Get rid of a couple separators and frames.  For some silly reason the
   xterm icon is a speaker, so I'll change that.  There's a bunch of other little
   configuration things that I do to xfce, but not worth mentioning.  Easy enough
   to make it your own, however you want.  Yay xfce.  I will say I prefer the Prune
   style window manager and a blueish desktop.  And for stuff like .Xmodmap and tpb
   to work you have to open a terminal and run
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gsf@magnum:~$ xmodmap ~/.Xmodmap
gsf@magnum:~$ tpb -d
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Oh, except &lt;code&gt;tpb -d&lt;/code&gt; spits back
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Unable to open device /dev/.static/dev/nvram: Permission denied
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This happens because tpb was installed before we had moved to the new kernel and
   udev, so I do a &lt;code&gt;aptitude reinstall tpb&lt;/code&gt; as root and rerun &lt;code&gt;tpb -d&lt;/code&gt; as gsf and
   we're good to go.   Also, open up Window Manager in the Settings Manager, hit
   the Keyboard tab, and change Next Workspace to the Forward button (should show
   up as F20 because of &lt;code&gt;~/.Xmodmap&lt;/code&gt;) and Previous Workspace to the Back button
   (F19).  Um, also in Window Manager in the Advanced tab uncheck &quot;Snap windows to
   screen border&quot;, &quot;Display content of windows when resizing&quot;, and &quot;Display content
   of windows when moving&quot;.  The last two options are a big part of why I like
   xfce.  It's so easy to enable wireframes for moving and resizing.&lt;br /&gt;

&lt;/p&gt;

&lt;h2&gt;Day 3&lt;/h2&gt;
&lt;p&gt;Okay, so we've got xfce up and running and I can do most things that I like to
   do on my computer.  I did an &lt;code&gt;aptitude install subversion&lt;/code&gt; so I could check my
   articles out; now I'm editing this on the X31.  Once I get &lt;a href=&quot;http://www.plasticboy.com/markdown-vim-mode/&quot;&gt;markdown syntax
highlighting for vim&lt;/a&gt; and &lt;a href=&quot;txt/vimrc&quot;&gt;my vimrc&lt;/a&gt; I get an even fuller
   editing experience.  (More on that at the &lt;a href=&quot;about&quot;&gt;about page&lt;/a&gt;).&lt;br /&gt;

&lt;/p&gt;
&lt;p&gt;Okay, let's focus on getting it to &lt;em&gt;hibernate&lt;/em&gt;.  First thing I do is consult
   &lt;a href=&quot;http://thinkwiki.org&quot;&gt;http://thinkwiki.org&lt;/a&gt;.  Reading a page there called &lt;a href=&quot;http://www.thinkwiki.org/wiki/How_to_make_ACPI_work&quot;&gt;How to make ACPI
work&lt;/a&gt; I decide to check out /boot/config-2.6.17-2-686 to see how the
   kernel's configured, and it looks like we've got ACPI support.  I install acpid
   as they recommend, and get the following complaint:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Starting Advanced Configuration and Power Interface daemon: acpid: 
can't open /proc/acpi/event: Device or resource busy
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I googled on that and found a thread on &lt;a href=&quot;http://www.gatago.com/linux/debian/laptop/9959955.html&quot;&gt;Powersaved complains acpid is not installed&lt;/a&gt; that suggested the use of &lt;code&gt;lsof /proc/acpi/event&lt;/code&gt;.  First time I've
   heard of &lt;code&gt;lsof&lt;/code&gt;.  Handy one, that.  It told me
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;magnum:/home/gsf# lsof /proc/acpi/event
COMMAND    PID      USER   FD   TYPE DEVICE SIZE       NODE NAME
hald-addo 3906 haldaemon    4r   REG    0,3    0 4026532116 /proc/acpi/event
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;So it's a conflict with hald.  But the &lt;em&gt;very next&lt;/em&gt; google hit was &lt;a href=&quot;http://www.mail-archive.com/debian-bugs-rc@lists.debian.org/msg70643.html&quot;&gt;Bug#380520:
marked as done (acpid and hald conflict)&lt;/a&gt;, which says it's fixed in 
   the version of hal I've got.  Hmm.  Try a reboot.
&lt;/p&gt;

&lt;h2&gt;Day 4&lt;/h2&gt;
&lt;p&gt;Okay, so day 3 was not so productive.  We'll try to get more done today.  On 
   the reboot, acpid started up before hald, and no one complained, and now
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;magnum:/home/gsf# lsof /proc/acpi/event
COMMAND  PID USER   FD   TYPE DEVICE SIZE       NODE NAME
acpid   3947 root    3r   REG    0,3    0 4026532116 /proc/acpi/event
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;but still nothing happens when I hit the &quot;little blue moon&quot; suspend button.
   Well, not nothing.  If run &lt;code&gt;acpi_listen&lt;/code&gt;, then hit the blue moon, I get
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gsf@magnum:~$ acpi_listen
button/sleep SLPB 00000080 00000009
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;So it hears the button, and knows what it is, but does nothing.  Ah, well,
   there's the following line in &lt;code&gt;/boot/config-2.6.17-2-686&lt;/code&gt;:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CONFIG_ACPI_IBM=m
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;So let's &lt;code&gt;modprobe ibm_acpi&lt;/code&gt;.  Hmm, no change.  I'll stick it in /etc/modules
   anyway, just to be on the safe side.  I found the &lt;a href=&quot;http://www.thinkwiki.org/wiki/Installing_Debian_Sid_on_a_ThinkPad_T42#ACPI_sleep&quot;&gt;acpi sleep command&lt;/a&gt;, &lt;code&gt;echo mem &amp;gt; sys/power/state&lt;/code&gt;.  It goes to sleep (little green moon
   lights up and all), so I know that's working.  (I also did the radeonfb stuff
   that page suggests).  I'm thinking I can put another script in &lt;code&gt;/etc/acpi&lt;/code&gt;, but
   then I see the &quot;if pidof powersaved&quot; section at the top of
   &lt;code&gt;/etc/acpi/powerbtn.sh&lt;/code&gt;, so I decide to install powersaved and see how that
   works.  I would install tpctl, but it depends on thinkpad-source, and I don't
   want to build my own kernel here, having followed that path in the past and felt
   I was missing out on the easy upgrading involved in sticking with the stock
   Debian.  After it's installed, I try a reboot.
&lt;/p&gt;
&lt;p&gt;Still no luck, but I notice I get complaints on tty1 about trying to suspend to
   disk and needing to set up a resume partition.  I'm gonna fly by the seat of my
   pants and suspend to ram, so I edit &lt;code&gt;/etc/powersave/events&lt;/code&gt; so that
   &lt;code&gt;EVENT_BUTTON_SLEEP=&quot;suspend_to_ram&quot;&lt;/code&gt;.  Now hitting the blue moon suspends to
   ram.  Only problem is the screen stays lit, but I'll work on that &lt;a href=&quot;#screenblank&quot;&gt;another
day&lt;/a&gt;.
&lt;/p&gt;

&lt;h2&gt;Day 11&lt;/h2&gt;
&lt;p&gt;Okay, not really, but feels like it.  Trying to get wireless to work, I
   &lt;code&gt;modprobe ipw2100&lt;/code&gt; and get:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;FATAL: Error inserting ipw2100 (/lib/modules/2.6.17-2-686/kernel/drivers/net/
wireless/ipw2100.ko): Unknown symbol in module, or unknown parameter (see dmesg)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;dmesg&lt;/code&gt; tells me 
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ipw2100: disagrees about version of symbol ieee80211_wx_get_encodeext
ipw2100: Unknown symbol ieee80211_wx_get_encodeext
ipw2100: disagrees about version of symbol ieee80211_wx_set_encode
ipw2100: Unknown symbol ieee80211_wx_set_encode
ipw2100: disagrees about version of symbol ieee80211_wx_get_encode
ipw2100: Unknown symbol ieee80211_wx_get_encode
ipw2100: disagrees about version of symbol ieee80211_txb_free
ipw2100: Unknown symbol ieee80211_txb_free
ipw2100: disagrees about version of symbol ieee80211_wx_set_encodeext
ipw2100: Unknown symbol ieee80211_wx_set_encodeext
ipw2100: disagrees about version of symbol ieee80211_wx_get_scan
ipw2100: Unknown symbol ieee80211_wx_get_scan
ipw2100: disagrees about version of symbol ieee80211_set_geo
ipw2100: Unknown symbol ieee80211_set_geo
ipw2100: disagrees about version of symbol ieee80211_rx
ipw2100: Unknown symbol ieee80211_rx
ipw2100: disagrees about version of symbol ieee80211_rx_mgt
ipw2100: Unknown symbol ieee80211_rx_mgt
ipw2100: disagrees about version of symbol free_ieee80211
ipw2100: Unknown symbol free_ieee80211
ipw2100: disagrees about version of symbol alloc_ieee80211
ipw2100: Unknown symbol alloc_ieee80211
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I think maybe the xen kernel image I installed earlier might be the cause of
   these version disagreements, so I go into aptitude and purge
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     linux-image-2.6-xen-686
 &lt;/li&gt;

 &lt;li&gt;
     linux-image-2.6.17-2-xen-686
 &lt;/li&gt;

 &lt;li&gt;
     linux-modules-2.6.17-2-xen-686
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Still getting the error, so try a reboot.&lt;br /&gt;

&lt;/p&gt;
&lt;p&gt;Back from reboot, still getting the error.&lt;br /&gt;
&lt;code&gt;aptitude reinstall
ieee80211-modules-2.6.17-2-686&lt;/code&gt;.  Still getting the error.  Check
   &lt;a href=&quot;http://bugs.debian.org/ieee80211-modules-2.6.17-2-686&quot;&gt;http://bugs.debian.org/ieee80211-modules-2.6.17-2-686&lt;/a&gt;, looks like a similar
   problem there with ipw3945.  Hmm, I might have to compile the kernel.
   Let's try &lt;code&gt;aptitude remove ieee80211-modules-2.6.17-2-686&lt;/code&gt; -- same problem.
   Reboot.
&lt;/p&gt;
&lt;p&gt;That fixed it!  I can now &lt;code&gt;modprobe ipw2100&lt;/code&gt;.  So we don't need the
   ieee80211-modules.  But the wireless still isn't functioning.  This &lt;a href=&quot;http://nixdoc.net/files/forum/post-819656-Tue-May-09--2006-3-10-am.html&quot;&gt;post on
ipw2100 in etch&lt;/a&gt; suggests I might need the &lt;a href=&quot;http://ipw2100.sourceforge.net/firmware.php&quot;&gt;firmware&lt;/a&gt;.
   I'm gonna assum the driver in the kernel is after v0.55.  Problem now is, where
   to put it so that it's loaded, used to be you put it in &lt;code&gt;/lib/firmware&lt;/code&gt; and
   hotplug would just see it, but I'm not sure about udev, which has supplanted
   hotplug.  I'll just try untarring it in there, add &lt;code&gt;ipw2100&lt;/code&gt; to &lt;code&gt;/etc/modules&lt;/code&gt;,
   and reboot.
&lt;/p&gt;
&lt;p&gt;An &lt;code&gt;lsmod&lt;/code&gt; shows &lt;code&gt;ipw2100&lt;/code&gt; is installed, but nothing shows up as wireless when I
   &lt;code&gt;iwconfig&lt;/code&gt;.  Not until this long-overdue point am I reminded by &lt;a href=&quot;http://www.student.cs.uwaterloo.ca/~bamoore/projects/debian_on_t41/&quot;&gt;Debian on a
T41&lt;/a&gt; to check &lt;code&gt;lspci&lt;/code&gt;, which tells me
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;02:02.0 Ethernet controller: Atheros Communications, Inc. AR5212 802.11abg NIC (rev 01)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Right!  Now I remember why I couldn't use ipw2100 the last time around -- my X31
   has the Atheros chipset, not Intel.  So I think &lt;a href=&quot;http://madwifi.org/&quot;&gt;MadWifi&lt;/a&gt; is my only choice.
   Before I forget, I remove ipw2100 from &lt;code&gt;/etc/modules&lt;/code&gt; and remove the ipw2100
   firmware from &lt;code&gt;/lib/firmware&lt;/code&gt;.  By comparing &lt;a href=&quot;http://www.fehu.org/index.php/Debian/AtherosCardsWithDebian&quot;&gt;Installing a WLan-Card with
Atheros Chipset under Debian Linux&lt;/a&gt; with the &lt;a href=&quot;http://madwifi.org/wiki/UserDocs/Distro/Debian&quot;&gt;MadWifi Debian
pages&lt;/a&gt; and the &lt;a href=&quot;http://madwifi.org/wiki/UserDocs/FirstTimeHowTo&quot;&gt;MadWifi First Timer's Guide&lt;/a&gt; I decided to
   &lt;code&gt;aptitude install linux-headers-2.6-686&lt;/code&gt;, then, as user gsf, I 
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gsf@magnum:~/svn$ svn checkout http://svn.madwifi.org/trunk madwifi
gsf@magnum:~/svn$ cd madwifi/
gsf@magnum:~/svn/madwifi$ make
[bunch of output, no errors]
gsf@magnum:~/svn/madwifi$ su
Password:
magnum:/home/gsf/svn/madwifi# make install
magnum:/home/gsf/svn/madwifi# modprobe ath_pci
magnum:/home/gsf/svn/madwifi# iwconfig
lo        no wireless extensions.

eth0      no wireless extensions.

eth1      no wireless extensions.

irda0     no wireless extensions.

wifi0     no wireless extensions.

ath0      IEEE 802.11b  ESSID:&quot;&quot;
          Mode:Managed  Channel:0  Access Point: Not-Associated
          Bit Rate:0 kb/s   Tx-Power:0 dBm   Sensitivity=0/3
          Retry:off   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
          Link Quality:0  Signal level:0  Noise level:0
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Success!  I think.  I added the following to &lt;code&gt;/etc/network/interfaces&lt;/code&gt;:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;iface ath0 inet dhcp
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;and &lt;code&gt;ifup ath0&lt;/code&gt; seems to be looking for connections.  There's also this:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;magnum:/home/gsf/svn/madwifi# modprobe wlan_scan_sta
magnum:/home/gsf/svn/madwifi# wlanconfig ath0 list scan
SSID            BSSID              CHAN RATE  S:N   INT CAPS
dragonfly       00:0f:8f:4f:da:70    1   54M 12:0   100 EPSs WME
dragonfly       00:0f:8f:38:7a:70    6   54M 27:0   100 EPSR WME
dragonfly       00:0f:8f:4f:e0:30    6   54M 13:0   100 EPSR WME
dragonfly       02:02:6b:d1:bd:3a    5   11M 23:0   100 I
airportthru     02:fa:5a:c9:fd:a9   10   11M 18:0   100 I
dragonfly       00:0f:8f:4f:db:e0   11   54M  6:0   100 EPSR WME
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;So it's seeing Drexel's networks, and I've got some signal strength (under
   &lt;code&gt;S:N&lt;/code&gt;).  Plus, the little green radio tower is blinking.  I think it's working
   well enough for me.  Yay!  Let's add &lt;code&gt;ath_pci&lt;/code&gt; and &lt;code&gt;wlan_scan_sta&lt;/code&gt; to
   &lt;code&gt;/etc/modules&lt;/code&gt;.
&lt;/p&gt;
&lt;p&gt;A couple of quick superficial things now.  As root, &lt;code&gt;update-alternatives
--config x-cursor-theme&lt;/code&gt; and select white regular theme, because I like that
   better, and xfce doesn't switch it via the gui mouse cursor selection settings
   window.  Next, &lt;code&gt;aptitude install gdm&lt;/code&gt; and at the login screen (reboot or quit X
   and &lt;code&gt;/etc/init.d/gdm start&lt;/code&gt;) set to log in automatically.  Then, following the
   steps outlined in &lt;a href=&quot;http://www.ma.utexas.edu/users/stirling/computergeek/shutdown.html#xfce4.2&quot;&gt;How normal users shut down Linux&lt;/a&gt;, I &lt;code&gt;visudo&lt;/code&gt; and
   add 
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gsf     ALL=(root)  NOPASSWD:/usr/sbin/xfsm-shutdown-helper
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;and the change is immediately visible when I click the &quot;log out&quot; button.
&lt;/p&gt;
&lt;p&gt;&lt;a id=&quot;screenblank&quot;&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;h3&gt;Screen blanking&lt;/h3&gt;
&lt;p&gt;Okay, so I never got around to writing this part, but the answer lies, as
   expected, at &lt;a href=&quot;http://www.thinkwiki.org/wiki/Problem_with_LCD_backlight_remaining_on_during_ACPI_sleep&quot;&gt;thinkwiki.org&lt;/a&gt;.
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>Hype, for searching with Python</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/hype"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2006-07-08</published>
    <summary>A quick account of my impressions of Hype, a Python wrapper API for the Hyper Estraier full-text search system.</summary>
    <content type="html">&lt;p&gt;So in setting up a search engine for my little &lt;a href=&quot;about.html&quot;&gt;artsy project&lt;/a&gt; I ran across &lt;a href=&quot;http://hype.python-hosting.com/&quot;&gt;Hype&lt;/a&gt;, a Python wrapper API for the &lt;a href=&quot;http://hyperestraier.sourceforge.net/&quot;&gt;Hyper Estraier&lt;/a&gt; full-text search
   system.  Actually, I first ran across this &lt;a href=&quot;http://www.oluyede.org/blog/2005/11/16/hype-the-python-indexer/&quot;&gt;blog
   post&lt;/a&gt; that, forgive the pun, hyped it up.  It's a straightforward-enough API.
   The relevant sections of the code I put together for it looked like this:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;...

db = hype.Database(indexPath)
for artFile in self.artCollect():
    print '%s found' % os.path.basename(artFile)
    self.index(artFile, db)
db.optimize()
db.close()

...

def index(artFile, db):
    # grab values and fill the index
    doc = hype.Document()
    doc['@uri'] = unicode(os.path.basename(artFile)[:-4])
    doc['@created'] = binding.article.created
    doc['@modified'] = binding.article.modified
    doc['@title'] = unicode(binding.article.title)
    doc.add_text(unicode(binding.article.title))
    doc['@description'] = unicode(binding.article.description)
    doc.add_text(unicode(binding.article.description))
    doc['@keyword'] = u''
    flag = 0
    for keyword in binding.article.keyword:
        if flag:
            doc['@keyword'] += u' '
        flag = 1
        doc['@keyword'] += unicode(keyword)
        doc.add_text(unicode(keyword))
    for content in binding.xml_xpath(u'/article/content//*'):
        doc.add_text(unicode(content))
    db.put_doc(doc)
    print '%s added to index' % os.path.basename(artFile)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I didn't get around to a search cgi, but it would look something like 
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;db = hype.Document(indexPath)
# some regex madness i'll figure out later would go here
hits = db.search(unicode(query)).add(unicode(attBits)))
for hit in hits:
    out += '&amp;amp;lt;a href=&quot;%s&quot;&amp;amp;gt;%s&amp;amp;lt;/a&amp;amp;gt;' % \
        (hit['@uri'], hit['@title'])
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;So the thing is that with Hype a document has short, non-tokenized attributes,
   assigned to variables with the &quot;@&quot; sign, and everything else is tokenized text
   (see the &lt;a href=&quot;http://svn.hype.python-hosting.com/trunk/doc/usage.txt&quot;&gt;usage doc&lt;/a&gt;).  This obviously mirrors the way most of us search: we
   go for the general and do a full-text for concepts or in recollection of a few
   words from an article or whatnot, or we go for the particular and look for a
   date range or something in the title, or we combine the two approaches.  That
   model works fine most of the time, but it constrains in a way the PyLucene API
   doesn't (really it's the Lucene API, but since I'm using PyLucene I'll use that
   as the reference).  In PyLucene I can choose whether or not to tokenize each
   field; I'm not forced into a number of non-tokenized attributes and one
   catch-all tokenized text field.  Also, there's a clearer way to involve
   different tokenizers and analyzers in PyLucene, but I haven't really messed
   around with that yet so let's just focus on which fields can do what for now.
&lt;/p&gt;
&lt;p&gt;The truth is that even though I'm using PyLucene I'll still create a
   catch-all tokenized text field, and most everything else about these article
   files can be put into non-tokenized attribute-like fields.  The exception is the
   &quot;description&quot; field.  I know it's an edge case, so it shouldn't be of much
   concern, but say someone wants to search for something that only appears in the
   description of an article?  With Hype, that means searching for it as an
   attribute, and that means it's not tokenized, which sucks because the
   description has sentences with punctuation and such that screw with STRINC
   searches (I guess part of the problem is also Hyper Estraier's limited attribute
   searching, but that's also due to the attributes-and-text document model). 
&lt;/p&gt;
&lt;p&gt;Don't get me wrong, I'm not bashing Hyper Estraier or Hype, and the API
   presented could be the perfect fit for a lot of projects, but for me the extra
   bit of control that the PyLucene API presents is something that I can't go
   without.  Now, if only Lucene weren't written in Java, and PyLucene didn't
   require an old, old version of GCJ and the new, new Python 2.4 (well it's not
   quite so new but it's still not the default in Debian) in order to run.  Can't
   we please get a decent, native Python text indexer/searcher?  Maybe I'll
   resurrect Lupy and turn it into the fastest, rockingest one ever.  Guess I
   better start doing some research on how these things really work. 
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>Keep Your Stuff Safe</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/cardboard"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2006-06-17</published>
    <summary>The odd trash we hold onto.</summary>
    <content type="html">&lt;p&gt;How many people in the world store the cardboard boxes and foam packaging from
   the things they buy, like home stereo components and appliances, so they can
   protect the things in their original boxes when they're moved to a new home?
   How much space is taken up by those boxes, worldwide? 
&lt;/p&gt;
&lt;p&gt;First world problem, and I've got plenty in my basement.  Some of them I kept
   for the things I thought I might return.  I give thanks to the great magnetic
   force of consumption that gathers unnecessary things into one's purview.  After
   the rapture, serene giants will make love on our mountains of fluff.&lt;br /&gt;

&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>Printer setup</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/printer"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2006-05-17</published>
    <summary>HP DeskJet 400 attached via parallel port to an IBM Thinkpad X31 running Debian GNU/Linux and CUPS.</summary>
    <content type="html">&lt;p&gt;Steps for setting up my HP DeskJet 400 attached via the parallel port to my IBM Thinkpad X31 running Debian GNU/Linux and CUPS:
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     &lt;code&gt;# aptitude install cupsys foomatic-db-hpijs&lt;/code&gt; (Note: hplip does not appear to
  be necessary, and currently in unstable has circular dependency problems with
  hplip-data.  cupsys-bsd and foomatic-etc. also not necessary.)
 &lt;/li&gt;

 &lt;li&gt;
     Need the following modules: parport, lp.
 &lt;/li&gt;

 &lt;li&gt;
     Open up http://localhost:631/admin in a web browser and put in &quot;root&quot; and
       root password. &lt;ul&gt;
 &lt;li&gt;
     Give whatever name, location, description.
 &lt;/li&gt;

 &lt;li&gt;
     Device: Parallel Port #1.
 &lt;/li&gt;

 &lt;li&gt;
     Make: HP.
 &lt;/li&gt;

 &lt;li&gt;
     Model: HP DeskJet 400 Foomatic/hpijs (recommended) - HPLIP 0.9.10 (en)
 &lt;/li&gt;

 &lt;li&gt;
     At printer page, click on &quot;Configure Printer&quot; button.
 &lt;/li&gt;

 &lt;li&gt;
     Have a black cartridge, so change &quot;Printout Mode&quot; to &quot;Draft Grayscale
       (Black cartridge)&quot;.  (Or use Normal Grayscale, doesn't seem to make a
       difference.)  Color printout mode without a color cartridge results in
       garbled output.
 &lt;/li&gt;
&lt;/ul&gt;

 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That's it.  Don't know if the printer's just old, but if I put more than one
   sheet in the paper tray it eats them all at once.  So, one page at a time.
   Also, I keep putting the scratch paper in the wrong way, so it prints on the
   used side. 
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>Kernel compile</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/kernel"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2006-05-16</published>
    <summary>Notes on the latest kernel compile.</summary>
    <content type="html">&lt;h2&gt;2.6.16&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;`aptitude install linux-source-2.6.16`&lt;/li&gt;
&lt;li&gt;Untarred linux-source.tar.bz2 in /usr/src/&lt;/li&gt;
&lt;li&gt;Copied .config from /usr/src/kernel-source-2.6.11 to /usr/src/linux-source-2.6.16&lt;/li&gt;
&lt;li&gt;Checked out the &lt;a href=&quot;http://kernel.xc.net/&quot;&gt;Linux Kernel Configuration Archive&lt;/a&gt; and consulted the trustworthy &lt;a href=&quot;http://dev.gentoo.org/~brix/papers/X31/X31.html&quot;&gt;GNU/Linux on an IBM ThinkPad X31&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Made some minor tweaks (found I could best tweak by looking at the .config file in one terminal while going through the `make menuconfig` selections in another)
&lt;ul&gt;
&lt;li&gt;Made ext2 support a module, since I'm running ext3 (`CONFIG_EXT2_FS=m`)&lt;/li&gt;
&lt;li&gt;No rom or cram support, since I'm not using initrd (`# CONFIG_ROMFS_FS is
not set` ... `# CONFIG_CRAMFS is not set`)&lt;/li&gt;
&lt;li&gt;Got rid of all usb network adapters except `CONFIG_USB_MON=y`, which were compiled as modules for some unknown reason&lt;/li&gt;
&lt;li&gt;Considered dropping apm for acpi, but decided to wait.  If it ain't broke
don't fix it, right?  I mean, the tradeoffs are about equal, so it's just not
worth it at this point.  Also selected `CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y`.&lt;/li&gt;
&lt;li&gt;Added `CONFIG_PRINTER=m`, which I needed&lt;/li&gt;
&lt;li&gt;Annoyance: `CONFIG_RAMFS=y` shows up in .config, and there's no listing for it in menuconfig.  Does that mean it's necessary for something else I selected, or just forgotten in the Kconfig?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Left madwifi and thinkpad modules' source in /usr/src/&lt;/li&gt;
&lt;li&gt;Ran the following:
&lt;pre&gt;
# make-kpkg clean modules_clean
# make-kpkg --revision=magnum.0.7 kernel_image
# make-kpkg modules_image
# dpkg -i linux-image-2.6.16_magnum.0.7_i386.deb
# dpkg -i madwifi-module-2.6.16_20050124-1-onoe+magnum.0.7_i386.deb
# dpkg -i thinkpad-modules-2.6.16_5.9-2.1+magnum.0.7_i386.deb&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Reboot&lt;/li&gt;
&lt;li&gt;Had to go into modconf and install the `ath_pci` module to get wireless working, same for apm and some others.&lt;/li&gt;
&lt;li&gt;That's it for now!  Here's my &lt;a href=&quot;txt/2.6.16.config.txt&quot;&gt;kernel .config file&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
      
Addendum: Thinkpad modules won't install.  Found &lt;a href=&quot;http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=353190&quot;&gt;this bug&lt;/a&gt;.  Don't really need them, anyway.</content>
  
  </entry>
  <entry>
    <title>Dude, Where's my Briefcase?</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/mta"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2006-05-11</published>
    <summary>Robots and their luggage.</summary>
    <content type="html">&lt;p&gt;I always loved seeing this &lt;a href=&quot;http://www.mta.nyc.ny.us/mta/security/pdf/MNR%20Briefcase%20TrainTalk%20Car%20Card.pdf&quot;&gt;silly waste of taxpayer money&lt;/a&gt; on the train.
   Thankfully, the MTA has put it up on their website for us as well.  I guess
   it's not a total waste if the absurdity of it all brightens up my day a little.
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>Kucinich at AMI</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/kuc"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2006-05-10</published>
    <summary>Notes from watching the video of Kucinich and Kelley at the American Monetary Institute's Monetary Reform Conference.</summary>
    <content type="html">&lt;p&gt;Just watched some video at the &lt;a href=&quot;http://monetary.org&quot;&gt;American Monetary
   Institute (AMI)&lt;/a&gt; from the recent Monetary Reform Conference.  Dennis
   Kucinich gave the keynote.  I agree with most everything he says, and he knows
   his stuff.  Here's a quote:
&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;What else is this war, but a transfer of the wealth of this
   nation upward, to the arms manufacturers, to the Halliburtons.
&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;He refers to Henry George twice in his talk, and to &lt;cite&gt;Progress and
   Poverty&lt;/cite&gt; in particular.  Here's another good quote (at minute 15:30):
&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;In 1901, the person who was the best Mayor of Cleveland, Tom L. Johnson, a
   friend of or, rather, a disciple of Henry George, wrote, &quot;I believe in public
   ownership of all public service facilities: the waterworks, the parks, and
   schools (and on and on), because if you do not own them they will, in time,
   own you.  They will corrupt your institutions, rule your politics, and,
   finally, destroy your liberty.&quot;
&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;He knows some good Latin, like &lt;em&gt;novus ordo seclorum&lt;/em&gt;, &quot;a new order
   follows&quot; (5:30) and, from the &lt;cite&gt;Canterbury Tales&lt;/cite&gt;, &lt;em&gt;radix malorum
est cupiditas&lt;/em&gt;, &quot;money is the root of all evil&quot; (27:33) (I checked the
   accuracy of the latter Latin phrase at &lt;a
href=&quot;http://en.wikipedia.org/wiki/The_Route_of_All_Evil&quot;&gt;The Route of All
   Evil&lt;/a&gt;.  Ah, the internet, how I love thy ways.).  Probably it's his Catholic
   upbringing.
&lt;/p&gt;
&lt;p&gt;This &lt;a href=&quot;http://www.hb.edu/school/primary/resources/Early_Cleveland/johnson.htm&quot;&gt;page on Tom L. Johnson&lt;/a&gt; says he was buried next to Henry George in Brooklyn.  A quick look on &lt;a href=&quot;http://www.findagrave.com/cgi-bin/fg.cgi?page=gr&amp;amp;GRid=3336&quot;&gt;findagrave.com&lt;/a&gt; shows that they're buried at &lt;a href=&quot;http://www.green-wood.com/&quot;&gt;Green-Wood Cemetary&lt;/a&gt;, a scarce 30 minutes from here by bike.  Maybe it'd be a nice thing to do on a Sunday before I leave for Philadelphia.
&lt;/p&gt;
&lt;p&gt;I also watched the video of Dave Kelley's talk.  He was Kucinich's &quot;Issue
   Consultant&quot;, according to the recent issue of &lt;a
href=&quot;http://www.progress.org/cg/grounds.htm&quot;&gt;GroundSwell&lt;/a&gt; I got in the mail
   (that's where I found out about AMI and its conference).  Kelley mentions
   &lt;cite&gt;When Corporations Rule the World&lt;/cite&gt;, by David C. Korten, as a
   must-read, as well as &lt;cite&gt;Wealth and Democracy&lt;/cite&gt;.  Maybe I'll check them
   out.
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>Debian on the Thinkpad X31</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/x31"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2006-04-17</published>
    <summary>The central repository for my trials with Debian on the Thinkpad X31.</summary>
    <content type="html">&lt;p&gt;This page is where I'll either put, or link to, lessons learned in the
   installation and maintenance of Debian GNU/Linux on my Thinkpad X31.  One about
   the &lt;a href=&quot;mousecursor&quot;&gt;mouse cursor&lt;/a&gt; has already been put up, and
   there are many more to come.
&lt;/p&gt;
&lt;p&gt;Every six months or so I feel the need to wipe the slate clean and reinstall
   everything.  The feeling's coming on again, and I promise to use this page to
   keep a better record of things than I have in the past.  All I have to do is
   first burn some photos and a few valuable configuration files to a CD using the
   &lt;a href=&quot;http://www.newegg.com/Product/Product.asp?Item=N82E16827106011&quot;&gt;Lite-On external DVD R/RW drive&lt;/a&gt; I picked up.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2006-05-16:&lt;/strong&gt; Still haven't reinstalled everything, but
   decided to &lt;a href=&quot;kernel&quot;&gt;recompile the kernel&lt;/a&gt;.&lt;br /&gt;

&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2006-05-17:&lt;/strong&gt; And now the &lt;a href=&quot;printer&quot;&gt;printer&lt;/a&gt; is working.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2006-07-03:&lt;/strong&gt; Picked up a Venus DS3 enclosure and hard
   drive from Newegg.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2006-10-03:&lt;/strong&gt; See the &lt;a href=&quot;x31install&quot;&gt;install notes&lt;/a&gt; from the reinstall.
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>About this site</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/about"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2006-04-17</published>
    <summary>Why this site exists, and its internal workings.</summary>
    <content type="html">&lt;p&gt;So I'll continue to update this page as I make changes to the site, but I'll
   say right now that I've designed it for a selfish purpose: I can't remember
   anything.  This especially applies to computer problems I've solved, as the
   answers are usually arrived at after hours of late-night head pounding.  It's a
   record of my thoughts, then, and a few pointers to information I appreciate.
&lt;/p&gt;
&lt;p&gt;Some thoughts on the site, as I'm working on it, probably not terribly
   interesting to anyone else: 
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     Keep html files in the root directory whenever possible to make for short
       URLs.
 &lt;/li&gt;

 &lt;li&gt;
     Leave xml and their respective html files intermixed in the same directories
       -- makes for much easier file management later on (don't need to worry that 
       xml files from this directory create html files for this other directory, but 
       these xml files create html files for yet another directory, etc.).
 &lt;/li&gt;

 &lt;li&gt;
     Depends on the following odd modules for python: &lt;a href=&quot;http://uche.ogbuji.net/tech/4suite/amara/&quot;&gt;amara&lt;/a&gt;, &lt;a href=&quot;http://pylucene.osafoundation.org/&quot;&gt;PyLucene&lt;/a&gt;, and
  (optionally) &lt;span class=&quot;strike&quot;&gt;&lt;a href=&quot;http://www.republika.pl/wmula/proj/aspell-python/index.html&quot;&gt;aspell-python&lt;/a&gt;&lt;/span&gt;&lt;a href=&quot;http://pyenchant.sourceforge.net/&quot;&gt;PyEnchant&lt;/a&gt; (because I didn't
  want to mess with system calls to build the aspell dictionary).
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Update 2007-11-19&lt;/strong&gt;: So this is all horribly out of date.  XML files are in their own directory.  Amara is no longer used.  Neither is PyLucene or PyEnchant.  Ugh.  I'll say more when I do something interesting.
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>About me</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/bio"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2006-04-17</published>
    <summary>Metadata for yours truly.</summary>
    <content type="html">&lt;p&gt;I'm Gabriel Sean Farrell and I live in Philadelphia (previously, Brooklyn).
   This is subject to change, and will be updated accordingly.  Please see my 
   &lt;a href=&quot;/bio_files/gsfcv0.8.pdf&quot;&gt;resume (PDF)&lt;/a&gt;.  You can also get it in &lt;a href=&quot;/bio_files/gsfcv0.8.tex&quot;&gt;LaTeX&lt;/a&gt;, with a 
   corresponding &lt;a href=&quot;/bio_files/gsfcv.sty&quot;&gt;style file&lt;/a&gt;, if you're into that sort of thing. 
&lt;/p&gt;
&lt;p&gt;I've put up a &lt;a href=&quot;shorn&quot;&gt;picture of myself&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;You can reach me at gsf at this domain.
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>Freshly shorn</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/shorn"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2006-03-30</published>
    <summary>Did you see the drummer's hair?</summary>
    <content type="html">&lt;p&gt;I just cut my hair, and I figured now's a good time to put a photo of me on the
   site:
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;img/haircut.jpg&quot;&gt;&lt;img src=&quot;img/haircut_thumb.jpg&quot; alt=&quot;gsf photo&quot;/&gt;&lt;/a&gt;
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>Smock smock smock</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/smock"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2006-03-24</published>
    <summary>One of my favorite Calvin and Hobbes.</summary>
    <content type="html">&lt;p&gt;Don't knock my &lt;a href=&quot;http://www.dontknockmysmock.com&quot;&gt;smock&lt;/a&gt;, or I'll clean your clock.
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>Changing the mouse cursor in X (xfce) with update-alternatives</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/mousecursor"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2006-03-22</published>
    <summary>The way I got the mouse cursor changed to how I want it in what I believe is a non-fragile way that works in xfce.</summary>
    <content type="html">&lt;p&gt;So I've been using &lt;a href=&quot;http://www.xfce.org/&quot;&gt;xfce&lt;/a&gt; for a while
   and I like it, but I wanted a different look for my mouse cursor, so on &lt;a href=&quot;http://www.xfce-look.org/&quot;&gt;xfce-look&lt;/a&gt; I found &lt;a href=&quot;http://www.xfce-look.org/content/show.php?content=32627&quot;&gt;ComixCursors&lt;/a&gt;
   (CC), which I thought looked nice.  Added bonus, they're already packaged and
   available in the regular Debian apt-get.  Only problem is I don't have a nice,
   easy way to change the mouse look like on gnome or kde.  The easiest I had
   found was &lt;a href=&quot;http://robotics.naist.jp/~min-d/pc/xfce.html&quot;&gt;this tip on
   changing the mouse cursor&lt;/a&gt;, but that proved to be not very robust, because
   when I upgraded xfce earlier tonight I was back to the ugly old cursor.  Well,
   after some frustration, I figured out by looking at the README for &lt;a href=&quot;http://packages.debian.org/unstable/x11/crystalcursors&quot;&gt;crystalcursors&lt;/a&gt;
   (cc) that I should be using update-alternatives.  cc is more nicely packaged
   than CC, though.  Whereas CC just plops a bunch of mouse icons in
   /usr/lib/X11/icons/, cc updates the alternatives for you, and provides the
   proper .theme files in /usr/share/crystalcursors/, which look something
   like:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Icon Theme]
Inherits = crystalwhite
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;So in order to make CC work I created
   /etc/X11/cursors/ComixCursors-White-Regular.theme and filled it with
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Icon Theme]
Inherits = ComixCursors-White-Regular
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I could have done this for all of the CC cursors, but I decided that
   white regular is my favorite, so why bother with the rest.  Then I looked at
   the present alternatives for x-cursor-theme by entering 
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# update-alternatives --display x-cursor-theme
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;which spit the following back at me:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;x-cursor-theme - status is auto.
 link currently points to /etc/X11/cursors/core.theme
/etc/X11/cursors/core.theme - priority 30
/etc/X11/cursors/redglass.theme - priority 20
/etc/X11/cursors/whiteglass.theme - priority 20
/etc/X11/cursors/handhelds.theme - priority 20
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I decided to go ahead and give the white CC the same priority as the
   other non-core themes, so I updated update-alternatives with 
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# update-alternatives --install /etc/alternatives/x-cursor-theme \
x-cursor-theme /etc/X11/cursors/ComixCursors-White-Regular.theme 20
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;then I ran 
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# update-alternatives --config x-cursor-theme
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;and chose the number next to
   &lt;code&gt;/etc/X11/cursors/ComixCursors-White-Regular.theme&lt;/code&gt;, and things still didn't
   work, but that was because the index.theme in &lt;code&gt;/usr/lib/X11/icons/default/&lt;/code&gt; had
   disappeared in the midst of my tinkering, so I had to link it back to the
   x-cursor-theme with 
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# ln -s /etc/alternatives/x-cursor-theme \
/usr/lib/X11/icons/default/index.theme
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;and after that, success!  The moral of the story is that
   update-alternatives is a bit confusing at first.  I learned to follow the usage
   message it spits out at you instead of the man page, because they conflict
   slightly.  Once you get the hang of it, however, it's a fun and powerful
   tool.
&lt;/p&gt;
&lt;p&gt;One last note is that, as cool as update-alternatives is, xfce should
   really have an easy, gui way to change the mouse cursor.  Sounds like a good
   project.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2006-04-17:&lt;/strong&gt; This solution isn't robust either, I guess, because a recent upgrade has borked it back to the ugly old core cursors.  I think it has something to do with the last X.Org upgrade.  More to come as I figure it out.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2006-04-20:&lt;/strong&gt; Something about that upgrade, and xserver-xorg, and how it removed xserver-common, messed a bunch of stuff up.  I think it might have something to do with this &lt;a href=&quot;http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=363169&quot;&gt;bug report&lt;/a&gt; on the package.  Anyway, after some freaking out on my part and installing and uninstalling stuff in aptitude, the ComixCursors are back.  Yay.  I think after the next clean-slate reinstall I'm going to go back to testing.  Unstable is too stressful.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2006-06-17:&lt;/strong&gt; On a recent upgrade, the ComixCursors package installed all of the various ComixCursors .theme files in /etc/X11/cursors/.  Sweet.  The package maintainer must've received the brain signals I transmitted. 
&lt;/p&gt;</content>
  
  </entry>
  <entry>
    <title>xhtml done right?</title>
    <link rel="alternate" type="text/html" href="http://rc98.net/xhtml"/>
    <updated>2009-01-12T11:44:47-05:00</updated>
    <published>2006-03-13</published>
    <summary>My working Apache configuration for serving application/xhtml+xml to Firefox and text/html to IE.</summary>
    <content type="html">&lt;p&gt;&lt;strong&gt;Update 20060418: &lt;/strong&gt;Okay, so a lot of the stuff written below is
   no longer true.  See the updates at the bottom of the article.
&lt;/p&gt;
&lt;p&gt;This page, and pages like it on this website, are served up by Apache as
   application/xhtml+xml in Firefox, but as text/html for Internet Explorer
   because IE can't handle the xhtml.  The reasons for doing so are, um, well,
   let's see, this guy has some good &lt;a
href=&quot;http://golem.ph.utexas.edu/~distler/blog/archives/000167.html&quot;&gt;reasons
   for serving xhtml as application/xhtml+xml&lt;/a&gt;.  Others say &lt;a
href=&quot;http://bclary.com/2004/12/24/bclary-process-changes&quot;&gt;application/xhtml+xml
   should die&lt;/a&gt; [well, that link's down already.  I'll send him an email.], or
   just outright &lt;a href=&quot;http://www.spartanicus.utvinternet.ie/no-xhtml.htm&quot;&gt;no
   to xhtml&lt;/a&gt;.  Well, one neat thing you can do is include inline svg:
&lt;/p&gt;
&lt;p&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:sodipodi=&quot;http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd&quot; xmlns:inkscape=&quot;http://www.inkscape.org/namespaces/inkscape&quot; sodipodi:docname=&quot;cecily1.svg&quot; height=&quot;600&quot; width=&quot;750&quot; sodipodi:version=&quot;0.32&quot; inkscape:version=&quot;0.43&quot; id=&quot;svg2&quot; sodipodi:docbase=&quot;/img/&quot;&gt;
   &lt;defs id=&quot;defs4&quot;/&gt;
   &lt;sodipodi:namedview bordercolor=&quot;#666666&quot; inkscape:pageshadow=&quot;2&quot; inkscape:window-y=&quot;0&quot; pagecolor=&quot;#ffffff&quot; inkscape:zoom=&quot;0.98994949&quot; inkscape:window-x=&quot;0&quot; id=&quot;base&quot; borderopacity=&quot;1.0&quot; inkscape:current-layer=&quot;layer1&quot; inkscape:cx=&quot;386.22477&quot; inkscape:cy=&quot;756.62514&quot; inkscape:window-height=&quot;739&quot; inkscape:pageopacity=&quot;0.0&quot; inkscape:window-width=&quot;1016&quot; inkscape:document-units=&quot;px&quot;/&gt;
   &lt;metadata id=&quot;metadata7&quot;&gt;
     &lt;rdf:RDF xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
       &lt;cc:Work xmlns:cc=&quot;http://web.resource.org/cc/&quot; rdf:about=&quot;&quot;&gt;
         &lt;dc:format xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot;&gt;image/svg+xml&lt;/dc:format&gt;
         &lt;dc:type xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; rdf:resource=&quot;http://purl.org/dc/dcmitype/StillImage&quot;/&gt;
       &lt;/cc:Work&gt;
     &lt;/rdf:RDF&gt;
   &lt;/metadata&gt;
   &lt;g inkscape:label=&quot;Layer 1&quot; id=&quot;layer1&quot; inkscape:groupmode=&quot;layer&quot;&gt;
     &lt;path d=&quot;M 155.5635,212.92541 C -63.639606,199.79344 310.37908,96.31738 342.44172,221.00664 C 364.11564,305.29491 153.54319,351.31632 153.54319,351.31632 C 153.54319,351.31632 320.21836,223.02694 155.5635,212.92541 z &quot; style=&quot;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#022686;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1&quot; id=&quot;path1307&quot; sodipodi:nodetypes=&quot;cscc&quot;/&gt;
     &lt;path style=&quot;fill:#000000;fill-opacity:1;stroke:#cb523c;stroke-width:15.27999973;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1&quot; sodipodi:type=&quot;star&quot; sodipodi:sides=&quot;5&quot; sodipodi:r1=&quot;91.439735&quot; sodipodi:r2=&quot;45.719868&quot; sodipodi:arg1=&quot;0.80102189&quot; sodipodi:arg2=&quot;1.4293404&quot; transform=&quot;translate(10.10153,31.31473)&quot; inkscape:randomized=&quot;0&quot; sodipodi:cy=&quot;85.646194&quot; sodipodi:cx=&quot;392.94934&quot; inkscape:rounded=&quot;0&quot; id=&quot;path1309&quot; inkscape:flatsided=&quot;false&quot; d=&quot;M 456.58895,151.30611 L 399.39514,130.9094 L 350.16877,166.46109 L 351.89333,105.76361 L 302.86988,69.932631 L 361.12953,52.816236 L 380.05774,-4.8802212 L 414.33963,45.238744 L 475.06136,45.411356 L 437.98907,93.502975 L 456.58895,151.30611 z &quot;/&gt;
     &lt;path style=&quot;fill:#000000;fill-opacity:1;stroke:#cb523c;stroke-width:15.27999973;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1&quot; sodipodi:type=&quot;star&quot; sodipodi:sides=&quot;5&quot; sodipodi:r1=&quot;69.141975&quot; sodipodi:r2=&quot;34.570988&quot; sodipodi:arg1=&quot;-0.20599134&quot; sodipodi:arg2=&quot;0.42232719&quot; transform=&quot;translate(10.10153,31.31473)&quot; inkscape:randomized=&quot;0&quot; sodipodi:cy=&quot;260.40259&quot; sodipodi:cx=&quot;475.78186&quot; inkscape:rounded=&quot;0&quot; id=&quot;path1311&quot; inkscape:flatsided=&quot;false&quot; d=&quot;M 543.46208,246.26045 L 507.31536,274.57269 L 510.14617,320.40015 L 472.04968,294.77153 L 429.33995,311.62525 L 441.94175,267.47366 L 412.71487,232.06238 L 458.59971,230.40381 L 483.24623,191.66471 L 499.00282,234.79125 L 543.46208,246.26045 z &quot;/&gt;
     &lt;path style=&quot;fill:#000000;fill-opacity:1;stroke:#cb523c;stroke-width:15.27999973;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1&quot; sodipodi:type=&quot;star&quot; sodipodi:sides=&quot;5&quot; sodipodi:r1=&quot;87.563385&quot; sodipodi:r2=&quot;43.781696&quot; sodipodi:arg1=&quot;1.8633581&quot; sodipodi:arg2=&quot;2.4916766&quot; transform=&quot;translate(10.10153,31.31473)&quot; inkscape:randomized=&quot;0&quot; sodipodi:cy=&quot;187.6716&quot; sodipodi:cx=&quot;552.55347&quot; inkscape:rounded=&quot;0&quot; id=&quot;path1313&quot; inkscape:flatsided=&quot;false&quot; d=&quot;M 527.29965,271.51426 L 517.69734,214.16476 L 465.0105,189.5626 L 516.58584,162.70829 L 523.70275,104.99765 L 565.18037,145.75027 L 622.26571,134.68528 L 596.32495,186.7261 L 624.48872,237.59821 L 566.97883,229.00858 L 527.29965,271.51426 z &quot;/&gt;
     &lt;path style=&quot;fill:#000000;fill-opacity:1;stroke:#cb523c;stroke-width:15.27999973;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1&quot; sodipodi:type=&quot;star&quot; sodipodi:sides=&quot;5&quot; sodipodi:r1=&quot;43.82246&quot; sodipodi:r2=&quot;21.91123&quot; sodipodi:arg1=&quot;0.4533387&quot; sodipodi:arg2=&quot;1.0816572&quot; transform=&quot;translate(10.10153,31.31473)&quot; inkscape:randomized=&quot;0&quot; sodipodi:cy=&quot;159.38733&quot; sodipodi:cx=&quot;449.51788&quot; inkscape:rounded=&quot;0&quot; id=&quot;path1315&quot; inkscape:flatsided=&quot;false&quot; d=&quot;M 488.91383,178.58023 L 459.81323,178.7292 L 443.43837,202.78603 L 434.30411,175.15575 L 406.36459,167.01631 L 429.81991,149.79088 L 428.92719,120.70359 L 452.55764,137.68798 L 479.94543,127.85049 L 471.09453,155.57284 L 488.91383,178.58023 z &quot;/&gt;
     &lt;path style=&quot;fill:#000000;fill-opacity:1;stroke:#cb523c;stroke-width:15.27999973;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1&quot; sodipodi:type=&quot;star&quot; sodipodi:sides=&quot;5&quot; sodipodi:r1=&quot;61.519867&quot; sodipodi:r2=&quot;30.759933&quot; sodipodi:arg1=&quot;-0.51507282&quot; sodipodi:arg2=&quot;0.11324571&quot; transform=&quot;translate(10.10153,31.31473)&quot; inkscape:randomized=&quot;0&quot; sodipodi:cy=&quot;255.35182&quot; sodipodi:cx=&quot;400.02042&quot; inkscape:rounded=&quot;0&quot; id=&quot;path1317&quot; inkscape:flatsided=&quot;false&quot; d=&quot;M 453.5585,225.04724 L 430.58332,258.82781 L 445.38596,296.90494 L 406.15901,285.49301 L 374.51978,311.33764 L 373.25137,270.50411 L 338.89461,248.39984 L 377.33764,234.57526 L 387.74323,195.06945 L 412.77074,227.35891 L 453.5585,225.04724 z &quot;/&gt;
     &lt;path style=&quot;fill:#000000;fill-opacity:1;stroke:#cb523c;stroke-width:15.27999973;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1&quot; sodipodi:type=&quot;star&quot; sodipodi:sides=&quot;5&quot; sodipodi:r1=&quot;37.046577&quot; sodipodi:r2=&quot;18.523289&quot; sodipodi:arg1=&quot;0.45145309&quot; sodipodi:arg2=&quot;1.0797716&quot; transform=&quot;translate(10.10153,31.31473)&quot; inkscape:randomized=&quot;0&quot; sodipodi:cy=&quot;148.27565&quot; sodipodi:cx=&quot;327.28943&quot; inkscape:rounded=&quot;0&quot; id=&quot;path1319&quot; inkscape:flatsided=&quot;false&quot; d=&quot;M 360.62446,164.43809 L 336.02371,164.61041 L 322.21913,184.97362 L 314.45319,161.63017 L 290.82078,154.7938 L 310.62191,140.19443 L 309.82086,115.60612 L 329.82458,129.92667 L 352.96191,121.56662 L 345.52375,145.01657 L 360.62446,164.43809 z &quot;/&gt;
     &lt;path style=&quot;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1&quot; d=&quot;M 102.75052,313.01266 C 99.218427,303.52427 88.53067,299.30982 79.746987,295.58878 C 72.077694,293.50501 44.688805,303.93422 68.825321,293.522 C 70.091682,292.97571 67.873121,296.22225 68.061819,297.58845 C 68.876359,303.48583 71.564618,309.21371 73.547469,314.77042 C 81.186809,333.39735 86.305072,357.83793 103.67933,370.37536 C 118.41682,366.74363 95.788859,383.61456 103.20072,370.2245 C 103.78803,368.14846 103.75315,365.98565 103.88138,363.85367 L 116.32439,357.55534 C 116.23436,359.77934 116.25505,362.01456 115.85134,364.21438 C 112.67604,373.35532 101.48911,381.0445 92.010193,377.90779 C 75.609338,363.47127 70.327635,340.42754 62.230982,321.06606 C 50.956798,293.34635 63.845724,286.60232 91.051475,288.0435 C 100.10142,292.32049 111.27859,296.8041 115.44243,306.54581 L 102.75052,313.01266 z &quot; id=&quot;path1321&quot;/&gt;
     &lt;path style=&quot;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1&quot; d=&quot;M 143.1702,374.0319 C 139.27505,376.26903 135.38501,378.51507 131.48474,380.74328 C 124.99194,384.45258 144.55987,373.47831 151.20975,370.05857 C 155.35733,367.92566 165.19307,362.35421 146.19492,372.90317 C 141.6046,375.452 154.52286,366.44097 158.13805,362.63336 C 170.00226,349.49266 172.29447,331.32818 167.85733,314.58937 C 191.42428,299.08037 160.93525,329.86992 154.73903,337.87716 C 149.54534,345.05699 139.50289,354.43116 149.77678,360.94361 C 162.40796,368.96833 174.86754,367.34435 188.40466,363.15222 C 193.41693,361.16468 210.55902,354.079 188.81973,364.40649 C 188.05247,364.77099 190.09598,363.28167 190.67999,362.66484 C 195.37386,357.70722 197.38695,350.74035 200.48178,344.7973 C 209.48969,330.87105 224.31852,319.94048 240.49935,315.884 C 273.01036,307.06886 265.32674,317.97061 241.03462,316.99292 C 233.06592,315.3061 204.72621,327.71744 226.57356,316.6748 C 231.5692,314.14978 217.82917,323.68832 213.78787,327.56132 C 205.50255,338.3619 219.7607,347.42671 227.20799,354.12085 C 241.275,368.50725 258.23052,362.52569 242.11565,369.59236 C 246.34447,358.84941 249.22973,347.6688 253.49364,336.90981 C 271.07445,312.30532 269.13254,334.18927 267.61072,347.32806 C 265.76319,359.25229 261.00638,374.44367 275.53632,378.42837 C 275.14686,379.90925 281.30194,376.45125 279.95925,377.18737 C 276.31937,379.18291 272.84624,381.49374 269.10382,383.28961 C 265.73062,384.90831 273.33303,377.10347 275.15017,373.8329 C 279.74744,365.55855 284.21782,357.27105 288.50296,348.82873 C 300.84277,323.62515 316.24515,298.93573 319.25715,270.45994 C 324.41571,238.21917 294.16977,251.13736 316.24342,239.16321 C 313.88116,271.21782 330.27049,304.24936 340.65292,334.01757 C 357.86066,372.499 360.76315,416.88358 380.4683,454.27528 C 381.65741,452.95169 382.32968,459.7842 383.63351,458.57346 C 386.74484,455.68426 376.07746,462.44927 372.27369,464.33584 C 371.18464,464.87599 373.66414,462.32911 374.191,461.23357 C 377.40378,454.55296 379.65176,447.48797 381.89677,440.44173 C 384.8729,431.54039 386.65465,422.31597 384.76418,413.09069 C 406.97984,395.97746 409.41794,431.16541 426.86248,440.15005 C 423.12052,442.13399 419.46387,444.28798 415.6366,446.10188 C 412.39218,447.63955 418.41216,439.40062 418.93648,435.84875 C 420.41581,425.82727 420.3227,415.61102 420.199,405.50556 C 419.79422,398.28676 419.34861,400.72172 432.71889,395.71345 C 434.22618,395.14884 433.85999,398.72649 434.53617,400.18715 C 437.14187,405.81583 440.26969,411.18819 443.36515,416.5533 C 452.60903,432.57494 462.5035,448.18563 472.50357,463.74315 C 484.94677,492.59533 517.92034,521.29954 520.39288,554.01876 C 521.24731,565.3254 506.2617,567.58576 499.62967,560.30685 C 477.56707,522.36361 457.65624,481.60198 448.05656,438.51292 C 440.80897,402.20439 461.71315,370.0894 480.08207,340.63963 L 491.82988,335.481 C 472.61134,364.1159 452.53036,396.73214 459.07013,432.60962 C 467.57346,475.28805 486.5514,517.61423 510.84341,553.41984 C 517.84552,559.50796 520.07555,555.34771 506.57233,563.96572 C 505.34615,564.74829 508.56622,561.59869 508.68837,560.14921 C 508.98109,556.67557 507.9425,552.29715 506.89962,549.17628 C 497.24401,520.28147 478.45401,495.16193 462.78555,469.42251 C 460.65237,466.17771 420.01643,403.70834 420.69661,403.24333 C 433.05331,394.79563 433.22966,392.0688 432.43484,399.27324 C 432.06996,418.7854 436.39017,439.80781 415.48514,448.27952 C 407.77014,444.10499 402.48492,433.11053 397.2063,426.21843 C 394.39973,422.55398 391.51637,418.7855 388.1466,415.60569 C 387.39019,414.89193 384.71553,414.46808 385.55998,413.86103 C 389.30385,411.16966 393.31234,408.86692 397.18852,406.36987 C 398.86418,416.02584 397.22792,425.55093 393.89434,434.78944 C 391.37051,442.64729 379.77262,480.3034 368.73211,460.92765 C 352.03979,421.94178 347.20891,378.66601 330.7162,339.50884 C 319.96507,308.79796 304.07576,277.50016 303.35026,244.50698 C 324.07229,231.88564 333.19222,241.91785 330.90529,264.68429 C 327.65091,293.36391 312.76402,318.1924 300.11592,343.57876 C 292.51436,358.78996 284.54348,385.70804 264.09266,386.38941 C 249.3756,381.03 253.59913,366.28525 255.51864,353.31497 C 257.36553,337.31398 253.83517,336.20324 268.30765,327.8039 C 269.46088,327.13461 264.71297,331.17715 266.04423,331.10206 C 261.63128,341.83749 258.16769,352.87008 254.79456,363.97061 C 243.35164,382.45352 227.1019,371.21356 215.78471,361.21508 C 207.56207,354.01232 193.37124,344.7286 201.07542,332.82374 C 215.27309,319.3289 231.51991,308.56943 251.84301,309.2125 C 282.35465,310.66212 240.8393,325.82777 229.8557,324.07614 C 221.19769,326.82197 226.61233,321.97814 213.02677,339.25357 C 204.30515,354.65795 197.54813,367.51619 177.65008,371.49881 C 163.7145,375.57492 151.14433,376.3667 138.25304,368.40932 C 126.74107,361.10255 136.31591,351.14599 142.66516,343.05382 C 153.72742,328.95582 164.53122,312.62987 180.08502,307.92331 C 183.00754,325.30881 182.81225,343.67895 170.43664,357.49295 C 144.40364,385.58872 143.7342,370.7433 132.07463,382.90731 L 143.1702,374.0319 z &quot; id=&quot;path1323&quot;/&gt;
     &lt;path style=&quot;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1&quot; d=&quot;M 275.04653,282.54381 C 277.39662,287.79858 280.72779,292.79008 283.97206,297.59925 C 291.64733,309.51356 291.69332,308.13289 276.07291,315.67909 L 287.64478,307.69213 C 273.59887,316.63831 279.29183,316.15593 272.05243,304.56186 C 268.69125,299.46395 265.16021,294.44063 262.35463,289.01066 L 275.04653,282.54381 z &quot; id=&quot;path1325&quot;/&gt;
   &lt;/g&gt;
   &lt;/svg&gt;
&lt;/p&gt;
&lt;p&gt;Look at the source and you'll see the xml.  With a graphic that large,
   though, it makes for a big old clunky xhtml page.  Also, the w3c validator
   doesn't like it (check by clicking the XHTML link at the bottom of the page).
   Better to put it in an object tag, like as follows: 
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  &amp;lt;object data=&quot;/img/cecily1.svg&quot; type=&quot;image/svg+xml&quot; width=&quot;750&quot; height=&quot;600&quot;&amp;gt;&amp;lt;/object&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;IE doesn't seem to like svg in any shape, even when pulled in with an
   object tag, so I'm not sure if that's a good idea either.  But I digress.  For
   better or worse (and with an eye toward the ever-glimmering future), I decided
   to serve it up with Apache's content negotiation.  Oh, and one more reason to
   serve application/xhtml+xml is that Firefox tells me if I've missed a closing
   tag.
&lt;/p&gt;
&lt;p&gt;A quick google search on some of this page's keywords should bring up
   most of the pages I looked at.  I got the most help from &lt;a href=&quot;http://www.w3.org/2003/01/xhtml-mimetype/content-negotiation&quot;&gt;the
   official w3c page on serving via content negotiation&lt;/a&gt;, but it took a little
   experimentation.  First, as per the w3c advice, all of my files end in .xhtml,
   and each has a symbolic link from a .html file of the same name.  In the apache
   available-sites file, in the directory section, I needed the MultiViews and
   FollowSymLinks options.  That works as long as you point at &lt;a href=&quot;http://un.ctuo.us/xhtml&quot;&gt;http://un.ctuo.us/xhtml&lt;/a&gt; (without the .html,
   and you let Apache decide which way to send it), or at &lt;a href=&quot;http://un.ctuo.us/index&quot;&gt;http://un.ctuo.us/index&lt;/a&gt;, but if it's just &lt;a href=&quot;http://un.ctuo.us/&quot;&gt;http://un.ctuo.us/&lt;/a&gt; then Firefox defaults (in
   error, in my opinion, but I'm not sure if it's Firefox's fault) to the .html,
   so I had to add &quot;DirectoryIndex index&quot; to the Apache config.  That works!  So
   my Directory section looks like this: 
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;Directory /var/www/un.ctuo.us/&amp;gt;
    Options Indexes FollowSymLinks MultiViews
    DirectoryIndex index
    AllowOverride None
    Order allow,deny
    allow from all
&amp;lt;/Directory&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;span class=&quot;update&quot;&gt;Update 20060403: &lt;/span&gt;As per these &lt;a href=&quot;http://httpd.apache.org/docs/2.0/misc/perf-tuning.html&quot;&gt;Apache
   performance tuning tips&lt;/a&gt;, I've changed 
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  DirectoryIndex index
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;to 
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  DirectoryIndex index.xhtml index.html
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I also played with the creation of type-map files, as it suggests, but those extra files further cluttered up my directories that are already full of redundant files (more about that later in &lt;a href=&quot;/about.html&quot;&gt;about this site&lt;/a&gt;) and as far as I can tell I'd have to end the URLs on my site in &quot;.var&quot; for that to work (ugly!), so it's out.  While I might take a performance hit for using MultiViews, it's a simpler, more elegant solution.
&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;update&quot;&gt;Update 20060411: &lt;/span&gt;Oops, just noticed that
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  DirectoryIndex index.xhtml index.html
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;doesn't take advantage of content negotiation.  Internet Explorer
   isn't served the .html page automatically when visiting &lt;a href=&quot;http://un.ctuo.us/&quot;&gt;http://un.ctuo.us/&lt;/a&gt;, so it's back to 
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  DirectoryIndex index
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;No performance tuning for my Apache, then.  Oh well, I tried.
&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;update&quot;&gt;Update 20060418: &lt;/span&gt;I've just realized that Google doesn't recognize the file format of my site, as you can see by the &lt;a href=&quot;http://www.google.com/search?hl=en&amp;amp;lr=&amp;amp;q=un.ctuo.us&amp;amp;btnG=Search&quot;&gt;un.ctuo.us search results&lt;/a&gt;.  Looks like Google &lt;a href=&quot;http://groups.google.com/group/google.public.support.general/browse_thread/thread/4d74cd3aa4798e95/5e10e9a72f89e49a?q=application%2Fxhtml%2Bxml&amp;amp;rnum=1&amp;amp;fwc=1&quot;&gt;doesn't recognize&lt;/a&gt; sites sent as application/xhtml+xml, and apparently it's not smart enough to content negotiate with Apache.  I'll have to think about this one and get back to you.
&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;update&quot;&gt;Update 20060418: &lt;/span&gt;Okay, so after the trouble with Google I flirted with the idea (after looking at &lt;a href=&quot;http://g-rave.nl/blog/4&quot;&gt;Tampering around with XSLT&lt;/a&gt;) of sending pages as XML with links to the XSLT stylesheets I'm using, but then I realized I'd have a lot of the same problems.  I did some research and found the very informative &lt;a href=&quot;http://www.456bereastreet.com/archive/200501/the_perils_of_using_xhtml_properly/&quot;&gt;Perils of using XHTML properly&lt;/a&gt;, and I'm convinced to just serve everything up as HTML 4 Strict.  The back end will still be XML, as will be described in the page &lt;a href=&quot;/about.html&quot;&gt;about this site&lt;/a&gt;, but all the browsers will see is straight HTML.  No MultiViews, no content negotiation, just HTML.
&lt;/p&gt;
&lt;p&gt;Another lesson I just learned (from this &lt;a href=&quot;http://www.stylusstudio.com/xsllist/200104/post11060.html&quot;&gt;Ampersand for URLs post&lt;/a&gt;) is that in order for these pages to run through the XSLT correctly all of the ampersands in my hrefs need to be referred to by the character entity &quot;&amp;amp;amp;&quot;.  So, for example, instead of 
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  &amp;lt;a href=&quot;http://www.google.com/search?hl=en&amp;amp;amp;lr=&amp;amp;amp;q=un.ctuo.us&amp;amp;amp;btnG=Search&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I need 
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  &amp;lt;a href=&quot;http://www.google.com/search?hl=en&amp;amp;amp;amp;lr=&amp;amp;amp;amp;q=un.ctuo.us&amp;amp;amp;amp;btnG=Search&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Fun!&lt;br /&gt;

&lt;/p&gt;
&lt;p&gt;So now that these pages are HTML (I learned a little from &lt;a href=&quot;http://www.xml.com/pub/a/2000/08/30/xsltandhtml/index.html&quot;&gt;HTML and XSLT&lt;/a&gt;) the SVG obviously no longer works, and it messes up validation like crazy, but I'm going to leave it in anyway, for posterity, and that others may benefit, I'm not sure how.
&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;update&quot;&gt;Update 20060420: &lt;/span&gt;On second thought (or, like, seventh thought), pages will be XHTML 1.0 Strict, but served up as text/html.  Seems to be the best compromise.  I guess that's why everyone else does it that way.
&lt;/p&gt;</content>
  
  </entry>
</feed>

