<?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 - Evergreen</title>
    <link>http://coffeecode.net/</link>
    <description>Caffeinated Librarian Geek</description>
    <dc:language>en</dc:language>
    <generator>Serendipity 1.5.1 - http://www.s9y.org/</generator>
    
    

<item>
    <title>Evergreen developer workshop at OLA SuperConference, February 24, 2010</title>
    <link>http://coffeecode.net/archives/211-Evergreen-developer-workshop-at-OLA-SuperConference,-February-24,-2010.html</link>
            <category>Evergreen</category>
    
    <comments>http://coffeecode.net/archives/211-Evergreen-developer-workshop-at-OLA-SuperConference,-February-24,-2010.html#comments</comments>
    <wfw:comment>http://coffeecode.net/wfwcomment.php?cid=211</wfw:comment>

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

    <author>dan@coffeecode.net (Dan Scott)</author>
    <content:encoded>
    &lt;p&gt;Given the &lt;a href=&quot;http://coffeecode.net/archives/210-Conifer-garners-two-awards-from-the-Ontario-Library-Association.html&quot;&gt;the awards&lt;/a&gt; that Project Conifer will be presented with at the OLA SuperConference, this might be a good opportunity to mention the &lt;a href=&quot;http://www.accessola.com/superconference2010/showSession.php?lsession=8&amp;usession=8&quot;&gt;Customizing and Extending Evergreen: a guide for geeks&lt;/a&gt; workshop that I&#039;ll be giving on Wednesday, February 24th. The workshop description promises:&lt;/p&gt;
&lt;blockquote&gt;Together, we will break OpenSRF down into its constituent parts (JSON, XMPP) and put it back together again in Perl, Python, and JavaScript so that you can define new services, or integrate existing services into other applications and websites. You will learn how PostgreSQL underpins Evergreen&#039;s search indices and how to access and modify any data in the system with permission-based storage APIs; plus we will build new interfaces with the Dojo JavaScript framework Evergreen extensions.&lt;/blockquote&gt;
&lt;p&gt;That&#039;s a hefty agenda for a half-day workshop, but I promise to do my best to deliver on that promise... &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, 28 Jan 2010 15:45:39 -0500</pubDate>
    <guid isPermaLink="false">http://coffeecode.net/archives/211-guid.html</guid>
    
</item>
<item>
    <title>Conifer garners two awards from the Ontario Library Association</title>
    <link>http://coffeecode.net/archives/210-Conifer-garners-two-awards-from-the-Ontario-Library-Association.html</link>
            <category>Evergreen</category>
    
    <comments>http://coffeecode.net/archives/210-Conifer-garners-two-awards-from-the-Ontario-Library-Association.html#comments</comments>
    <wfw:comment>http://coffeecode.net/wfwcomment.php?cid=210</wfw:comment>

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

    <author>dan@coffeecode.net (Dan Scott)</author>
    <content:encoded>
    &lt;p&gt;The Ontario Library Association (OLA) announced its &lt;a href=&quot;http://www.accessola3.com/index.php?app=blog&amp;module=display&amp;section=blog&amp;blogid=9&amp;showentry=681&quot;&gt;2010 OLA and OLA Divisional Award winners&lt;/a&gt; today, and to my great surprise Project Conifer was named the winner of two awards:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The Ontario College and University Library Association (OCULA) Special Achievement Award&lt;/li&gt;
