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

<channel>
	<title>blyberg.net &#187; Search Results  &#187;  xmlopac</title>
	<atom:link href="http://www.blyberg.net/?s=xmlopac&#038;feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.blyberg.net</link>
	<description>A library-geek blog</description>
	<lastBuildDate>Mon, 16 Nov 2009 04:10:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=abc</generator>
		<item>
		<title>Dynamic item recommendations</title>
		<link>http://www.blyberg.net/2007/01/31/dynamic-item-recommendations/</link>
		<comments>http://www.blyberg.net/2007/01/31/dynamic-item-recommendations/#comments</comments>
		<pubDate>Wed, 31 Jan 2007 15:54:33 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[Libraries]]></category>
		<category><![CDATA[AADL]]></category>
		<category><![CDATA[OPAC]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Reccomendations]]></category>

		<guid isPermaLink="false">http://www.blyberg.net/2007/01/31/dynamic-item-recommendations/</guid>
		<description><![CDATA[So today, at AADL, we quietly rolled out dynamic item recommendations. That means that when you're looking at a catalog record, you'll be given Amazon-like recommendations ("Users who checked out this item also checked out these library items.."). This little feature uses data from our opt-in patron history system. Since we've been offering that system [...]]]></description>
			<content:encoded><![CDATA[<p>So today, at AADL, we quietly rolled out dynamic item recommendations.  That means that when you're looking at a catalog record, you'll be given Amazon-like recommendations ("Users who checked out this item also checked out these library items..").<a href="http://www.flickr.com/photos/jblyberg/375550585/"><img src="http://farm1.static.flickr.com/180/375550585_1157e702ca.jpg?v=0" border="0" height="158" width="500" /></a></p>
<p>This little feature uses data from our opt-in <a href="http://www.blyberg.net/2005/12/01/enhanced-patron-history/">patron history</a> system.  Since we've been offering that system for about a year now, we've been able to accumulate over 300,000 data points.  This is another great example of how to reuse your existing data to enrich use experience.  Like I've said before, you need to use the data you have to its full potential--even if it's not the data's primary purpose.</p>
<p>Ok, so let's look at the nuts and bolts of this.  I was able to cobble this together with two SQL queries.  Actually, I was able to get the same results with a single nested query, but for some reason, non-cached results took upward of ten seconds, so splitting the query seemed like the right thing to do.</p>
<p>Anyway..</p>
<div class="igBar"><span id="lphp-2"><a href="#" onclick="javascript:showPlainTxt('php-2'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-2">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$bibinfo</span> = <span style="color:#0000FF;">$xmlopac</span>-&amp;gt;get_opac_data<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$bnum</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$mattype</span> = <span style="color:#0000FF;">$bibinfo</span><span style="color:#006600; font-weight:bold;">&#91;</span>mattype<span style="color:#006600; font-weight:bold;">&#93;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$rec_uids</span> = db_query<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#FF0000;">"SELECT DISTINCT(uid) AS uid FROM iii_hist_data WHERE bnum = '$bnum'"</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$subcrit</span> = <span style="color:#FF0000;">''</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#616100;">while</span> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$rec_uid</span> = db_fetch_array<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$rec_uids</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#616100;">if</span> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$rec_uid</span><span style="color:#006600; font-weight:bold;">&#91;</span>uid<span style="color:#006600; font-weight:bold;">&#93;</span> != <span style="color:#0000FF;">$user</span>-&amp;gt;uid<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$subcrit</span> .= <span style="color:#0000FF;">$rec_uid</span><span style="color:#006600; font-weight:bold;">&#91;</span>uid<span style="color:#006600; font-weight:bold;">&#93;</span> . <span style="color:#FF0000;">', '</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$subcrit</span> = <a href="http://www.php.net/substr"><span style="color:#000066;">substr</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$subcrit</span>, <span style="color:#CC66CC;color:#800000;">0</span>, -<span style="color:#CC66CC;color:#800000;">2</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$rec_bibs</span> = db_query<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#FF0000;">"SELECT DISTINCT(bnum), COUNT(bnum) AS total FROM iii_hist_data WHERE mattype = '$mattype' AND bnum != '$bnum' AND uid IN ($subcrit) GROUP BY bnum HAVING count(bnum)&amp;gt; 2 ORDER BY RAND() DESC LIMIT 5"</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#616100;">if</span> <span style="color:#006600; font-weight:bold;">&#40;</span>!db_num_rows<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$rec_bibs</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#616100;">return</span>; <span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#616100;">while</span> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$rec</span> = db_fetch_array<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$rec_bibs</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#FF9933; font-style:italic;">// Do your business here</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>So basically, you can see what's happening here.  First I get an array of all the other users who have checked out this item.  Then I get a list of items that three or more of those people have checked out and display it randomly (so it's not always the same list).  Pretty easy, of course you need to grow that data before it becomes useful.  300,000 records makes the results pertinent, 300 does not.</p>
<p>If you're curious, head on over to AADL's <a href="http://www.aadl.org/catalog/">catalog</a> and test it out.. you might stumble on something new.</p>
<p>The next step, of course, in all this SOPAC business is to try to determine how check-out patterns are changing and whether it will have an impact on collection development.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.blyberg.net/2007/01/31/dynamic-item-recommendations/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>AADL.org Goes Social</title>
		<link>http://www.blyberg.net/2007/01/21/aadlorg-goes-social/</link>
		<comments>http://www.blyberg.net/2007/01/21/aadlorg-goes-social/#comments</comments>
		<pubDate>Mon, 22 Jan 2007 03:43:49 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[Libraries]]></category>
		<category><![CDATA[SOPAC]]></category>
		<category><![CDATA[AADL]]></category>
		<category><![CDATA[OPAC]]></category>
		<category><![CDATA[Social-OPAC]]></category>

		<guid isPermaLink="false">http://www.blyberg.net/2007/01/21/aadlorg-goes-social/</guid>
		<description><![CDATA[I have a good excuse for dropping off the face of the biblioblogosphere for a month. It only took a year, but I finally got permission to go ahead with implementing what I've dubbed "The SOPAC" here at AADL. That would be "cute-speak" for Social OPAC. The SOPAC represents a slew of features that I've [...]]]></description>
			<content:encoded><![CDATA[<p>I have a good excuse for dropping off the face of the biblioblogosphere for a month.</p>
<p>It only took a year, but I finally got permission to go ahead with implementing what I've dubbed "The SOPAC" here at <a href="http://www.aadl.org/">AADL</a>.  That would be "cute-speak" for <em>Social OPAC</em>.  The SOPAC represents a slew of features that I've wanted to implement for quite some time now. I'm rather excited to see if library users will respond to these tools in an OPAC setting as much as Web 2.0 users have to commercial social networking sites.  I'm fairly confident they will.  Mainly, I'm relieved that I no longer need to talk conceptually about features I've been planning to build on top of the catalog.</p>
<p>So what is the SOPAC?  It's basically a set of social networking tools integrated into the <a href="http://www.aadl.org/catalog/">AADL catalog</a>.  It gives users the ability to rate, review, comment-on, and tag items.  The concept is nothing new, but the nature of our systems do not yield readily to this kind of retrofitting--something I plan to really start tackling in earnest, but that's a topic for another post.</p>
<p>If you're wondering (and didn't know already), AADL's automation system is III which recently released a software package called "Encore" that does some of what the SOPAC does.  We did not purchase it, nor do we intend to.  Instead we're going to use the money we saved to buy a Lexus. *grin*</p>
<p>Anyway, I've been messing around a bit with Snapz Pro, and thought that since this is a pretty big upgrade to AADL's site, I would include a screencast covering most of the new features.  So for those with 15 minutes or so to kill (ignore the screaming kids in the background):</p>
[See post to watch QuickTime movie](<a href="http://www.blyberg.net/downloads/jblyberg_sopac_1_21_07.mov">Download Movie</a> ~88 MB)</p>
<h2>SOPAC Features</h2>
<p><a href="http://www.flickr.com/photos/jblyberg/363134135/"><img style="padding-right: 15px" src="http://farm1.static.flickr.com/101/363134135_78d22b11df_m.jpg" alt="" align="left" /></a>The "front door" to the SOPAC is, of course, the main catalog search screen.  Drupal's API made development of this code relatively painless.  For example, the blocks on the right-hand side use Drupal's hook_block function, making the development of those blocks simply a matter of writing a function that would return the content.  In this case, the right-hand column contains search, tag, and review information.</p>
<p>Let's take a look at some of those blocks:</p>
<p><a href="http://www.flickr.com/photos/jblyberg/363136507/"><img src="http://farm1.static.flickr.com/178/363136507_0fd4b0d7ff_m.jpg" alt="" /></a><a href="http://www.flickr.com/photos/jblyberg/363134132/"><img style="padding-left: 25px" src="http://farm1.static.flickr.com/145/363134132_d63e6295a4_m.jpg" alt="" /></a></p>
<p>These two blocks represent the contextual nature of SOPAC.  The first block appears in the regular SOPAC, while the second is displayed in the use management tools.</p>
<p>Here are some sample review pages:</p>
<p>Top of review page:<br />
<a href="http://www.flickr.com/photos/jblyberg/363136505/"><img src="http://farm1.static.flickr.com/132/363136505_59bf2e11e7_m.jpg" alt="" /></a></p>
<p>Reviews themselves:<br />
<a href="http://www.flickr.com/photos/jblyberg/363136508/"><img style="padding-left: 25px" src="http://farm1.static.flickr.com/128/363136508_726ac6a322_m.jpg" alt="" /></a></p>
<p>Public view of all my reviews:<br />
<a href="http://www.flickr.com/photos/jblyberg/363136511/"><img src="http://farm1.static.flickr.com/137/363136511_f092090071_m.jpg" alt="" /></a></p>
<p>Private view of all my reviews:<br />
<a href="http://www.flickr.com/photos/jblyberg/363134133/"><img src="http://farm1.static.flickr.com/146/363134133_4033e3a283_m.jpg" alt="" /></a></p>
<p>While writing a review, you can simultaneously add tags for the item you're reviewing.  Or you can simply tag catalog items without reviewing them.  Here are some same examples of the tag system:</p>
<p>Personal tag cloud (My tags in cloud-vew mode):<br />
<a href="http://www.flickr.com/photos/jblyberg/363134129/"><img src="http://farm1.static.flickr.com/181/363134129_cac87a0fd5_m.jpg" alt="" /></a></p>
<p>Personal tag list.  This is where users can manage their tags.  Delete, modify, view, etc.<br />
<a href="http://www.flickr.com/photos/jblyberg/363134131/"><img src="http://farm1.static.flickr.com/151/363134131_2a560e5f21_m.jpg" alt="" /></a></p>
<p>List of items in the catalog tagged with "dogs":<br />
<a href="http://www.flickr.com/photos/jblyberg/363136513/"><img src="http://farm1.static.flickr.com/99/363136513_5cb40f38f3_m.jpg" alt="" /></a></p>
<p>Feel free to visit the <a href="http://www.aadl.org/catalog/">AADL catalog</a> to tag and/or review some items.  You do need an account to create content, but you don't need a library card to get an account, so these features are not limited to cardholders in any way.</p>
<p>Because I feel that this version of AADL.org is a significant milestone, I've made a tarball of the source code publicly available for download.  Included in the tarball is our middle-ware "glue" that allows us to interface Drupal with the III server in addition to all the SOPAC code and supporting libraries.  Bear in mind that this code will definitely <strong>not</strong> work out-of-the-box but could definitely be made to work with any III server with XMLOPAC support.</p>
<p>You can download the package <a href="http://www.blyberg.net/downloads/SOPAC_1.0.tar.gz">here</a>, or from my <a href="http://www.blyberg.net/files/">files</a> section.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.blyberg.net/2007/01/21/aadlorg-goes-social/feed/</wfw:commentRss>
		<slash:comments>68</slash:comments>
		</item>
		<item>
		<title>PatREST to Include OCLC Audience Level Data</title>
		<link>http://www.blyberg.net/2006/09/15/patrest-to-include-oclc-audience-level-data/</link>
		<comments>http://www.blyberg.net/2006/09/15/patrest-to-include-oclc-audience-level-data/#comments</comments>
		<pubDate>Fri, 15 Sep 2006 13:31:17 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[Libraries]]></category>
		<category><![CDATA[OPAC]]></category>
		<category><![CDATA[PatREST]]></category>
		<category><![CDATA[Patron-REST]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web Services]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://www.blyberg.net/2006/09/15/patrest-to-include-oclc-audience-level-data/</guid>
		<description><![CDATA[I've updated AADL's PatREST interface to reflect an addition I've made to the PatREST specification (now 1.3). This addition takes advantage of OCLC's Audience Level indicator. OCLC makes this information available via an XML web service. From their service page: There are a variety of ways to characterize library materials. The type of reader believed [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/jblyberg/243854995/"><img src="http://static.flickr.com/97/243854995_cb68f16623_m.jpg" align="right" /></a>I've updated AADL's <a href="http://www.aadl.org/rest/record/1120526/">PatREST interface</a> to reflect an addition I've made to the PatREST specification (now <a href="http://www.blyberg.net/downloads/patrest_1.3_overview.pdf">1.3</a>).  This addition takes advantage of OCLC's <a href="http://www.oclc.org/research/projects/audience/default.htm">Audience Level indicator</a>.  OCLC makes this information available via an XML web service.  From their service page:</p>
<blockquote><p>There are a variety of ways to characterize library materials. The type of reader believed to be interested in a particular item is one. Such an indicator, generally known as the audience level, is potentially useful for a variety of activities, including the development of new ways to improve information relevance for retrieval, reference services (including readers advisory) and collection development. Audience-level filters could be implemented in existing retrieval systems to assist users in finding content based on their information needs.</p></blockquote>
<p>This is not the first OCLC service PatREST has taken advantage of.  PatREST has been incorporating data from OCLC's xISBN service for quite some time.  By pulling in the data they make available, the data PatREST is able to return becomes significantly more valuable.</p>
<p>Because AADL's PatREST implementation relies heavily upon III's XML server, I've added OCLC's Audience Level functionality to the PHP XMLOPAC class code which is freely available from my <a href="http://www.blyberg.net/files/">files</a> page or you can directly grab it right <a href="http://www.blyberg.net/downloads/iii-xmlopac-1.11.tar.gz">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.blyberg.net/2006/09/15/patrest-to-include-oclc-audience-level-data/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>III XMLOPAC: findings, promise, and a little relief</title>
		<link>http://www.blyberg.net/2006/03/31/iii-xmlopac-findings-promise-and-a-little-relief/</link>
		<comments>http://www.blyberg.net/2006/03/31/iii-xmlopac-findings-promise-and-a-little-relief/#comments</comments>
		<pubDate>Fri, 31 Mar 2006 21:16:49 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[Libraries]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Code4Lib]]></category>
		<category><![CDATA[DomDocument]]></category>
		<category><![CDATA[MARC]]></category>
		<category><![CDATA[OPAC]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SRU]]></category>
		<category><![CDATA[Web Services]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[XMLOPAC]]></category>
		<category><![CDATA[XSLT]]></category>

		<guid isPermaLink="false">http://www.blyberg.net/2006/03/31/iii-xmlopac-findings-promise-and-a-little-relief/</guid>
		<description><![CDATA[Ryan Eby has done what III seems to not be able to do: Create a resource for XMLOPAC users. He's thrown up some wiki pages with the express purpose of documenting III's XMLOPAC. All I can say is, "Thank-you Ryan!" Be sure to participate and help with the documentation--we can all benefit from it. In [...]]]></description>
			<content:encoded><![CDATA[<p><img align="left" src="/wp-content/images/xmllogo.jpeg"/><a href="http://blog.ryaneby.com/">Ryan Eby</a> has done what <a href="http://www.iii.com">III</a> seems to not be able to do:  Create a resource for XMLOPAC users.  He's thrown up some <a href="http://wiki.lib.muohio.edu/xmlopac/index.php/Main_Page">wiki pages</a> with the express purpose of documenting III's XMLOPAC.  All I can say is, "Thank-you Ryan!"  Be sure to participate and help with the documentation--we can all benefit from it.</p>
<p>In addition, Ryan has written up a couple great how-to's on getting <a href="http://blog.ryaneby.com/archives/iii-item-data-from-xmlopac/">item data</a> and <a href="http://blog.ryaneby.com/archives/iii-featured-lists-from-the-xmlopac/">featured lists</a> from the XML.  I, for one, had no idea it was possible to grab featured lists this way.  Ryan Eby has been documenting III's XMLOPAC for quite some time now and he's certainly one of only a handful of authoritative voices on the feature.</p>
<p><a href="http://public.csusm.edu/dwalker/">David Walker</a> is another, and a very industrious voice at that.  Today I had a good chat with him on the <a href="http://www.code4lib.org">Code4Lib</a> <a href="http://www.code4lib.org/irc/faq">IRC channel</a> after he showed me his <a href="http://library.csusm.edu/catalog/sru/example/">totally amazing catalog</a> based off his equally cool <a href="http://library.csusm.edu/catalog/sru/">Shrew project</a>.  What he's been doing is <i>exactly</i> what I've been looking for.  Even though the Shrew project is currently written in C#, he has plans to port it to PHP5, taking advantage of <a href="http://us2.php.net/manual/en/ref.dom.php">DomDocument</a>.  It's a project I'm completely willing to commit some time to myself, if he asks.  The shrew project is "a system that converts the Innovative XML Server into an SRU/SRW and OpenSearch server."  He's put a great deal of time into writing XSLT that will translate the III server's output into MARC-XML, Dublin Core, or MODS 3.0.  My <a href="http://www.blyberg.net/files">XMLOPAC class</a> for PHP5 utilizes an older version of his MARC-XML XSLT, but I think when he pulls off this port, the need for my code will go away altogether--his way is preferable.</p>
<p>We also discussed some inherent problems with III's XMLOPAC--of which there are a number, and some potential enhancements.  Chief among them would be the ability to conduct business--placing items on hold and such.  A lot of work needs to be done, but I'm feeling much more optimistic about my OPAC aspirations now and, thanks to David and Ryan, a renewed sense of enthusiasm.  Thanks guys!</p>
<p><strong>[update]</strong> Ryan reminded me that <a href="http://foam.lib.muohio.edu/blog/">Rob Casson</a> is the individual who was kind enough to provide hosting for the wiki <strong>[/update]</strong></p>
<p>[tags] OPAC, XMLOPAC, XML, XSLT, Library, Code4Lib, PHP, C#, SRU, MARC, DomDocument, Web Services [/tags]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.blyberg.net/2006/03/31/iii-xmlopac-findings-promise-and-a-little-relief/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Source code for virtual card catalog images</title>
		<link>http://www.blyberg.net/2006/02/10/source-code-for-virtual-card-catalog-images/</link>
		<comments>http://www.blyberg.net/2006/02/10/source-code-for-virtual-card-catalog-images/#comments</comments>
		<pubDate>Fri, 10 Feb 2006 22:34:30 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[Libraries]]></category>
		<category><![CDATA[AADL]]></category>
		<category><![CDATA[Library 2.0]]></category>
		<category><![CDATA[Open-Source]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Virtual-Card-Catalog]]></category>
		<category><![CDATA[Web 2.0]]></category>

		<guid isPermaLink="false">http://www.blyberg.net/2006/02/10/source-code-for-virtual-card-catalog-images/</guid>
		<description><![CDATA[<a href="/downloads/iii-vcards-0.1.tar.gz">iii-vcards-0.1.tar.gz</a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.aadl.org/cat/ccimg/1258697/"><img align="right" src="http://www.aadl.org/card/cardimg.php?bnum=1258697&#038;card=1&#038;comment1=413&#038;comment2=249&#038;comment3=170&#038;c1_font=kristenscript&#038;c2_font=Efficient2&#038;c3_font=dulcesfont&#038;shrink=.6"/></a>I can't tell you how many people have emailed me about getting the source code to the virtual card catalog images I <a href="http://www.blyberg.net/2006/01/19/creating-a-virtual-card-catalog/">announced</a> a few weeks ago.  Anyway, I've finally gotten around to stripping out all the garbage from the script that generates the images, and I'm <a href="http://www.blyberg.net/downloads/iii-vcards-0.1.tar.gz">releasing it here</a> (and as always, it'll be available in the <a href="http://www.blyberg.net/files/">files</a> section).  There are a few things you need to keep in mind about it, however.</p>
<p>First, this code is written for use with III's XMLOPAC and requires my PHP XMLOPAC class.  That said, an astute PHP coder could easily port this app and make it usable on another system (I heartily encourage that).  Someday, I plan to make it completely generic so that all you need to do is pass it the data itself.  I'm a little busy at the moment, however.</p>
<p>I am not releasing the card stock images that AADL uses.  There was no license info associated with the original images.  Until I can contact the folks at <a href="http://www.library.upenn.edu/exhibits/pennhistory/library/cards/cards.samples.html">UPenn</a> and find out what the deal is, I'm not going to make them available.  It'd be very easy to create your own stock, however.</p>
<p>Same deal with the fonts.  I was able to freely download them--so should you.</p>
<p>At present, this code is really meant for developers, it is not a "package" that will work out of the box.  You must know what you're doing in order to get this going.</p>
<p>I'm releasing it under GPL for all the world to use freely, forever and ever.</p>
<p>Included in the tarball is a README file with some basic instructions.  Be sure to read that before emailing me your questions.</p>
<p>Enjoy.  I'm looking forward to some possible creative uses.  Please email me if you get it working as I'd love to see what you're doing with it.  If you come up with a particularly interesting use, I'll be sure to showcase it here.</p>
<p>[tags]PHP, Programming, Virtual Card Catalog, AADL, Web 2.0, Library 2.0, Open Source[/tags]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.blyberg.net/2006/02/10/source-code-for-virtual-card-catalog-images/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>III XMLOPAC Class update</title>
		<link>http://www.blyberg.net/2006/02/08/iii-xmlopac-class-update-2/</link>
		<comments>http://www.blyberg.net/2006/02/08/iii-xmlopac-class-update-2/#comments</comments>
		<pubDate>Wed, 08 Feb 2006 20:47:08 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[Libraries]]></category>
		<category><![CDATA[AADL]]></category>
		<category><![CDATA[III]]></category>
		<category><![CDATA[OPAC]]></category>
		<category><![CDATA[Open-Source]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[XMLOPAC]]></category>

		<guid isPermaLink="false">http://www.blyberg.net/2006/02/08/iii-xmlopac-class-update-2/</guid>
		<description><![CDATA[<a href="/downloads/iii-xmlopac-1.10.tar.gz">iii-xmlopac-1.10.tar.gz</a>]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/images/xmllogo.jpeg" alt="" align="left" />After a fair amount of work, I'm releasing an update to the iii-xmlopac class.  I've been sitting on this update for awhile because it's a fairly big update and I wanted to make sure it was performing like it should.  I highly recommend that anyone using this class update because a number of fairly critical bugs have been fixed, including a messy tangle of UTF8 encoding issues.</p>
<p>In addition, I've included an XSLT file written by <a href="http://library.csusm.edu/catalog/sru/xserver/test.htm">David Walker</a> which I've modified slightly.  It allows me to easily extract subject headings from the XML, so yes, this class now will return an array of subject headings!!</p>
<p>So, be sure to <a href="http://www.blyberg.net/downloads/iii-xmlopac-1.10.tar.gz">download</a> the latest version.  As always, you can grab it anytime from the <a href="http://www.blyberg.net/files/">files</a> section.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.blyberg.net/2006/02/08/iii-xmlopac-class-update-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>III-XMLOPAC Class 1.9 update</title>
		<link>http://www.blyberg.net/2006/01/21/iii-xmlopac-class-19-update/</link>
		<comments>http://www.blyberg.net/2006/01/21/iii-xmlopac-class-19-update/#comments</comments>
		<pubDate>Sat, 21 Jan 2006 18:59:57 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[Libraries]]></category>

		<guid isPermaLink="false">http://www.blyberg.net/2006/01/21/iii-xmlopac-class-19-update/</guid>
		<description><![CDATA[<a href="/downloads/iii-xmlopac-1.8.tar.gz">iii-xmlopac-1.9.tar.gz</a>]]></description>
			<content:encoded><![CDATA[<p>While working on the <a href="http://www.blyberg.net/2006/01/19/creating-a-virtual-card-catalog/">virtual card catalog</a>, I ran into some serious issues with the way my xmlopac class was dealing with III's malformed XML (sound familiar?).  Again, it all comes back to the fact that III's XML output <i>claims</i> to be UTF-8, but in reality, it is no such thing.  These problems have also been plaguing our users who would often complain of missing titles, authors, etc.</p>
<p>Every time this crops up, I've fixed the problem, but it's sort of like putting your finger in the dike--another leak springs up somewhere else.  Anyway, <a href="http://www.blyberg.net/downloads/iii-xmlopac-1.8.tar.gz">the 1.9 update</a> goes a long way toward applying a broader fix to those problems.  I'd recommend that anyone who is currently using this class to update because it'll greatly improve your results.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.blyberg.net/2006/01/21/iii-xmlopac-class-19-update/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8216;Tis a far, far better thing I code.</title>
		<link>http://www.blyberg.net/2005/12/20/tis-a-far-far-better-thing-i-code/</link>
		<comments>http://www.blyberg.net/2005/12/20/tis-a-far-far-better-thing-i-code/#comments</comments>
		<pubDate>Tue, 20 Dec 2005 17:11:08 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[Libraries]]></category>

		<guid isPermaLink="false">http://www.blyberg.net/?p=57</guid>
		<description><![CDATA[I mentioned last week that there is a disparity between libraries that code (or have coders) and those that don't. Since then, several people have examined whether a resident developer is a prerequisite when shepherding your organization into the library 2.0 world: Travis Ennis writes: Not all libraries have the good fortune to have these [...]]]></description>
			<content:encoded><![CDATA[<p>I mentioned last week that there is a disparity between libraries that code (or have coders) and those that don't.  Since then, several people have examined whether a resident developer is a prerequisite when shepherding your organization into the library 2.0 world:</p>
<p>Travis Ennis <a href="http://libfoo.blogspot.com/2005/12/library-20.html">writes</a>:<br />
<i>Not all libraries have the good fortune to have these kinds of people on their staff, so what kinds of communities will emerge to develop and share these applications?</i></p>
<p>Lib 2.0 <a href="http://lib20.com/wp/index.php?p=17">writes</a>:<br />
<i>Let me also say that it is not merely the existence of coders or big budgets which separate the haves and the have not's. There has to be a fundamental attitude and a willingness to change, so when your hacker comes up with some crazy idea, there are a whole bunch of people who are excited about making it work, willing to promote it and test it and document it and train people about it. Just hiring someone who can program, no matter how brilliant, is only a small part of it.</i></p>
<p>As you might imagine, I've got some opinions on the matter.  Before I can address the question of coders in the library, however, I need to revisit my thoughts on vendors, and how better to do that than to respond to Talis's Richard Wallis.  Richard wrote a <a href="http://blogs.talis.com/panlibus/archives/2005/12/library_20_for.html">response</a> to my "<a href="http://www.blyberg.net/2005/12/13/library-20-the-road-ahead/">Road Ahead</a>" post in which he talks about "Orchestrated Library Services" as a framework of tools to enable non-technical staff to produce a constellation of integrated services via the presentation layer.  In my post, I stated that there was a disparity between libraries with coders and libraries without coders.  Richard writes:</p>
<p><i>So what is the solution to this technical apartheid - a coder for every library? With today's technology, where an understanding of SQL, database schemas, and programming languages is required, probably yes but that is impractical on anything but a small scale.</i></p>
<p>First, I don't consider the disparity between the have-coder's and have-no-coder's an apartheid--it's a resource problem.  The solution to which is to either hire interested coders, or find someone in your organization who has an interest in coding and foster their desire.  I'd beseech libraries not to agree with Richard when he says that having developers on staff is "impractical on anything but a small scale."  Yes, in a Library 1.0 world, an emphatic NO in an L2 environment (btw, I tag/categorize my posts with "Library 2.0" for the technorati's and use the shorthand L2 because it seems to not overwork the term).  For medium-to-large size libraries, having a developer on staff is just part of the L2 face and shouldn't just be considered a luxury.  We need to accept that, and get used to it because it's just part of a larger strategy by which  libraries take back the creative development process.  I'll say it until I'm red in the face: if we want to be pertinent, the curent model needs to change.  The model that we should be adopting looks more like a meta-coop in which libraries work together via a developer's network using a set of platform independent, standards-based tools to create open-source projects, programs, and snippets. <i>That</i> is the real Utopian vision.</p>
<p><i>But, what if configuring and orchestrating web services became as easy as it now to produce a web page? And, what if the web service based library services supported by library system components became as ubiquitous and standard as say HTML is now? And, what if the tools to do the orchestration became as easy to use as say MS FrontPage [no recommendation as a tool, just an example]. Would, in that situation, the librarian orchestrating his/her Library's service to its customers need to be a coder? No more than they would, to be able to put a Word macro together today.</i></p>
<p>I see a couple problems with this idea.</p>
<p>First, in order to make such a tool usable to the average user, it would have to be severely limited in scope.  To incentivise librarians to use the tool, it'd have to be somewhat simple and intuitive.  It would be a major challenge to create a simple, easy-to-use tool that can "orchestrate" services at any great level of complexity.</p>
<p>Second, the services we're talking about are far more complex than html.  You can't even compare html to web services/APIs.  HTML is a very simple language that is parsed and presented.  When you start introducing complex data sets, you've increased complexity by an order of magnitude.  There is very little you can do to simplify the process at that point, especially when it comes to debugging and pinpointing the data you need inside a data set.</p>
<p>Third, it's one more third-party, proprietary tool to learn.  Library staff struggle enough with the actual administrative interface of an ILS, giving them another tool to learn is not going to make them very happy.  It's much better to make business logic ubiquitous and present it using developer lexicon.</p>
<p>Fourth, it adds an extra layer to the development model we're asking for.  This seems like an unnecessary "middleman" when it comes to development.</p>
<p>Finally, like I've said before, there is no way for vendors to anticipate every need of every customer.  Are vendors going to develop software to integrate and manage patrons' wireless devices?  Are vendors going to develop an integrated game tournament system?  Will they write a module for every CMS on the market so that it can be integrated into the ILS, or will they just write their own CMSs and expect us to use them?</p>
<p>Vendors need to stop assuming that they know what we want better than we do.  For instance, find me a single library coder who does <i>not</i> want read-only SQL access.  <i>We're</i> telling you want we want.  If you want to know what will drive a library coder to coffee in the morning, it's the spectre of non-technical staff believing that they can hack together a "Library 2.0" site on their own because they've been sold a bill of goods that tells them they can.</p>
<p>This leads into another topic I touched on in my post when I pointed at our own institutions as barriers to change.  This is a component of Library 2.0 that vendors should not be addressing because to do so would be placing undue influence on fundamental policy shifts that need to take place inside our institutions.  Yes, libraries are experiencing internal struggles as these changes unfold, but these are struggles that vendors have no right to be a part of.</p>
<p><i>Not only have us vendors got to get our act together in delivering the Library 2.0 technology in a way that fosters and enables the emergence of new processes and new ways of interaction between libraries, between libraries and associated institutions &#038; commercial services, and between libraries and the consumers of their services; but the librarians in, at least a significant proportion of, those libraries must be ready to take their services in to the Library 2.0 world and most importantly understand why they should.</i></p>
<p>That's part of our struggle, yes.  But as I wrote in a previous post, L2 as a concept is still in it's infancy.  It'd be irresponsible for vendors to ramp up their marketing engines with a sight toward L2--especially since L2 is such a nebulous group of ideas.  Yes, libraries have people who still want the card catalog back, yes we have non-technical people making technical decisions, we certainly don't have a mandate to start implementing all these wonderful changes.  All of this needs to be worked out, and while that is happening the best thing for vendors to do is reevaluate their client relationships, take Occam's razor to their software, and work with library developers to come up with a standard framework of open standards and vendor interoperability.</p>
<p>I wanted to revisit the vendor issue from a different angle because it provides a context within which to consider the purpose of coders in libraries.  Maybe a non-techie will disagree with me on all this, but I believe that it should not be the non-techies' job to make technical decisions.  All of this brings me inexorably toward the million dollar question: should all libraries have a coder on staff?  </p>
<p>If you look at a product like <a href="http://wordpress.org/">WordPress</a> (much simpler than an ILS, granted, but the model scales), you'll see that you don't need to be a programmer to use it.  Anyone, with a little time, can install WordPress and start blogging.  But many of the really great WordPress sites are those that have been heavily customized and there are a large number of "contribs" (contributed code in the form of plug-ins) that made WordPress such a hit.  In the current L2 landscape, you won't need a coder to have a good online presence, but you will need one if you want a <i>great</i> online presence.</p>
<p>Ultimately, MLS programs are going to have to start offering CS electives and eventually requirements.  The profession itself is changing with the industry.  Databases and networks, increasingly, are information's domain and if we want to be part of the vanguard, and if we want to call ourselves the stewards of that information, we darn well better know how to work with it.  So to answer my own question, I'd say that libraries should strongly consider having a coder on staff.  In five years, there's no question, you will have a coder on staff or you will be considered quaint.</p>
<p>Let me just give a few examples of how coders are influencing the work going on at <a href="http://www.aadl.org/">AADL</a>:</p>
<p>We have an exceptional high school student on our part time staff, <a href="http://communityhigh.org/matth/">Matt Hampel</a>, who wrote a very useful <a href="http://communityhigh.org/matth/50/aadl-catalog-search-plugin">search plugin</a>.</p>
<p>I released my php xmlopac class for III, and <a href="http://libdev.plymouth.edu/">Casey Bisson</a> <a href="http://libdev.plymouth.edu/post/11">contributed</a> two very useful functions.  Casey's contribution inspired me to make public a bit of code to access and cache amazon images.  This, in turn, caught <a href="http://labs.lcls.org/">Chris Deweese's</a> attention who is now working on an ASP derivative.</p>
<p>I received an email yesterday from <a href="http://vielmetti.typepad.com/vacuum/">Ed Vielmetti</a> who just wrote an <a href="http://vielmetti.typepad.com/vacuum/2005/12/duckytool_searc.html">AADL search module</a> for <a href="http://www.monkey.org/~jose/wiki/doku.php?id=DuckyTool">duckytool</a> using the RSS feeds I implemented last month.  He's requested microformat output from our catalog to extend his tool, and I think it's a great idea.</p>
<p><a href="http://www.daveyp.com/blog/">DaveyP</a> just <a href="http://www.daveyp.com/blog/index.php/archives/57/">announced his plans</a> to work on patron catalog tagging--a project I've got my sights on for <a href="http://www.aadl.org/">AADL</a>.  He's going after it with the energy of a terrier and has an idea for a cooperative database of tags.  He's sharing his code, too.</p>
<p>Do you notice a pattern?  Often times one bit of work spawns another, and so on.  This type of collaboration is only going to proliferate.  Make it a mantle-piece of library 2.0.  This stuff is happening in the coder's workshop, it will do your institution well to take notice.  It'll do you even better to take part.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.blyberg.net/2005/12/20/tis-a-far-far-better-thing-i-code/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>III XMLOPAC 1.8 Update</title>
		<link>http://www.blyberg.net/2005/12/19/iii-xmlopac-18-update/</link>
		<comments>http://www.blyberg.net/2005/12/19/iii-xmlopac-18-update/#comments</comments>
		<pubDate>Mon, 19 Dec 2005 18:35:26 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[Libraries]]></category>

		<guid isPermaLink="false">http://www.blyberg.net/?p=56</guid>
		<description><![CDATA[<a href="/downloads/iii-xmlopac-1.8.tar.gz">iii-xmlopac-1.8.tar.gz</a>]]></description>
			<content:encoded><![CDATA[<p>I've fixed a problem in the xmlopac class that would sometimes return key fields such as author or title as "GarbageData".  The problem basically stems from the fact that PHP doesn't have an extensive enough set of html_special_chars to handle what's being thrown at it from Innovative.  You'll find that <a href="http://www.blyberg.net/downloads/iii-xmlopac-1.8.tar.gz">1.8</a> will return better results overall now.  Be sure to grab it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.blyberg.net/2005/12/19/iii-xmlopac-18-update/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Library 2.0: The road ahead</title>
		<link>http://www.blyberg.net/2005/12/13/library-20-the-road-ahead/</link>
		<comments>http://www.blyberg.net/2005/12/13/library-20-the-road-ahead/#comments</comments>
		<pubDate>Tue, 13 Dec 2005 20:12:03 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[Libraries]]></category>

		<guid isPermaLink="false">http://www.blyberg.net/?p=54</guid>
		<description><![CDATA[It does seems somewhat arbitrary that a term like "Library 2.0" can be coined, snatched up, and tossed about like a hacky-sack at Burning Man. I agree that it's not quite the right label, but to be honest, I really don't care--if we're arguing over semantics, we've been derailed. So as I use the term [...]]]></description>
			<content:encoded><![CDATA[<p>It does seems somewhat arbitrary that a term like "Library 2.0" can be coined, snatched up, and tossed about like a hacky-sack at Burning Man.  I agree that it's <a href="http://www.tangognat.com/2005/11/30/library-360/">not quite the right label</a>, but to be honest, I really don't care--if we're arguing over semantics, we've been derailed.  So as I use the term "Library 2.0" (L2), bear in mind that it's only a way for me to refer to a collective of ideas.</p>
<p>Essentially, those of us who are familiar with the term "Library 2.0" all assemble in the same theoretical nebulae when we read and talk about it, and that's good enough for me.  For the moment.  But there is the real danger of getting mired in discussions like 'what does it mean to be Library 2.0ish'.  That's why I think we ought to have a series of clear objectives that forge a path toward L2.  I've put together a list of components that, for me, define a strategic vision for L2 in terms of general statements, questions that need to be asked, ideas that need to be drawn up, and unknowns that need to be discovered.  It's important for me to do this for myself because any time I'm in "dev mode" I need to have an ideological framework to work with.</p>
<p><b>Ongoing discussion: What is Library 2.0?</b><br />
This is where most of the current L2 discussion seems to be centered, and for good reason.  Why pursue something if you don't know what it is, or whether it even exists?  I love the current discussion because, despite everyone's differing perceptions of L2, there is a common denominator emerging that defines some interesting boundaries for the term.  Naturally, a concise definition of "Library 2.0" is not going to happen--it'd be a house built on sand.  Assuming that ongoing discussion is part of L2's foundation seems to be the pragmatic thing to do.  Pursuing any subsequent action should acknowledge that L2 has a core set of ideologies that are interpreted differently by many.</p>
<p><b>What are our current impediments?</b><br />
I've talked a lot about the culpability of vendors when it comes to stifling innovation.  I think the nature of vendor-library relationship is perhaps the largest battle we're going to fight on this winding road and I predict a casualty, or two, among vendors who refuse to make way.  Many vendors are still building SUVs in a hybrid world.</p>
<p>But vendors are not the only  impediments to L2.  It might be worthwhile to look a little closer to home.  Your largest obstacles may lie within your own organizations.  Perhaps you need to finally have that sit-down with your IT department.  Maybe some of the changes heralded by L2 are threats to the old-timers.  I have a feeling that many of you read about L2 and think to yourself, "it'd be nice to take our library in that direction, but..".  Finding solutions or workarounds to those caveats needs to be an important part of the collective discussion.</p>
<p>A perfect example, that has been discussed a little, is the fact that many librarians wish they had coders to implement their ideas.  It's a good example because having coders is the dividing line between the have's and the have-not's.  At this point, it's inevitable, but in the long term, that is an unacceptable disparity.  For now, however, it's the libraries with coders that have the burden and responsibility to build the prototypes for next-generation online services.</p>
<p><b>How do we overcome those impediments?</b><br />
Librarians are smart people and I have faith that no impediment will go unaddressed.  Of course, different problems have different degrees of complexity, but discussing and brainstorming possible solutions is the first step in dealing with any setback.  </p>
<p>I previously mentioned that vendors are a large part of the problem, therefore it stands to reason that vendors need to be a large part of the solution.  We need to be able to use the correct language when we draft RFPs or talk to their support teams.  I drafted the <a href="http://www.blyberg.net/2005/11/20/ils-customer-bill-of-rights/">ILS Customer Bill-of-Rights</a> for two reasons.  First, I wanted to give other libraries a very basic set of demands to present to their vendors.  If vendors hear it enough, they might just crack the tiller over a degree or two and chart a new course.  Second, I wanted to throw down the gauntlet with vendors themselves and, hopefully, <a href="http://www.blyberg.net/2005/11/24/talis-responds-to-bill-of-rights/">open up a discourse with them</a>.  Of course, Talis is the <a href="http://blogs.talis.com/panlibus/archives/2005/11/an_ils_customer.html">only vendor to respond</a> so far, and they are the only vendor to publicly acknowledge the existence, let alone the importance of L2.  I think L2 scares the pants off most of the others.</p>
<p>It's important to demand change not only from your vendors, but from anyone else who is stifling your library's progress.  Share your ideas and success stories so the rest of us can see how you overcame adversity.  Also, share an analysis of your failures because those are just as important when it comes to making futures decisions and laying plans.  Ironically, in the Web 2.0 world, being open and honest about your failures tends to bolster your credibility.</p>
<p><b>Who is going to facilitate this change?</b><br />
You, for one.  But before L2 can enter the mainstream, we're going to need an "official voice" that endorses L2 from both a technology and human perspective.  Once this happens,  it'll be easier for everyone to bring L2 up in an organization and make headway when it comes to implementation and, especially, buy-in.  Of course, ALA comes to mind, but multiple voices of less authority can suffice, depending on context.  For now, the debate over how much L2 matters is pertinent, but at some point it becomes farcical to defend the merits of L2 philosophy.  An official ratification of L2 as a label would certainly shake loose some acceptance within organizations as well as put pressure on vendors to turn their sights toward L2.  If you can, lobby for L2, spread the good news!</p>
<p><b>What, precisely do we want to offer?</b><br />
I think we are at the point now where we need to be discussing, in detail, what types of features and services we want to offer under the auspices of L2.  Tag cloud <a href="http://flickr.com/photos/shifted/60728682/">mock-ups</a>, <a href="http://www.daveyp.com/blog/index.php/archives/46/taggyness/">prototypes</a>, <a href="http://www.aadl.org/catalog/">RSS feeds</a>, <a href="http://www.blyberg.net/2005/11/30/casey-bisson-contributes-to-the-xmlopac-class/">collaborative development</a>, memes, and library blogs all serve as hard evidence of a life after Library 1.0.  Aside from all that, however, so much focus is on ubiquitous web 2.0 sites like <a href="http://www.flickr.com">flickr</a> and <a href="http://del.icio.us/">delicious</a>.  Events like Internet Librarian and the Code4Lib conference will undoubtedly serve as periodical collective brainstorming sessions, but what would be great is a clearinghouse of off-the-wall ideas for the practical application of Web 2.0 in the library setting.  There are a few of us in the library-coder community who could certainly draw from that pool to create some interesting prototype services and applications.</p>
<p><b>Ultimately, what are we trying to achieve?</b><br />
Every now and then, stop and ask yourself why this is all so important.  Maintain perspective on your goals.  For my part, I'd like to see L2 reach a 'critical mass' within the next two years.  That's an ambitious time-line by any standards when it comes to libraries, but think about the fact that the sooner we start harnessing the intelligence of our communities, the sooner we will be creating a living record of our time.  Doesn't that cut to the very core of our mission as libraries?  What you want to achieve personally and what you want for your institution need to be aligned so that you can set a clear agenda for yourself as you begin tackling your projects.</p>
<p><b>L2 is not a fad.</b><br />
Despite what some people may say about L2, it is not a passing fancy bandied about by a few hypertechno-literate librarians.  L2 is part of an evolution that is taking place worldwide--a movement in which the threshold between technology and individuality is giving way.  Those two seemingly disparate concepts are starting to bleed together, creating the emergence of a new culture.  We can be a part of it, or we can be relics.  As libraries, I think we have a unique moral obligation to usher our communities into it.</p>
<p>Bear in mind, this post is a brain-dump of questions and ideas that orbit L2 in my head.  I'm certainly no authority on the future of L2, but I do have strong convictions about it and, therefore, my interpretation of L2 may reflect that.  My desire is to build interesting, useful, and immersive tools for our users.  A simple goal with a very complex path.</p>
<p><b>[update]</b><br />
<a href="http://tametheweb.com">Michael Stephens</a> pointed me in the direction of this month's SirsiDynix OneSource in which Stephen Abram <a href="http://www.imakenews.com/sirsi/e_article000485040.cfm?x=b6h9CVc,b2rpQhRM">takes a look at Library 2.0</a>.  Bear in mind that even though only Talis has engaged in public discussion, other vendors are quietly listening and developing strategies behind the scenes.  What we don't want, is a mud-slinging contest between vendors.  They certainly don't want that either, so expect most of them to inch in slowly and quietly.</p>
<p>It's also worth noting that Sirsi actually does comply fairly well to the ILS Customer Bill-of-Rights, which is not an endorsement since I have no hands-on experience with their ILS, just a statement of fact.  Any SirsiDynix customers want to review their API?<br />
<b>[/update]</b></p>
]]></content:encoded>
			<wfw:commentRss>http://www.blyberg.net/2005/12/13/library-20-the-road-ahead/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>III Bib # to ASIN to Cover Art</title>
		<link>http://www.blyberg.net/2005/12/08/iii-bib-to-asin-to-cover-art/</link>
		<comments>http://www.blyberg.net/2005/12/08/iii-bib-to-asin-to-cover-art/#comments</comments>
		<pubDate>Thu, 08 Dec 2005 18:34:00 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[Libraries]]></category>

		<guid isPermaLink="false">http://www.blyberg.net/?p=53</guid>
		<description><![CDATA[<a href="/downloads/azImgSrc-1.0.tar.gz">azImgSrc-1.0.tar.gz</a>]]></description>
			<content:encoded><![CDATA[<p>I've written a PHP script that takes a III Bib # and, using amazon's REST interface, it tries it's darnedest to find the ASIN for that item.  It will then store that Bib#-ASIN pair in a database.  After that, it will cache the small, medium and large cover images associated with that ASIN in another database table and display whichever one you want.</p>
<p>This script requires the latest version of the III-XMLOPAC class (1.6), PEAR::DB, MySQL (of course) and PHP5 (or PHP4 with SimpleXML).  In addition to that, you'll need to have your own Amazon Dev token, etc.</p>
<p>Essentially, I wanted a way to get more cover art into the catalog.  If you currently use Syndetics, you'll know that you almost never get any cover art for CDs and DVDs.  My solution was to write this.  Just to warn you, though, this script will not return ASINs and cover art for all the items in your collection.  Far from it.  There is about a 30% hit-rate.  I could easily get that higher, but then accuracy drops off, and I want 100% accuracy.</p>
<p>So, I plan on working with this script, massaging the search to figure out ways to get that 30% up.  Please feel free to hack away at it yourselves too, but bear in mind, that I'm looking for accuracy above all else.  If you're really interested in how I'm determining an accurate hit, take a look at the code.  Basically, I'm doing an initial search, then I match the UPC number on the amazon record to the stdnum info from the Bib record.  Doing it this way, I haven't seen a wrong match yet.</p>
<p>Incidentally, here is a hit list with images from this script:</p>
<p><a href="http://www.flickr.com/photos/jblyberg/71523965/"><img src="http://static.flickr.com/34/71523965_616d86f2b0_m.jpg"/></a></p>
<p>To use it, you'd basically do something like this:</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-inlinetags">&lt;?php</span><span class="hl-code">
 
</span><span class="hl-var">$bibnum</span><span class="hl-code"> = </span><span class="hl-quotes">&quot;</span><span class="hl-string">123456</span><span class="hl-quotes">&quot;</span><span class="hl-code">;
</span><span class="hl-reserved">echo</span><span class="hl-code">  </span><span class="hl-quotes">'</span><span class="hl-string">&lt;img src=&quot;/azImgSrc.php?bnum=</span><span class="hl-quotes">'</span><span class="hl-code"> . </span><span class="hl-var">$bibnum</span><span class="hl-code"> . </span><span class="hl-quotes">'</span><span class="hl-string">&quot;&gt;</span><span class="hl-quotes">'</span><span class="hl-code">;
 
</span><span class="hl-inlinetags">?&gt;</span></pre></div></div>
<p>As a side bonus, you'll have a nice table with Bib#-to-ASIN data.  You can even manually add data to that table to ensure your favorite records have images associated with them.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.blyberg.net/2005/12/08/iii-bib-to-asin-to-cover-art/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>III-XMLOPAC class update 1.6</title>
		<link>http://www.blyberg.net/2005/12/07/iii-xmlopac-class-update-16/</link>
		<comments>http://www.blyberg.net/2005/12/07/iii-xmlopac-class-update-16/#comments</comments>
		<pubDate>Thu, 08 Dec 2005 04:35:02 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[Libraries]]></category>

		<guid isPermaLink="false">http://www.blyberg.net/?p=52</guid>
		<description><![CDATA[[update] <a href="/downloads/iii-xmlopac-1.7.tar.gz">iii-xmlopac-1.7.tar.gz</a> [/update]]]></description>
			<content:encoded><![CDATA[<p>I really love that <a href="http://libdev.plymouth.edu/">Casey</a> keeps adding functionality to the III XMLOPAC class.  I've incorporated his <a href="http://libdev.plymouth.edu/post/28">latest function</a> that grabs alternate ISBN numbers from <a href="http://www.oclc.org/research/projects/xisbn/">OCLC's xISBN service</a> into 1.6.</p>
<p>Because of his function, however, I've changed the way get_opac_data() is called.  The change is completely backward compatible, so don't worry about anything breaking after you upgrade.  The new prototype looks like this:</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-inlinetags">&lt;?php</span><span class="hl-code">
</span><span class="hl-var">$bibinfo</span><span class="hl-code"> = </span><span class="hl-identifier">get_opac_data</span><span class="hl-brackets">(</span><span class="hl-var">$bibnum</span><span class="hl-code">, </span><span class="hl-var">$extend</span><span class="hl-code"> = </span><span class="hl-reserved">NULL</span><span class="hl-brackets">)</span><span class="hl-code">;
 
</span><span class="hl-comment">//</span><span class="hl-comment"> Of course, you can just call it like this:</span><span class="hl-comment"></span><span class="hl-code">
</span><span class="hl-var">$bibinfo</span><span class="hl-code"> = </span><span class="hl-identifier">get_opac_data</span><span class="hl-brackets">(</span><span class="hl-var">$bibnum</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-inlinetags">?&gt;</span></pre></div></div>
<p>Essentially, Casey's function will only be called if $extend is TRUE (or some value).  I've implemented it this way because this class gets some heavy use and I don't want it polling OCLC every time I  grab a bib record.  I envision the $extend flag to be used in cases where external web services are queried.  By default, those features will be disabled.</p>
<p>Also, in 1.6, I've fixed a pretty bad bug that would often times return an invalid ISBN.  I've broken that bad ISBN number off into the "stdnum" key instead.</p>
<p>If you're using this class, you definitely should upgrade to 1.6.</p>
<p><b>[update]</b><br />
Actually, grab version <a href="http://www.blyberg.net/downloads/iii-xmlopac-1.7.tar.gz">1.7</a>.  I didn't add a test to make sure a record has an ISBN before it's shunted to Casey's function.  As such, you might get a PHP warning depending on your error report settings.  Nothing major, just an annoyance, 1.7 fixes that.<br />
<b>[/update]</b></p>
]]></content:encoded>
			<wfw:commentRss>http://www.blyberg.net/2005/12/07/iii-xmlopac-class-update-16/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
