<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   >
<channel>
    <title>Coffee|Code : Dan Scott</title>
    <link>http://coffeecode.net/</link>
    <description>Caffeinated Librarian Geek</description>
    <dc:language>en</dc:language>
    <generator>Serendipity 1.4.1 - http://www.s9y.org/</generator>
    
    

<item>
    <title>SFX target parser for Evergreen and some thoughts about searching identifiers</title>
    <link>http://coffeecode.net/archives/194-SFX-target-parser-for-Evergreen-and-some-thoughts-about-searching-identifiers.html</link>
            <category>Evergreen</category>
    
    <comments>http://coffeecode.net/archives/194-SFX-target-parser-for-Evergreen-and-some-thoughts-about-searching-identifiers.html#comments</comments>
    <wfw:comment>http://coffeecode.net/wfwcomment.php?cid=194</wfw:comment>

    <slash:comments>3</slash:comments>
    <wfw:commentRss>http://coffeecode.net/rss.php?version=2.0&amp;type=comments&amp;cid=194</wfw:commentRss>
    

    <author>dan@coffeecode.net (Dan Scott)</author>
    <content:encoded>
    &lt;p&gt;&lt;a href=&quot;http://laurentian.ca&quot;&gt;Laurentian University&lt;/a&gt; is part of the &lt;a href=&quot;http://www.ocul.on.ca/&quot;&gt;Ontario Council of University Libraries (OCUL)&lt;/a&gt;, and a user of the centrally hosted &lt;a href=&quot;http://scholarsportal.info&quot;&gt;Ontario Scholars Portal&lt;/a&gt; SFX link resolver, so one of the things we needed when we migrated to Evergreen was a target parser for our link resolver. This is the target associated with &lt;em&gt;Search the library catalogue&lt;/em&gt; that is the last resort when the resolver fails to turn up any full-text resources for a given OpenURL - so hopefully it won&#039;t need to be invoked too often, as we have a very rich set of full-text electronic resources at Laurentian University.
&lt;/p&gt;
&lt;h3&gt;The code&lt;/h3&gt;
&lt;p&gt;Here is a quick implementation of a target parser that generates search URLs based on ISSN, ISBN, book title, or journal title. Pretty impoverished from an OpenURL perspective, but it maintains the same level of functionality from our previous system. In &lt;strong&gt;TargetParser/Evergreen/Conifer.pm&lt;/strong&gt; I created a target parser called Evergreen::Conifer that implements a subset of the Parsers::TargetParser API for SFX as follows:&lt;/p&gt;
&lt;pre&gt;
package Parsers::TargetParser::Evergreen::Conifer;
use Parsers::TargetParser;
use base qw(Parsers::TargetParser);
use strict;