&lt;li&gt;The Ontario Library Information Technology Association (OLITA) Award for Technical Innovation&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;All of the libraries in the Project Conifer consortium have been listed in the award announcement, and for good reason: everyone using the &lt;a href=&quot;http://evergreen-ils.org&quot;&gt;Evergreen&lt;/a&gt; library system &lt;a href=&quot;http://coffeecode.net/archives/191-Conifer-lives-Ontario-launches-a-consortial-academic-library-system-built-on-Evergreen.html&quot;&gt;since May 2009&lt;/a&gt; has contributed to the project, be it by bug reports, or suggestions for enhancement, or sharing approaches to solving problems, or contributing code. This has been a real team effort, and make no mistake: the road has been bumpy at times, and there&#039;s a &lt;strong&gt;lot&lt;/strong&gt; of road left to travel before we get to our destination. &lt;em&gt;Dan furtively glances at the open list of requested enhancements on the Conifer ticket system and gets back to finishing off this blog post...&lt;/em&gt; The continuing support of staff and librarians across the consortium has been critical to keeping things moving in a very positive direction, and I&#039;m delighted that they&#039;re being recognized for their efforts.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Thu, 28 Jan 2010 15:28:05 -0500</pubDate>
    <guid isPermaLink="false">http://coffeecode.net/archives/210-guid.html</guid>
    
</item>
<item>
    <title>Doing useful things with periodical holdings, part 2: comparing with print holdings in Evergreen</title>
    <link>http://coffeecode.net/archives/206-Doing-useful-things-with-periodical-holdings,-part-2-comparing-with-print-holdings-in-Evergreen.html</link>
            <category>Evergreen</category>
    
    <comments>http://coffeecode.net/archives/206-Doing-useful-things-with-periodical-holdings,-part-2-comparing-with-print-holdings-in-Evergreen.html#comments</comments>
    <wfw:comment>http://coffeecode.net/wfwcomment.php?cid=206</wfw:comment>

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

    <author>dan@coffeecode.net (Dan Scott)</author>
    <content:encoded>
    &lt;h3&gt;Doing interesting things with Evergreen serials data&lt;/h3&gt;
&lt;p&gt;I&#039;m working on a project to compare our electronic journal holdings with our print journal holdings. This is probably a task that most academic libraries have been working on over the past few years, as collection space dwindles, the duplication of holdings in electronic and print formats increases, and electronic delivery and 24/7 access becomes the default expectation of our patrons.&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://coffeecode.net/archives/205-Doing-useful-things-with-the-TXT-dump-of-SFX-holdings,-part-1-database.html&quot;&gt;In my previous post&lt;/a&gt;, I worked through the hoops required to get our SFX holdings into a usable database for query purposes. In this post, I&#039;ll walk through the steps required to get the serials holdings from Evergreen into the same database so that we can generate reports based on the authoritative sources for both our electronic and print holdings.
&lt;/p&gt;
&lt;p&gt;We&#039;ll start by dumping the schema for the biblio.record_entry and serial.record_entry tables from our Evergreen database. In the previous post, we could have added the tables from the SFX export to the Evergreen database, but I don&#039;t like mixing these more experimental projects with our production system - so we&#039;ll work with the a database named &lt;strong&gt;periodicals&lt;/strong&gt; instead.&lt;/p&gt;
&lt;pre&gt;
pg_dump --no-owner --data-only --table biblio.record_entry \
    --table serial.record_entry --database evergreen \
    &gt; bre_sre_schema.ddl
&lt;/pre&gt;
&lt;p&gt;
We have to munge the schema to not create the indexes on the tables - should lead to faster loads. Also, remove any triggers that point at other stuff that doesn&#039;t exist in this limited subset of data. Then create the schema in our periodicals holdings database:
&lt;/p&gt;
&lt;pre&gt;
psql -f bre_sre_schema.ddl -d periodical
&lt;/pre&gt;
&lt;p&gt;
Now dump the data for those tables from the Evergreen database. If you have a large set of bibliographic records like we do, make sure you have a few gigabytes of space available in the output location.
&lt;/p&gt;
&lt;pre&gt;
pg_dump --no-owner --schema-only --table biblio.record_entry \
    --table serial.record_entry --database evergreen &gt; bre_sre_data.dump
