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

<channel>
	<title>Dilettante's Ball</title>
	<atom:link href="http://dilettantes.code4lib.org/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://dilettantes.code4lib.org</link>
	<description></description>
	<pubDate>Sun, 23 Nov 2008 16:25:45 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7-hemorrhage</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>I couldn&#8217;t agree more</title>
		<link>http://dilettantes.code4lib.org/2008/11/i-couldnt-agree-more/</link>
		<comments>http://dilettantes.code4lib.org/2008/11/i-couldnt-agree-more/#comments</comments>
		<pubDate>Sun, 23 Nov 2008 16:25:45 +0000</pubDate>
		<dc:creator>Ross</dc:creator>
		
		<category><![CDATA[jangle]]></category>

		<guid isPermaLink="false">http://dilettantes.code4lib.org/?p=126</guid>
		<description><![CDATA[&#8220;[S]training-to-be-clever acronyms department&#8221;&#8230;
Project names are very important to me in a &#8220;the clothes make the man&#8221; sensibility.  I&#8217;d prefer to leave an application untitled rather than have a contrived or pedestrian name attached to it (which is why my EAD publisher app never had a title &#8212; nothing non-EAD-derogatory ever came to me).
Often, the name [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://lib.typepad.com/up2date/2008/11/jangle.html" target="_blank">&#8220;[S]training-to-be-clever acronyms department&#8221;</a>&#8230;</p>
<p>Project names are very important to me in a &#8220;the clothes make the man&#8221; sensibility.  I&#8217;d prefer to leave an application untitled rather than have a contrived or pedestrian name attached to it (which is why my EAD publisher app never had a title &#8212; nothing non-EAD-derogatory ever came to me).</p>
<p>Often, the name is the only part of a project that &#8220;works&#8221; (see:  FancyPants, CommuniCat etc.), so, in my mind, it&#8217;s important that it&#8217;s memorable enough that people (coworkers, mostly) pay attention to the initial pitch so you don&#8217;t have to explain its functionality every time.  When you are in the brainstorming/gathering-enough-interest-to-get-the-green-light phase, everything&#8217;s about marketing.  And, for me, that means a good working title.  I don&#8217;t like acronyms, usually, because I don&#8217;t think they&#8217;re terribly interesting (WAG the Dog&#8217;s acronym notwithstanding - I liked that one).</p>
<p>Anyway, &#8220;Jangle&#8221; was there before I was.  I don&#8217;t have to like the name to think the project is worthwhile.  Still, sometimes it pains me to spend all my time on a project that I had no influence over the title.  Silly, yes, but that&#8217;s why my pants are so fancy.</p>
]]></content:encoded>
			<wfw:commentRss>http://dilettantes.code4lib.org/2008/11/i-couldnt-agree-more/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Working around Ruby with XSLT</title>
		<link>http://dilettantes.code4lib.org/2008/09/working-around-ruby-with-xslt/</link>
		<comments>http://dilettantes.code4lib.org/2008/09/working-around-ruby-with-xslt/#comments</comments>
		<pubDate>Tue, 16 Sep 2008 21:16:53 +0000</pubDate>
		<dc:creator>Ross</dc:creator>
		
		<category><![CDATA[jangle]]></category>

		<category><![CDATA[ruby]]></category>

		<category><![CDATA[xslt]]></category>

		<guid isPermaLink="false">http://dilettantes.code4lib.org/?p=120</guid>
		<description><![CDATA[My relationship with Ruby nowadays is roughly akin to somebody addicted to pain killers.  I know it&#8217;s not good for me (since everything I work on nowadays is RDF, XML or both) but I&#8217;m able to still be productive and the pain of quitting, while in the long run would be better for everybody, just [...]]]></description>
			<content:encoded><![CDATA[<p>My relationship with Ruby nowadays is roughly akin to somebody addicted to pain killers.  I know it&#8217;s not good for me (since <em>everything</em> I work on nowadays is RDF, XML or both) but I&#8217;m able to still be productive and the pain of quitting, while in the long run would be better for everybody, just isn&#8217;t something I have time for right now.  Maybe someday I&#8217;ll make the jump back to Python (since it&#8217;s actually pretty good at dealing with both RDF and XML), but for now I&#8217;ll just find workarounds to my problems (unlike others, I am completely incapable of juggling more than one language).</p>
<p>I first ran into my big XML and Ruby problem a couple of weeks ago while working on the TalisLMS connector for Jangle.  I&#8217;ve, of course, run into it before, but it has never been a total show stopper like this.  In order to add the Resource entity to the TalisLMS (Jangle-ese for bibliographic records) connector, I am querying the Platform store the OPAC uses.  I&#8217;m using the Platform rather than the Zebra index that comes with Alto (the records are indexed in both places) because the modified date isn&#8217;t sortable in Zebra and that would be an issue when serializing everything to Atom.  The records are transformed into a proprietary RDF format (called BibRDF) when loaded into the Platform (this is for the benefit of Prism, our OPAC).  In order to get the MARC records (there&#8217;s no route back to the MARC from BibRDF), I have to pull the UniqueIdentifer (which is the mapped 001)  field out of the BibRDF and throw them in a Z39.50 client (<a href="http://ruby-zoom.rubyforge.org/" target="_blank">Ruby/ZOOM</a>) and query the Zebra index.  In order to get enough metadata to create a valid Atom entry, I needed to be able to parse the BibRDF (which comes out of the Platform as RDF/XML), since that is the default record format.</p>
<p>And this is where I&#8217;d run into problems.  I have the default number of records set to be returned by the Jangle to 100.  That&#8217;s a pretty sweet spot for both servers to handle the load and clients to deal with resulting Atom document.  Well, you&#8217;d think it was, anyway, except REXML was taking about 10 seconds to parse the Platform response into Ruby objects.</p>
<p>I realize the Rubyists out there are already dismissing this and scrolling down to the comment box to write &#8220;well don&#8217;t use REXML, you dumbass&#8221;, but let me explain.  I generally <em>don&#8217;t</em> use REXML (unless it&#8217;s something very small and simple), instead opting for Hpricot for parsing XML.  I&#8217;ve tended to avoid LibXML in Ruby, when I first tried it, it segfaulted a lot, but that was the past&#8230; my reasons for avoiding it lately is because I have this stubborn ideal about having things work with JRuby and that&#8217;s just not going to be an option with LibXML (before you scroll down and add another comment about the Ruby/ZOOM requirement, it will eventually be replaced with Ruby-SRU&#8230; probably).  Hpricot was falling flat on its face with the BibRDF namespace prefixes, though (j.0:UniqueIdentifier).  It seems to have problems with periods in the prefix, so that was a no go.</p>
<p>So I had REXML and I had horrible performance.  Now what?</p>
<p>Well, JSON is fast in Ruby, so I thought that might be an option.  The Platform has a transform service, if you pass an argument with the URL for an XSLT stylesheet, it will output the result in the format you want.  <a href="http://www.google.com/search?q=xml+to+json+xslt" target="_blank">Googling found several projects</a> that would turn XML into JSON via XSLT (<a href="http://www.bramstein.com/projects/xsltjson/" target="_blank">this one seems the best</a> if you have an XSLT 2.0 parser), but they weren&#8217;t <em>quite</em> what I needed.  I wanted to preserve the original RDF/XML since I was just going to be turning around and regurgitating it back to the Jangle server, anyway.  I just needed a quick way to grab the UniqueIdentifier, MainAuthor and LastModified fields and shove the rest of the XML into an object attribute.</p>
<p>I have always chafed at the thought of actually doing anything in XSLT.  In retrospect (after I&#8217;ve been using almost exclusively for a month, now), I realize that my opinion was probably actually the result of the data that I was trying to transform (EAD, the metadata format designed to punish technologists) rather than XSLT itself (the project got sucked into a vortex when I tried working with the EAD directly with Ruby, too).  Still, I had always resisted.  The syntax is weird, variables confused me, I just never got the hang of it.</p>
<p>But, damn, it&#8217;s fast.</p>
<p>And, when I turned the XML into JSON (with XML), it was perfect.  <a href="http://jangle.googlecode.com/svn/trunk/xsl/skywalk2json.xsl" target="_blank">Here&#8217;s my stylesheet</a>.  <a href="http://api.talis.com/tx?xsl-uri=http://jangle.googlecode.com/svn/trunk/xsl/skywalk2json.xsl&amp;xml-uri=http://api.talis.com/stores/bib-demo-2/items?query%3D*:*%26sort%3Ddisplayaslastmodified:d%26offset%3D0%26max%3D100" target="_blank">Here&#8217;s what the output from the Platform</a> looks like.  <a href="http://anvil.lisforge.net:4567/resources/" target="_blank">Here&#8217;s the output</a> from the TalisLMS connector.</p>
<p>I wasn&#8217;t done, yet, though.  The DLF ILS-DI Adapter for Jangle&#8217;s OAI-PMH service was sooooo slow.  Requests were literally taking around 35 seconds each.  This was because I was using <a href="http://www.sporkmonger.com/projects/feedtools/">FeedTools</a> to parse the Atom documents and Builder::XmlMarkup to generate the OAI-PMH output.  And this was silly.  Atom is a very short hop to OAI-PMH, and there was really no need to manipulate the data itself at all.  However, I did need to add stuff to the final XML output that I wouldn&#8217;t know until it was time to render.  So I wrote <a href="http://code.google.com/p/jangle/source/browse/#svn/trunk/external_interfaces/xsl" target="_blank">these two XSLTs</a>.  I have patterns in there which are identified by &#8220;##verb##&#8221; or &#8220;##requestUrl##&#8221;, etc.  This way, I can load the XSLT file into my Ruby script, replace the patterns with their real values via regex, and then transform the Atom to OAI-PMH using <a href="http://libxsl.rubyforge.org/" target="_blank">libxslt-ruby</a>.  Requests are now down to about 5 seconds.  Not bad.</p>
<p>All in all I&#8217;m pretty happy with this.  And I don&#8217;t have to quit my addiction just yet.</p>
<p>For those of you that noticed that libxslt-ruby doesn&#8217;t quite jibe with my JRuby requirement, well, I guess I&#8217;m not a very dogmatic at the end of the day (which is right about now).</p>
]]></content:encoded>
			<wfw:commentRss>http://dilettantes.code4lib.org/2008/09/working-around-ruby-with-xslt/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Risk, reward, and the in-between</title>
		<link>http://dilettantes.code4lib.org/2008/07/risk-reward-and-the-in-between/</link>
		<comments>http://dilettantes.code4lib.org/2008/07/risk-reward-and-the-in-between/#comments</comments>
		<pubDate>Mon, 07 Jul 2008 16:54:41 +0000</pubDate>
		<dc:creator>Ross</dc:creator>
		
		<category><![CDATA[jangle]]></category>

		<category><![CDATA[philosophizing]]></category>

		<guid isPermaLink="false">http://dilettantes.code4lib.org/?p=119</guid>
		<description><![CDATA[I have been following a thread on the VuFind-Tech list regarding the project&#8217;s endorsement of Jangle to provide the basis of the ILS plugin architecture for that project.  It&#8217;s not an explicit mandate, just a pragmatic decision that if work is going in to creating a plugin for VuFind, it would make more sense (from [...]]]></description>
			<content:encoded><![CDATA[<p>I have been following <a href="http://sourceforge.net/mailarchive/forum.php?thread_name=486BDDB9.1030205%40lehigh.edu&amp;forum_name=vufind-tech" target="_blank">a thread on the VuFind-Tech</a> list regarding the project&#8217;s endorsement of <a href="http://jangle.org/" target="_blank">Jangle</a> to provide the basis of the ILS plugin architecture for that project.  It&#8217;s not an explicit mandate, just a pragmatic decision that if work is going in to creating a plugin for <a href="http://vufind.org/" target="_blank">VuFind</a>, it would make more sense (from an open source economics point of view) if that plugin was useful to more projects than just VuFind.  More users, more interest, more community, more support.</p>
<p>The skepticism of Jangle is understandable and expected.  After all, it&#8217;s a very unorthodox approach to library data, seemingly eschewing <a href="http://diglib.org/architectures/ilsdi/" target="_blank">other library initiatives</a> and, at the surface, seems to be wholly funded by a <a href="http://talis.com/" target="_blank">single vendor</a>&#8217;s support.</p>
<p>And, certainly, Jangle may fail.  Just like any other project.  Just like VuFind.  Just like <a href="http://open-ils.org/" target="_blank">Evergreen</a>.  Any new innovative project brings risk.  More important than the direct reward of any of these initiatives succeeding is the disruption they bring to the status quo.  Instead of what they directly bring to the table, what do they change about how we view the world?</p>
<p>Let&#8217;s start with Evergreen.  Five years ago I sat in a conference room at <a href="http://web.library.emory.edu/" target="_blank">Emory&#8217;s main library</a> while Brad LaJeunesse and Jason Etheridge (this predated PINES hiring Mike Rylander and Bill Erickson) told us that they were ditching Unicorn and building their own system.  I, like the others in the room, Selden Deemer, Martin Halbert, smiled and nodded and when they left I (Mr. Library Technology Polyanna) turned to the others and said that I liked their moxie, but it was never going to work.  <a href="http://koha.org/" target="_blank">Koha</a> was the only precedent at the time, and, frankly, it seemed like a toy.</p>
<p>Now where are we?  Most of the public libraries in Georgia using Evergreen, a large contingency from British Columbia migrating, and a handful of academic libraries either live or working towards migration.  Well, I sure was wrong.</p>
<p>The more significant repercussion of PINES going live with Evergreen was that it cast into doubt our assumptions of how our relationship with our integrated library system needed to work.  Rather than the library waiting for their vendor to provide whatever functionality they need or want, they can instead, implement it themselves.  While it&#8217;s unrealistic for every library to migrate to Evergreen or Koha, these projects have brought to light the lack of transparency and cooperation in the ILS marketplace.</p>
<p>Similarly, projects like VuFind, <a href="http://blacklight.rubyforge.org/" target="_blank">Blacklight</a> and <a href="http://code.google.com/p/fac-back-opac/" target="_blank">fac-back-opac</a> prove that by pulling some off-the-shelf non-library-specific applications and cleverly using existing web services (like covers from Amazon) that we can cheaply and quickly create the kinds of interfaces we have been begging from our vendors for years.  It is unlikely that all of these initiatives will succeed, and the casualties will more likely be the result of the technology stack they are built upon rather than any lack of functionality, the fact that they all appeared around the same time and answer roughly the same question, shows that we can pool our resources and build some pretty neat things.</p>
<p>To be fair, the real risk taker in this arena was <a href="http://www.lib.ncsu.edu/catalog/" target="_blank">NC State</a>.  They spent the money on Endeca and rolled out the interface that wound up changing the way we looked at the OPAC.  The reward of NCSU&#8217;s entrepreneurialism is that we now have projects like VuFind and its ilk.  Very few libraries can afford to be directly rewarded by NC State&#8217;s catalog implementation, but with every library that signs on with <a href="http://www.iii.com/products/encore.shtml" target="_blank">Encore</a> or <a href="http://www.exlibrisgroup.com/category/PrimoOverview" target="_blank">Primo</a>, III and Ex Libris owe that sale to a handful of people in Raleigh.  You would not be able to download and play with VuFind if NC State libraries had worried too much about failure.</p>
<p>Which then brings me to Jangle.  The decision to build the spec on the <a href="http://bitworking.org/projects/atom/rfc5023.html" target="_blank">Atom Publishing Protocol</a> has definitely been the single most criticism of the project (once we removed the confusing, outdated wiki pages about Jangle being an Rails application), but there has been little dialogue as to <em>why</em> it wouldn&#8217;t work (actually, none).  The purpose of Jangle is to provide an API for roughly 95% of your local development needs with regards to your library services.  There will be edge cases, for sure, and Jangle might not cover them.  At this point, it&#8217;s hard to tell.  What is easier to tell, however, is that dwelling on the edge cases does absolutely nothing to address the majority of needs.  Also, the edge cases are mainly library-internal-specific problems (like circulation rules).  A campus or municipal IT person doesn&#8217;t particularly care about these specifics when trying to integrate the library into courseware or some e-government portal.  They just want a simple way to get the data.</p>
<p>This doesn&#8217;t mean that Jangle is solely relegated to simple tasks, however.  It just is capable of scaling down to simple use cases.  And that&#8217;s where I hope Jangle causes disruption whether or not it is ultimately the technology that succeeds.  By leveraging popular non-library-specific web standards it will make the job of the systems librarian or the external developer easier, whether it&#8217;s via AtomPub or some other commonly deployed protocol.</p>
]]></content:encoded>
			<wfw:commentRss>http://dilettantes.code4lib.org/2008/07/risk-reward-and-the-in-between/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Whew</title>
		<link>http://dilettantes.code4lib.org/2008/04/whew/</link>
		<comments>http://dilettantes.code4lib.org/2008/04/whew/#comments</comments>
		<pubDate>Thu, 24 Apr 2008 02:36:34 +0000</pubDate>
		<dc:creator>Ross</dc:creator>
		
		<category><![CDATA[Talis]]></category>

		<guid isPermaLink="false">http://dilettantes.code4lib.org/?p=117</guid>
		<description><![CDATA[Thank God I&#8217;ve already been hired.  Hopefully this won&#8217;t be on my annual appraisal.
]]></description>
			<content:encoded><![CDATA[<p>Thank God I&#8217;ve already been hired.  <a href="http://blogs.talis.com/n2/archives/57" target="_blank">Hopefully this won&#8217;t be on my annual appraisal</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://dilettantes.code4lib.org/2008/04/whew/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Dear Innovative Customers</title>
		<link>http://dilettantes.code4lib.org/2008/04/dear-innovative-customers/</link>
		<comments>http://dilettantes.code4lib.org/2008/04/dear-innovative-customers/#comments</comments>
		<pubDate>Thu, 10 Apr 2008 02:07:50 +0000</pubDate>
		<dc:creator>Ross</dc:creator>
		
		<category><![CDATA[libraries]]></category>

		<guid isPermaLink="false">http://dilettantes.code4lib.org/?p=116</guid>
		<description><![CDATA[Why do you put up with this crap?
Maybe it&#8217;s about time you all started to explore this idea again.
]]></description>
			<content:encoded><![CDATA[<p>Why do you put up with <a href="http://blogs.lib.berkeley.edu/shimenawa.php/2008/04/04/ils_basic_discovery" target="_blank">this crap</a>?</p>
<p>Maybe it&#8217;s about time you all started to <a title="ILS Customer Bill of Rights" href="http://www.blyberg.net/2005/11/20/ils-customer-bill-of-rights/" target="_blank">explore this idea again</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://dilettantes.code4lib.org/2008/04/dear-innovative-customers/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Blindly groping towards ActivePlatform</title>
		<link>http://dilettantes.code4lib.org/2008/04/blindly-groping-towards-activeplatform/</link>
		<comments>http://dilettantes.code4lib.org/2008/04/blindly-groping-towards-activeplatform/#comments</comments>
		<pubDate>Thu, 10 Apr 2008 00:23:07 +0000</pubDate>
		<dc:creator>Ross</dc:creator>
		
		<category><![CDATA[activerdf]]></category>

		<category><![CDATA[coding]]></category>

		<category><![CDATA[platform]]></category>

		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://dilettantes.code4lib.org/?p=115</guid>
		<description><![CDATA[Something I&#8217;ve taken it upon myself to do since I joined Talis is make ActiveRDF a viable client to access the Platform.  While this is mostly selfishness on my part (I want to keep developing in Ruby and there&#8217;s basically no RDF support right now, plus this gives me a chance to learn about the [...]]]></description>
			<content:encoded><![CDATA[<p>Something I&#8217;ve taken it upon myself to do since I joined Talis is make <a href="http://activerdf.org/" target="_blank">ActiveRDF</a> a viable client to access the Platform.  While this is mostly selfishness on my part (I want to keep developing in Ruby and there&#8217;s basically no RDF support right now, plus this gives me a chance to learn about the RDF/SPARQL-y aspects of the Platform), I also think that libraries like this can only help democratize the Platform.</p>
<p>So far, it&#8217;s been pretty ugly.  I haven&#8217;t had much time to work on it, granted, but the time I&#8217;ve spent on it has made me think that there will be a lot of work to do.  Couple this with some of the things that make the Platform difficult to work with in Ruby anyway (read: Digest Authentication) and this might be a more uphill battle than I&#8217;ll <em>ever</em> have time for, but I figure it&#8217;s either this or go back to Python and I&#8217;m not quite ready to give up on Ruby yet.</p>
<p>Currently, performance is abysmal with ActiveRDF against the Platform, so I&#8217;ll need to think of shortcuts to improve that (I&#8217;m not even considering write access presently).  Here&#8217;s some code (this is as much for my benefit, so I can remember what I&#8217;ve done) to work with Ian Davis&#8217; Quotations Book Example store:</p>
<blockquote><p>require &#8216;time&#8217; # Otherwise ActiveRDF starts freaking out about DateTime<br />
require &#8216;active_rdf&#8217;</p>
<p>$activerdf_without_xsdtype = true<br />
# less than ideal, but without it, ActiveRDF sends<br />
# ^^&lt;http://www.w3.org/2001/XMLSchema#string&gt; with string literals even if you don&#8217;t want<br />
# to send the datatype.  I haven&#8217;t actually tried it with other datatypes to see how this breaks<br />
# down the road.</p>
<p>ConnectionPool.set_data_source(:type =&gt; :sparql, :results =&gt; :sparql_xml, :engine=&gt;:joseki,  :url=&gt; &#8220;http://api.talis.com/stores/iand-dev2/services/sparql&#8221;)</p>
<p>Namespace.register :foaf, &#8220;http://xmlns.com/foaf/0.1/&#8221;<br />
Namespace.register :dc, &#8220;http://purl.org/dc/elements/1.1/&#8221;<br />
Namespace.register :quote, &#8220;http://purl.org/vocab/quotation/schema&#8221;</p>
<p>QUOTE::Quotations.find_by_dc::creator(&#8221;Loren, Sophia&#8221;).each do | quote |</p></blockquote>
<blockquote><p># print the important stuff from each graph</p>
<p># http://purl.org/vocab/quotation/schema#quote has to be manually added as a predicate<br />
# the &#8220;#&#8221; seems to cause problems<br />
quote.add_predicate(:quote, QUOTE::quote)<br />
puts quote.quote<br />
puts quote.subject<br />
puts quote.rights<br />
puts quote.isPrimaryTopicOf</p></blockquote>
<blockquote><p>end</p></blockquote>
<p>If you actually try to execute this, you&#8217;ll see that it takes a long time to run (God help you if you try it on QUOTE::Quotations.find_by_dc::subject(&#8221;Age and Aging&#8221;)).  A really long time.</p>
<p>If you set some environment vars before you go into irb:</p>
<blockquote><p>$ export ACTIVE_RDF_LOG_LEVEL=0<br />
$ export ACTIVE_RDF_LOG=./activerdf.log</p></blockquote>
<p>then you can tail -f activerdf.log and see what exactly is happening.</p>
<p>After ActiveRDF does it&#8217;s initial SPARQL query (<em>SELECT DISTINCT ?s WHERE { ?s &lt;http://purl.org/dc/elements/1.1/creator&gt; &#8220;Loren, Sophia&#8221; . }</em>), it&#8217;s doing two things for every request in the block:</p>
<ol>
<li>a SPARQL query for every predicate associated with the URI (<em>http://api.talis.com/stores/iand-dev2/services/sparql?query=SELECT+DISTINCT+%3Fp+WHERE+%7B+%3Chttp%3A%2F%2Fapi.talis.com%2Fstores%2Fiand-dev2%2Fitems%2F1187139384317%3E+%3Fp+%3Fo+.+%7D+</em>)</li>
<li>a SPARQL query for the value of the attribute (predicate):  <em>http://api.talis.com/stores/iand-dev2/services/sparql?query=SELECT+DISTINCT+%3Fo+WHERE+%7B+%3Chttp%3A%2F%2Fapi.talis.com%2Fstores%2Fiand-dev2%2Fitems%2F1187139384317%3E+%3Chttp%3A%2F%2Fpurl.org%2Fdc%2Felements%2F1.1%2Fcreator%3E+%3Fo+.+%7D</em></li>
</ol>
<p><em>for every predicate in the graph</em>.  You can imagine how crazily inefficient this is, since to get every value for a resource, you have to make a different HTTP request for each one.</p>
<p>Obviously this would be a lot easier if it used DESCRIBE rather than SELECT, but without a real RDF library to parse the resulting graph, I&#8217;m not sure how ActiveRDF would deal with what the triple store returned.</p>
<p>So, anyway, these are some of the hurdles in making ActiveRDF work with the Platform, but I&#8217;m not quite ready to throw in the towel, yet.</p>
]]></content:encoded>
			<wfw:commentRss>http://dilettantes.code4lib.org/2008/04/blindly-groping-towards-activeplatform/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Mea Culpa</title>
		<link>http://dilettantes.code4lib.org/2008/04/mea-culpa/</link>
		<comments>http://dilettantes.code4lib.org/2008/04/mea-culpa/#comments</comments>
		<pubDate>Thu, 03 Apr 2008 17:40:53 +0000</pubDate>
		<dc:creator>Ross</dc:creator>
		
		<category><![CDATA[jangle]]></category>

		<guid isPermaLink="false">http://dilettantes.code4lib.org/?p=114</guid>
		<description><![CDATA[Jangle-discuss is now publicly viewable.  Since I&#8217;m always logged into the Googles, I never noticed that it was blocked to non-subscribers.
Sorry about that.
]]></description>
			<content:encoded><![CDATA[<p><a href="http://groups.google.com/group/jangle-discuss">Jangle-discuss</a> is now publicly viewable.  Since I&#8217;m always logged into the Googles, I never noticed that it was blocked to non-subscribers.</p>
<p>Sorry about that.</p>
]]></content:encoded>
			<wfw:commentRss>http://dilettantes.code4lib.org/2008/04/mea-culpa/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Bootstrapping Jangle</title>
		<link>http://dilettantes.code4lib.org/2008/04/bootstrapping-jangle/</link>
		<comments>http://dilettantes.code4lib.org/2008/04/bootstrapping-jangle/#comments</comments>
		<pubDate>Wed, 02 Apr 2008 18:47:08 +0000</pubDate>
		<dc:creator>Ross</dc:creator>
		
		<category><![CDATA[Community building]]></category>

		<category><![CDATA[jangle]]></category>

		<guid isPermaLink="false">http://dilettantes.code4lib.org/2008/04/02/bootstrapping-jangle/</guid>
		<description><![CDATA[After several months of trying, Jangle.org is finally starting to take off.  I set up a Drupal instance yesterday on our new web host.
When I was still at Georgia Tech, one of the things I was trying to work on was a framework to consistently and easily expose the library&#8217;s data from its various silos [...]]]></description>
			<content:encoded><![CDATA[<p>After several months of trying, <a href="http://jangle.org/" target="_blank">Jangle.org</a> is finally starting to take off.  I set up a Drupal instance yesterday on our new web host.</p>
<p>When I was still at Georgia Tech, one of the things I was trying to work on was a framework to consistently and easily expose the library&#8217;s data from its various silos into external services.  In that case, my initial focus was the <a href="https://t-square.gatech.edu/portal" target="_blank">Sakai implementation</a> that we were rolling into production, but the intention was to make it as generic as possible (i.e. the opposite of a &#8220;<a href="http://www.blackboard.com/extend/b2/" target="_blank">Blackboard Building Block</a>&#8220;) so it could be consumed and reconstituted into as many applications as we wanted.</p>
<p>Coincidentally (and, for me, conveniently), Talis was also thinking about such a framework that would supply a generic <abbr title="Service Oriented Architecture">SOA</abbr> layer to libraries (and potentially beyond) and contacted me about possibly collaborating with them on it as an open source project.  Obviously that relationship changed a bit when they hired me and they put me and my colleague <a href="http://townx.org/" target="_blank">Elliot Smith</a> (reports of his demise have been greatly exaggerated) in charge of trying to get this project off the ground.  Thankfully, Elliot is the other Talis malcontent who prefers Ruby, so our early prototypes all focused on Rails (the Java that originally seeded the project, like all Java, made my eyes glaze over).</p>
<p>We had a hard time getting anywhere at first.  Not even taking into consideration the fact that he and I were an ocean apart, we really had no idea what it was that we should be building or why it would be useful to Talis (after all, they are paying the bills) since they already have an SOA product, <a href="http://www.talis.com/keystone/" target="_blank">Keystone</a>.  Also, we didn&#8217;t want to recreate <a href="http://synapse.apache.org/" target="_blank">Apache Synapse</a> or <a href="http://rice.kuali.org/" target="_blank">Kuali Rice</a>.  In essence, we were trying to find a solution to a problem we hadn&#8217;t really defined, yet.</p>
<p>In December and early January, I drove across town for a couple of meetings with Mike Rylander, Bill Erickson and Jason Etheridge from <a href="http://esilibrary.com/esi/" target="_blank">Equinox</a> to try to generate interest in Jangle and, at the same time, solicit ideas from them as to what this project should look like and do.  Thankfully, they gave me both.</p>
<p>Jangle still foundered a bit through February.  We were waiting for the <a href="https://project.library.upenn.edu/confluence/display/ilsapi/Draft+Recommendation" target="_blank">DLF&#8217;s ILS and Discovery Systems API recommendation</a> to come out (since we had targeted that as goal) and Elliot produced a prototype in JRuby (we had long abandoned Rails for this) that effectively consumed the Java classes used for Keystone and rewrote them for Jangle.  The problem we were still facing, though, is that we were, effectively, just creating another niche library interface from scratch and there were too many possible avenues to take to accomplish that.  Our freedom was paralyzing us.</p>
<p>I gave a <a href="/wp-content/uploads/2008/04/jangle-lightning-talk.pdf" target="_blank">lightning talk on Jangle at Code4lib2008</a> that was big on rah-rah rhetoric (free your data!) and short on details (since we hadn&#8217;t really come up with any yet) that generated some interest and a few more subscriptions to our <a href="http://groups.google.com/group/jangle-discuss" target="_blank">Google Group</a>.  A week later, the DLF met with the vendors to talk about their recommendation.   I attended by phone.  While in many ways I feel the meeting was a wash, it did help define for me what Jangle needed to do.</p>
<p>At the end of my first meeting with Equinox, Mike Rylander asked me if we had considered supporting the <a href="http://bitworking.org/projects/atom/rfc5023.html" target="_blank">Atom Publishing Protocol</a> in Jangle.  At the time, I hadn&#8217;t.  In fact, I didn&#8217;t until I sat on the phone for 8 hours listening to the vendors hem and haw over the DLF&#8217;s recommendation.  The more I sat there (with my ear getting sore), the more I realized that AtomPub might be a good constraint to get things moving (as well as useful to appealing to non-library developers).</p>
<p>We are just now trying to start building how this spec might work.  Basically there are two parts.  First, the Jangle &#8220;core&#8221; which is an AtomPub interface to external clients.  It&#8217;s at this level that we need to model how library resources map to Atom (and other common web data structures, like vCard) and where we need to extend Atom to include data like MARC (when necessary).  The Jangle core also proxies these requests to the service &#8220;connectors&#8221; and translates their responses back to the AtomPub client.  The connectors are service specific applications that takes the specific schema and values in, say, a particular ILS&#8217;s RDBMS and puts them in a more syntax to send back to the Jangle core.  Right now, the proposal is that all communication between the core and connectors would be JSON over HTTP (again, to help forward momentum).</p>
<p>So at this point you may be asking why AtomPub rather than implementing the recommendations of the DLF directly?  The recommendation assumes the vendors will be complicit, uniform and timely in implementing their API and I cynically feel that is unrealistic.  I also think it helps to get a common, consistent interface to help build interoperability (like the kind that the DLF group is advocating), since then you&#8217;d only have to write one, say, NCIP adapter and it would work for all services that have a Jangle connector.  Also, by leveraging non-library technologies, it opens up our data to groups outside our walls.</p>
<p>So, if you&#8217;re interested in freeing your data (rah-rah!), come help us build this spec.  We&#8217;re trying to conform to the <a href="http://wiki.code4lib.org/index.php/Rogue" target="_blank">Rogue &#8216;05 specification</a> that <a href="http://onebiglibrary.net/" target="_blank">Dan Chudnov</a> came up with for development of this so, while it will still be a painful process, it won&#8217;t be painful and long. :)  In other words, this ain&#8217;t NISO.</p>
]]></content:encoded>
			<wfw:commentRss>http://dilettantes.code4lib.org/2008/04/bootstrapping-jangle/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Buy me</title>
		<link>http://dilettantes.code4lib.org/2008/03/buy-me/</link>
		<comments>http://dilettantes.code4lib.org/2008/03/buy-me/#comments</comments>
		<pubDate>Thu, 06 Mar 2008 15:58:01 +0000</pubDate>
		<dc:creator>Ross</dc:creator>
		
		<category><![CDATA[Real estate classifieds]]></category>

		<guid isPermaLink="false">http://dilettantes.code4lib.org/2008/03/06/buy-me/</guid>
		<description><![CDATA[Our house is back on the market.
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.erathebakergroup.com/ListNow/Property.aspx?PropertyID=1698584" target="_blank">Our house is back on the market</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://dilettantes.code4lib.org/2008/03/buy-me/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Real men go to conferences with their mothers</title>
		<link>http://dilettantes.code4lib.org/2008/03/real-men-go-to-conferences-with-their-mothers/</link>
		<comments>http://dilettantes.code4lib.org/2008/03/real-men-go-to-conferences-with-their-mothers/#comments</comments>
		<pubDate>Tue, 04 Mar 2008 03:28:27 +0000</pubDate>
		<dc:creator>Ross</dc:creator>
		
		<category><![CDATA[code4libcon2008]]></category>

		<guid isPermaLink="false">http://dilettantes.code4lib.org/2008/03/03/real-men-go-to-conferences-with-their-mothers/</guid>
		<description><![CDATA[In most cases, the suggestion that I travel across the country with my mom to attend a library technology conference would be greeted with incredulous shock.  It would be about the same reaction I&#8217;d have to the expectation that I take my one and a half year old son across the country.   [...]]]></description>
			<content:encoded><![CDATA[<p>In most cases, the suggestion that I travel across the country with my mom to attend a library technology conference would be greeted with incredulous shock.  It would be about the same reaction I&#8217;d have to the expectation that I take my one and a half year old son across the country.   However, that was the position I found myself last Monday, at 5:30AM, driving frantically from Chattanooga to Nashville so as not to miss our flight to Portland for <a href="http://code4lib.org/conference/2008/" target="_blank">Code4lib 2008</a>.</p>
<p>Why would I subject myself to this?  Well, a majority of my family lives in Portland and it seemed like a good opportunity for Che to meet his 97 year old great-grandmother.  Since Selena couldn&#8217;t go, my mother volunteered to join me and take care of Che while I was in the conference.  Surprisingly, despite ridiculously planned twelve hour traveling days, Che was a remarkably good traveling companion.  Especially given that the day before we left, he was up all night vomiting from a stomach virus he picked up at daycare.  But enough about my stupid traveling decisions for now.</p>
<p>Code4lib 2008 set an awfully high bar for <a href="http://dilettantes.code4lib.org:6789/election/results/3" target="_blank">Providence, RI to follow</a>.  Jeremy Frumkin managed to find an <a href="http://embassysuites1.hilton.com/en_US/es/hotel/PDXPSES-Embassy-Suites-Portland-Downtown-Oregon/index.do" target="_blank">amazing hotel</a> with both free breakfast and happy hour in the downtown of a remarkable city and somehow managed perfect weather in Portland at the end of February.  Is it ok to name Jeremy president for life of Code4lib?  Good luck, Brown University, Jeremy just made your job insanely hard.</p>
<p>I would say the overarching theme of this year&#8217;s event was &#8220;help us with our open source project!&#8221;.  Or maybe, &#8220;fooled you!  This actually all about RDF&#8221;.   Also, given how this is one of the more premier library technology conferences, we might want to give a scholarship to an MBA or two to teach us how to use a projector and Powerpoint.   I began to think there was a hex on the podium.</p>
<p>Rather than go over the presentations themselves (since that will be done more eloquently elsewhere, I&#8217;m sure), I&#8217;ll just make some observations.  My perspective changed somewhat after Brewster Kahle&#8217;s keynote and Rob Styles&#8217; presentation (during the following break) since my role in the conference went from &#8216;jerk in the audience making snarky comments in IRC&#8217; to master of ceremonies when Jeremy had to go back to Corvallis to care for his sick daughter (or, rather, for his sick daughter and exhausted wife).</p>
<p>Rob was the first to focus on RDF and I think the constraint of our twenty minute presentation slots was both a blessing and a curse here.  Rob did an excellent job of explaining why RDF is a good fit for MARC data (or, rather, the metadata that we are currently putting in MARC), but there wasn&#8217;t enough time for that <em>and</em> demonstrating why we would want to go through the effort of actually doing it (like, for linked open data and whatnot).  It was a good overview of busting the MARC into its conceptual components and making connections between those components, however.</p>
<p>If any of my former colleagues at Georgia Tech still read my blog (hello!), I definitely urge you to take a look at Oregon State&#8217;s <a href="http://ica.library.oregonstate.edu/about/index.html" target="_blank">Interactive Course Assignment Pages</a> (ICAP).  This is exactly what I was trying to do when I wrote the subject guides application there.  There is a lot of what appears to be NIH syndrome when it comes to subject/course guide applications; in reality I think these applications have to conform to a lot of local needs and expectations which is why &#8220;somebody else&#8217;s code&#8221; doesn&#8217;t always do the trick.  ICAP is <em>so</em> similar to what Tech is running (although executed much, <em>much</em> more elegantly) that I don&#8217;t think there would be much of a leap for them to migrate.  As an aside, the developer (Kim Griggs) mentioned that it took four months from proof-of-concept to production.  I find this an amazing attribute of Ruby of Rails.  The Umlaut took slightly less than six months.  I should add these were both <em>one person development teams</em>.</p>
<p>Next up, David Walker talked about the new Worldcat API.  What I found interesting about his talk is that he said his initial interest in the API was to be able to build ad-hoc union catalogs when he needed to.  This was <a href="http://dilettantes.code4lib.org/2007/03/29/in-search-of-bigfoot/">my original reason for trying out the Talis Platform</a> when I was at Georgia Tech (although I could never figure out how to manage getting all the libraries I wanted to work with to get their holdings in a Platform store), so it definitely resonated.  With the gravitational pull that OCLC already has in the U.S., this idea of &#8216;union catalog for specific problem set&#8217; could really flourish.  Of course, since not every library can afford to put their holdings in Worldcat (and therefore have access to the API) it may not be all that useful to the sorts of libraries that would gain the largest benefit.</p>
<p>While I was impressed by Winona Salesky&#8217;s and Michael Park&#8217;s presentation on XForms (there were definitely some slick features there!), my takeaway was that this technology seemed too difficult to deploy (when your options are browser extensions or Java servlets, I&#8217;ll pass on that).  Am I missing something here?  Java purists, you are free to mock me and my scripting language ways.</p>
<p>Interestingly, the Zotero presentation removed pretty much all references to RDF and the Semantic Web that appeared in their proposal.</p>
<p>The breakout session I attended on Tuesday was proposed by Jonathan Rochkind (who I co-presented with on the Umlaut) about finding a way to isolate only the open access content in OAIster.  While maintaining a separate index of this data might be useful (sort of like what IndexData does, but they also include the non-free material; I am also harvesting some of this data with the intention of putting it into a platform store&#8230; but whoa does the clean-up of the data take time&#8230;), the group eventually decided that a web service that identified whether or not OAIster results were OA or not (via whitelists, blacklists, etc.) might be an easier first step.  I&#8217;ve created a <a href="http://groups.google.com/group/open-oaister" target="_blank">Google Group to carry this discussion forward</a> here, if anybody is interested in participating.</p>
<p>I can&#8217;t remember which lightning talks happened on day one (is there a list published anywhere?), but it doesn&#8217;t matter.  The day two lightning talks showed why having this style of presentation is so great.  The reasons can be summed up by pictures of underpants and player piano midi files being played from musical scores generated from OCR.  When the video files are up, definitely check those two out.</p>
<p>Did I mention that there were free drinks from 5:30-7:30 every day?</p>
<p>Karen Coyle opened day two with her keynote on RDA.  Corey Harper closed the formal presentations the next day on the same topic.  It was pretty neat how they managed to not step on each other&#8217;s toes.  I think their message resounded pretty loudly:  people like Code4libbers need to get involved in RDA and DCAM to ground it in reality.  Ok, I&#8217;ll see what I can do.</p>
<p>LibLime&#8217;s MARC editor was quite nice.  Granted, I&#8217;ve never used OCLC Connexion, but I would have to think something like this would be a strong competitor.</p>
<p>I&#8217;ll skip over Aaron Swartz&#8217;s presentation (based on the number of Flickr photos of his presentation, I figure there must be plenty about it already), but I plan on writing a bit about ThingDB and other document-centric databases really soon.</p>
<p>Skipping up to the DLF ILS API, both Emily and Terry&#8217;s presentation as well as the breakout session on this were incredibly useful.  I feel like the DLF has a pretty pragmatic approach to working on the problems of interoperability and Emily and Terry were really good emissaries to explain their goals to Code4lib.  During the breakout I introduced <a href="http://jangle.org/" target="_blank">Jangle</a> and later gave a lightning talk on it.  Since the cat&#8217;s out of the bag, I absolutely will have a post about that this week.  While I don&#8217;t exactly trust the vendors&#8217; response to the DLF proposal (they meet on Thursday), I think that the potential of this is mutually beneficial to every party.  Jangle was quite well received, by the way.</p>
<p><a href="http://omeka.org/" target="_blank">Omeka</a> seems exactly like what <a href="http://www.greenstone.org/" target="_blank">Greenstone</a> promised to be, but wasn&#8217;t quite exactly (at least, in my mind).  I really like the focus and polish of this project.</p>
<p>Day three is where things started slipping for me.  Not only was my brain quite full at that point, but Che&#8217;s stomach virus apparently had taken a grip on me (and I apologize to anybody I paid that forward to).  I did manage to get out to see my family that night, though (who may not be as thankful to have seen me if I spread it to them, too).</p>
<p>This is a fun conference and I&#8217;m really proud to be a part of it.  Thankfully, Oregon State had everything so well organized that things still hummed along fine despite losing our ringleader.  I had a good time MCing, but we lost all of the dignity and professionalism when Jeremy had to leave.  &#8220;Slackerly&#8221; and &#8220;clownish&#8221; are more apt for me.  I know Roy Tennant and, sir, I am no Roy Tennant.</p>
]]></content:encoded>
			<wfw:commentRss>http://dilettantes.code4lib.org/2008/03/real-men-go-to-conferences-with-their-mothers/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