sub getHolding {
  my ($this,$genRequestObj) = @_;
  
  my $objectType = $genRequestObj-&gt;{&#039;objectType&#039;};
  my $ISBN = $genRequestObj-&gt;{&#039;ISBN&#039;};
  my $eISBN = $genRequestObj-&gt;{&#039;eISBN&#039;};
  my $ISSN = $genRequestObj-&gt;{&#039;ISSN&#039;};
  my $eISSN = $genRequestObj-&gt;{&#039;eISSN&#039;};

  my $CODEN = $genRequestObj-&gt;{&#039;CODEN&#039;};
  my $bookTitle = $genRequestObj-&gt;{&#039;bookTitle&#039;};
  my $journalTitle = $genRequestObj-&gt;{&#039;journalTitle&#039;};

  # Canonical search results URL for simple searches:
  # http://laurentian.concat.ca/opac/en-CA/skin/lul/xml/rresult.xml?rt=keyword&amp;tp=keyword&amp;t=0895-2779&amp;l=105&amp;d=2&amp;f=&amp;av=

  my $svc = $this-&gt;{svc};
  my $egHost = $svc-&gt;parse_param(&#039;eg_host&#039;);
  my $egLocale = $svc-&gt;parse_param(&#039;eg_locale&#039;);
  my $egSkin = $svc-&gt;parse_param(&#039;eg_skin&#039;);
  my $egOrgUnit = $svc-&gt;parse_param(&#039;eg_org_unit&#039;);
  my $egDepth = $svc-&gt;parse_param(&#039;eg_depth&#039;);

  my $path = &quot;http://${egHost}/opac/${egLocale}/skin/${egSkin}/xml/rresult.xml?l=${egOrgUnit}&amp;d=${egDepth}&quot;;

  my $searchString = &#039;&amp;rt=keyword&amp;tp=keyword&amp;t=&#039;;

  if (defined($ISSN)) {
    if ($ISSN =~ m/x/i) {
      # Current indexer doesn&#039;t deal well with ISSNs containing an X, so break it up
      $ISSN =~ s/^(\d{4})-?(\d+)x/$1 -$2 x/i;
      $searchString .= $ISSN;
    } else {
      $searchString .= &quot;\&quot;$ISSN\&quot;&quot;;      # format 9999-9999 for MARC
    }
  } 
  elsif (defined($ISBN)) {
    # Evergreen doesn&#039;t force ISBNs to be stripped of hyphens, so take whatever
    $searchString .= &quot;\&quot;$ISBN\&quot;&quot;;
  }
  elsif (defined($journalTitle)) {
    # Restrict searches to title index, with bibliographic level = s
    $searchString .= &quot;ti:${journalTitle}&amp;bl=s&quot;;
  }
  elsif (defined($bookTitle)) {
    # Restrict searches to title index, with bibliographic level = m
    $searchString .= &quot;ti:${bookTitle}&amp;bl=m&quot;;
  }

  return ($path . $searchString);

}

1;
&lt;/pre&gt;
&lt;p&gt;And here&#039;s the help that I added to the corresponding &lt;strong&gt;Conifer.hlp&lt;/strong&gt; file:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;General Information&lt;/strong&gt;&lt;br /&gt;
  Target - LOCAL_CATALOGUE_EVERGREEN_CONIFER&lt;br /&gt;
  Service - getHolding&lt;br /&gt;
  Parser - Evergreen::Conifer
&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Information needed in the Target Service:&lt;/strong&gt;&lt;br /&gt;
In the PARSE_PARAM field, replace the following information:&lt;br /&gt;
 eg_host = $$LOCAL_CATALOGUE_SERVER&lt;br /&gt;
 eg_locale = Locale (en-US, en-CA, fr-CA, etc)&lt;br /&gt;
 eg_skin = algoma, default, lul, nohin, uwin&lt;br /&gt;
 eg_org_unit = 103, 1, etc&lt;br /&gt;
 eg_depth = 0, 1, 2, 3, etc&lt;br /&gt;
&lt;/p&gt;
&lt;h3&gt;Findings and wishlists&lt;/h3&gt;
&lt;p&gt;While it&#039;s quite easy to set up Evergreen as a searchable resource, thanks to its straightforward URL syntax, one of the things that leaps out at me is that Evergreen, by default, has no identifier index for limiting searches by ISBN / ISSN / LCCN / OCLCnum. Ideally, we would disable full-text indexing on this index so that we can more accurately search for ISSNs that include an &lt;strong&gt;x&lt;/strong&gt;. Right now we have to split ISSNs with an &quot;x&quot; into constituent parts and generate searches on those parts, which results in false hits from across the database. This would also be useful for limiting Z39.50 searches.&lt;/p&gt;
&lt;p&gt;I would also like to teach Evergreen about ISBN-10/ISBN-13 equivalence, to broaden the search while maintaining precision. And I would like to automatically normalize ISSN and ISBN formats so that I don&#039;t have to worry about whether a cataloguer entered hyphens or not - and the same for incoming search terms.&lt;/p&gt;
&lt;p&gt;Finally, to support services like &lt;a href=&quot;http://www.worldcat.org/affiliate/webservices/xisbn/app.jsp&quot;&gt;xISBN&lt;/a&gt; that search for multiple formats and editions of a given work by generating a shotgun blast of ISBNs for all known representations, I would love to teach Evergreen how to accept a list of identifiers as search input.&lt;/p&gt;
&lt;p&gt;Don&#039;t ask me when these things will happen, though; if it requires work from me, it will probably be 2010 before any of it happens.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Mon, 29 Jun 2009 13:00:48 -0400</pubDate>
    <guid isPermaLink="false">http://coffeecode.net/archives/194-guid.html</guid>
    
</item>
<item>
    <title>Globalization presentation at Evergreen International Conference 2009</title>
    <link>http://coffeecode.net/archives/193-Globalization-presentation-at-Evergreen-International-Conference-2009.html</link>
            <category>Evergreen</category>
    
    <comments>http://coffeecode.net/archives/193-Globalization-presentation-at-Evergreen-International-Conference-2009.html#comments</comments>
    <wfw:comment>http://coffeecode.net/wfwcomment.php?cid=193</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://coffeecode.net/rss.php?version=2.0&amp;type=comments&amp;cid=193</wfw:commentRss>
    

    <author>dan@coffeecode.net (Dan Scott)</author>
    <content:encoded>
    &lt;p&gt;
I was fortunate to be invited to give a talk (&lt;a href=&quot;http://coffeecode.net/uploads/talks/2009/Globalization1.odp&quot; target=&quot;_blank&quot;&gt;OpenOffice.org Impress&lt;/a&gt; / &lt;a href=&#039;http://coffeecode.net/uploads/talks/2009/Globalization1.pdf&#039;&gt;PDF&lt;/a&gt; ) on Evergreen&#039;s progress on the
globalization front at the first ever &lt;a href=&quot;http://evergreen-ils.org/dokuwiki/doku.php?id=eg09:main&quot;&gt;Evergreen International Conference&lt;/a&gt;. My friend
&lt;a href=&quot;http://www.eifl.org/cps/sections/services/eifl-foss/foss-blog/2009_05_29_first-evergreen&quot;&gt;Tigran Zargaryan&lt;/a&gt; from the &lt;a href=&quot;http://www.flib.sci.am&quot;&gt;Fundamental Science Library of the National Academy of Sciences of the Republic of Armenia&lt;/a&gt; gave a
talk at almost the same time about his library&#039;s progress in adopting
Evergreen. Tigran himself was responsible for the translation of the
Evergreen catalogue and staff client into Armenian, and he confided that he
also expected to make significant progress towards a Russian translation
during the lengthy layovers at airports that are part of his normal travel routine.
&lt;/p&gt;
&lt;p&gt;
So, my goal was to provide an overview of the progress we have made in
taking Evergreen from its American English roots and enabling it to support
not just translated interfaces, but properly localized content display - and
to provide some pointers towards where we need to go next. We have been
making progress towards a more formalized translation process, so keep an
eye out for a call for translations in the next week or two when the Evergreen
1.6 release candidate is made available for testing. We currently sport
Armenian, Canadian English, Canadian French, and Czech translations, and
welcome both new translations and revisions to our current translations.
&lt;/p&gt;
&lt;p&gt;
To make it easier for translators to collaborate, we need to take our
&lt;a href=&quot;http://coffeecode.net:8080&quot;&gt;Pootle translation server&lt;/a&gt; from a
beta service running on my poor little VPS to a real server. We have some
technical challenges to overcome - providing translation support for the
Template::Toolkit framework, for example. And we have some basic grunt work
to do to replace the hard-coded display of numbers, currencies, dates, and times
with localized variations throughout our code.
&lt;p&gt;
&lt;/p&gt;
I was pleasantly surprised by the number of people attending the session; I
hadn&#039;t expected such an interest in the topic, despite it nominally being an international
conference. My only regret was that I rushed off the stage without taking
questions in the mistaken belief that I had used up all of my time and was
eating into my successor&#039;s presentation timeslot; as it turned out, there
was a built-in 15 minute buffer that I had overlooked. Ah well. Thanks to
everyone who came out, and for everyone else who wasn&#039;t able to make it to
the session, I hope you&#039;ll find the slides a good introduction to the
state of globalization in Evergreen. And if you have the skills to contribute, please
consider pitching into the globalization enablement effort!
&lt;/p&gt; 
    </content:encoded>

    <pubDate>Thu, 04 Jun 2009 22:12:00 -0400</pubDate>
    <guid isPermaLink="false">http://coffeecode.net/archives/193-guid.html</guid>
    
</item>
<item>
    <title>Evergreen International Conference hackfest results: Evergreen serials support</title>
    <link>http://coffeecode.net/archives/192-Evergreen-International-Conference-hackfest-results-Evergreen-serials-support.html</link>
            <category>Evergreen</category>
    
    <comments>http://coffeecode.net/archives/192-Evergreen-International-Conference-hackfest-results-Evergreen-serials-support.html#comments</comments>
    <wfw:comment>http://coffeecode.net/wfwcomment.php?cid=192</wfw:comment>

    <slash:comments>3</slash:comments>
    <wfw:commentRss>http://coffeecode.net/rss.php?version=2.0&amp;type=comments&amp;cid=192</wfw:commentRss>
    

    <author>dan@coffeecode.net (Dan Scott)</author>
    <content:encoded>
    &lt;p&gt;Yes, all of a sudden and rather quietly, Evergreen has serials support.&lt;/p&gt;
&lt;p&gt;A few weeks ago, I finished hooking up a rudimentary serials holdings display based on &lt;a href=&quot;http://lisletters.fiander.info/&quot;&gt;David Fiander&#039;s&lt;/a&gt; &lt;a href=&quot;http://svn.open-ils.org/trac/ILS/browser/trunk/Open-ILS/src/perlmods/OpenILS/Utils/MFHD.pm&quot;&gt;MFHD parsing code&lt;/a&gt; to our production instance of Evergreen. We loaded our MFHD records from our legacy system into Evergreen and that gave us enough breathing room to keep working on the problem. By rudimentary I mean:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;limited to displaying one MFHD record per bibliographic record (a problem for journals for which you have separate sets of holdings in microfiche, print, etc)&lt;/li&gt;
&lt;li&gt;serials holdings were displayed for a given bibliographic record no matter what library scope you were searching in (more of a problem in theory than in practice as we currently have one copy of a given bibliographic record per library... that will change over time...)&lt;/li&gt;
&lt;li&gt;no way to edit the MFHD records, which is a problem as the issues we have received since migrating to Evergreen three weeks ago are starting to pile up&lt;/li&gt;
&lt;li&gt;limited to English labels in the interface&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Here&#039;s the rudimentary serials holdings display: &lt;!-- s9ymdb:303 --&gt;&lt;a href=&quot;http://coffeecode.net/uploads/talks/2009/serials_display.png&quot;&gt;&lt;img class=&quot;serendipity_image_left&quot; width=&quot;110&quot; height=&quot;89&quot; style=&quot;border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://coffeecode.net/uploads/talks/2009/serials_display.serendipityThumb.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;The operative phrase is &lt;em&gt;was rudimentary&lt;/em&gt;. In the past two weeks, things have come a long way in Evergreen. The primary result of my afternoon of work at the Evergreen International Hackfest, with lots of help from Mike Rylander and Bill Erickson in navigating the impressive new &lt;a href=&quot;http://dojotoolkit.org&quot;&gt;Dojo toolkit&lt;/a&gt;-based Evergreen JavaScript widgets and services in the upcoming Evergreen 1.6 release, was to add an &lt;strong&gt;Edit&lt;/strong&gt; button to the holdings display that shows up when the record is viewed in the staff client. When pressed, the Edit button invokes a MARC editor so that you can copy an 86[345] field and fill in the pertinent information; or collapse holdings in the 86[678] fields, etc. It seems like a minor victory, but it was a real result from the hackfest, and that cannot be discounted!&lt;/p&gt;
&lt;p&gt;
Here&#039;s the MARC editor in action:&lt;!-- s9ymdb:304 --&gt; &lt;a href=&quot;http://coffeecode.net/uploads/talks/2009/MFHD_editor.png&quot;&gt;&lt;img class=&quot;serendipity_image_left&quot; width=&quot;110&quot; height=&quot;89&quot; style=&quot;border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://coffeecode.net/uploads/talks/2009/MFHD_editor.serendipityThumb.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Since then, I&#039;ve been on fire... or maybe on a slow burn, as I put a few hours in here and there, and am happy to say that when Evergreen 1.6 is released, serials support will feature:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;support for display unlimited MFHD records per bibliographic record&lt;/li&gt;
&lt;li&gt;holdings display scoped by library search context - so you&#039;ll only see holdings for the part of the library hierarchy that you&#039;re searching, rather than the whole consortium&lt;/li&gt;
&lt;li&gt;the &lt;strong&gt;Edit&lt;/strong&gt; button for editing the raw MFHD record&lt;/li&gt;
&lt;li&gt;internationalization support for interface labels, based on Dojo string substitution&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I have already committed these features to the Evergreen trunk, but I hope to add a few more pieces to the mix before the Evergreen 1.6 release is cut. We need to display the 852 field contents to identify the location of each set of holdings, and we need to give cataloguers the ability to edit some of the attributes (such as owning library).&lt;/p&gt;
&lt;p&gt;Here are &lt;a class=&#039;serendipity_image_link&#039; href=&#039;http://coffeecode.net/uploads/talks/2009/Hackfest_results.pdf&#039;&gt;&lt;!-- s9ymdb:302 --&gt;&lt;img class=&quot;serendipity_image_left&quot; width=&quot;&quot; height=&quot;&quot; style=&quot;float: left; border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://coffeecode.net/uploads/talks/2009/Hackfest_results.serendipityThumb.pdf&quot; alt=&quot;&quot; /&gt;the slides&lt;/a&gt; I presented (largely screenshots of the serials display and edit button) for the hackfest results lightning talk that I gave with Jeff Godin of &lt;a href=&quot;http://www.tadl.org/&quot;&gt;Traverse Area District Library&lt;/a&gt;. Jeff did some interesting work in his own right on generating feeds for recently added titles based on copy location during the hackfest.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Wed, 27 May 2009 14:23:40 -0400</pubDate>
    <guid isPermaLink="false">http://coffeecode.net/archives/192-guid.html</guid>
    
</item>
<item>
    <title>Conifer lives: Ontario launches a consortial academic library system built on Evergreen</title>
    <link>http://coffeecode.net/archives/191-Conifer-lives-Ontario-launches-a-consortial-academic-library-system-built-on-Evergreen.html</link>
            <category>Evergreen</category>
    
    <comments>http://coffeecode.net/archives/191-Conifer-lives-Ontario-launches-a-consortial-academic-library-system-built-on-Evergreen.html#comments</comments>
    <wfw:comment>http://coffeecode.net/wfwcomment.php?cid=191</wfw:comment>

    <slash:comments>25</slash:comments>
    <wfw:commentRss>http://coffeecode.net/rss.php?version=2.0&amp;type=comments&amp;cid=191</wfw:commentRss>
    

    <author>dan@coffeecode.net (Dan Scott)</author>
    <content:encoded>
    &lt;p&gt;
I awoke around 4:48 am today. At the time, I thought it was just our
baby kicking away excitedly. However, later this afternoon, I realized
that it had been almost exactly a week ago, around 4:30 am on Monday, May 4th
that I sent a broadcast email message to librarians and staff at 24
different libraries. The Conifer consortial library system, built on 
the solid foundations of the &lt;a href=&quot;http://evergreen-ils.org&quot;&gt;Evergreen
open-source library system&lt;/a&gt;, had gone live  - and I was exhausted after
a long weekend of migrating all of that data. I was proud to see
the &lt;a href=&quot;http://laurentian.concat.ca&quot;&gt;Laurentian catalogue&lt;/a&gt; sporting
a completely different look and new functionality - reviews! book covers!
sharable book bags! format &amp;amp; edition grouping! - and excited by the
promise of more to come.
&lt;/p&gt;
&lt;p&gt;
Conifer represents the first flowering of an effort that began back
in July 2007 with a hand-shake agreement between
&lt;a href=&quot;http://laurentian.ca&quot;&gt;Laurentian University&lt;/a&gt;,
&lt;a href=&quot;http://mcmaster.ca&quot;&gt;McMaster University&lt;/a&gt;, and the 
&lt;a href=&quot;http://uwindsor.ca&quot;&gt;University of Windsor&lt;/a&gt; to build a provincial,
primarily academic, library system on Evergreen. The system is centrally hosted
by the top-notch IT team at the &lt;a href=&quot;http://www.uoguelph.ca/ccs/&quot;&gt;University of Guelph&lt;/a&gt;.
Things change, and along the way &lt;a href=&quot;http://algomau.ca&quot;&gt;Algoma University&lt;/a&gt; and the 
&lt;a href=&quot;http://nosm.ca&quot;&gt;Northern Ontario School of Medicine&lt;/a&gt; joined us
as full partners, and McMaster University opted to continue contributing to
the common development effort but withdrew from the centrally hosted system.
&lt;/p&gt;
&lt;p&gt;
As noted, we went live on Monday, May 4th and we survived the first day. On Tuesday,
May 5th we corrected a problem in our configuration that had caused some instability
(thanks to Mike Rylander for providing the patch that set things straight). Since then,
we have been slowly refining aspects of the system - setting up circulation rules,
migrating records and items that had been missed over the weekend, polishing the Z39.50
server, fine-tuning the permissions scheme - but the core of the system is solid. We 
have a consortial system that stretches from the southern-most tip of Ontario to the
north-west corner of the province (hello, Thunder Bay!), and so far connectivity seems
good and the reliability of the system - which, upon launch, has probably become the
second largest Evergreen implementation by number of bibliographic records - has been
superb.
&lt;/p&gt;
&lt;p&gt;
A few interesting statistics about Conifer... (have I mentioned how much
I love that Evergreen is built on PostgreSQL because it becomes so simple to
generate basic reports in plain SQL?):
&lt;/p&gt;
&lt;h4&gt;Number of staff and user accounts per library in Conifer&lt;/h4&gt;
&lt;pre&gt;
conifer=# SELECT aou.name, count(au.id)
    FROM actor.org_unit aou
    INNER JOIN actor.usr au
    ON aou.id = au.home_ou
    GROUP BY aou.name
    ORDER BY 2 DESC;

                    name                    | count 
--------------------------------------------+-------
 Leddy Library                              | 19468
 J.N. Desmarais Library                     | 11921
 Algoma University, Wishart Library         |  2431
 University of Sudbury                      |  1100
 Hearst, Bibliothèque Maurice-Saulnier      |  1043
 Huntington College Library                 |   834
 Paul Martin Law Library                    |   592
 Northern Ontario School of Medicine (West) |   284
 HRSRH Health Sciences Library              |   261
 Northern Ontario School of Medicine (East) |   224
 Xstrata Process Support Centre Library     |   122
 NOHIN                                      |   121
 Instructional Media Centre                 |     9
 Laboratoire de didactiques, E.S.E.         |     7
 Vale Inco                                  |     4
 Mines Library, Willet Green Miller Centre  |     2
 Art Gallery of Sudbury                     |     1
 Curriculum Resource Centre                 |     1
 Sault Area Hospital                        |     1
 Centre Franco-Ontarien de Folklore         |     1
 Conifer                                    |     1
(21 rows)
&lt;/pre&gt;
&lt;h4&gt;Number of copies held per library in Conifer&lt;/h4&gt;
&lt;pre&gt;
conifer=# SELECT aou.name, count(ac.barcode)
    FROM actor.org_unit aou
    INNER JOIN asset.copy ac
    ON aou.id = ac.circ_lib
    GROUP BY aou.name
    ORDER BY 2 DESC;

                    name                    |  count
--------------------------------------------+---------
 Leddy Library                              | 1373197
 J.N. Desmarais Library                     |  614380
 Paul Martin Law Library                    |  229391
 Algoma University, Wishart Library         |  115156
 University of Sudbury                      |   42154
 Hearst, Bibliothèque Maurice-Saulnier      |   34276
 Huntington College Library                 |   12517
 Laboratoire de didactiques, E.S.E.         |   10284
 Mining and the Environment Database        |    9940
 HRSRH Health Sciences Library              |    7512
 Music Resource Centre                      |    7511
 Xstrata Process Support Centre Library     |    5477
 Centre Franco-Ontarien de Folklore         |    4365
 Northern Ontario School of Medicine (East) |    3779
 Northern Ontario School of Medicine (West) |    3301
 NOHIN                                      |    2647
 Mines Library, Willet Green Miller Centre  |    2617
 Curriculum Resource Centre                 |    2583
 Sault Area Hospital                        |    2515
 Art Gallery of Sudbury                     |    2237
 Hearst Timmins, Centre de Ressources       |    2202
 Hearst Kapuskasing, Centre de Ressources   |    2007
 Vale Inco                                  |    1106
 Instructional Media Centre                 |    1095
(24 rows)
&lt;/pre&gt;
&lt;h4&gt;What about acquisitions, serials, and reserves?&lt;/h4&gt;
&lt;p&gt;
One of the reasons we had a hard migration date of early May was because
it matches nicely with the fiscal year-end for those institutions who were
running a traditional acquisitions system on their legacy ILS. We normally
shut down all purchases for a period of weeks while we roll over the encumbrances
into the next fiscal year and set up our budgets. This year, we&#039;re migrating all
of the old financial data twice: first, and foremost, into the most sophisticated
set of spreadsheets you&#039;ll ever see attached to a library system (as pulled together
by the inestimable Art Rhyno); and second, into the Evergreen acquisitions system
that will launch with Evergreen 1.6. The first migration of a given set of data
is always the hardest part, so once we have the fund / order / provider data in
spreadsheets, the migration into Evergreen proper will be trivial. This will give
us the summer to use both systems side-by-side and refine what we need from Evergreen.
&lt;/p&gt;
&lt;p&gt;
We have migrated all of our serials data from the legacy system, I just haven&#039;t
enabled the display of that data in our live system. A prototype was running on
my laptop for a few days until I accidentally blew it away - ah well, anything
worthwhile doing is better the second time around anyway. This, too, will be
part of the Evergreen 1.6 release, and will feature full MFHD compliance built on
the code that David Fiander has been writing on behalf of Equinox. I should note
that this first cut at serials is in some ways relatively basic; while the system in
Evergreen 1.6 will be fully MFHD compliant, down to the point of letting you to
edit an MFHD record to &quot;check in&quot; a new issue by adding a new 863 field, it won&#039;t
associate barcodes with individual issues. Most of the database schema exists to
support that, but there&#039;s still a large amount of code to be written on top of the
schema and we need Something That Works Right Now &lt;img src=&quot;http://coffeecode.net/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt; I&#039;m confident that that&#039;s coming
not too far down the road, though.
&lt;/p&gt;
&lt;p&gt;
Finally, what would an academic library be without reserves? Art Rhyno (again!) has
been working with Graham Fawcett for the past six months on
&lt;a href=&quot;http://svn.open-ils.org/trac/ILS-Contrib/wiki/SyrupReserves&quot;&gt;Syrup&lt;/a&gt; -
a really impressive melding of the world of electronic reserves and traditional
physical library system reserves that uses SIP and Z39.50 to talk to Evergreen.
Syrup is just about at a full boil now, so in a few more weeks we should have it
deployed so that we can savour its sweetness through the relatively slow summer
months before ensuring that the taste is just right for all of our incoming students
and faculty in the fall.
&lt;/p&gt; 
    </content:encoded>

    <pubDate>Mon, 11 May 2009 17:21:24 -0400</pubDate>
    <guid isPermaLink="false">http://coffeecode.net/archives/191-guid.html</guid>
    
</item>
<item>
    <title>All in a day's work: defending book reviews in our catalogue</title>
    <link>http://coffeecode.net/archives/190-All-in-a-days-work-defending-book-reviews-in-our-catalogue.html</link>
            <category>Libraries</category>
    
    <comments>http://coffeecode.net/archives/190-All-in-a-days-work-defending-book-reviews-in-our-catalogue.html#comments</comments>
    <wfw:comment>http://coffeecode.net/wfwcomment.php?cid=190</wfw:comment>

    <slash:comments>1</slash:comments>
    <wfw:commentRss>http://coffeecode.net/rss.php?version=2.0&amp;type=comments&amp;cid=190</wfw:commentRss>
    

    <author>dan@coffeecode.net (Dan Scott)</author>
    <content:encoded>
    &lt;p&gt;The following was written in response to a faculty member&#039;s complaint that a review containing a negative statement about a book that the faculty member had authored was attached to the book record in our catalogue. The facult member asked that we delete the review from the catalogue because &lt;em&gt;[i]t is inappropriate for the Laurentian library to be highlighting attacks on Laurentian&#039;s faculty, undermining their work in the eyes of students and other faculty members&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;My response:&lt;/p&gt;
&lt;blockquote&gt;On the matter of the reviews that appear as a supplemental part of the
Conifer catalogue, we contracted with a third-party supplier of review
content that draws from a &lt;a href=&quot;http://www.bowker.com/syndetics/options/book_reviews.htm&quot;&gt;number of sources&lt;/a&gt;.&lt;/blockquote&gt;
&lt;blockquote&gt;These reviews are automatically matched to books displayed in the
catalogue by correlating their ISBN. There is no selection being
performed on the part of the Library, nor is there the ability to select
or hide specific reviews for a given book in the catalogue.
&lt;/blockquote&gt;
&lt;blockquote&gt;
It is regrettable that the one review available for your book from our
added content supplier should include one negative statement; however,
I&#039;m sure you can appreciate my position that it would be an extremely
dangerous policy for the Library to deliberately suppress content if
said content does not support our institution.
&lt;/blockquote&gt;
&lt;blockquote&gt;
As to your concerns about catalogue browsers confusing the providence of
the review, I believe most readers would find the byline &quot;CHOICE
Copyright © American Library Association, used with permission.&quot; a
reasonably clear indication of the source of the review. I agree,
however, that the reviewer&#039;s name should be included, and will request
that our added content supplier make this amendment to their service.
&lt;/blockquote&gt;
&lt;blockquote&gt;
I do empathize with your position on this matter, but I hope
that you can see that we are trying to draw from a broad range of review
sources, and that these sources are generally considered reputable, and
that as a general policy I cannot support hiding reviews that are not
uniformly supportive of our institution.
&lt;/blockquote&gt;
&lt;p&gt;
I had expected the addition of third-party reviews to the catalogue to be a universally welcomed enhancement, and I naively failed to anticipate this possibility. In retrospect, it&#039;s easy to see that enriched content that helps library users select material might not please everyone. However... just as we wouldn&#039;t rip the article out of the pertinent copy of &lt;strong&gt;Choice&lt;/strong&gt; if we had it on our shelves, I think we&#039;re perfectly justified in maintaining our third-party reviews in the catalogue.
&lt;/p&gt;
&lt;p&gt;
Have other librarians run across similar complaints?
&lt;/p&gt; 
    </content:encoded>

    <pubDate>Thu, 07 May 2009 16:26:10 -0400</pubDate>
    <guid isPermaLink="false">http://coffeecode.net/archives/190-guid.html</guid>
    
</item>
<item>
    <title>Evergreen iPhone application? Unnecessary!</title>
    <link>http://coffeecode.net/archives/189-Evergreen-iPhone-application-Unnecessary!.html</link>
            <category>Evergreen</category>
    
    <comments>http://coffeecode.net/archives/189-Evergreen-iPhone-application-Unnecessary!.html#comments</comments>
    <wfw:comment>http://coffeecode.net/wfwcomment.php?cid=189</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://coffeecode.net/rss.php?version=2.0&amp;type=comments&amp;cid=189</wfw:commentRss>
    

    <author>dan@coffeecode.net (Dan Scott)</author>
    <content:encoded>
    &lt;p&gt;This Easter weekend I had the opportunity to play with someone&#039;s iPod Touch. Of course, the only thing I tried was the Evergreen 1.4 catalogue interface. Lo and behold, it came up just fine on Safari in all of its heavily dynamic JavaScript and less-than-XHTML-compliant glory - even sporting several Dojo widgets. Nice. So we don&#039;t have to worry about writing an iPhone-specific application to access Evergreen; users of such devices can just use the normal dynamic catalogue with full functionality.&lt;/p&gt;
&lt;p&gt;Evergreen doesn&#039;t fare quite as well with Microsoft&#039;s rather decrepit &lt;em&gt;PocketExplorer&lt;/em&gt; browser on my HTC Touch smartphone (it&#039;s a Windows Mobile monstrosity, sigh), but it does work well with the &lt;a href=&quot;http://www.opera.com/mobile/&quot;&gt;Opera Mobile&lt;/a&gt; 9.5 beta browser. I eagerly anticipate the first good release of &lt;a href=&quot;https://wiki.mozilla.org/mobile&quot;&gt;Fennec&lt;/a&gt; for Windows Mobile (&lt;a href=&quot;http://starkravingfinkle.org/blog/2009/03/fennec-windows-mobile-update/&quot;&gt;coming soon!&lt;/a&gt;), as I&#039;m confident that&#039;s going to improve my mobile Web browsing experience even further.&lt;/p&gt;
&lt;p&gt;I predict that in another year or two the idea of building mobile-specific Web portals to complement your full-function Web site will be pretty passé. I already get really irritated when Web sites think they&#039;re being helpful by automatically redirecting my smartphone to an extremely limited interface; in most cases, the full site runs fine. Give me the option, sure, but don&#039;t force me down that path. As hardware costs continue to drop, and 3G networks expand, and more people upgrade to more capable mobile devices, one full-function Web site will be all we need--as long as that site is written in (X)HTML and CSS and JavaScript.&lt;/p&gt;
&lt;p&gt;Those sites that decide to push core functionality into Flash or SilverLight, on the other hand, can go straight to hell, thankyouverymuch. I&#039;m looking at you, &lt;a href=&quot;http://ptonthenet.com&quot;&gt;PTOnTheNet&lt;/a&gt;. This is a site to which Lynn has been a paying customer for years. It recently announced that it was revising the Web site, which is all well and good. What&#039;s not so good is that they adopted SilverLight: not just for pretty effects here and there, but as a core technology. Problem: Lynn has been using Linux at home since I introduced her to it somewhere around eight years ago, and last year bought one of the early models of the Linux-based Asus EEE netbook. Not only did the site redesign destroy the personal training programs she had set up for her clients over the years (breaking site redesign rule #1: &lt;em&gt;Thou shalt not destroy your clients&#039; data&lt;/em&gt;), but it also renders her netbook useless for that site.&lt;/p&gt;
&lt;p&gt;Even with the &lt;a href=&quot;http://www.go-mono.com/moonlight/&quot;&gt;Moonlight plugin&lt;/a&gt; installed, it looks like the cretinous site developers are using detection scripts to prevent the plugin from even trying to render the content.  With Linux-based netbooks on the rise--and with netbooks being the right form factor and price for personal trainers who want to throw them into their backpacks and not weep too bitterly if their netbook suffers the misfortune of being knocked around or sweated to death--this seems very much like a technology choice that was not based on the needs of the customers. Worst of all, they &lt;a href=&quot;http://www.ptonthenet.com/techhelp.aspx&quot;&gt;deliberately chose to exclude Linux&lt;/a&gt;, when a (X)HTML, CSS, and JavaScript platform would have supported almost any modern platform: not just Linux netbooks, but other mobile devices like the iPhone and smartphones that are so well-suited to the personal trainer. So, at least one customer is going to be walking away, and if there&#039;s a competing Web site out there that caters to a broader clientele, I bet there will be far more customers moving in that direction.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Mon, 13 Apr 2009 00:29:58 -0400</pubDate>
    <guid isPermaLink="false">http://coffeecode.net/archives/189-guid.html</guid>
    
</item>
<item>
    <title>Transparent acquisitions budgets and expenditures for academic libraries</title>
    <link>http://coffeecode.net/archives/188-Transparent-acquisitions-budgets-and-expenditures-for-academic-libraries.html</link>
            <category>Coding</category>
    
    <comments>http://coffeecode.net/archives/188-Transparent-acquisitions-budgets-and-expenditures-for-academic-libraries.html#comments</comments>
    <wfw:comment>http://coffeecode.net/wfwcomment.php?cid=188</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://coffeecode.net/rss.php?version=2.0&amp;type=comments&amp;cid=188</wfw:commentRss>
    

    <author>dan@coffeecode.net (Dan Scott)</author>
    <content:encoded>
    &lt;p&gt;In my &lt;a href=&quot;http://www.academicmatters.ca/bloggers.bookends.gk?catalog_item_id=2386&amp;category=/blogger/bookends&quot;&gt;most recent post&lt;/a&gt; over at the Academic Matters site, after a general discussion about &quot;new books lists&quot; in academic libraries, I tackle one of the dirty laundry areas for academic libraries: exposing how collection development funds are allocated to departments. Here&#039;s a relevant quote:&lt;/p&gt;
&lt;blockquote&gt;For 2008-2009, we decided to adopt a much more transparent approach our collection development decisions and began publishing publicly available collection development reports on a weekly basis. These reports mirror our library budgets, which are broken down by a per-department, per-material type, per-item language hierarchy. We make the allocated, encumbered, and paid budget amounts available for all to see - inside and outside the Laurentian University community.  ... We recognize that there can be political consequences of exposing this data, particularly if departments feel that they deserve more of a piece of the collection development budget than they currently receive - but those conversations need to be held, and making the data as transparent as possible can only help facilitate those discussions.&lt;/blockquote&gt;
&lt;p&gt;Earth-shaking stuff, eh? If you want to read more, go &lt;a href=&quot;http://www.academicmatters.ca/bloggers.bookends.gk?catalog_item_id=2386&amp;category=/blogger/bookends&quot;&gt;check it out&lt;/a&gt;! Maybe you can be the first person to comment on one of the &lt;em&gt;More than Bookends&lt;/em&gt; blog posts that Amy Greenberg, Anne Fullerton, and I are slowly publishing &lt;img src=&quot;http://coffeecode.net/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;/p&gt; 
    </content:encoded>

    <pubDate>Thu, 19 Mar 2009 13:30:35 -0400</pubDate>
    <guid isPermaLink="false">http://coffeecode.net/archives/188-guid.html</guid>
    
</item>
<item>
    <title>One big library, one little device: Evergreen staff client on Nokia N810</title>
    <link>http://coffeecode.net/archives/187-One-big-library,-one-little-device-Evergreen-staff-client-on-Nokia-N810.html</link>
            <category>Evergreen</category>
    
    <comments>http://coffeecode.net/archives/187-One-big-library,-one-little-device-Evergreen-staff-client-on-Nokia-N810.html#comments</comments>
    <wfw:comment>http://coffeecode.net/wfwcomment.php?cid=187</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://coffeecode.net/rss.php?version=2.0&amp;type=comments&amp;cid=187</wfw:commentRss>
    

    <author>dan@coffeecode.net (Dan Scott)</author>
    <content:encoded>
    &lt;p&gt;&lt;div class=&quot;serendipity_imageComment_left&quot; style=&quot;width: 480px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;!-- s9ymdb:301 --&gt;&lt;img class=&quot;serendipity_image_left&quot; width=&quot;480&quot; height=&quot;379&quot;  src=&quot;http://coffeecode.net/uploads/pics/n810.jpg&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;&lt;div class=&quot;serendipity_imageComment_txt&quot;&gt;It&#039;s hard to take good photos of these devices&lt;/div&gt;&lt;/div&gt;
Almost exactly a year ago, Jason Etheridge (the primary developer of the Evergreen staff client) and I managed to get our hands on a developer edition of the &lt;a href=&quot;http://www.nseries.com/products/n810/#l=products,n810&quot; title=&quot;Nokia N810 official site&quot;&gt;Nokia N810&lt;/a&gt; Internet tablet device. It&#039;s a nifty little handheld computer that packs 128 MB of memory, a touch screen, and a beautiful 800x480 screen, and I&#039;ve had my hands on it from almost the beginning. The primary rationale of the Nokia developer program was to encourage developers to put together useful applications for their platform, of course... and as the months ticked by and I did nothing of interest, my guilt slowly grew.
&lt;/p&gt;
&lt;p&gt;
Well, today I feel a little bit better. Here&#039;s what happened: when I was attending &lt;a href=&quot;http://fsoss.senecac.on.ca/2008/&quot; title=&quot;Free Software and Open Source Symposium&quot;&gt;FSOSS 2008&lt;/a&gt; at Seneca College, I ran into &lt;a href=&quot;http://madhava.com/egotism/&quot;&gt;Madhava Enros&lt;/a&gt;. Madhava and I had worked together on some help UI designs back when we were both DB2 employees; since then, he had joined the Mozilla Foundation and was working on &lt;a href=&quot;https://wiki.mozilla.org/Mobile/Fennec&quot; title=&quot;Fennec on the Mozilla wiki&quot;&gt;Fennec&lt;/a&gt;, the mobile version of Firefox targeting the N810 device (to begin with, at least). The first alpha of Fennec had been released to coincide with FSOSS 2008, so I gave it a shot a few days later. Madhava&#039;s team made some great innovative decisions for Fennec&#039;s UI, but what really caught my eye was that they had packaged a port of XULRunner-1.9 to the N810.
&lt;/p&gt;
&lt;p&gt;
See, the Evergreen staff client is built on XUL, the same XML/JavaScript/CSS foundation as Firefox and Thunderbird and Fennec - and to run XUL, you need XULRunner. At the time, though, the Evergreen staff client needed the 1.8 version of XULRunner; it simply wouldn&#039;t work with 1.9. So, I stuffed the N810 back into its case and forgot about it for a few more months while I focused on other things like the never-ending effort to improve Evergreen&#039;s internationalization support.
&lt;/p&gt;
&lt;p&gt;
Over the last few weeks, though, Jason has been steadily enhancing the staff client in Evergreen trunk - and the comment for one of his &lt;a href=&quot;http://svn.open-ils.org/trac/ILS/changeset/12275&quot; title=&quot;Evergreen changeset 12275&quot;&gt;recent commits&lt;/a&gt; was &lt;q&gt;we&#039;re kicking xulrunner 1.8 to the curb with trunk&lt;/q&gt;. I had a spare hour or two on my hands today, so I copied a staff client build from Conifer&#039;s Evergreen trunk test box to the N810, kicked off the XULRunner command, and waited... expecting failure. Instead, I found that the staff client worked almost exactly as it does on my laptop - the major difference being that some of the default function key mappings on the staff client conflict with the mappings of special buttons on the N810 (like the full screen toggle gets mapped to F6 - Record In-House Use on the staff client). Otherwise, the client did a great job of adjusting to the available screen width, and even Dojo-based interfaces like the Vandelay MARC batch importer/exporter and the pop-up calendar worked. Very cool!
&lt;/p&gt;
&lt;p&gt;
So, if I can find a barcode scanner with a mini-USB attachment, I could have a nice little inventory tool on my hands. Or a mobile circulation station. All because the Evergreen developers made the decision years ago to build on XUL as a cross-platform framework... this should be sweet confirmation that they made a good choice. XUL continues to be ported to more platforms, and anyone using the Evergreen staff client benefits from the optimizations and bug fixes that go into XULRunner. Nice. When we cut a release from Evergreen trunk that supports XULRunner 1.9, I&#039;ll do my best to package up a version of the staff client for the N810, and some of my guilt will be assuaged. Yes!
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Updated 2009-03-02 10:35 am&lt;/strong&gt;: Correcting Madhava&#039;s name; I shouldn&#039;t write past midnight without proof-reading! Sorry Madhava.&lt;/em&gt;&lt;/p&gt; 
    </content:encoded>

    <pubDate>Mon, 02 Mar 2009 00:23:17 -0500</pubDate>
    <guid isPermaLink="false">http://coffeecode.net/archives/187-guid.html</guid>
    
</item>
<item>
    <title>Arik and Amber update</title>
    <link>http://coffeecode.net/archives/186-Arik-and-Amber-update.html</link>
            <category>Personal</category>
    
    <comments>http://coffeecode.net/archives/186-Arik-and-Amber-update.html#comments</comments>
    <wfw:comment>http://coffeecode.net/wfwcomment.php?cid=186</wfw:comment>

    <slash:comments>2</slash:comments>
    <wfw:commentRss>http://coffeecode.net/rss.php?version=2.0&amp;type=comments&amp;cid=186</wfw:commentRss>
    

    <author>dan@coffeecode.net (Dan Scott)</author>
    <content:encoded>
    &lt;p&gt;Arik is just over eight weeks old now (and over fifteen pounds!), so I&#039;m long overdue to post some photo updates of the family. The following photo was taken when Arik was about six weeks old. He loves the sling; so does his Mommy, and and so does his Daddy (who has an extra-large version to fit his extra-large frame). Amber prefers us to use the Austin Powers-style baby carrier, though.&lt;/p&gt;
&lt;div class=&quot;serendipity_imageComment_center&quot; style=&quot;width: 110px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;!-- s9ymdb:295 --&gt;&lt;a href=&quot;http://coffeecode.net/uploads/pics/arik/img_2461.jpg&quot;&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;110&quot; height=&quot;83&quot;  src=&quot;http://coffeecode.net/uploads/pics/arik/img_2461.serendipityThumb.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;serendipity_imageComment_txt&quot;&gt;Three most important people&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Janet sent us this fabulous soft, warm quilt for Arik that will undoubtedly accompany him for years to come. In this picture, he&#039;s lying on the floor in our living room soaking up a bit of the sunshine on a warm February day in Sudbury (it happens, honestly!):&lt;/p&gt;
&lt;div class=&quot;serendipity_imageComment_center&quot; style=&quot;width: 110px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;!-- s9ymdb:296 --&gt;&lt;a href=&quot;http://coffeecode.net/uploads/pics/arik/img_2506.jpg&quot;&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;110&quot; height=&quot;83&quot;  src=&quot;http://coffeecode.net/uploads/pics/arik/img_2506.serendipityThumb.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;serendipity_imageComment_txt&quot;&gt;A study in contrasts (quilt courtesy Janet)&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;serendipity_imageComment_center&quot; style=&quot;width: 110px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;!-- s9ymdb:297 --&gt;&lt;a href=&quot;http://coffeecode.net/uploads/pics/arik/img_2512.jpg&quot;&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;110&quot; height=&quot;83&quot;  src=&quot;http://coffeecode.net/uploads/pics/arik/img_2512.serendipityThumb.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;serendipity_imageComment_txt&quot;&gt;Spook loves Arik (and the quilt, and sunshine) too&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Amber loves Arik. Loves holding him, loves singing to him, loves being sung songs featuring both of them that Daddy makes up on the spot... only sometimes is that a detriment when Arik is sleeping and she wants to wake him up &lt;img src=&quot;http://coffeecode.net/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;/p&gt;
&lt;div class=&quot;serendipity_imageComment_center&quot; style=&quot;width: 110px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;!-- s9ymdb:298 --&gt;&lt;a href=&quot;http://coffeecode.net/uploads/pics/arik/img_2520.jpg&quot;&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;110&quot; height=&quot;83&quot;  src=&quot;http://coffeecode.net/uploads/pics/arik/img_2520.serendipityThumb.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;serendipity_imageComment_txt&quot;&gt;Big sister doesn&#039;t look &lt;u&gt;that&lt;/u&gt; big next to Arik&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Amber also loves the camera. (For the dentists out there, she is on a weaning program for her pacifier, don&#039;t worry)&lt;/p&gt;
&lt;div class=&quot;serendipity_imageComment_center&quot; style=&quot;width: 110px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;!-- s9ymdb:299 --&gt;&lt;a href=&quot;http://coffeecode.net/uploads/pics/amber/img_2521.jpg&quot;&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;110&quot; height=&quot;83&quot;  src=&quot;http://coffeecode.net/uploads/pics/amber/img_2521.serendipityThumb.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;serendipity_imageComment_txt&quot;&gt;Mugging&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Arik apparently likes the camera too.&lt;/p&gt;
&lt;div class=&quot;serendipity_imageComment_center&quot; style=&quot;width: 110px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;!-- s9ymdb:300 --&gt;&lt;a href=&quot;http://coffeecode.net/uploads/pics/arik/img_2524.jpg&quot;&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;110&quot; height=&quot;83&quot;  src=&quot;http://coffeecode.net/uploads/pics/arik/img_2524.serendipityThumb.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;serendipity_imageComment_txt&quot;&gt;Mugging, part two&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Updated: 2009-03-01&lt;/strong&gt; Thumbnails were all linked to the same image... fixed!&lt;/em&gt;&lt;/p&gt; 
    </content:encoded>

    <pubDate>Sun, 01 Mar 2009 08:38:01 -0500</pubDate>
    <guid isPermaLink="false">http://coffeecode.net/archives/186-guid.html</guid>
    
</item>
<item>
    <title>Seven things</title>
    <link>http://coffeecode.net/archives/185-Seven-things.html</link>
            <category>Personal</category>
            <category>PHP</category>
    
    <comments>http://coffeecode.net/archives/185-Seven-things.html#comments</comments>
    <wfw:comment>http://coffeecode.net/wfwcomment.php?cid=185</wfw:comment>

    <slash:comments>5</slash:comments>
    <wfw:commentRss>http://coffeecode.net/rss.php?version=2.0&amp;type=comments&amp;cid=185</wfw:commentRss>
    

    <author>dan@coffeecode.net (Dan Scott)</author>
    <content:encoded>
    &lt;p&gt;I was tagged by &lt;a href=&quot;http://pooteeweet.org/blog/1402&quot;&gt;Lukas&lt;/a&gt; for the &quot;7 things&quot; meme, and meant to do something about it, but I&#039;ve been kind of preoccupied with the new baby and the sprinting toddler and work. Anyway, it seems like a heck of a lot more reasonable than the evil Facebook&#039;s &quot;25 things&quot; meme, so I&#039;m going to take a few minutes to try to play along.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I was an early riser until I was around 15 or 16 years old and discovered the surrealists. At that point, I began experimenting with sleep deprivation as a means of stimulating my prose and poetry. This is also when I began drinking coffee. After about a month, I was no longer capable of being an early riser--and the fruit of writing experiments was, uh, not too impressive.&lt;/li&gt;
&lt;li&gt;Rather than going directly to university after high school, I elected to take what is now termed a &lt;em&gt;gap year&lt;/em&gt;. No trips to Europe for me, though; the goal was to refine my bass-playing and music-reading skills and head to a post-secondary music program. I recorded a few prog-rock tracks in a studio with a fantastic couple of guys (hey Pete and Mike!), but ultimately didn&#039;t put enough effort into my bass to carry out the plan. Let me assure you that a year of working night shifts at a convenience store in the entertainment district of a small city is &lt;u&gt;not&lt;/u&gt; a waste of time; I can&#039;t count the number of experiences that I&#039;m thankful for having had during that time.&lt;/li&gt;
&lt;li&gt;Although I roast and grind my own coffee, I&#039;m not a coffee snob. In fact, I possess almost no sense of smell and I suspect that my sense of taste is limited in comparison to most people, and I&#039;m quite happy to drink diner coffee. I cannot stand the taste of Starbucks coffee, however.&lt;/li&gt;
&lt;li&gt;The first time I was able to run a full kilometre without walking was when I was eighteen. Since then I&#039;ve run a couple of 5K races and and a &lt;a href=&quot;http://www.coffeecode.net/archives/79-Im-not-as-sore-as-I-thought-I-would-be.html&quot;&gt;sprint duathlon&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;I&#039;m pretty sure I was destined to become a systems librarian. When I was 10, I used to hang out at the local college&#039;s computer room until the students would log me onto a completely restricted Gandalf mainframe account so I could pretend to be Matthew Broderick in WarGames. My first real job, when I was 14, was as a &quot;computer page&quot; at the Barrie Public Library Children&#039;s Annex. It was my responsibility to oversee the use of the bank of Commodore 64s that the library made available to children, luring them in with games but requiring them to complete their allotment of educational software first. Oh the power.&lt;/li&gt;
&lt;li&gt;I occasionally wrote reviews for random CDs that came into the campus newspaper office. Nobody else wanted to review this orange CD called &lt;em&gt;Tragic Kingdom&lt;/em&gt; by some West-coast band, so I took it on. I gave it a savage review; I wasn&#039;t impressed with faux-ska and couldn&#039;t stand the lead singer&#039;s voice. Six months later No Doubt&#039;s &quot;SpiderWebs&quot; was in high rotation on every radio station in North America (look, folks, that song is repetitive enough without being played twice an hour!). I&#039;m sure that my negative review still gnaws at Gwen Stefani today as she weeps bitterly in her platinum mansion.&lt;/li&gt;
&lt;li&gt;In grade one, my report card read &lt;em&gt;Dan is too critical of his classmates.&lt;/em&gt; In my defence, if they weren&#039;t so stupid--come on, sound it out buddy--I wouldn&#039;t have been critical. Okay, not much of a defence.&lt;/li&gt;
&lt;li&gt;I am not a very demanding friend. I (almost) never call, (almost) never write, and (almost) never visit. Okay, scratch that: I&#039;m a crappy friend. Most of my close friends found out that we were expecting a second child only through Lynn&#039;s Facebook account. I called one couple shortly after Arik was born and his quasi-namesake (one of the Eric&#039;s in our life who bring honour to the noble name) asked me after a few minutes: &quot;So, uhh... did we &lt;em&gt;know&lt;/em&gt; that you were expecting a baby?&quot;. No, no you didn&#039;t, and that&#039;s not your fault. Man I suck.&lt;/li&gt;
&lt;li&gt;I&#039;m really good at arithmetic.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Link your original tagger(s), and list these rules on your blog.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Share seven facts about yourself in the post — some random, some weird.&lt;/li&gt;
&lt;li&gt;Tag seven people at the end of your post by leaving their names and the links to their blogs.&lt;/li&gt;
&lt;li&gt;Let them know they’ve been tagged by leaving a comment on their blogs and/or Twitter.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wow, that was fun. Lemme see, I&#039;m going to break the rules and just tag two people: &lt;a href=&quot;http://blog.evermeet.cx&quot;&gt;Helmut&lt;/a&gt;, because he&#039;s one of the only other people who worked on the ibm_db2 PHP driver out of passion rather than as a job assignment. And &lt;a href=&quot;http://rc98.net&quot;&gt;Gabriel&lt;/a&gt; because I like his style.&lt;/p&gt;
 
    </content:encoded>

    <pubDate>Mon, 09 Feb 2009 00:56:35 -0500</pubDate>
    <guid isPermaLink="false">http://coffeecode.net/archives/185-guid.html</guid>
    
</item>
<item>
    <title>Unicorn to Evergreen migration: rough notes</title>
    <link>http://coffeecode.net/archives/184-Unicorn-to-Evergreen-migration-rough-notes.html</link>
            <category>Evergreen</category>
    
    <comments>http://coffeecode.net/archives/184-Unicorn-to-Evergreen-migration-rough-notes.html#comments</comments>
    <wfw:comment>http://coffeecode.net/wfwcomment.php?cid=184</wfw:comment>

    <slash:comments>4</slash:comments>
    <wfw:commentRss>http://coffeecode.net/rss.php?version=2.0&amp;type=comments&amp;cid=184</wfw:commentRss>
    

    <author>dan@coffeecode.net (Dan Scott)</author>
    <content:encoded>
    &lt;p&gt;&lt;strong&gt;Updated 2009-02-25 00:29 EST&lt;/strong&gt;: Corrected setuptools installation step.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Updated 2009-02-08 23:39 EST&lt;/strong&gt;: Trimmed width of some of the &amp;lt;pre&amp;gt; code sections for better formatting. Created bzr repository for unicorn2evergreen scripts at &lt;a href=&quot;http://bzr.coffeecode.net/unicorn2evergreen&quot;&gt;http://bzr.coffeecode.net/unicorn2evergreen&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I did this once a long time ago for the &lt;a href=&quot;http://library.upei.ca/&quot;&gt;Robertson Library&lt;/a&gt; at the University of Prince Edward Island. For our own migration to Evergreen, I have to load a representative sample of records from our Unicorn system onto one of our test servers. This has been a good refresher of the process... and a reminder to myself to post the other part of the Unicorn to Evergreen migration scripts in a publicly available location. Okay, they&#039;re posted to this bzr repository called &lt;a href=&quot;http://bzr.coffeecode.net/unicorn2evergreen&quot;&gt;unicorn2evergreen&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Export bibliographic records from Unicorn using Unicorn&#039;s catalog key (basic sequential accession number) as the unique identifier (I plopped the catalog key into the 935a field/subfield combo). I use the catalog key because the &quot;flexkey&quot; is not guaranteed to be unique within a single Unicorn instance - and because the catalog key makes it easy for us to match call numbers and copies.&lt;/li&gt;
&lt;li&gt;For each item, export call number / barcode / owning library / current location / home location / item type using the catalog key as the identifier.&lt;/li&gt;
&lt;li&gt;Set up the organization unit hierarchy on your Evergreen system. You can dump it from an existing Evergreen system into a file named &quot;orgunits.dump&quot; like so:&lt;pre&gt;
pg_dump -U evergreen --data-only --table actor.org_unit_type \
    --table actor.org_unit &gt; orgunits.sql
&lt;/pre&gt;Then drop all of the existing org_units and org_unit_types and load your custom data in a psql session:&lt;pre&gt;
BEGIN;
SET CONSTRAINTS ALL DEFERRED;
DELETE FROM actor.org_unit;
DELETE FROM actor.org_unit_type;
\i orgunits.sql
COMMIT&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;Import bibliographic records using the &lt;a href=&quot;http://open-ils.org/dokuwiki/doku.php?id=evergreen-admin:importing:bibrecords&quot;&gt;standard marc2bre.pl / direct_ingest.pl / pg_loader.pl process&lt;/a&gt;. Point the --idfield / --idsubfield and --tcnfield / --tcnsubfield options for marc2bre.pl at 935a (yes, this sucks for title control numbers, but as noted above they are not guaranteed to be unique in Unicorn and we need uniqueness in Evergreen). We need the bibliographic record entry ID field to be the catalog key to set up subsequent call number/barcode matches.&lt;/li&gt;
&lt;li&gt;Enable the subsequent addition of new bibliographic records by setting the sequence object values to avoid conflicting ID / TCN values by issuing the following SQL statements:&lt;pre&gt;
SELECT setval(&#039;biblio.autogen_tcn_value_seq&#039;,
     (select max(id) from biblio.record_entry) + 100);
SELECT setval(&#039;biblio.record_entry_id_seq&#039;,
     (select max(id) from biblio.record_entry) + 100);&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Process holdings records.
&lt;ol&gt;
  &lt;li&gt;Call numbers might have MARC8 encoded characters, so process&#039;em and convert to UTF8. Theoretically &quot;yaz-iconv -f MARC-8 -t UTF-8 &amp;lt; holdings.lst &amp;gt; holdings_utf8.lst&quot; should do it, but instead it eats linefeeds and creates an unusable field. Ugh. We use a little Python script instead that requires pymarc, which in turn requires a version of setuptools (0.6c5) newer than Debian Etch&#039;s packaged version (0.6c3). So:&lt;pre&gt;
wget http://pypi.python.org/packages/2.4/s/setuptools/setuptools-0.6c9-py2.4.egg
sudo sh setuptools-0.6c9-py2.4.egg
sudo easy_install pymarc&lt;/pre&gt;&lt;/li&gt;
  &lt;li&gt;Now actually generate the &#039;holdings_utf8.lst&#039; file.&lt;pre&gt;
cat holdings.lst | python marc8_to_utf8.py&lt;/pre&gt;&lt;/li&gt;
  &lt;li&gt;Adjust parse_unicorn.py to match up the holdings fields (added flexkey to the start). Then parse the holdings_utf8.lst to generate an SQL file (holdings_eg.sql) that we can load into the import staging table.&lt;pre&gt;
python parse_unicorn.py&lt;/pre&gt;
Note that the holdings data for the item with barcode 30007007751786 didn&#039;t process cleanly and won&#039;t load. Weird - possibly a corrupt character in the item data? Augh, no - there are flexkeys and callnumbers that contain &#039;|&#039; characters (16 occurrences for &quot;|z&quot;, 37 for &quot;|b&quot;), which is of course also what we are using as our delimiters. ARGH. I deleted it for now with:&lt;pre&gt;
grep -v &#039;|z&#039; holdings_utf8.lst &gt; holdings_clean.lst
grep -v &#039;|z&#039; holdings_clean.lst &gt; holdings_clean.lst2
mv holdings_clean.lst2 holdings_clean.lst&lt;/pre&gt;
Adjust parse_unicorn.py to match the new input name and generate a new holdings_eg.sql.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
  &lt;li&gt;Create the import staging table:&lt;pre&gt;
psql -f Open-ILS/src/extras/import/import_staging_table.sql&lt;/pre&gt;&lt;/li&gt;
  &lt;li&gt;Load the items into the import staging table:&lt;pre&gt;
psql -f holdings_eg_clean.sql&lt;/pre&gt;
    We discover that some more of our data sucks - for example, one item (&quot;Research in autism spectrum disorders&quot;, HIRC PER-WEB) has a create date of &#039;0&#039; which is not a valid date format because the barcode is &quot;1750-9467|21&quot;. For now, grep it out as above and reload.&lt;/li&gt;
  &lt;li&gt;Investigate possibilities of collapsing unnecessary duplicate item types:&lt;pre&gt;
SELECT item_type, COUNT(item_type)
FROM staging_items
GROUP BY item_type
ORDER BY item_type;

 item_type  | item_count 
------------+------------
 ATLAS      |        162
 AUDIO      |        792
 AUD_VISUAL |       1790
 AV         |         69
 AV-EQUIP   |        182
 BOOK       |        996
 BOOKS      |     581592
 BOOK_ART   |          1
 BOOK_RARE  |       4949
 BOOK_SHWK  |          5
 BOOK_WEB   |      49163
 COMPUTER   |         33
...
(40 rows)&lt;/pre&gt;
How about locations?&lt;pre&gt;
SELECT location, COUNT(location)
FROM staging_items
GROUP BY location
ORDER BY location;

  location  | count  
------------+--------
 ALGO-ACH   |     13
 ALGO-ATLAS |    148
 ALGO-AV    |   1837
...
(212 rows)&lt;/pre&gt;

Now we can collapse categories pretty simply inside the staging table. For example, if we want to collapse all of the BOOK types into a single type of BOOK:&lt;pre&gt;
UPDATE staging_items
SET item_type = &#039;BOOK&#039;
WHERE item_type IN 
(&#039;BOOKS&#039;, &#039;BOOK_ART&#039;, &#039;BOOK_RARE&#039;, &#039;BOOK_SHWK&#039;, &#039;BOOK_WEB&#039;, &#039;REF-BOOK&#039;);&lt;/pre&gt;
&lt;/li&gt;
  &lt;li&gt;Update legacy library names to new Evergreen library short names (we&#039;re using OCLC codes where possible). Some will be straightforward old names to new names. Others will require a little more logic based on location + legacy library name; we&#039;re splitting the DESMARAIS collection into multiple org-units (Music Resource Centre, Hearst locations, hospital locations, etc).&lt;pre&gt;
-- Laurentian Music Resource Centre
UPDATE staging_items
SET owning_lib = &#039;LUMUSIC&#039;
WHERE location = &#039;DESM-MRC&#039;;

-- Hearst - Kapuskasing location
UPDATE staging_items
SET owning_lib = &#039;KAP&#039;
WHERE location LIKE &#039;HRSTK%&#039;;

-- Hearst - Timmins location
UPDATE staging_items
SET owning_lib = &#039;TIMMINS&#039;
WHERE location LIKE &#039;HRSTT%&#039;;&lt;/pre&gt;&lt;/li&gt;
  &lt;li&gt;Generate the copies in the system:&lt;pre&gt;
psql -f generate_copies.sql&lt;/pre&gt;&lt;/li&gt;
  &lt;li&gt;Make the metarecords:&lt;pre&gt;
psql -f quick_metarecord_map.sql&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Ah, recognize that any electronic resources (which don&#039;t have associated copies) won&#039;t appear. Check for 856 40 and change the bre source to a transcendent one mayhaps?&lt;/p&gt;
&lt;pre&gt;
-- Create a new transcendant resource; 
-- this autogenerates an ID of 4 in a default, untouched system
INSERT INTO config.bib_source (quality, source, transcendant)
VALUES (10, &#039;Electronic resource&#039;, &#039;t&#039;);
-- Make the electronic full text resources (856 40) transcendant
-- by setting their bib record source to the new bib_source value of 4
UPDATE biblio.record_entry 
SET source = 4 
WHERE id IN (
    SELECT DISTINCT(record) 
    FROM metabib.full_rec 
    WHERE tag = &#039;856&#039; AND ind1 = &#039;4&#039; AND ind2 = &#039;0&#039;
);
&lt;/pre&gt;
&lt;p&gt;
And no transcendence. Hmm. Oh well, worry about that later.
&lt;/p&gt;
 
    </content:encoded>

    <pubDate>Sun, 08 Feb 2009 16:32:48 -0500</pubDate>
    <guid isPermaLink="false">http://coffeecode.net/archives/184-guid.html</guid>
    
</item>
<item>
    <title>Evergreen Exposed: introduction to Evergreen development (OLA 2009)</title>
    <link>http://coffeecode.net/archives/183-Evergreen-Exposed-introduction-to-Evergreen-development-OLA-2009.html</link>
            <category>Evergreen</category>
    
    <comments>http://coffeecode.net/archives/183-Evergreen-Exposed-introduction-to-Evergreen-development-OLA-2009.html#comments</comments>
    <wfw:comment>http://coffeecode.net/wfwcomment.php?cid=183</wfw:comment>

    <slash:comments>1</slash:comments>
    <wfw:commentRss>http://coffeecode.net/rss.php?version=2.0&amp;type=comments&amp;cid=183</wfw:commentRss>
    

    <author>dan@coffeecode.net (Dan Scott)</author>
    <content:encoded>
    &lt;p&gt;
&lt;strong&gt;Update 2009-02-19&lt;/strong&gt;: uploaded diffs from Evergreen 1.4.0.2 (&lt;a href=&quot;http://coffeecode.net/uploads/files/EG_exposed.tar.gz&quot; title=&quot;EG_exposed.tar.gz&quot; target=&quot;_blank&quot;&gt;EG_exposed.tar.gz&lt;/a&gt;) for adding details to record summary; and Bill Erickson&#039;s slides and code examples are &lt;a href=&quot;http://acq.open-ils.org/~erickson/berick_ola.zip&quot;&gt;also available for download&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
The slides: &lt;a href=&quot;http://coffeecode.net/uploads/talks/2009/Evergreenexposed.odp&quot; title=&quot;Evergreenexposed.odp&quot; target=&quot;_blank&quot;&gt;Evergreen exposed, part 1&lt;/a&gt; (OpenOffice)
&lt;/p&gt;
&lt;p&gt;My second presentation at the OLA SuperConference 2009 was &lt;strong&gt;Evergreen Exposed: hacking the open library system&lt;/strong&gt;, which promised to &lt;q&gt;take attendees on a tour of the architecture and source code of the &lt;a href=&quot;http://evergreen-ils.org&quot;&gt;Evergreen library system&lt;/a&gt;&lt;/q&gt;. I was very fortunate to have Bill Erickson, one of the original Evergreen developers, agree to join me as a co-presenter. Given the hour-and-fifteen-minute time slot that we were allotted, we opted to take an incremental approach to introducing parts of Evergreen to the audience, starting with basic tasks and working up to more complex customisations. We also tried to focus on answering questions that had been posted to the &lt;a href=&quot;http://evergreen-ils.org/listserv.php&quot;&gt;Evergreen mailing lists&lt;/a&gt; to ensure that we would satisfy our target audience&#039;s interests.&lt;/p&gt;
&lt;h3&gt;Dan starts with the basics&lt;/h3&gt;
&lt;p&gt;I started the session with an introduction of how to create a different skin for the catalogue, starting with text, CSS, JavaScript, and images and extending to the translation and customization framework. We talked about how to future-proof your customizations against future upgrades and how consortia can use skins to provide not just different look-and-feel, but different functionality, for each member of the consortium. Not much more than XML entities defined by DTDs, massaged via Apache server side includes (SSI), but it&#039;s an important conceptual building block for both the catalogue and the staff client.&lt;/p&gt;
&lt;p&gt;I then ran through the exercise of &lt;a href=&quot;http://coffeecode.net/archives/181-Adding-a-new-metadata-format-to-Evergreen-in-a-dozen-lines-of-code.html&quot;&gt;adding a new metadata export format&lt;/a&gt; that brought the Federal Geographic Data Committee&#039;s Content Standard for Geospatial Data Metadata (&lt;a href=&quot;http://www.fgdc.gov/metadata/csdgm/&quot;&gt;FGDC CSGDM&lt;/a&gt;) format to Evergreen&#039;s existing list of supported formats. On the one hand: big deal, another metadata format. Hold that thought in that one hand; we&#039;ll come back to it later.&lt;/p&gt;
&lt;p&gt;I also walked through two other common requests on the mailing lists: &lt;em&gt;how do I define a new index or tweak the behaviour of an existing index&lt;/em&gt; and &lt;em&gt;how do I hide or show more information on the detailed record display page&lt;/em&gt;? I&#039;ll follow up with separate posts for each of these pieces to augment what you have before you in the slides; suffice to say that there&#039;s a lot of &lt;a href=&quot;http://www.loc.gov/standards/mods&quot;&gt;MODS&lt;/a&gt;, a little bit of JavaScript, a smidgin of XPath, a dollop of Evergreen&#039;s interface definition language (IDL), and a slice of Perl mixed together. Along the way, I peeled back the covers to show a bit of OpenSRF in operation, setting up Bill&#039;s part of the show...&lt;/p&gt;
&lt;h3&gt;Bill leads us into the promised land&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; I&#039;ll update this with a link to Bill&#039;s slides when he manages to post them!&lt;/p&gt;
&lt;p&gt;Bill gave a quick &quot;big picture&quot; view of how OpenSRF operates, including a much clearer overview of Evergreen&#039;s object-relational IDL that maps objects to relational tables. He also covered the cstore OpenSRF application that offers access to the underlying database without requiring SQL but still with support for full transactions (commit/rollback) and sub-transactions (savepoints). During Bill&#039;s demonstrations of these features, he exercised srfsh in a way that was new to me - he used the &lt;strong&gt;introspect&lt;/strong&gt; command with a partial method name to perform a left-anchored search for matching method names. Cool!&lt;/p&gt;
&lt;p&gt;Oh, and he also showed that if OpenSRF would normally return a reference to an object defined in the IDL, you can ask it to &lt;em&gt;flesh&lt;/em&gt; the object in-place with its complete set of attributes instead; and of course if any of those attributes are object references, you have the option of fleshing those as well. It&#039;s a lovely way to cut down on chattiness in your application.&lt;/p&gt;
&lt;p&gt;From there, Bill whipped out DojoSRF, the OpenSRF-aware extensions for &lt;a href=&quot;http://dojotoolkit.org&quot;&gt;dojo, the JavaScript toolkit&lt;/a&gt; that Evergreen adopted as its core JavaScript framework in release 1.4. In 90 lines of HTML and JavaScript code, he implemented a basic but workable catalogue - and then, with a few more lines of code, he gave the audience the payoff for that FGDC CSGDM (geographic metadata) format that I had earlier hacked into Evergreen. As part of the transform separates out the geographic coordinates of the subject matter (in the case of our demo data, maps of Northern California), Bill was able, in just a few more lines of code, to easily extract the coordinates from the FGDC CSGDM representation of the bibliographic material and plot the bounding box for the coverage area on a Google Map image. Very cool.&lt;/p&gt;
&lt;p&gt;We had about 15 to 20 people attend our session, and I was happy with that attendance given the extremely technical content and relatively niche product. If as a result we end up adding just one more developer to the Evergreen community, that would be a great outcome. And for myself, I was forced to learn much more of Evergreen - just in time for Project Conifer, I hope &lt;img src=&quot;http://coffeecode.net/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;/p&gt;
 
    </content:encoded>

    <pubDate>Sun, 01 Feb 2009 15:21:19 -0500</pubDate>
    <guid isPermaLink="false">http://coffeecode.net/archives/183-guid.html</guid>
    
</item>
<item>
    <title>Project Conifer update session at OLA SuperConference 2009</title>
    <link>http://coffeecode.net/archives/182-Project-Conifer-update-session-at-OLA-SuperConference-2009.html</link>
            <category>Evergreen</category>
    
    <comments>http://coffeecode.net/archives/182-Project-Conifer-update-session-at-OLA-SuperConference-2009.html#comments</comments>
    <wfw:comment>http://coffeecode.net/wfwcomment.php?cid=182</wfw:comment>

    <slash:comments>1</slash:comments>
    <wfw:commentRss>http://coffeecode.net/rss.php?version=2.0&amp;type=comments&amp;cid=182</wfw:commentRss>
    

    <author>dan@coffeecode.net (Dan Scott)</author>
    <content:encoded>
    &lt;p&gt;&lt;em&gt;&lt;strong&gt;Updated&lt;/strong&gt; 2009-02-02 to add PDF formatted slides because the &lt;a href=&quot;http://go-oo.org&quot;&gt;free and libre formats&lt;/a&gt; just isn&#039;t good enough for some people - heh&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The slides, up front and center:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://coffeecode.net/uploads/talks/2009/OLA2009Coniferupdate.odp&quot; title=&quot;OLA2009Coniferupdate.odp&quot; target=&quot;_blank&quot;&gt;OpenOffice Impress format (ODP)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://coffeecode.net/uploads/talks/2009/OLA2009Coniferupdate.pdf&quot; title=&quot;OLA2009Coniferupdate.pdf&quot; target=&quot;_blank&quot;&gt;Portable Document Format (PDF)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Last year I &lt;a href=&quot;http://coffeecode.net/archives/149-The-State-of-Evergreen-OLA-Presentation.html&quot;&gt;gave a presentation&lt;/a&gt; at the OLA SuperConference  2008 on &lt;em&gt;The State of Evergreen&lt;/em&gt;. Yesterday, &lt;a href=&quot;http://libgrunt.blogspot.com&quot;&gt;John Fink&lt;/a&gt; and I gave an update on the state of &lt;a href=&quot;http://conifer.mcmaster.ca&quot;&gt;Project Conifer&lt;/a&gt;, the partnership between Algoma University, Laurentian University, Northern Ontario School of Medicine, and the University of Windsor to mount a consortial instance of Evergreen for our respective academic libraries.&lt;/p&gt;
&lt;p&gt;McMaster University  (John Fink&#039;s employer) is another Project Conifer institutional partner, albeit with a slightly different relationship. They are contributing resources towards development of academic features, but working towards their own Evergreen instance on their own timeline. Their relationship in the project changed the week before our presentation, so John and I had a fun time adjusting our presentation to match the new reality &lt;img src=&quot;http://coffeecode.net/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;/p&gt;
&lt;p&gt;In comparison to last year, which was largely an introduction to Evergreen and the state of its various features, this session was much more focused on Project Conifer. John gave the background of the project and the importance of having an open source library system at the core of our academic libraries, particularly given the short-term challenges that most of the Project Conifer participants face with their/our current library systems. I focused on the challenges and lessons learned in managing the project, with most of the challenges being the difficulty of getting skilled resources to work on our development requirements, and most of the lessons learned being in working out cost-sharing agreements and priority-setting procedures early on in the project.&lt;/p&gt;
&lt;p&gt;The session was well-attended, and there is clearly growing interest in Evergreen as a viable option, as well a a bit of frustration at the pace of development of some of the features that academics in particular are interested in. These are &quot;interesting times&quot; for academic libraries - this week an announcement has been rippling through the Ontario library community that the &lt;a href=&quot;http://bibliocentre.ca&quot;&gt;BiblioCentre&lt;/a&gt; consortial library system that has served many Ontario college libraries since 2003 is being shut down. If Evergreen&#039;s academic features were already in place, it would have been a slam-dunk to put together a business case for a centrally hosted Evergreen system to serve the same constituency. As those features are still in active development, it&#039;s not quite as easy to make that business case.
&lt;/p&gt;
&lt;p&gt;Happily, Art Rhyno and Graham Fawcett have taken support for academic reserves for managing both print and electronic materials from ground zero to a reasonable interface in just a few months. They expect to start wiring in direct Evergreen support over the next few months so that we will have a functioning reserves system that goes far beyond our current library system&#039;s capabilities (&quot;our&quot; being Laurentian University, in this case).&lt;/p&gt;
&lt;p&gt;After an exciting drive from Buffalo on a very snowy Wednesday afternoon, Bill Erickson of &lt;a href=&quot;http://esilibrary.com&quot;&gt;Equinox Software Incorporated&lt;/a&gt; gave Project Conifer participants a demo of the current state of acquisitions on Wednesday night, and it&#039;s not too far from meeting our base requirements. Equinox has hired a second developer to contribute to acquisitions development, documentation is being concurrently produced, and one of Project Conifer&#039;s contractors is working on adding EDI support. So we&#039;re optimistic that a functioning base acquisitions system will be in place in May - although, as one of our collection development librarians has wryly noted, our budgets might not have any room for book purchases in the coming fiscal year in any case.&lt;/p&gt;
&lt;p&gt;A highlight of the session was when I asked Susan Downs, CEO of the &lt;a href=&quot;http://www.innisfil.library.on.ca/tsuga/&quot;&gt;Innisfil Public Library&lt;/a&gt;, to talk about their success story. In October 2008, Innisfil announced to the library world that they had migrated to Evergreen without any vendor assistance - certainly the first known instance in Ontario, and possibly the first self-migrated and self-supported public library on Evergreen in the world. It was great to meet the people behind that project and I was glad to let Susan share some of her energy, enthusiasm, and insights with our audience.&lt;/p&gt;
&lt;p&gt;I had some feedback from one attendee who was happy to see a presentation on an in-process project, with warts and all exposed, rather than the usual post-project stories that quickly put the rough patches behind them (or forget them entirely). I&#039;m happy to do as good a job as I can to represent an objective look at the project - for one thing, it&#039;s my job as project manager - and I hope that in some small way I&#039;ve been able to help others prepare for similar projects.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Fri, 30 Jan 2009 11:28:08 -0500</pubDate>
    <guid isPermaLink="false">http://coffeecode.net/archives/182-guid.html</guid>
    
</item>
<item>
    <title>Adding a new metadata format to Evergreen in a dozen lines of code</title>
    <link>http://coffeecode.net/archives/181-Adding-a-new-metadata-format-to-Evergreen-in-a-dozen-lines-of-code.html</link>
            <category>Evergreen</category>
    
    <comments>http://coffeecode.net/archives/181-Adding-a-new-metadata-format-to-Evergreen-in-a-dozen-lines-of-code.html#comments</comments>
    <wfw:comment>http://coffeecode.net/wfwcomment.php?cid=181</wfw:comment>

    <slash:comments>1</slash:comments>
    <wfw:commentRss>http://coffeecode.net/rss.php?version=2.0&amp;type=comments&amp;cid=181</wfw:commentRss>
    

    <author>dan@coffeecode.net (Dan Scott)</author>
    <content:encoded>
    &lt;p&gt;Just like my &lt;a href=&quot;http://coffeecode.net/archives/180-Fetching-item-availability-from-Evergreen-using-the-OpenSRF-HTTP-gateway.html&quot;&gt;last entry&lt;/a&gt;, this is a preview of one part of my upcoming session at the OLA SuperConference, &lt;a href=&quot;http://www.accessola.com/superconference2009/showSession.php?lsession=1017&amp;usession=1017&quot;&gt;Evergreen Exposed: Hacking the open source library system&lt;/a&gt;. We know from the last entry that Evergreen internally converts MARC21 to MODS to support item display; and in fact it also includes support for exposing records as OAI, RDF, SRW, and HTML. Today, we&#039;re going to be looking at adding support for an entirely new metadata format to Evergreen.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://article.gmane.org/gmane.education.libraries.open-ils.devel/2366/match=fgdc&quot;&gt;Back in November, 2008&lt;/a&gt;, George Duimovich requested &quot;I would like to hear from anyone on the process for adding an additional supported format&quot; in the specific context of the &lt;a href=&quot;http://www.fgdc.gov/&quot;&gt;FGDC&lt;/a&gt; metadata format for digital geospatial data. George did a great thing to support his request and included links to the metadata format itself, along with a pointer to an &lt;a href=&quot;http://ir.library.oregonstate.edu/dspace/handle/1957/16&quot;&gt;XSLT stylesheet&lt;/a&gt; that the inestimable &lt;a href=&quot;http://oregonstate.edu/~reeset/&quot;&gt;Terry Reese&lt;/a&gt; had written and published for converting MARC21 to FGDC XML. His request has been burning at the back of my mind since then, partially because I had quickly responded with the oh-so-helpful:&lt;/p&gt;
&lt;blockquote&gt;
Assuming that we can get over the licensing hump, it should be a
relatively straightforward matter of dropping the transform into
Open-ILS/src/perlmods/OpenILS/Application/SuperCat.pm and
Open-ILS/src/perlmods/OpenILS/WWW/SuperCat/Feed.pm (using something
like MODS32 as a template).
&lt;/blockquote&gt;
&lt;p&gt;Simple and straightforward, right? Well... yes and no. I had just gone through the process of adding MODS 3.2 support because I needed the more granular treatment of URLs to fix an item display problem, so I was pretty comfortable with the code at the time. After a few months, that familiarity goes away and one gets to go through the discovery process again. (Oh, and about a week after the MODS 3.2 support went in and Mike Rylander went the extra mile to update all of the indexes to use MODS 3.2, MODS 3.3 was released to the world. Sigh).
&lt;p&gt;Without further ado, following are the diffs required to roughly support FGDC as a SuperCat format:&lt;/p&gt;
&lt;pre&gt;
dbs@dbs-laptop:~/source/Evergreen-rel_1_4$ svn diff Open-ILS/src/perlmods/
Index: Open-ILS/src/perlmods/OpenILS/Application/SuperCat.pm
===================================================================
--- Open-ILS/src/perlmods/OpenILS/Application/SuperCat.pm	(revision 11952)
+++ Open-ILS/src/perlmods/OpenILS/Application/SuperCat.pm	(working copy)
@@ -143,6 +143,18 @@
 	# and stash a transformer
 	$record_xslt{rss2}{xslt} = $_xslt-&gt;parse_stylesheet( $rss_xslt );
 
+	# parse the FGDC xslt ...
+	my $fgdc_xslt = $_parser-&gt;parse_file(
+		OpenSRF::Utils::SettingsClient
+			-&gt;new
+			-&gt;config_value( dirs =&gt; &#039;xsl&#039; ).
+		&quot;/MARC21slim2FGDC.xsl&quot;
+	);
+	# and stash a transformer
+	$record_xslt{fgdc}{xslt} = $_xslt-&gt;parse_stylesheet( $fgdc_xslt );
+	$record_xslt{fgdc}{docs} = &#039;http://www.fgdc.gov/metadata/csdgm/index_html&#039;;
+	$record_xslt{fgdc}{schema_location} = &#039;http://www.fgdc.gov/metadata/fgdc-std-001-1998.xsd&#039;;
+
 	register_record_transforms();
 
 	return 1;
&lt;/pre&gt;
&lt;p&gt;If you&#039;re still with me after that whack of code, and you&#039;re counting, that&#039;s about 12 lines of code. Okay, I&#039;m cheating - the diff doesn&#039;t include the MARC21 to FGDC stylesheet - for one thing, I&#039;m still waiting to see a version of the stylesheet with a license attached to it. For another, do you &lt;u&gt;really&lt;/u&gt; want to see all that XSL? After you patch your copy of OpenILS::Application::SuperCat.pm, copy the MARC21 to FGDC stylesheet into /openils/var/xsl, and restart the Evergreen Perl services, you&#039;ll be able to take advantage of the new functionality. That&#039;s it!&lt;/p&gt;
&lt;p&gt;What&#039;s going on in this code? This patch against Open-ILS/src/perlmods/OpenILS/Application/SuperCat.pm enables SuperCat (and therefore unAPI) support for the new format. We just add an entry to the hash of XSLT stylesheets that SuperCat knows about, and the rest is visible in URLs like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;http://localhost/opac/extras/supercat/formats/record - list of supported record formats&lt;/li&gt;
&lt;li&gt;http://localhost/opac/extras/supercat/retrieve/fgdc/record/1 - display record #1 in FGDC format&lt;/li&gt;
&lt;li&gt;http://localhost/opac/extras/unapi?id=tag:localhost,2009:biblio-record_entry/1 - display the record formats that unAPI can return&lt;/li&gt;
&lt;li&gt;http://localhost/opac/extras/unapi?id=tag:localhost,2009:biblio-record_entry/1&amp;format=fgdc - return record #1 in FGDC format via unAPI&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So who cares about this? Well, George cares, and (I&#039;m guessing wildly here), perhaps it&#039;s because his organization has tools that can import FGDC but that also want to maintain the data in their library catalogue because they love MARC. That might be sufficient reason. Another reasonable use case would be to use the FGDC transform to populate spatial data tables built on the geospatial extensions offered by &lt;a href=&quot;http://www.postgis.org&quot;&gt;PostGIS&lt;/a&gt; and index these for lightning-fast retrieval of maps and map data that cover a given range of coordinates.&lt;/p&gt;
&lt;p&gt;I&#039;m sure the same approach could be used for other specialized metadata formats. This is just one example of why I&#039;m sold on Evergreen&#039;s capability as a platform for the future of our library.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Mon, 26 Jan 2009 00:29:00 -0500</pubDate>
    <guid isPermaLink="false">http://coffeecode.net/archives/181-guid.html</guid>
    
</item>
<item>
    <title>Fetching item availability from Evergreen using the OpenSRF HTTP gateway</title>
    <link>http://coffeecode.net/archives/180-Fetching-item-availability-from-Evergreen-using-the-OpenSRF-HTTP-gateway.html</link>
            <category>Evergreen</category>
    
    <comments>http://coffeecode.net/archives/180-Fetching-item-availability-from-Evergreen-using-the-OpenSRF-HTTP-gateway.html#comments</comments>
    <wfw:comment>http://coffeecode.net/wfwcomment.php?cid=180</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://coffeecode.net/rss.php?version=2.0&amp;type=comments&amp;cid=180</wfw:commentRss>
    

    <author>dan@coffeecode.net (Dan Scott)</author>
    <content:encoded>
    &lt;p&gt;This is a preview of one part of my upcoming session at the OLA SuperConference, &lt;a href=&quot;http://www.accessola.com/superconference2009/showSession.php?lsession=1017&amp;usession=1017&quot;&gt;Evergreen Exposed: Hacking the open source library system&lt;/a&gt;. In the Conifer implementation of Evergreen, at least one of the partners plans to use a decoupled discovery layer rather than the Evergreen OPAC. So we needed to answer the typical question &quot;How do I retrieve the availability of copies for a given work at my institution?&quot; Note that this mini-tutorial is based entirely on OpenSRF 1.0 / Evergreen 1.4; OpenSRF 0.9 will generate different JSON output, and the URL for the OpenSRF gateway will be different.&lt;/p&gt;
&lt;h3&gt;Learning from the old masters: how the Evergreen OPAC does it&lt;/h3&gt;
&lt;p&gt;The Evergreen OPAC itself relies heavily on JavaScript to dynamically flesh out item details and retrieve item status, so it&#039;s actually pretty easy to work out how to do this without even delving too deeply into OpenSRF. First, let&#039;s use the &lt;a href=&quot;http://www.getfirebug.com/&quot;&gt;Firebug&lt;/a&gt; Mozilla extension to follow network requests for a given &quot;title details&quot; page in the OPAC search results for the title: &lt;a href=&quot;http://dev.gapines.org/opac/en-US/skin/default/xml/rdetail.xml?r=8526&amp;t=beer&amp;tp=keyword&amp;d=0&amp;hc=33&amp;rt=keyword&quot;&gt;The new world guide to beer&lt;/a&gt;. Open up Firebug, enable network monitoring for the OPAC site, and watch the requests flood past for the title details page. We can see that there are a number of POST requests to http://dev.gapines.org/osrf-gateway-v1:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;POST request #1 parameters&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;method = open-ils.search.biblio.record.mods_slim.retrieve&lt;/li&gt;
&lt;li&gt;service = open-ils.search&lt;/li&gt;
&lt;li&gt;locale = en-US&lt;/li&gt;
&lt;li&gt;param = 8526&lt;/li&gt;&lt;/ul&gt;
This is how we retrieve the title / author / ISBN and other bibliographic details of interest for display; as we&#039;re talking about a decoupled discovery layer, we won&#039;t need to worry about this piece of the puzzle.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;POST request #2 parameters&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;method = open-ils.search.config.copy_status.retrieve.all&lt;/li&gt;
&lt;li&gt;service = open-ils.search&lt;/li&gt;
&lt;li&gt;locale = en-US&lt;/li&gt;&lt;/ul&gt;
This is how we retrieve the list of all possible copy statuses that have been configured for this Evergreen system; here&#039;s the response (truncated for legibility):
&lt;pre&gt;
{
   &quot;status&quot; : 200,
   &quot;payload&quot; : [
      [
         {
            &quot;__c&quot; : &quot;ccs&quot;,
            &quot;__p&quot; : [
               null, null, null, &quot;f&quot;, 3, &quot;Lost&quot;, &quot;f&quot;
            ]
         },
         {
            &quot;__c&quot; : &quot;ccs&quot;,
            &quot;__p&quot; : [
               null, null, null, &quot;t&quot;, 0, &quot;Available&quot;, &quot;t&quot;
            ]
         },
         {
            &quot;__c&quot; : &quot;ccs&quot;,
            &quot;__p&quot; : [
               null, null, null, &quot;t&quot;, 1, &quot;Checked out&quot;, &quot;t&quot;
            ]
         },
         {
            &quot;__c&quot; : &quot;ccs&quot;,
            &quot;__p&quot; : [
               null, null, null, &quot;f&quot;, 2, &quot;Bindery&quot;, &quot;t&quot;
            ]
         }
      ]
   ]
}
&lt;/pre&gt;We&#039;re getting a response in JavaScript Object Notation (&lt;a href=&quot;http://www.json.org&quot;&gt;JSON&lt;/a&gt;) format - the nice, compact, easy-to-read data interchange format that almost every programming language under the sun can interpret and generate. Yay!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;POST request #3 parameters&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;method = open-ils.search.biblio.copy_counts.summary.retrieve&lt;/li&gt;
&lt;li&gt;service = open-ils.search&lt;/li&gt;
&lt;li&gt;locale = en-US&lt;/li&gt;
&lt;li&gt;param = 8526&lt;/li&gt;
&lt;li&gt;param = 1&lt;/li&gt;
&lt;li&gt;param = 0&lt;/li&gt;&lt;/ul&gt;
 This is how we retrieve the call numbers, copies, and copy status for a given title. We pass in the the TCN input parameter (&quot;8526&quot;), the numeric ID of the organization being searched (&quot;1&quot; = &quot;every branch&quot;), and the depth of the organization (&quot;0&quot; = top of the hierarchy). The response for this request is:
&lt;pre&gt;{
   &quot;status&quot; : 200,
   &quot;payload&quot; : [
      [
         [
            &quot;127&quot;,
            &quot;663.42 JACKSON, MICHAEL&quot;,
            {
               &quot;0&quot; : 1
            }
         ],
         [
            &quot;130&quot;,
            &quot;663.42 JACKSON, MICHAEL&quot;,
            {
               &quot;0&quot; : 1
            }
         ],
         [
            &quot;125&quot;,
            &quot;663.42 JACKSON, MICHAEL&quot;,
            {
               &quot;0&quot; : 1
            }
         ],
         [
            &quot;34&quot;,
            &quot;R 641.23 JACKSON, MICHAEL&quot;,
            {
               &quot;0&quot; : 1
            }
         ]
      ]
   ]
}
&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Interpreting the HTTP requests and responses&lt;/h3&gt;
&lt;p&gt;Okay, so we&#039;ve found a couple of requests that are pertinent to our goal. And you might be able to guess that the fifth element of the &lt;strong&gt;__p&lt;/strong&gt; entry in the copy status response is the numeric identifier for the copy status, while the sixth element is the copy status name (which, as of OpenSRF 1.0 / Evergreen 1.4, if you pass a different &lt;strong&gt;locale&lt;/strong&gt; value can return a translated value).&lt;/p&gt;
&lt;p&gt;You might even be able to guess that the response from the copy_counts.summary request returns an array of responses consisting of the organization ID, the call number, and a hash of copy status and the respective counts for each copy status. And you would be guessing correctly. But why guess, when you can get an authoritative interpretation by looking up the class hint (the &lt;strong&gt;__c&lt;/strong&gt; value in the copy_status response of &quot;ccs&quot;) in Evergreen&#039;s intermediate definition language file &lt;strong&gt;/openils/conf/fm_IDL.xml&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;class id=&quot;ccs&quot; controller=&quot;open-ils.cstore&quot; 
  oils_obj:fieldmapper=&quot;config::copy_status&quot; oils_persist:tablename=&quot;config.copy_status&quot;&gt;
  &amp;lt;fields oils_persist:primary=&quot;id&quot; oils_persist:sequence=&quot;config.copy_status_id_seq&quot;&gt;
    &amp;lt;field name=&quot;isnew&quot; oils_obj:array_position=&quot;0&quot; oils_persist:virtual=&quot;true&quot; /&gt;
    &amp;lt;field name=&quot;ischanged&quot; oils_obj:array_position=&quot;1&quot; oils_persist:virtual=&quot;true&quot; /&gt;
    &amp;lt;field name=&quot;isdeleted&quot; oils_obj:array_position=&quot;2&quot; oils_persist:virtual=&quot;true&quot; /&gt;
    &amp;lt;field name=&quot;holdable&quot; oils_obj:array_position=&quot;3&quot; 
      oils_persist:virtual=&quot;false&quot; reporter:datatype=&quot;bool&quot;/&gt;
    &amp;lt;field name=&quot;id&quot; oils_obj:array_position=&quot;4&quot; 
      oils_persist:virtual=&quot;false&quot; reporter:selector=&quot;name&quot; reporter:datatype=&quot;id&quot;/&gt;
    &amp;lt;field name=&quot;name&quot; oils_obj:array_position=&quot;5&quot; 
      oils_persist:virtual=&quot;false&quot;  reporter:datatype=&quot;text&quot; oils_persist:i18n=&quot;true&quot;/&gt;
    &amp;lt;field name=&quot;opac_visible&quot; oils_obj:array_position=&quot;6&quot; 
      oils_persist:virtual=&quot;false&quot; reporter:datatype=&quot;bool&quot;/&gt;
  &amp;lt;/fields&gt;
&lt;/pre&gt;
&lt;p&gt;So now, by taking our first steps into Evergreen&#039;s object persistence model, we can determine authoritatively that the order of values in the &lt;strong&gt;__p&lt;/strong&gt; array maps to &quot;isnew&quot;, &quot;ischanged&quot;, &quot;isdeleted&quot;, &quot;holdable&quot;, &quot;id&quot;, &quot;name&quot;, and &quot;opac_visible&quot;. As for the response from the copy_counts.summary call, well, these are not Evergreen objects (they don&#039;t have a &lt;strong&gt;__c&lt;/strong&gt; class hint) - but you can use the OpenSRF shell &quot;srfsh&quot; introspect command to view the documentation for the applicable method:
&lt;/p&gt;
&lt;pre&gt;bash$ srfsh
srfsh# introspect open-ils.search
... (truncated for legibility) ...
Received Data: {
  &quot;__c&quot;:&quot;OpenILS_Application&quot;,
  &quot;__p&quot;:{
    &quot;api_level&quot;:1,
    &quot;stream&quot;:0,
    &quot;object_hint&quot;:&quot;OpenILS_Application_Search_Biblio&quot;,
    &quot;package&quot;:&quot;OpenILS::Application::Search::Biblio&quot;,
    &quot;remote&quot;:0,
    &quot;api_name&quot;:&quot;open-ils.search.biblio.copy_counts.summary.retrieve&quot;,
    &quot;signature&quot;:{
      &quot;params&quot;:[
        
      ],
      &quot;desc&quot;:&quot;returns an array of these: [
         org_id,
         callnumber_label,
         &lt;status1_count&gt;,
         &lt;status2_cout&gt;,
        ...
      ]       where statusx is a copy status name.  the statuses are sorted by id.&quot;,
      &quot;return&quot;:{
        &quot;desc&quot;:null,
        &quot;type&quot;:null,
        &quot;class&quot;:null
      }      
    },
    &quot;server_class&quot;:&quot;open-ils.search&quot;,
    &quot;notes&quot;:&quot;\treturns an array of these:\n\t\t[
       org_id,
       callnumber_label,
       &lt;status1_count&gt;,
       &lt;status2_cout&gt;,
      ...
    ]    \n\t\twhere statusx is a copy status name.  the statuses are sorted\n\t\tby id.\n&quot;,
    &quot;method&quot;:&quot;copy_count_summary&quot;,
    &quot;argc&quot;:0
  }  
&lt;/pre&gt;
&lt;p&gt;
The introspect output is a bit rough - it&#039;s really intended for the &lt;a href=&quot;http://dev.gapines.org/opac/extras/docgen.xsl?service=open-ils.search&amp;param=%22copy_counts.summary.retrieve%22&quot;&gt;doxygen API help interface&lt;/a&gt; - but it&#039;s good enough for our purposes. If we want to dig into what&#039;s going on under the covers, we can follow the package_name value &quot;OpenILS::Application::Search::Biblio&quot; to read the source code for the &lt;a href=&quot;http://svn.open-ils.org/trac/ILS/browser/branches/rel_1_4/Open-ILS/src/perlmods/OpenILS/Application/Search/Biblio.pm&quot;&gt;OpenILS::Application::Search::Biblio&lt;/a&gt; Perl module, and look up the method &quot;copy_count_summary&quot; as indicated by the &quot;method&quot; value in the introspect output. That reveals that the input arguments are &quot;($self, $client, $rid, $org, $depth)&quot;. Every OpenSRF method automatically receives $self and $client as the first two arguments, so $rid (record ID), $org (organization unit ID), and $depth (organization unit depth) are the variables over which we have control.
&lt;/p&gt;
&lt;h3&gt;Zeroing in on the copies for  a particular library or library system&lt;/h3&gt;
&lt;p&gt;If we want to retrieve the visible copies for just a single organization unit in the entire Evergreen system, we just have to adjust the values of the organization unit ID and organization unit depth parameters accordingly. If we ask for the visible copies for &lt;a href=&quot;http://dev.gapines.org/osrf-gateway-v1?service=open-ils.search&amp;method=open-ils.search.biblio.copy_counts.summary.retrieve&amp;locale=en-US&amp;param=8526&amp;param=125&amp;param=2&quot;&gt;just org_unit ID &quot;125&quot; at depth &quot;2&quot;&lt;/a&gt;, we narrow down our results to a single hit:&lt;/p&gt;
&lt;pre&gt;{
   &quot;status&quot; : 200,
   &quot;payload&quot; : [
      [
         [
            &quot;125&quot;,
            &quot;663.42 JACKSON, MICHAEL&quot;,
            {
               &quot;0&quot; : 1
            }
         ]
      ]
   ]
}&lt;/pre&gt;
&lt;p&gt;So, with all of that ammunition at your disposal, you can write an Evergreen copy status lookup in any decoupled discovery layer that supports HTTP POST or GET requests. Which should be pretty much any discovery layer, right?&lt;/p&gt;
&lt;h3&gt;Frequently used tools and methods for Evergreen / OpenSRF hacking&lt;/h3&gt;
&lt;p&gt;Note, the first: you can easily play with different parameter values for the HTTP POST requests using the &lt;a href=&quot;http://curl.haxx.se/&gt;curl&lt;/a&gt; command. If you have a recent version of the Perl JSON::XS module installed, you can pipe the output from curl to &lt;a href=&quot;http://search.cpan.org/dist/JSON-XS/bin/json_xs&quot;&gt;json_xs&lt;/a&gt; command to pretty print the JSON response:&lt;/p&gt;
&lt;pre&gt;curl -d service=open-ils.search   -d locale=en-US \
  -d method=open-ils.search.biblio.copy_counts.summary.retrieve \
  -d param=8526 -d param=1 -d param=0 \
  http://dev.gapines.org/osrf-gateway-v1 | json_xs -t json-pretty&lt;/pre&gt;
&lt;p&gt;Note, the second: the OpenSRF gateway also supports GET requests; simply concatenate the request parameters in &lt;a href=&quot;http://dev.gapines.org/osrf-gateway-v1?service=open-ils.search&amp;method=open-ils.search.biblio.copy_counts.summary.retrieve&amp;locale=en-US&amp;param=8526&quot;&gt;a single URL like this&lt;/a&gt;&lt;/p&gt;.
 
    </content:encoded>

    <pubDate>Tue, 20 Jan 2009 10:57:37 -0500</pubDate>
    <guid isPermaLink="false">http://coffeecode.net/archives/180-guid.html</guid>
    
</item>

</channel>
</rss>