&lt;/pre&gt;
&lt;p&gt;
Okay, now you can load the data into your serials holdings database:
&lt;/p&gt;
&lt;pre&gt;
psql -f bre_sre_data.dump -d periodical
&lt;/pre&gt;
&lt;p&gt;
And now we add the indexes that we previously culled from the schema. You can be more selective in the indexes you create, if you know what you&#039;re doing.
&lt;/p&gt;
&lt;p&gt;
For some reason, I opted to play with PostgreSQL&#039;s support for XML as a native column type and converted the plain text marc column into an XML column:
&lt;/p&gt;
&lt;pre&gt;
ALTER TABLE biblio.record_entry 
    ALTER COLUMN marc 
    SET DATA TYPE XML USING marc::XML;
&lt;/pre&gt;
&lt;p&gt;
Now we add the Evergreen holdings to the &lt;tt&gt;holdings.conifer&lt;/tt&gt; table. We use the &lt;tt&gt;xpath()&lt;/tt&gt; function to retrieve the desired values from the MARC XML in biblio.record_entry, and wrap the results in the &lt;tt&gt;unnest()&lt;/tt&gt; function to return the nodeset as a plain text string, rather than an array of values. The WHERE clause restricts the holdings to those owned by the library in which I am interested.
&lt;pre&gt;
CREATE TABLE holdings.conifer (
    record BIGINT, 
    issn TEXT, 
    coverage TEXT, 
    call_number TEXT
);

