<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-27513220</id><updated>2009-11-11T05:33:31.442-05:00</updated><title type='text'>Your Metadata Sucks</title><subtitle type='html'>How I Learned to Stop Worrying and Love the Semantic Web</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://cwilper.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default'/><link rel='alternate' type='text/html' href='http://cwilper.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Chris Wilper</name><uri>http://www.blogger.com/profile/02854752603314709168</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>19</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-27513220.post-7997584796584152405</id><published>2009-09-04T14:39:00.004-04:00</published><updated>2009-09-04T14:59:47.692-04:00</updated><title type='text'>An extra cent?</title><content type='html'>It often happens that my flight price goes up while I'm in the process of booking.  I thought it was pretty shady the first few times it happened.  Now I just accept it and move on.  But I thought this one was a little bizarre today:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RJQkGginDe4/SqFi8YhgcRI/AAAAAAAAACM/VHwEAwmJrk0/s1600-h/Picture+1.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 187px;" src="http://1.bp.blogspot.com/_RJQkGginDe4/SqFi8YhgcRI/AAAAAAAAACM/VHwEAwmJrk0/s400/Picture+1.png" alt="" id="BLOGGER_PHOTO_ID_5377688219571745042" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I can't help but wonder if &lt;a href="http://newsthatsfittoprint.files.wordpress.com/2008/04/peter.jpg"&gt;Peter Gibbons&lt;/a&gt; is behind this in some way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27513220-7997584796584152405?l=cwilper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwilper.blogspot.com/feeds/7997584796584152405/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27513220&amp;postID=7997584796584152405' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/7997584796584152405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/7997584796584152405'/><link rel='alternate' type='text/html' href='http://cwilper.blogspot.com/2009/09/extra-cent.html' title='An extra cent?'/><author><name>Chris Wilper</name><uri>http://www.blogger.com/profile/02854752603314709168</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05569396271000164157'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_RJQkGginDe4/SqFi8YhgcRI/AAAAAAAAACM/VHwEAwmJrk0/s72-c/Picture+1.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27513220.post-1706197180582786425</id><published>2009-08-31T02:12:00.012-04:00</published><updated>2009-08-31T05:58:19.498-04:00</updated><title type='text'>Discovery of *content* metadata on the web</title><content type='html'>A thought experiment...&lt;br /&gt;&lt;br /&gt;I recently read an &lt;a href="http://www.nextthing.org/archives/2005/08/07/fun-with-http-headers"&gt;entertaining old article&lt;/a&gt; on various things people have been shoving into http response headers.  Some for utility (X-XRDS-Location), and some for fun (slashdot's random X-Fry and X-Bender quotes).  One site actually put a bunch of DC.title, DC.etc headers in their responses.  Not that anyone's looking for them there, but *just* in case...&lt;br /&gt;&lt;br /&gt;This got me thinking (&lt;a href="http://lists.w3.org/Archives/Public/www-tag/2002Dec/0056"&gt;again&lt;/a&gt;) about ways to provide richer metadata, especially RDF, about resources on the web. We have &lt;a href="http://www.w3.org/TR/xhtml-rdfa-primer/"&gt;RDFa&lt;/a&gt; now, which is a big step forward, but there are a couple key problems we still don't have worked out:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;ISSUE 1: &lt;/span&gt;How do we discover publisher-sanctioned &lt;a href="http://esw.w3.org/topic/FindingResourceDescriptions"&gt;resource descriptions&lt;/a&gt; for arbitrary resources on the web?  (e.g., non-XHTML)&lt;/blockquote&gt; I think the &lt;a href="http://www.mnot.net/drafts/draft-nottingham-http-link-header-07.txt"&gt;http Link: response header&lt;/a&gt; is the right way forward on this: An isDescribedBy link, pointing to a resource whose representation encodes an RDF graph describing this resource.&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;ISSUE 2:&lt;/span&gt; Given that a resource and the content of a representation of that resource are distinct things, how do we make statements about the latter on the web?&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;This one deserves more explanation.&lt;br /&gt;&lt;br /&gt;If I access http://example.org/Picture1, and my browser uses content negotiation to request the image/jpeg representation, and gets it, I want to be able to discover this kind of info:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;@prefix    : &amp;lt;http://dear.lazyweb/please/write/this/ontology/&amp;gt;&lt;br /&gt;@prefix xsd: &amp;lt;http://www.w3.org/2001/XMLSchema#&amp;gt;&lt;br /&gt;&lt;br /&gt;# The file is a JPEG and here's some basic info about it&lt;br /&gt;&lt;br /&gt;_:myFile  a            :OctetStream;&lt;br /&gt;        :name        "Picture1.jpg";&lt;br /&gt;        :mediaType   "image/jpeg";&lt;br /&gt;        :format      &amp;lt;info:pronom/fmt/42&amp;gt;&lt;br /&gt;        :length      105124;&lt;br /&gt;        :md5sum      "7846df5ced300e9543a267a856c4ab6e";&lt;br /&gt;        :sha1sum     "e3b5112b24e793f41fc5b843a505a83a80aaf776";&lt;br /&gt;        :created     "2009-08-31T10:12.342Z"^^xsd:dateTime;&lt;br /&gt;        :modified    "2009-08-31T16:28.921Z"^^xsd:dateTime;&lt;br /&gt;        :renditionOf &amp;lt;http://example.org/someImage&amp;gt;&lt;br /&gt;&lt;br /&gt;# The file is one of any number of renditions of a picture&lt;br /&gt;&lt;br /&gt;&amp;lt;http://example.org/Picture1&amp;gt;&lt;br /&gt;        dc:title       "Best Picture Ever";&lt;br /&gt;        dc:description "This is a picture of my cat, Lucky"&lt;br /&gt;        dc:creator     "Bob Dobbs".&lt;br /&gt;&lt;/pre&gt;What would be cool is if my browser knew about the http Link response header, and the metadata was just a click away, in an RDFa document.&lt;br /&gt;&lt;br /&gt;The trick would be for user-agents to be able to associate the particular rendition I got by GETting the resource with the appropriate resource in this graph.  Notice it's a bNode in the example above.  It might have a URI, it might not; but the URI of the rendition isn't known by the user-agent when it retrieves this graph....and the relation expressed by the http Link header is to be interpreted as "(the resource identified by this URI) isDescribedBy (the graph resource over there)"&lt;br /&gt;&lt;br /&gt;So, absent some additional information, in the general case, the user-agent is going to have to do the association via some distinctive property matching:  Did the response of the original GET request on the picture include a Content-MD5 header?  If so, that's a good clue.  Hmmm.&lt;br /&gt;&lt;br /&gt;&lt;/thought_experiment&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27513220-1706197180582786425?l=cwilper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwilper.blogspot.com/feeds/1706197180582786425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27513220&amp;postID=1706197180582786425' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/1706197180582786425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/1706197180582786425'/><link rel='alternate' type='text/html' href='http://cwilper.blogspot.com/2009/08/discovery-of-content-metadata-on-web.html' title='Discovery of *content* metadata on the web'/><author><name>Chris Wilper</name><uri>http://www.blogger.com/profile/02854752603314709168</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05569396271000164157'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27513220.post-8825253044627654882</id><published>2009-05-04T21:43:00.002-04:00</published><updated>2009-05-04T22:06:13.834-04:00</updated><title type='text'>That's Classy</title><content type='html'>Here's a simple program to report on Java .class versions. I'm sure some variant of this has been written a thousand times, but Google wouldn't give me what I wanted right away, so here it is again :)&lt;br /&gt;&lt;br /&gt;The program takes one argument: a path to a .class file, .jar file, or directory containing a mixture of both, and produces a report of each class file's major .class format version (50 for Java 6, 49 for Java 5, and so on).  Handy if you want to track down those new fangled classes and avoid the dreaded &lt;code&gt;java.lang.UnsupportedClassVersionError&lt;/code&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import java.io.File;&lt;br /&gt;import java.io.FileInputStream;&lt;br /&gt;import java.io.InputStream;&lt;br /&gt;import java.util.jar.JarEntry;&lt;br /&gt;import java.util.jar.JarInputStream;&lt;br /&gt;&lt;br /&gt;public abstract class ThatsClassy {&lt;br /&gt;&lt;br /&gt; static void classyFile(File file) throws Exception {&lt;br /&gt;   if (file.isDirectory())&lt;br /&gt;     for (File child: file.listFiles())&lt;br /&gt;       classyFile(child);&lt;br /&gt;   else if (file.getName().endsWith(".jar"))&lt;br /&gt;     classyJar(file);&lt;br /&gt;   else if (file.getName().endsWith(".class"))&lt;br /&gt;     classyClass(file.getPath(), new FileInputStream(file), true);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; static void classyJar(File jarFile) throws Exception {&lt;br /&gt;   JarInputStream jarStream = new JarInputStream(new FileInputStream(jarFile));&lt;br /&gt;   JarEntry entry = jarStream.getNextJarEntry();&lt;br /&gt;   while (entry != null) {&lt;br /&gt;     if (entry.getName().endsWith(".class"))&lt;br /&gt;       classyClass(jarFile.getName() + "#" + entry.getName(), jarStream, false);&lt;br /&gt;     entry = jarStream.getNextJarEntry();&lt;br /&gt;   }&lt;br /&gt;   jarStream.close();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; static void classyClass(String id, InputStream in, boolean close) throws Exception {&lt;br /&gt;   in.skip(7);&lt;br /&gt;   int majorClassVersion = in.read();&lt;br /&gt;   if (close) in.close();&lt;br /&gt;   System.out.println(id + " " + majorClassVersion);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public static void main(String[] args) throws Exception {&lt;br /&gt;   classyFile(new File(args[0]));&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27513220-8825253044627654882?l=cwilper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwilper.blogspot.com/feeds/8825253044627654882/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27513220&amp;postID=8825253044627654882' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/8825253044627654882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/8825253044627654882'/><link rel='alternate' type='text/html' href='http://cwilper.blogspot.com/2009/05/thats-classy.html' title='That&apos;s Classy'/><author><name>Chris Wilper</name><uri>http://www.blogger.com/profile/02854752603314709168</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05569396271000164157'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27513220.post-2330988378297826583</id><published>2009-02-16T10:46:00.004-05:00</published><updated>2009-02-16T11:09:27.414-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dev8d'/><title type='text'>dev8D Tweet Cloud</title><content type='html'>&lt;a href="http://www.wordle.net/gallery/wrdl/549359/Dev8D_Tweets" title="Wordle: Dev8D Tweets"&gt;&lt;img align="bottom" src="http://www.wordle.net/thumb/wrdl/549359/Dev8D_Tweets" alt="Wordle: Dev8D Tweets" style="border: 1px solid rgb(221, 221, 221); padding: 4px;" /&gt;&lt;/a&gt; Here's my abbreviated trip report: dev8D was a big success -- any conference that gets developers together and avoids long monologues is a winner in my book. As a side note, I think twitter works pretty well as a backchannel. I noticed at least one person created a separate account to avoid spamming their regular followers. Not a bad idea.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27513220-2330988378297826583?l=cwilper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwilper.blogspot.com/feeds/2330988378297826583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27513220&amp;postID=2330988378297826583' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/2330988378297826583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/2330988378297826583'/><link rel='alternate' type='text/html' href='http://cwilper.blogspot.com/2009/02/dev8d-tweet-cloud.html' title='dev8D Tweet Cloud'/><author><name>Chris Wilper</name><uri>http://www.blogger.com/profile/02854752603314709168</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05569396271000164157'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27513220.post-5648595434877098255</id><published>2008-10-04T12:30:00.004-04:00</published><updated>2008-10-04T13:29:32.878-04:00</updated><title type='text'>Multi-project Subversion Commit Notification</title><content type='html'>I recently had to set up commit notification for a repository hosting multiple projects and thought I'd write up my experience here.&lt;br /&gt;&lt;br /&gt;There are several ways to set up commit notification in subversion.  Each involves the use of the &lt;a href="http://svnbook.red-bean.com/en/1.0/svn-book.html#svn-ch-5-sect-2.1"&gt;post-commit hook&lt;/a&gt;.  Here's how it works: After the subversion repository successfully commits a change, if it finds an executable file, /path/to/svn/hooks/post-commit, it will be invoked with two arguments.  The first is the path to the repository, and the second is the revision number of the commit.&lt;br /&gt;&lt;br /&gt;The content of post-commit can be whatever you want.  In practice, most people make it a shell script that just invokes a utility like &lt;a href="http://search.cpan.org/dist/SVN-Notify/"&gt;svnnotify&lt;/a&gt; to get things done.&lt;br /&gt;&lt;br /&gt;Since the repository I was working on is hosting multiple projects (&lt;a href="http://svn.apache.org/viewvc/"&gt;ala apache&lt;/a&gt;), each top-level project has it's own &lt;code&gt;codewatch&lt;/code&gt; mailing list.  I don't want to spam each project with every change to unrelated projects in the repository.  So, based on arguments passed to &lt;code&gt;post-commit&lt;/code&gt;, I had to start by determining which project the change was relevant to.  I used the &lt;a href="http://svnbook.red-bean.com/en/1.0/svn-book.html#svn-ch-5-sect-3.1.1"&gt;svnlook&lt;/a&gt; utility for this, like so:&lt;br /&gt;&lt;pre&gt;# Get the first top-level directory changed by the commit&lt;br /&gt;# Note: svnlook's dirs-changed output is multi-line, and&lt;br /&gt;#       each line looks like "projname/trunk/etc"&lt;br /&gt;PROJ=`/usr/bin/svnlook dirs-changed -r $2 $1|head -1|sed -e 's/\/.*//g'`&lt;/pre&gt;Once I had that information, the rest was straightforward.  Here's &lt;a href="http://sites.google.com/site/cwilper/post-commit"&gt;the whole script&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27513220-5648595434877098255?l=cwilper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwilper.blogspot.com/feeds/5648595434877098255/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27513220&amp;postID=5648595434877098255' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/5648595434877098255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/5648595434877098255'/><link rel='alternate' type='text/html' href='http://cwilper.blogspot.com/2008/10/multi-project-subversion-commit.html' title='Multi-project Subversion Commit Notification'/><author><name>Chris Wilper</name><uri>http://www.blogger.com/profile/02854752603314709168</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05569396271000164157'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27513220.post-8576205269268587613</id><published>2008-07-12T08:59:00.005-04:00</published><updated>2008-07-12T09:24:30.160-04:00</updated><title type='text'>Fedora Commons Repository - Lines of Code</title><content type='html'>We're wrapping up our last branches before the 3.0 final code freeze.  I got curious last night about how the maintenance branch (2.2.x line) and the trunk (3.0 line) compared in terms of lines of code.&lt;br /&gt;&lt;br /&gt;So I decided to pull up the archives of past releases and do a per-release comparison of everything under src/java/fedora.  Here's what &lt;a href="http://www.locmetrics.com/"&gt;LocMetrics&lt;/a&gt; and &lt;a href="http://www.gnuplot.info/"&gt;Gnuplot&lt;/a&gt; told me:&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_RJQkGginDe4/SHitcBovOLI/AAAAAAAAABg/BIoe8y344tM/s1600-h/logical-loc.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_RJQkGginDe4/SHitcBovOLI/AAAAAAAAABg/BIoe8y344tM/s400/logical-loc.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5222114464923334834" /&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;It's hard to draw any definitive conclusions about the SLOC metric, but it's safe to say it's directly related to maintenance cost.  And it's interesting to see how certain features / architectural changes affect it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27513220-8576205269268587613?l=cwilper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwilper.blogspot.com/feeds/8576205269268587613/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27513220&amp;postID=8576205269268587613' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/8576205269268587613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/8576205269268587613'/><link rel='alternate' type='text/html' href='http://cwilper.blogspot.com/2008/07/fedora-commons-repository-lines-of-code.html' title='Fedora Commons Repository - Lines of Code'/><author><name>Chris Wilper</name><uri>http://www.blogger.com/profile/02854752603314709168</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05569396271000164157'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_RJQkGginDe4/SHitcBovOLI/AAAAAAAAABg/BIoe8y344tM/s72-c/logical-loc.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27513220.post-7549586185565633210</id><published>2008-06-07T13:57:00.004-04:00</published><updated>2008-06-08T20:51:45.124-04:00</updated><title type='text'>Installing Fedora in Two Minutes</title><content type='html'>Want to get a Fedora repository up and running as quickly as possible?&lt;br /&gt;&lt;br /&gt;This screencast uses the installer's "quick" option to skip all the hard questions.&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Utoymym_yaI&amp;hl=en"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/Utoymym_yaI&amp;hl=en" type="application/x-shockwave-flash" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;The "quick" option is useful if you've never installed Fedora before and just want to get acquainted.  For more serious use, you'll want the "custom" option.  And the &lt;a href="http://www.fedora-commons.org/documentation/3.0b1/userdocs/distribution/installation.html"&gt;installation guide&lt;/a&gt; :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27513220-7549586185565633210?l=cwilper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwilper.blogspot.com/feeds/7549586185565633210/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27513220&amp;postID=7549586185565633210' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/7549586185565633210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/7549586185565633210'/><link rel='alternate' type='text/html' href='http://cwilper.blogspot.com/2008/06/installing-fedora-in-two-minutes.html' title='Installing Fedora in Two Minutes'/><author><name>Chris Wilper</name><uri>http://www.blogger.com/profile/02854752603314709168</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05569396271000164157'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27513220.post-236783018043827216</id><published>2007-12-21T07:46:00.000-05:00</published><updated>2007-12-21T08:48:39.853-05:00</updated><title type='text'>Current CMA Documentation Available</title><content type='html'>Coinciding with the availability of &lt;em&gt;Fedora 3.0 Beta 1&lt;/em&gt; this week, the first round of semi-official CMA (formerly called CMDA) documentation is now available: &lt;a href="http://www.fedora-commons.org/documentation/3.0b1/userdocs/digitalobjects/cmda.html"&gt;The Fedora Content Model Architecture&lt;/a&gt;.  As Dan points out, we'll be doing some name changes before it's all said and done, but so far this is the most up-to-date diagram  of the supporting object-object relationships:&lt;br /&gt;&lt;img src="http://www.fedora-commons.org/documentation/3.0b1/userdocs/digitalobjects/images/cmarel.png" /&gt;&lt;br /&gt;As implemented, the &lt;em&gt;BDef&lt;/em&gt; and &lt;em&gt;BMech&lt;/em&gt; objects are basically unchanged.  Here's what the new &lt;em&gt;CModel&lt;/em&gt; control object looks like:&lt;br /&gt;&lt;img src="http://www.fedora-commons.org/documentation/3.0b1/userdocs/digitalobjects/images/cmodel.png"/&gt;&lt;br /&gt;The &lt;code&gt;DS-COMPOSITE-MODEL&lt;/code&gt; datastream specifies the structural requirements of member objects.  The &lt;a href="http://www.fedora.info/definitions/1/0/dsCompositeModel.xsd"&gt;dsCompositeModel.xsd schema&lt;/a&gt; describes the expected format.  For example, here's the DS-COMPOSITE-MODEL of &lt;em&gt;info:fedora/fedora-system:ContentModel&lt;/em&gt;:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;dsCompositeModel xmlns="..."&amp;gt;&lt;br /&gt;  &amp;lt;dsTypeModel ID="RELS-EXT"&amp;gt;&lt;br /&gt;    &amp;lt;form MIME="text/xml"&amp;gt;&lt;br /&gt;  &amp;lt;dsTypeModel&amp;gt;&lt;br /&gt;  &amp;lt;dsTypeModel ID="DC"&amp;gt;&lt;br /&gt;    &amp;lt;form MIME="text/xml"&amp;gt;&lt;br /&gt;  &amp;lt;dsTypeModel&amp;gt;&lt;br /&gt;  &amp;lt;dsTypeModel ID="DS-COMPOSITE-MODEL"&amp;gt;&lt;br /&gt;    &amp;lt;form MIME="text/xml"&amp;gt;&lt;br /&gt;  &amp;lt;dsTypeModel&amp;gt;&lt;br /&gt;&amp;lt;/dsCompositeModel&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Pretty simple.  It says, member objects must have at least these datastreams, and each be in the form specified.  If multiple forms are listed in a single dsTypeModel, the datastream may be in any of those forms.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27513220-236783018043827216?l=cwilper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwilper.blogspot.com/feeds/236783018043827216/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27513220&amp;postID=236783018043827216' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/236783018043827216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/236783018043827216'/><link rel='alternate' type='text/html' href='http://cwilper.blogspot.com/2007/12/current-cma-documentation-available.html' title='Current CMA Documentation Available'/><author><name>Chris Wilper</name><uri>http://www.blogger.com/profile/02854752603314709168</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05569396271000164157'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27513220.post-2165754212692433352</id><published>2007-12-16T16:04:00.000-05:00</published><updated>2007-12-16T19:53:38.894-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fedora-commons'/><category scheme='http://www.blogger.com/atom/ns#' term='cmda'/><title type='text'>Fedora 3.0 - Where's the Binding Map?</title><content type='html'>Okay, I'm excited.&lt;br /&gt;&lt;br /&gt;After several months of effort,&lt;span style="font-style: italic;"&gt; Fedora Commons 3.0 Beta 1 &lt;/span&gt;should go live sometime this week. For most Fedora users, this Beta will be their first real exposure to the &lt;span style="font-style: italic;"&gt;Content Model Dissemination Architecture,&lt;/span&gt; or &lt;span style="font-style: italic;"&gt;CMDA. (&lt;/span&gt;this name is subject to change before 3.0-final)&lt;br /&gt;&lt;br /&gt;Among other things, the CMDA allows people to attach runtime behaviors to digital objects at a class level.  This architectural change has been a long time coming for Fedora, and we've worked hard to get the design right.  Dan is working on the official design doc for publication with the software, but here's a simple overview of how it works:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_RJQkGginDe4/R2Wu0qJkjwI/AAAAAAAAABE/0s5DBvUkCRI/s1600-h/CMDA_Relationships.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_RJQkGginDe4/R2Wu0qJkjwI/AAAAAAAAABE/0s5DBvUkCRI/s400/CMDA_Relationships.PNG" alt="" id="BLOGGER_PHOTO_ID_5144710369031524098" border="0" /&gt;&lt;/a&gt;The Fedora-defined CMDA relationships are expressed in RDF in the RELS-EXT datastream of each referring object.  As long as all the necessary relationships exist, Fedora will use them to provide the desired behaviors for each data object.  By design, the Resource Index does &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; need be enabled for this to work.&lt;br /&gt;&lt;br /&gt;One question that will inevitably arise for those familiar with Fedora's traditional disseminators is, "Where's the Binding Map?".  The short answer is, they no longer exist.  For the long answer, continue reading.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Background&lt;/span&gt;&lt;br /&gt;To support extensible "views" or "behaviors" on digital objects, prior versions of Fedora required each object to include a special piece of metadata called a disseminator.  The disseminator included a reference to a "Behavior Definition" (an object that defines the behaviors), a "Behavior Mechanism" (an object that grounds the behaviors to a specific implementation), and lastly, a "Datastream Binding Map".  The binding map's purpose was to map the datastream IDs in the object to specific input requirements of the BMech.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;CMDA Implementation of Behaviors&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;With the CMDA, behavior subscription is now done at the content model level.  Among other useful properties, this design allows people to significantly change behaviors for whole classes of objects without making changes to (or visiting) every single one.&lt;br /&gt;&lt;br /&gt;Since the content model object would now appear to occupy the role of the old per-object disseminator, if a datastream-to-BMech-input mapping existed, it would go in the content model, right?&lt;br /&gt;&lt;br /&gt;Actually, I don't think so.  In general, a content model is intended to be a sharable object that survives through time.  It a) describes a class of objects by their structure, and b) indicates which operations/behaviors they should have within a repository.  In order for it to be as sharable and survivable as possible, the content model must not dictate *how* the operations are to be executed.  That's the job of the BMech.&lt;br /&gt;&lt;br /&gt;Part of the "how" is deciding which (if any) of the datastreams defined by the content model actually need to be given as input to the code that executes the behavior.  At a high level, BMechs are bound to content models, and not vice-versa.  The direction of the relation is important.  It's the BMech's job to pick apart the content model it works with and decide how it's going to fulfill the contract with the given pattern of data.&lt;br /&gt;&lt;br /&gt;Therefore the mapping, if necessary, is really a BMech implementation detail.  But if a BMech only isContractor for one content model, then there's really no point to having the extra indirection...just make the part names in the BMech match the datastream IDs and be done with it.  That's the simplest approach, and the one that I think will get people "up and running" with the CMDA the quickest.&lt;br /&gt;&lt;br /&gt;But, you ask, what if you want to use the same BMech for content models that differ only in their datastream IDs?  First, if possible, consider merging those content models.  It'll make life easier for you in the long run.  If that's impractical or doesn't make sense for your use case, then just create a BMech for each -- one that only differs in the part names used.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;For Fedora 3.0b1, what this means in a practical sense is that people who have lots of variance in their datastream IDs will either need to "bring them in line" (which is a very practical thing to do in its own right, for ease of management), or will need to define different content models for them, which use different BMechs, even if they formerly used the same BMechs.&lt;br /&gt;&lt;br /&gt;The migration tools (which I'm writing the docs for now) will do the latter automatically, creating Content Models and BMech copies with appropriate IDs automatically. If people want a "cleaner" upgrade, they need to invest some sweat in getting their datastream IDs consistent prior to running the analysis (the first of three phases of migration) so they don't end up with too-unmanageable a set of BMech copies.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;3.0-final and Beyond&lt;/span&gt;&lt;br /&gt;Two things absent from the Beta 1 release, which should be present 3.0-final are 1) the ability to assert object-object relationship constraints as part of the formal definition of a content model, and 2) a basic validator that can take a content model and an object that claims to adhere to it, and tell whether it actually complies or not.&lt;br /&gt;&lt;br /&gt;For 3.0b1, we've kept the "Fedora Object Type" idea around.  Viewed through this old lens, there are only four basic kinds of Fedora digital objects.  We know that there is some overlap with the "typing" introduced by the CMDA.  As the CMDA takes hold, I think the idea of "Fedora Object Type" can be gracefully subsumed by content model.&lt;br /&gt;&lt;br /&gt;In future releases, the BMech will also evolve to something more flexible.  We know people have got a lot of mileage out simple web service HTTP GET bindings, but other methods, protocols, and even in-VM code bindings are definitely called for.  With the CMDA, we are now in a much better position to do these things.&lt;br /&gt;&lt;br /&gt;Another idea that keeps popping up in CMDA discussions is, can an object be it's own content model? Or from a slightly different angle: Can a content model play the role of a Data Object, and thus act as a template?  Also, what about multiple content models per object?  Inheritance?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_RJQkGginDe4/R2XG1qJkjxI/AAAAAAAAABM/3VxReMyHdQI/s1600-h/blue-skies.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_RJQkGginDe4/R2XG1qJkjxI/AAAAAAAAABM/3VxReMyHdQI/s400/blue-skies.jpg" alt="Blue Skies - CC Licensed - by Sybren Stüvel - http://www.flickr.com/photos/sybrenstuvel/520362534/" id="BLOGGER_PHOTO_ID_5144736774490459922" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;These questions hit on design, implementation, and best practices issues, all of which we are now in a much better position to discuss with the release of 3.0b1.  I'm looking forward to it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27513220-2165754212692433352?l=cwilper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwilper.blogspot.com/feeds/2165754212692433352/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27513220&amp;postID=2165754212692433352' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/2165754212692433352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/2165754212692433352'/><link rel='alternate' type='text/html' href='http://cwilper.blogspot.com/2007/12/fedora-30-wheres-binding-map.html' title='Fedora 3.0 - Where&apos;s the Binding Map?'/><author><name>Chris Wilper</name><uri>http://www.blogger.com/profile/02854752603314709168</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05569396271000164157'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_RJQkGginDe4/R2Wu0qJkjwI/AAAAAAAAABE/0s5DBvUkCRI/s72-c/CMDA_Relationships.PNG' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27513220.post-1771711430426398109</id><published>2007-08-28T09:54:00.000-04:00</published><updated>2007-08-28T10:15:56.126-04:00</updated><title type='text'>Fedora Commons Launched</title><content type='html'>For those who haven't heard yet.... this is great news.&lt;br/&gt;&lt;br /&gt;Carol also has some &lt;a href="http://expertvoices.nsdl.org/roadreports/2007/08/15/celebration-marks-launch-of-fedora-commons/"&gt;pictures from the launch celebration&lt;/a&gt; over at &lt;span style="font-style: italic;"&gt;NSDL Road Reports&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Here's the text of the official announcement:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;FEDORA COMMONS AWARDED $4.9M GRANT TO DEVELOP OPEN-SOURCE SOFTWARE FOR BUILDING COLLABORATIVE INFORMATION COMMUNITIES&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(Ithaca, New York, August, 2007)&lt;/span&gt; - Fedora Commons announced the award of a four year, $4.9M grant from the Gordon and Betty Moore Foundation to develop the organizational and technical frameworks necessary to effect revolutionary change in how scientists, scholars, museums, libraries, and educators collaborate to produce, share, and preserve their digital intellectual creations.  Fedora Commons is a new non-profit organization that will continue the mission of the Fedora Project, the successful open-source software collaboration between Cornell University and the University of Virginia.  The Fedora Project evolved from the Flexible Extensible Digital Object Repository Architecture (Fedora) developed by researchers at Cornell Computing and Information Science.&lt;br /&gt;&lt;br /&gt;With this funding, Fedora Commons will foster an open community to support the development and deployment of open source software, which facilitates open collaboration and open access to scholarly, scientific, cultural, and educational materials in digital form.  The software platform developed by Fedora Commons with Gordon and Betty Moore Foundation funding will support a networked model of intellectual activity, whereby scientists, scholars, teachers, and students will use the Internet to collaboratively create new ideas, and build on, annotate, and refine the ideas of their colleagues worldwide.&lt;br /&gt;&lt;br /&gt;With its roots in the Fedora open-source repository system, developed since 2001 with support from the Andrew W. Mellon Foundation, the new software will continue to focus on the integrity and longevity of the intellectual products that underlie this new form of knowledge work.  The result will be an open source software platform that both enables collaborative models of information creation and sharing, and provides sustainable repositories to secure the digital materials that constitute our intellectual, scientific, and cultural history.&lt;br /&gt;&lt;br /&gt;Recognizing the importance of multiple participants in the development of new technologies to support this vision, the Moore Foundation funding will also support the growth and diversification of the Fedora Community, a global set of partners who will cooperate in software development, application deployment, and community outreach for Fedora Commons.  This network of partners will be instrumental for making Fedora Commons a self-sustainable non-profit organization that will support and incubate open-source software projects that focus on new mechanisms for information formation, access, collaboration, and preservation.&lt;br /&gt;&lt;br /&gt;According to Sandy Payette, Executive Director of Fedora Commons, "the new Fedora Commons can foster technologies and partnerships that make it possible for academic and scientific communities to publish, share, and archive the results of their own work in a free, open fashion, and make it possible to analyze and use content in novel ways."&lt;br /&gt;&lt;br /&gt;"Establishing a sustainable open-source software system that provides the basic infrastructure for on-line communities of scholars will have enduring impact.  The unanticipated cross-disciplinary uses of this open platform are the hallmark of this revolutionary infrastructure," said Jim Omura, technology strategist with the Gordon and Betty Moore Foundation.&lt;br /&gt;&lt;br /&gt;Payette also noted, "The open-source software that is developed and distributed by Fedora Commons can impact the entire lifecycle of what is often referred to as "e-Research" and "e-Science," including storage of experimental data, analysis of experimental results, peer review, publication of findings, and the reuse of published material for the next generation of scholarly works.  We will also continue our work with libraries and museums to facilitate the sharing of digitized collections, making previously locked away material available to wide audiences.  Also, building on our attention to digital preservation in the Fedora open-source repository system, Fedora Commons will continue to stress the importance of the sustainability of digital information in applications of our work."&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;About Fedora Commons&lt;/span&gt;&lt;br /&gt;Fedora Commons is a non-profit organization whose purpose is to provide sustainable open-source technologies to help individuals and organizations create, manage, publish, share, and preserve digital content upon which we form our intellectual, scientific, and cultural heritage.  Since 2001, with support from the Andrew W. Mellon Foundation, Cornell University and the University of Virginia have collaborated on the Fedora Project which has developed, distributed, and supported innovative open-source repository software that combines content management, web services, and semantic technologies.  The Fedora software has been adopted worldwide to support an array of applications including open-access publishing, scholarly communication, digital libraries, e-science, archives, and education.&lt;br /&gt;&lt;br /&gt;Fedora Commons will initially be located in the Information Science Building at Cornell University, Ithaca, New York.  The Executive Director of Fedora Commons is Sandy Payette, who co-invented the Fedora architecture and led the Cornell arm of the open-source Fedora Project.  The Board of Directors of Fedora Commons provides leadership from multiple communities, including open-access publishing, digital libraries, sciences, and humanities.  For more information, visit &lt;a href="http://www.fedora-commons.org/"&gt;http://www.fedora-commons.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;About the Gordon and Betty Moore Foundation&lt;/span&gt;&lt;br /&gt;The Gordon and Betty Moore Foundation, established in 2000, seeks to advance environmental conservation and cutting-edge scientific research around the world and improve the quality of life in the San Francisco Bay Area.  The Foundation's Science Program seeks to make a significant impact on the development of provocative, transformative scientific research, and increase knowledge in emerging fields. For more information, visit &lt;a href="http://www.moore.org/"&gt;http://www.moore.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;CONTACT:&lt;/span&gt;&lt;br /&gt;Fedora Commons: Sandy Payette&lt;br /&gt;(607) 255-9222, payette@cs.cornell.edu&lt;br /&gt;http://www.fedora-commons.org&lt;br /&gt;Gordon and Betty Moore Foundation: Greg Nelson&lt;br /&gt;(415) 561-7427, greg.nelson@moore.org&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27513220-1771711430426398109?l=cwilper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwilper.blogspot.com/feeds/1771711430426398109/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27513220&amp;postID=1771711430426398109' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/1771711430426398109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/1771711430426398109'/><link rel='alternate' type='text/html' href='http://cwilper.blogspot.com/2007/08/fedora-commons-launched.html' title='Fedora Commons Launched'/><author><name>Chris Wilper</name><uri>http://www.blogger.com/profile/02854752603314709168</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05569396271000164157'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27513220.post-8065942688439083411</id><published>2007-03-29T12:46:00.000-04:00</published><updated>2007-03-29T13:19:21.868-04:00</updated><title type='text'>FTP ASCII unmangler</title><content type='html'>FTP text mode is evil.  &lt;br /&gt;&lt;br /&gt;I made the mistake of transferring several important binary files from OS/X to windows last night, using FTP.  Actually, a few mistakes were made along the way.  1) I didn't check that I was in BIN mode first, 2) I didn't verify the integrity of the files after the transfer, and 3) I deleted the sources.&lt;br /&gt;&lt;br /&gt;Luckily, it was Unix-to-Windows, which means all #10 octets were replaced with #13#10.  First I tried dos2unix with no luck.  Then I wrote a program to replace all #13#10 sequences with #10 and crossed my fingers.&lt;br /&gt;&lt;br /&gt;It worked.  Here it is in all it's inefficient glory.  Maybe this will help someone else someday.  No guarantees, but it's worth a shot if you're desperate.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import java.io.*;&lt;br /&gt;&lt;br /&gt;public class Unmangle&lt;br /&gt;{&lt;br /&gt;    public static void main(String[] args) throws Exception&lt;br /&gt;    {&lt;br /&gt;        InputStream in = new FileInputStream(args[0]);&lt;br /&gt;        OutputStream out = new FileOutputStream(args[1]);&lt;br /&gt;        int prev = 0;&lt;br /&gt;        int b = in.read();&lt;br /&gt;        while (b != -1)&lt;br /&gt;        {&lt;br /&gt;            if (prev == 13 &amp;amp;&amp;amp; b != 10)&lt;br /&gt;                out.write(13);&lt;br /&gt;            if (b != 13)&lt;br /&gt;                out.write(b);&lt;br /&gt;            prev = b;&lt;br /&gt;            b = in.read();&lt;br /&gt;        }&lt;br /&gt;        if (prev == 13)&lt;br /&gt;            out.write(13);&lt;br /&gt;        out.close();&lt;br /&gt;        in.close();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27513220-8065942688439083411?l=cwilper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwilper.blogspot.com/feeds/8065942688439083411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27513220&amp;postID=8065942688439083411' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/8065942688439083411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/8065942688439083411'/><link rel='alternate' type='text/html' href='http://cwilper.blogspot.com/2007/03/ftp-ascii-unmangler.html' title='FTP ASCII unmangler'/><author><name>Chris Wilper</name><uri>http://www.blogger.com/profile/02854752603314709168</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05569396271000164157'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27513220.post-6125514194031225295</id><published>2007-02-01T06:48:00.000-05:00</published><updated>2007-02-01T06:46:40.449-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tagging'/><category scheme='http://www.blogger.com/atom/ns#' term='metadata'/><category scheme='http://www.blogger.com/atom/ns#' term='libraries'/><category scheme='http://www.blogger.com/atom/ns#' term='bookmarks'/><category scheme='http://www.blogger.com/atom/ns#' term='monkeys'/><title type='text'>Social Bookmarking == Free Metadata</title><content type='html'>Metadata is expensive.  Librarians aren't the only ones privy to this fact.&lt;br /&gt;&lt;br /&gt;I remember the pain we went through in bringing HP's FTP site to the web.  The first step was converting the old README files to HTML.  Perl made this a snap, but somehow it didn't address the now-more-apparent quality problem.  So we slurped it all into a Paradox database had a big metadata entry party.&lt;br /&gt;&lt;br /&gt;Ok, the word &lt;span style="font-style:italic;"&gt;"party"&lt;/span&gt; might be a stretch.  There was technically pizza involved, but it was more of a bribe.  It lasted days, and nobody really celebrated 'till it was over.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_RJQkGginDe4/RcGlv32EThI/AAAAAAAAAAU/rtE3G6kYYG0/s1600-h/mdmonkey-small.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_RJQkGginDe4/RcGlv32EThI/AAAAAAAAAAU/rtE3G6kYYG0/s400/mdmonkey-small.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5026480900985343506" /&gt;&lt;/a&gt;&lt;br /&gt;I distinctly remember the phrase &lt;span style="font-style:italic;"&gt;"metadata monkey"&lt;/span&gt; entering my vernacular at that point.&lt;br /&gt;&lt;br /&gt;I don't have anything against monkeys.  Monkeys are cute.  Monkeys at keyboards are even cuter.  But metadata entry has long been viewed as a thankless job.&lt;br /&gt;&lt;br /&gt;Now, sites like &lt;a href="http://del.icio.us/"&gt;del.icio.us&lt;/a&gt; have figured out a way to get metadata monkeys to work for free.  The incentive?  Not pizza, not even bananas: just the ability to store our own descriptions, share those descriptions with others, and access it all from anywhere.&lt;br /&gt;&lt;br /&gt;It makes me wonder about the role of the library in &lt;span style="font-weight:bold;"&gt;creating&lt;/span&gt; &lt;span style="font-style:italic;"&gt;authoritative&lt;/span&gt;, versus &lt;span style="font-weight:bold;"&gt;curating&lt;/span&gt; &lt;span style="font-style:italic;"&gt;social&lt;/span&gt;, metadata.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27513220-6125514194031225295?l=cwilper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwilper.blogspot.com/feeds/6125514194031225295/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27513220&amp;postID=6125514194031225295' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/6125514194031225295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/6125514194031225295'/><link rel='alternate' type='text/html' href='http://cwilper.blogspot.com/2007/02/social-bookmarking-free-metadata.html' title='Social Bookmarking == Free Metadata'/><author><name>Chris Wilper</name><uri>http://www.blogger.com/profile/02854752603314709168</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05569396271000164157'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_RJQkGginDe4/RcGlv32EThI/AAAAAAAAAAU/rtE3G6kYYG0/s72-c/mdmonkey-small.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27513220.post-1918634103176237087</id><published>2007-01-28T05:19:00.000-05:00</published><updated>2007-01-28T23:04:08.775-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='repositories'/><category scheme='http://www.blogger.com/atom/ns#' term='rdf'/><category scheme='http://www.blogger.com/atom/ns#' term='semanticweb'/><category scheme='http://www.blogger.com/atom/ns#' term='webarch'/><category scheme='http://www.blogger.com/atom/ns#' term='oai-ore'/><category scheme='http://www.blogger.com/atom/ns#' term='or2007'/><title type='text'>Resources, Representations, Repositories, and RDF</title><content type='html'>Last week, Carl Lagoze gave an update on the &lt;a href="http://www.openarchives.org/ore/"&gt;OAI-ORE&lt;/a&gt; work at &lt;a href="http://openrepositories.org/"&gt;Open Repositories '07&lt;/a&gt;.  ORE is a new project that intends to specify how heterogeneous repositories can exchange information about the digital objects they hold.  Although they're not necessarily going after a new protocol, I still think of it as taking &lt;a href="http://www.openarchives.org/pmh/"&gt;OAI-PMH&lt;/a&gt; to the next level.  It's not just about metadata anymore.&lt;br /&gt;&lt;br /&gt;For me, the most interesting parts of the talk were &lt;a href="http://www.w3.org/TR/webarch/"&gt;webarch&lt;/a&gt;-related.  It all started with the statement (to paraphrase) "we must build on the web architecture".  Carl then pointed out how representations are essentially second-class citizens on the web.&lt;br /&gt;&lt;br /&gt;That got me thinking.  At the most basic level, repositories are all about managing bitstreams (whether they're considered data or metadata).  In webarch, bitstreams seem to equate to what they call "representation data". And a representation is defined by how it relates to a resource:&lt;br /&gt;&lt;blockquote&gt;"A &lt;a style="" name="def-representation" id="def-representation"&gt;&lt;dfn&gt;representation&lt;/dfn&gt;&lt;/a&gt; is data that encodes information about resource state."&lt;br /&gt;&lt;/blockquote&gt;So, in w3c-speak, a repository manages representation data.  Okay, that's just a terminology change.  But what about this statement:&lt;br /&gt;&lt;blockquote&gt;"For robustness, Web architecture promotes independence between an identifier and the state of the identified resource."&lt;br /&gt;&lt;/blockquote&gt;That makes a whole lot of sense for the web when you consider how often web pages change. But what does it mean for repositories?  How do we manage bitstreams if we can't identify them?  The answer must be one of the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Indirect identification.  Identify the associated "resource" in order the work with the bitstream(s).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Reification.  Elevate the bitstream to a "resource" so we can talk about it.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt; How about if we want to model the repository as an RDF graph?  Well, we know that  representations can have metadata in addition to the payload.  So in order to do this modeling, we need to reify.  Internal to a repository, representation triples might look something like:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;representationA represents urn:example:someTextFile&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;representationA contentType "text/plain"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;representationA payloadLocation "/path/to/someTextFile.txt"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;I think the OAI-ORE work is going to attempt something like the above: a model (and maybe a format?) for expressing resource-representation information in a repository-neutral way.  It will be interesting to see what pops out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27513220-1918634103176237087?l=cwilper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwilper.blogspot.com/feeds/1918634103176237087/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27513220&amp;postID=1918634103176237087' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/1918634103176237087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/1918634103176237087'/><link rel='alternate' type='text/html' href='http://cwilper.blogspot.com/2007/01/resources-representations-repositories.html' title='Resources, Representations, Repositories, and RDF'/><author><name>Chris Wilper</name><uri>http://www.blogger.com/profile/02854752603314709168</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05569396271000164157'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27513220.post-116024243036188123</id><published>2006-10-07T12:57:00.000-04:00</published><updated>2007-01-28T23:17:04.128-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>A good source tree</title><content type='html'>A good source tree:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Has a root-level README file.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Contains all compile-time dependencies.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;With versions noted.&lt;/li&gt;&lt;li&gt;With originations and licenses noted.&lt;/li&gt;&lt;li&gt;With transitive dependencies noted.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Can be compiled and linked easily.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;With one command.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Without a network connection.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Can be unit + integration tested easily.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;With one command.&lt;/li&gt;&lt;li&gt;Without a network connection.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27513220-116024243036188123?l=cwilper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwilper.blogspot.com/feeds/116024243036188123/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27513220&amp;postID=116024243036188123' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/116024243036188123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/116024243036188123'/><link rel='alternate' type='text/html' href='http://cwilper.blogspot.com/2006/10/good-source-tree.html' title='A good source tree'/><author><name>Chris Wilper</name><uri>http://www.blogger.com/profile/02854752603314709168</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05569396271000164157'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27513220.post-115985522398036605</id><published>2006-10-03T01:57:00.000-04:00</published><updated>2007-01-28T23:18:06.259-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humor'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Hardly coding</title><content type='html'>URGENT ASSISTANCE!!!&lt;br /&gt;&lt;br /&gt;HELP I CAN"T COMPILE&gt;&gt;&gt; ERROR!!&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;  [checkstyle] C:\work\mptstore\trunk\src\java\org\nsdl\mptstore\query\&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;  provider\TriplePatternSQLProvider.java:35:45: '3' is a magic number.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I EVEN TRIED INSTRUCTIONS ON HOW TO PROGRAMMER??&lt;br /&gt;&lt;br /&gt;&lt;a href="http://secretgeek.net/howtobeaprogrammer.asp"&gt;  http://secretgeek.net/howtobeaprogrammer.asp&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;SO I SERCH GOOGLE LIKE A GOOD PROGRAMMER AND FOUND THE ANSER:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=yPzAjiLr5Zw"&gt;http://www.youtube.com/watch?v=yPzAjiLr5Zw&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;BUT HOW TO I PASTE VIDEO I"M USING ECLIPSE??&lt;br /&gt;&lt;br /&gt;THANK YOU!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27513220-115985522398036605?l=cwilper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwilper.blogspot.com/feeds/115985522398036605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27513220&amp;postID=115985522398036605' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/115985522398036605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/115985522398036605'/><link rel='alternate' type='text/html' href='http://cwilper.blogspot.com/2006/10/hardly-coding.html' title='Hardly coding'/><author><name>Chris Wilper</name><uri>http://www.blogger.com/profile/02854752603314709168</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05569396271000164157'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27513220.post-115451778050157779</id><published>2006-08-02T07:07:00.000-04:00</published><updated>2007-01-28T23:16:36.078-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><title type='text'>Reducing Firefox Memory Consumption</title><content type='html'>Firefox uses incredible amounts of memory.  Some of this is caused by various undiagnosed memory leaks.  Looking around on the net, I found a few things that can help, short of restarting all the time:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt; Make sure you have the latest version (currently 1.5.0.5)&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Enter about:config in the address bar.&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Right click, add Boolean: config.trim_on_minimize (true)&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Right click, add Integer: browser.cache.memory.capacity (32768)&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Restart Firefox.&lt;/li&gt;&lt;br /&gt;&lt;li&gt; If things get sluggish, minimize the window and restore it.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Using a tool like &lt;a href="http://www.outertech.com/index.php?_charisma_page=product&amp;id=7"&gt;CachemanXP&lt;/a&gt; can quickly show how well the "trim_on_minimize" setting is working.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27513220-115451778050157779?l=cwilper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwilper.blogspot.com/feeds/115451778050157779/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27513220&amp;postID=115451778050157779' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/115451778050157779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/115451778050157779'/><link rel='alternate' type='text/html' href='http://cwilper.blogspot.com/2006/08/reducing-firefox-memory-consumption.html' title='Reducing Firefox Memory Consumption'/><author><name>Chris Wilper</name><uri>http://www.blogger.com/profile/02854752603314709168</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05569396271000164157'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27513220.post-115139680287804429</id><published>2006-06-27T02:29:00.000-04:00</published><updated>2006-06-27T04:26:42.910-04:00</updated><title type='text'>DTP Model</title><content type='html'>The X/Open DTP Model is a widely-supported standard that defines components and interfaces useful for dealing with distributed transactions.&lt;br /&gt;&lt;br /&gt;In this model, the application uses a &lt;i&gt;transaction manager&lt;/i&gt; to help carry out a &lt;i&gt;global transaction&lt;/i&gt;.  The app communicates with the transaction manager via the &lt;i&gt;TX interface&lt;/i&gt;, which provides the transaction semantics (begin/commit/rollback/etc).&lt;br /&gt;&lt;br /&gt;Each data store involved in a global transaction is exposed to the transaction manager as a &lt;i&gt;resource manager&lt;/i&gt;.  The communication takes place over the &lt;i&gt;XA interface&lt;/i&gt;, which defines functions for lower-level transaction semantics.  The transaction manager uses the XA interface to carry out two-phase commits, and the resource manager uses it to dynamically enlist specific resources in the transaction.&lt;br /&gt;&lt;br /&gt;References:&lt;br /&gt;&lt;a href="http://www.subbu.org/articles/transactions/NutsAndBoltsOfTP.html"&gt;Nuts and Bolts of Transaction Processing&lt;/a&gt;, by Subbu Allamaraju, subbu.org&lt;br /&gt;&lt;a href="http://www.aurorainfo.com/wp4/index.htm"&gt;Global Transactions - X/Open XA - Resource Managers&lt;/a&gt;, by Donald A. Marsh, Jr., Aurora Information Systems, Inc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27513220-115139680287804429?l=cwilper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwilper.blogspot.com/feeds/115139680287804429/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27513220&amp;postID=115139680287804429' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/115139680287804429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/115139680287804429'/><link rel='alternate' type='text/html' href='http://cwilper.blogspot.com/2006/06/dtp-model.html' title='DTP Model'/><author><name>Chris Wilper</name><uri>http://www.blogger.com/profile/02854752603314709168</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05569396271000164157'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27513220.post-114689319416106598</id><published>2006-05-06T01:26:00.000-04:00</published><updated>2007-01-28T23:16:01.543-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Java coding style</title><content type='html'>Here's the style I prefer these days.&lt;br /&gt;&lt;span style="font-size:+1;"&gt;&lt;pre&gt;&lt;span style="font-size:85%;"&gt;package org.example.myproject;&lt;br /&gt;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.util.Map;&lt;br /&gt;&lt;br /&gt;import org.apache.log4j.Logger;&lt;br /&gt;&lt;br /&gt;import org.example.myproject.util.MyUtil;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* This class does several things.&lt;br /&gt;*&lt;br /&gt;* @author name@domain.com&lt;br /&gt;*/&lt;br /&gt;public class MyClass {&lt;br /&gt;&lt;br /&gt;   public static final String PUB = "a";&lt;br /&gt;&lt;br /&gt;   private static final String PRIV = "b";&lt;br /&gt;&lt;br /&gt;   private String _name;&lt;br /&gt;&lt;br /&gt;   private String _description;&lt;br /&gt;&lt;br /&gt;   /**&lt;br /&gt;    * Construct a new MyClass.&lt;br /&gt;    */&lt;br /&gt;   public MyClass(String name, String description) {&lt;br /&gt;       _name = name;&lt;br /&gt;       _description = description;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27513220-114689319416106598?l=cwilper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwilper.blogspot.com/feeds/114689319416106598/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27513220&amp;postID=114689319416106598' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/114689319416106598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/114689319416106598'/><link rel='alternate' type='text/html' href='http://cwilper.blogspot.com/2006/05/java-coding-style.html' title='Java coding style'/><author><name>Chris Wilper</name><uri>http://www.blogger.com/profile/02854752603314709168</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05569396271000164157'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27513220.post-114672630345709915</id><published>2006-05-04T03:04:00.000-04:00</published><updated>2007-01-28T23:18:36.117-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humor'/><category scheme='http://www.blogger.com/atom/ns#' term='search'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Writing a search engine</title><content type='html'>I just remembered this story...&lt;br /&gt;&lt;br /&gt;Back in '96, I was part of a small team working on the HP support website.  We had just started to look at incorporating a search engine and had hired Verity to integrate their search software with our site.&lt;br /&gt;&lt;br /&gt;One afternoon, Jim, the project manager for search, invited a few of us to attend a Verity training session.  I was really curious about how these search engine things worked, so I was happy to attend.&lt;br /&gt;&lt;br /&gt;Derrick, the consultant, had given us a nice introduction to inverted indexes and stopwords, and I was intrigued.  Ten minutes in, I stopped listening and started typing.  Shortly afterward, Jim noticed I wasn't being as attentive as the others.  He came over and asked me what I was up to.&lt;br /&gt;&lt;br /&gt;"Oh, I'm writing a search engine in Perl"&lt;br /&gt;&lt;br /&gt;Poor Jim.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27513220-114672630345709915?l=cwilper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cwilper.blogspot.com/feeds/114672630345709915/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27513220&amp;postID=114672630345709915' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/114672630345709915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27513220/posts/default/114672630345709915'/><link rel='alternate' type='text/html' href='http://cwilper.blogspot.com/2006/05/writing-search-engine.html' title='Writing a search engine'/><author><name>Chris Wilper</name><uri>http://www.blogger.com/profile/02854752603314709168</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05569396271000164157'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry></feed>