INSERT INTO holdings.conifer (record, issn)
    SELECT bre.id, UNNEST(XPATH(&#039;//*[local-name()=&quot;datafield&quot;][@tag=&quot;022&quot;]&#039; ||
            &#039;/*[local-name()=&quot;subfield&quot;][@code=&quot;a&quot;]/text()&#039;, bre.marc))
        FROM biblio.record_entry bre INNER JOIN serial.record_entry sre
        ON sre.record = bre.id
        WHERE sre.owning_lib = 103
;
&lt;/pre&gt;
&lt;p&gt;
We&#039;ll populate the call number based on the 852 field in the serial record. We could pull this from the &lt;tt&gt;asset.call_number&lt;/tt&gt; table, but this will be good enough for the first pass. 
&lt;/p&gt;
&lt;pre&gt;
UPDATE holdings.conifer 
    SET call_number = UNNEST(
      XPATH(
        &#039;//*[local-name()=&quot;datafield&quot;][@tag=&quot;852&quot;]/&#039; ||
            &#039;*[local-name()=&quot;subfield&quot;][@code=&quot;h&quot;]/text()&#039;, 
        (
            SELECT sre.marc::xml
            FROM serial.record_entry sre
              INNER JOIN holdings.conifer hc ON hc.record = sre.record
            WHERE hc.record = holdings.conifer.record
            LIMIT 1
        )
      )
    )
;
&lt;/pre&gt;
&lt;p&gt;
Now we need to generate usable holdings statements for the print. Evergreen includes a great MFHD parsing library written in Perl, and PostgreSQL thankfully enables you to create functions written in Perl, but to get the following to work on a non-Evergreen machine, I had to copy &lt;tt&gt;Open-ILS/src/perlmods/OpenILS/Utils/MFHD/*&lt;/tt&gt; to &lt;tt&gt;/usr/local/share/perl/5.10.0&lt;/tt&gt; and edit the occurrences of &lt;tt&gt;OpenILS::Utils::MFHD::*&lt;/tt&gt; to *.
&lt;/p&gt;
&lt;pre&gt;
CREATE OR REPLACE FUNCTION holdings.parse_mfhd ( xml TEXT ) RETURNS TEXT AS $_$

    use MARC::Record;
    use MARC::File::XML;
    use MFHD;

    my $xml = shift;
    my $text;
    my $captions;

    my $marc = MARC::Record-&gt;new_from_xml( $xml );
    my $mfhd = MFHD-&gt;new($marc);

    foreach my $field ($marc-&gt;field(&#039;866&#039;)) {

        my $holdings = $field-&gt;subfield(&#039;a&#039;);
        if ($holdings) {
            my $public_note = $field-&gt;subfield(&#039;z&#039;);
            if ($public_note) {
                $text .= &quot;$holdings - $public_note&quot;;
            } else {
                $text .= &quot;$holdings&quot;;
            }
        }
    }

    foreach my $cap_id ($mfhd-&gt;captions(&#039;853&#039;)) {
        my @curr_holdings = $mfhd-&gt;holdings(&#039;863&#039;, $cap_id);
        next unless scalar @curr_holdings;
        foreach (@curr_holdings) {
            if ($captions) {
                $captions .= &#039;, &#039;;
            }
            $captions .= $_-&gt;format();
        }
    }

    if ($text and $captions) {
        $text = &quot;$text / $captions&quot;;
    } else {
        $text = &quot;$text$captions&quot;;
    }

    return $text;

$_$ LANGUAGE PLPERLU;
&lt;/pre&gt;
&lt;p&gt;
And update the table:
&lt;/p&gt;
&lt;pre&gt;
UPDATE holdings.conifer SET coverage = (
    SELECT holdings.parse_mfhd(marc)
    FROM serial.record_entry
    WHERE serial.record_entry.record = holdings.conifer.record
    LIMIT 1
);
&lt;/pre&gt;
&lt;p&gt;
That almost works, but it only retrieves the coverage from a single serial holdings record for a given bibliographic record, even though there might be multiple serial holdings records. To amend that, we&#039;ll create a PL/pgSQL function that concatenates all of the coverage statements from all of the pertinent serial holdings records for a given bibliographic record:
&lt;/p&gt;
&lt;pre&gt;
CREATE OR REPLACE FUNCTION holdings.print_coverage(marc_record BIGINT)
    RETURNS TEXT AS $$
    DECLARE 
        r RECORD;
        coverage TEXT;
    BEGIN
        -- If coverage is NULL to begin with, then concatenating to it results in NULL
        coverage := &#039;&#039;;

        -- RAISE NOTICE &#039;marc_record = %&#039;, marc_record;

        -- Loop over the serial records attached to the targeted bib record
        FOR r IN SELECT marc FROM serial.record_entry 
            WHERE record = marc_record
            ORDER BY id
        LOOP
            coverage := coverage || holdings.parse_mfhd(r.marc);
            -- RAISE NOTICE &#039;r.marc = %&#039;, r.marc;
        END LOOP;

        -- RAISE NOTICE &#039;coverage = %&#039;, coverage;
        RETURN coverage;
    END
$$ LANGUAGE &#039;plpgsql&#039;;
&lt;/pre&gt;
&lt;p&gt;
And we&#039;ll use this fancy new function to update the print holdings statements again with the more complete coverage:
&lt;/p&gt;
&lt;pre&gt;
UPDATE holdings.conifer SET coverage = (
    SELECT holdings.print_coverage(record)
        FROM serial.record_entry
        WHERE serial.record_entry.record = holdings.conifer.record
        LIMIT 1
    )
;
&lt;/pre&gt;
&lt;p&gt;
Now the payoff: generating a list of matching ISSNs from the electronic holdings and our print holdings, with the coverage statements for each, for a subset of the SFX collections to which we have access:
&lt;/p&gt;
&lt;pre&gt;
-- Set the display to expanded format for easy reading
\x
-- Basic report for perusal
SELECT hsfx.issn AS &quot;ISSN&quot;, hsfx.title AS &quot;Title&quot;,
        hsfx.collection AS &quot;SFX Collection&quot;,
        hsfx.coverage AS &quot;Electronic Coverage&quot;,
        hc.coverage AS &quot;Print Coverage&quot;, hc.call_number AS &quot;Call Number&quot;
    FROM holdings.sfx_complete hsfx
        INNER JOIN holdings.conifer hc ON hsfx.issn = hc.issn
    WHERE (hsfx.collection ILIKE &#039;%JStor%&#039; OR hsfx.collection LIKE &#039;%Scholars%&#039;)
        AND hc.coverage &gt; &#039;&#039;
    LIMIT 5;
&lt;/pre&gt;
&lt;p&gt;That results in:&lt;/p&gt;
&lt;pre&gt;
-[ RECORD 1 ]-------+--------------------------------------------------------------------------
ISSN                | 0142-2774
Title               | Journal of Occupational Behavior
SFX Collection      | JSTOR Arts and Sciences 4
Electronic Coverage | Available from 1980 until 1987. 
Print Coverage      | Vol. 1 No.  - Vol. 8 No. 4 (1980-1987)
Call Number         | DESM-PER
-[ RECORD 2 ]-------+--------------------------------------------------------------------------
ISSN                | 0741-6261
Title               | The Rand Journal of Economics
SFX Collection      | JSTOR Arts and Sciences 2
Electronic Coverage | Available from 1984 until 2006. 
Print Coverage      | V.17 (1986) - v.23 (1992)
Call Number         | DESM-PER
-[ RECORD 3 ]-------+--------------------------------------------------------------------------
ISSN                | 0002-8614
Title               | Journal of the American Geriatrics Society
SFX Collection      | Scholars Portal
Electronic Coverage | Available from 2001 volume: 49 issue: 1 until 2009 volume: 57 issue: 10. 
Print Coverage      | Vol. 1 - 37 (1953-1989)
Call Number         | DESM-PER
-[ RECORD 4 ]-------+--------------------------------------------------------------------------
ISSN                | 0023-7639
Title               | Land Economics
SFX Collection      | JSTOR Arts and Sciences 7
Electronic Coverage | Available from 1948 until 2005. 
Print Coverage      | v.62 (1986) - v.68 (1992)
Call Number         | DESM-PER
-[ RECORD 5 ]-------+--------------------------------------------------------------------------
ISSN                | 0090-2616
Title               | Organizational dynamics
SFX Collection      | Scholars Portal
Electronic Coverage | Available from 1995 volume: 23 issue: 3 until 2009 volume: 38 issue: 3. 
Print Coverage      | Vol. 15 No.  - Vol. 23 No. 5 (Summer 1986-Spring 1995)
Call Number         | DESM-PER
&lt;/pre&gt;
&lt;p&gt;Looks pretty good to these eyes. Okay, now we&#039;ll get serious and dump the output to a tab-delimited file so we can easily open it in OpenOffice.org Calc or another spreadsheet:&lt;/p&gt;
&lt;pre&gt;
-- Set delimiter to TAB (CTRL-V &lt;tab&gt;)
\f &#039;^V&lt;tab&gt;&#039;
-- Set the output to being unaligned
\a
-- Dump the output to a file
\o /tmp/periodicals.tsv
-- Generate URLs for quick catalogue lookups
SELECT &#039;http://laurentian.concat.ca/opac/en-CA/skin/lul/xml/rdetail.xml?r=&#039; 
            || hc.record || &#039;&amp;amp;l=105&amp;amp;d=1&#039; AS &quot;URL&quot;,
        hsfx.issn AS &quot;ISSN&quot;, hsfx.title AS &quot;Title&quot;,
        hsfx.collection AS &quot;SFX Collection&quot;,
        hsfx.coverage AS &quot;Electronic Coverage&quot;, hc.coverage AS &quot;Print Coverage&quot;,
        hc.call_number AS &quot;Call Number&quot;
    FROM holdings.sfx_complete hsfx
        INNER JOIN holdings.conifer hc ON hsfx.issn = hc.issn
    WHERE (hsfx.collection ILIKE &#039;%JStor%&#039; OR hsfx.collection LIKE &#039;%Scholars%&#039;)
        AND hc.coverage &gt; &#039;&#039;
;
&lt;/pre&gt;
&lt;p&gt;
And that&#039;s it. It might seem complex, but I&#039;ve found that investing the effort into learning how to lean on PostgreSQL to do the hard work pays plenty of dividends. This exploration should help me contribute more functionality to Evergreen core; for example, I hope to use my experiments with the pl/Perl function to start populating the &lt;tt&gt;serial.bib_summary&lt;/tt&gt; tables using an INSERT/UPDATE/DELETE trigger on &lt;tt&gt;serial.record_entry&lt;/tt&gt; so that we don&#039;t have to generate the summaries for every item details request in the catalogue.
&lt;/p&gt; 
    </content:encoded>

    <pubDate>Tue, 17 Nov 2009 12:05:59 -0500</pubDate>
    <guid isPermaLink="false">http://coffeecode.net/archives/206-guid.html</guid>
    
</item>
<item>
    <title>FSOSS 2009: Project Conifer update</title>
    <link>http://coffeecode.net/archives/204-FSOSS-2009-Project-Conifer-update.html</link>
            <category>Evergreen</category>
    
    <comments>http://coffeecode.net/archives/204-FSOSS-2009-Project-Conifer-update.html#comments</comments>
    <wfw:comment>http://coffeecode.net/wfwcomment.php?cid=204</wfw:comment>

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

    <author>dan@coffeecode.net (Dan Scott)</author>
    <content:encoded>
    &lt;p&gt;&lt;strong&gt;Update: 2009-11-24&lt;/strong&gt; James Forrester of the Ontario Academy of Art and Design has posted a &lt;a href=&quot;http://www.archive.org/details/DanScottpresentationEvergreeninOntarioMigratingAcademicLibraries&quot;&gt;short video&lt;/a&gt; (Internet Archive) of the presentation. Thanks, James!&lt;/p&gt;
&lt;p&gt;On Friday, October 30th, I presented a status update on Project Conifer at the &lt;a href=&quot;http://fsoss.ca&quot;&gt;Free Software Open Source Symposium (FSOSS)&lt;/a&gt;. This was a follow-up to the talk I gave with John Fink at &lt;a href=&quot;http://coffeecode.net/archives/170-Evergreen-deOSSification-of-library-software.html&quot;&gt;last year&#039;s FSOSS&lt;/a&gt;, with the hopefully interesting twist that instead of talking about what we were going to do, I talked about what we had done, and the lessons learned along the way.&lt;/p&gt;
&lt;p&gt;This was a slightly modified version of the talk I gave at the &lt;a href=&quot;http://coffeecode.net/archives/201-Presentation-at-the-Lyrasis-Open-Source-in-Your-Library-conference.html&quot;&gt;Lyrasis/NELINET open source conference&lt;/a&gt; earlier in October, aimed at a more general audience. The talk was recorded and will be posted online at the FSOSS site at some point.&lt;/p&gt;
&lt;p&gt;Here are the slides in &lt;a href=&quot;http://coffeecode.net/uploads/talks/2009/FSOSS_Conifer_update.odp&quot;&gt;(ODP)&lt;/a&gt; and &lt;a href=&quot;http://coffeecode.net/uploads/talks/2009/FSOSS_Conifer_update.pdf&quot;&gt;(PDF)&lt;/a&gt; format. The speaker notes on the slides will give you the meat of the content.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Mon, 09 Nov 2009 23:00:07 -0500</pubDate>
    <guid isPermaLink="false">http://coffeecode.net/archives/204-guid.html</guid>
    
</item>
<item>
    <title>Evergreen development workshop at FSOSS 2009</title>
    <link>http://coffeecode.net/archives/202-Evergreen-development-workshop-at-FSOSS-2009.html</link>
            <category>Evergreen</category>
    
    <comments>http://coffeecode.net/archives/202-Evergreen-development-workshop-at-FSOSS-2009.html#comments</comments>
    <wfw:comment>http://coffeecode.net/wfwcomment.php?cid=202</wfw:comment>

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

    <author>dan@coffeecode.net (Dan Scott)</author>
    <content:encoded>
    &lt;p&gt;&lt;strong&gt;Update 2009-11-24&lt;/strong&gt; Robert Soulliere has also made the videos available via the &lt;a href=&quot;http://www.archive.org/details/EvergreenDeveloperSeries-Fsoss2009 &quot;&gt;Internet Archive&lt;/a&gt; - thanks again, Robert!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2009-11-09&lt;/strong&gt; As promised, Robert Soulliere has &lt;a href=&quot;http://markmail.org/message/4ntfbshzhhmjn2tw&quot;&gt;posted the video recordings&lt;/a&gt; he made of the workshop - thanks, Robert!&lt;/p&gt;
&lt;p&gt;
Yesterday, I lead a three-hour Evergreen development workshop at the &lt;a href=&quot;http://fsoss.ca&quot;&gt;Free Software Open Source Symposium&lt;/a&gt;. I had promised Nick Ruest from McMaster that it wouldn&#039;t be three hours of me talking... but in prepping for the workshop, I ran out of time putting together the virtual image that was going to include all of the tutorial materials... and therefore, ended up talking for almost three hours. Not ideal. Interestingly, there were a number of non-library-world attendees who were interested in OpenSRF, so I was able to spend most of the first hour covering that framework and (I think) managed to successfully keep their attention for that period of time. I wasn&#039;t suprised to see them leave once we hit more library-centric content &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;
That said, there is a stake in the ground now for developers who are relatively new to Evergreen. The assumption is that the developer is already comfortable with basic install and configuration of OpenSRF and Evergreen, at least as far as following the &lt;a href=&quot;http://evergreen-ils.org/dokuwiki/doku.php?id=server:1.6.0:install&quot;&gt;install instructions&lt;/a&gt;, and that the developer is comfortable writing one or both of Perl or JavaScript. I posit that such a person should be able to work through the &lt;a href=&quot;http://evergreen-ils.org/~denials/workshop.html&quot;&gt;workshop tutorial&lt;/a&gt; and follow the workshop slides through the evolution of a CGI program to an OpenSRF service that eventually taps into the Evergreen IDL (see &lt;a href=&quot;http://evergreen-ils.org/~denials/workshop.tar.gz&quot;&gt;workshop tarball&lt;/a&gt;).
&lt;/p&gt;
&lt;p&gt;
In writing this down and trying to provide basic examples that can be building blocks for bigger applications, I surprised myself by how much I had to re-learn or in some cases learn for the first time. But now it&#039;s written down, and the re-learning path (because my brain is full and constantly rids itself of even painfully learned lessons) will be much shorter. And I hope that this makes it easier for others to become productive OpenSRF and Evergreen developers as well.
&lt;/p&gt;
&lt;p&gt;
This content will continue to evolve and improve over time, as I&#039;m betting that my fellow Evergreen developers will suggest improvements to the materials. Note that I&#039;m delivering a four-hour workshop covering much of the same material at the OLA SuperConference in 2010. The extra hour should give us time to complete some hands-on exercises, and I&#039;ll incorporate the feedback that I&#039;ve received from the FSOSS workshop for the OLA workshop. (Your feedback is always welcome, either in comments to this post or via email at dan@coffeecode.net). It would be great to see other people take these materials and improve and deliver them as well - they&#039;re under a CC-BY-SA license - so if there&#039;s interest, I&#039;ll be happy to check them into a public source repository (hmm, maybe a bzr branch at the &lt;a href=&quot;http://code.launchpad.net/evergreen&quot;&gt;Evergreen Launchpad&lt;/a&gt; project).
&lt;/p&gt;
&lt;p&gt;Oh! And Robert Soulliere from Mohawk College recorded the entire workshop and plans to make it available online. So if you need some sleep, those video segments will be available!&lt;/p&gt; 
    </content:encoded>

    <pubDate>Fri, 30 Oct 2009 13:24:10 -0400</pubDate>
    <guid isPermaLink="false">http://coffeecode.net/archives/202-guid.html</guid>
    
</item>

</channel>
</rss>