<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"><channel><title>Coffee|Code: Dan Scott's blog</title><link>https://coffeecode.net/</link><description>Librarian · Developer</description><lastBuildDate>Tue, 12 Mar 2019 22:45:00 -0400</lastBuildDate><item><title>Linked Data: Introductory Resources</title><link>https://coffeecode.net/linked-data-introductory-resources.html</link><description>
  &lt;p&gt;
    I was recently asked for a list of resources that would serve as good
    introductions for students interested in linked data concepts--not just
    in libraries, but in general, including knowledge graphs and inferences. It
    was a good opportunity to review sources that I used in the past, and to
    see what new sources might be appropriate. While there is a lot of exciting
    research literature, some of the core resources do not seem to have changed
    much in the past decade. If I'm wrong, please tell me what I've missed
    through one of my &lt;a href="https://dscott.ca/#accounts"&gt;contact
    methods&lt;/a&gt;!
  &lt;/p&gt;
  &lt;p&gt;
  &lt;strong&gt;Update 2019-03-12:&lt;/strong&gt; &lt;a href="http://www.seoskeptic.com/aaron-bradley/"&gt;Aaron Bradley&lt;/a&gt; suggested the addition of some more good intro and Knowledge Graph entries. Thanks Aaron!
  &lt;/p&gt;
  &lt;h3&gt;Introductions and overviews&lt;/h3&gt;
  &lt;div class="csl-bib-body"&gt;
    &lt;div class="csl-entry"&gt;Berners-Lee, T. (2009, June 18). Linked Data - Design Issues. Retrieved March 10, 2019, from &lt;a href="https://www.w3.org/DesignIssues/LinkedData.html"&gt;https://www.w3.org/DesignIssues/LinkedData.html&lt;/a&gt;&lt;/div&gt;
    &lt;span class="Z3988" title="url_ver=Z39.88-2004&amp;amp;ctx_ver=Z39.88-2004&amp;amp;rfr_id=info%3Asid%2Fzotero.org%3A2&amp;amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;amp;rft.type=webpage&amp;amp;rft.title=Linked%20Data%20-%20Design%20Issues&amp;amp;rft.identifier=https%3A%2F%2Fwww.w3.org%2FDesignIssues%2FLinkedData.html&amp;amp;rft.aufirst=Tim&amp;amp;rft.aulast=Berners-Lee&amp;amp;rft.au=Tim%20Berners-Lee&amp;amp;rft.date=2009-06-18"&gt;&lt;/span&gt;
    &lt;p style="margin-left: 2em"&gt;
    Tim Berners-Lee, generally recognized as the creator of the World Wide Web
    and a co-creator of the Semantic Web, boils down the latter's overly complex
    implementation concerns into four simple, practical principles that he calls
    "linked data." This is the classic introduction.
    &lt;/p&gt;
    &lt;p style="margin-left: 2em"&gt;
    His 2009 revision to these principles adds a fifth principle, that the data be
    distributed under an open license that does not impede its reuse for free, to
    be considered "linked open data."
    &lt;/p&gt;
    &lt;div class="csl-entry"&gt;Blaney, J. (2017). Introduction to the Principles of Linked Open Data. &lt;i&gt;Programming Historian&lt;/i&gt;. Retrieved from &lt;a href="https://programminghistorian.org/en/lessons/intro-to-linked-data"&gt;https://programminghistorian.org/en/lessons/intro-to-linked-data&lt;/a&gt;&lt;/div&gt;
    &lt;span class="Z3988" title="url_ver=Z39.88-2004&amp;amp;ctx_ver=Z39.88-2004&amp;amp;rfr_id=info%3Asid%2Fzotero.org%3A2&amp;amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;amp;rft.genre=article&amp;amp;rft.atitle=Introduction%20to%20the%20Principles%20of%20Linked%20Open%20Data&amp;amp;rft.jtitle=Programming%20Historian&amp;amp;rft.aufirst=Jonathan&amp;amp;rft.aulast=Blaney&amp;amp;rft.au=Jonathan%20Blaney&amp;amp;rft.date=2017-05-07&amp;amp;rft.language=en"&gt;&lt;/span&gt;
    &lt;p style="margin-left: 2em"&gt;
    A self-guided two-hour tutorial for an audience for whom programming is a
    means to their digital humanities research aims. This tutorial helps unpack
    some of the jargon found in other resources. 
    &lt;/p&gt;
    &lt;p style="margin-left: 2em"&gt;
    It introduces the Turtle and RDF/XML serializations, and touches on the SPARQL
    language for querying sets of linked data.
    &lt;/p&gt;
    &lt;div class="csl-entry"&gt;Heath, T., &amp;amp; Bizer, C. (2011). &lt;i&gt;Linked Data: Evolving the Web into a Global Data Space&lt;/i&gt; (Vol. 1). Morgan &amp;amp; Claypool. Retrieved from &lt;a href="http://linkeddatabook.com/editions/1.0/"&gt;http://linkeddatabook.com/editions/1.0/&lt;/a&gt;&lt;/div&gt;
    &lt;span class="Z3988" title="url_ver=Z39.88-2004&amp;amp;ctx_ver=Z39.88-2004&amp;amp;rfr_id=info%3Asid%2Fzotero.org%3A2&amp;amp;rft_id=urn%3Aisbn%3A978-1-60845-431-0&amp;amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;amp;rft.genre=book&amp;amp;rft.btitle=Linked%20Data%3A%20Evolving%20the%20Web%20into%20a%20Global%20Data%20Space&amp;amp;rft.publisher=Morgan%20%26%20Claypool&amp;amp;rft.series=Synthesis%20Lectures%20on%20the%20Semantic%20Web%3A%20Theory%20and%20Technology&amp;amp;rft.aufirst=Tom&amp;amp;rft.aulast=Heath&amp;amp;rft.au=Tom%20Heath&amp;amp;rft.au=Christian%20Bizer&amp;amp;rft.date=2011-02-09&amp;amp;rft.tpages=136&amp;amp;rft.isbn=978-1-60845-431-0&amp;amp;rft.language=English"&gt;&lt;/span&gt;
    &lt;p style="margin-left: 2em"&gt;
    This remains my recommendation as the best overall  introduction to linked
    data. Even though the book is eight years old, and some of the products it
    refers to no longer exist, the fundamental concepts that it presents are
    sound.
    &lt;/p&gt;
    &lt;div class="csl-entry"&gt;Sporny, M. (2012). &lt;i&gt;What is Linked Data?&lt;/i&gt; Retrieved from &lt;a href="https://www.youtube.com/watch?v=4x_xzT5eF5Q&amp;amp;feature=youtu.be"&gt;https://www.youtube.com/watch?v=4x_xzT5eF5Q&amp;amp;feature=youtu.be&lt;/a&gt;&lt;/div&gt;
    &lt;span class="Z3988" title="url_ver=Z39.88-2004&amp;amp;ctx_ver=Z39.88-2004&amp;amp;rfr_id=info%3Asid%2Fzotero.org%3A2&amp;amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;amp;rft.type=videoRecording&amp;amp;rft.title=What%20is%20Linked%20Data%3F&amp;amp;rft.rights=CC%20BY-SA%203.0&amp;amp;rft.identifier=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D4x_xzT5eF5Q%26feature%3Dyoutu.be&amp;amp;rft.au=undefined&amp;amp;rft.date=2012-06-16&amp;amp;rft.language=English"&gt;&lt;/span&gt;
    &lt;p style="margin-left: 2em"&gt;
     Manu Sporny is a gifted technical communicator. In this 12 minute video, he introduces linked data with hand-drawn slides featuring a cute mouse and robot.
    &lt;/p&gt;
    &lt;div class="csl-entry"&gt;Verborgh, R. (2019, March). &lt;i&gt;The Semantic Web &amp;amp; Linked&amp;nbsp;Data&lt;/i&gt;. Retrieved from &lt;a href="http://rubenverborgh.github.io/WebFundamentals/semantic-web/"&gt;http://rubenverborgh.github.io/WebFundamentals/semantic-web/&lt;/a&gt;&lt;/div&gt;
    &lt;span class="Z3988" title="url_ver=Z39.88-2004&amp;amp;ctx_ver=Z39.88-2004&amp;amp;rfr_id=info%3Asid%2Fzotero.org%3A2&amp;amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;amp;rft.type=presentation&amp;amp;rft.title=The%20Semantic%20Web%20%26%20Linked%C2%A0Data&amp;amp;rft.rights=CC-BY%204.0&amp;amp;rft.identifier=http%3A%2F%2Frubenverborgh.github.io%2FWebFundamentals%2Fsemantic-web%2F&amp;amp;rft.aufirst=Ruben&amp;amp;rft.aulast=Verborgh&amp;amp;rft.au=Ruben%20Verborgh&amp;amp;rft.date=2019-03-07&amp;amp;rft.language=English"&gt;&lt;/span&gt;
    &lt;p style="margin-left: 2em"&gt;
    If you like presentations as a way of ingesting information, Ruben's slides
    will be right up your alley. They provide a high-level single-slide
    introduction to many concepts you are likely to encounter in the literature
    and in the wild, such as the N-Quads and TriG serializations, and expand on
    areas such as the JSON-LD serialization that are increasingly relevant.
    &lt;/p&gt;
    &lt;p style="margin-left: 2em"&gt;
    Verborgh covers RDF Schema (RDFS) and the Web Ontology Language (OWL) before
    introducing SPARQL and rules-based reasoners. The slides include interactive
    elements to demonstrate the query and inference examples running against live
    data.
    &lt;/p&gt;
    &lt;p style="margin-left: 2em"&gt;
    These slides are a great resource for refreshing your understanding of a
    concept that might slip your mind in the future.
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;h3&gt;Publishing linked data&lt;/h3&gt;
  &lt;div class="csl-bib-body"&gt;
    &lt;div class="csl-entry"&gt;Dodds, L., &amp;amp; Davis, I. (2012). &lt;i&gt;Linked Data Patterns&lt;/i&gt;. Retrieved from &lt;a href="http://patterns.dataincubator.org/book/"&gt;http://patterns.dataincubator.org/book/&lt;/a&gt;&lt;/div&gt;
    &lt;span class="Z3988" title="url_ver=Z39.88-2004&amp;amp;ctx_ver=Z39.88-2004&amp;amp;rfr_id=info%3Asid%2Fzotero.org%3A2&amp;amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;amp;rft.genre=book&amp;amp;rft.btitle=Linked%20Data%20Patterns&amp;amp;rft.aufirst=Leigh&amp;amp;rft.aulast=Dodds&amp;amp;rft.au=Leigh%20Dodds&amp;amp;rft.au=Ian%20Davis&amp;amp;rft.date=2012-05-31&amp;amp;rft.language=English"&gt;&lt;/span&gt;
    &lt;p style="margin-left: 2em"&gt;
    Best practices and considerations for publishing linked data. This book is organized into five sets of linked data patterns:
    &lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;Identifier patterns&lt;/li&gt;
      &lt;li&gt;Modelling patterns&lt;/li&gt;
      &lt;li&gt;Publishing patterns&lt;/li&gt;
      &lt;li&gt;Data management patterns&lt;/li&gt;
      &lt;li&gt;Application patterns&lt;/li&gt;
    &lt;/ul&gt;
    &lt;p style="margin-left: 2em"&gt;
    Each pattern within the set is clearly named to support discussions between the designers of linked data for a given project.
    &lt;/p&gt;
    &lt;div class="csl-entry"&gt;JSON-LD - JSON for Linking Data. (n.d.). Retrieved March 9, 2019, from &lt;a href="https://json-ld.org/"&gt;https://json-ld.org/&lt;/a&gt;&lt;/div&gt;
    &lt;span class="Z3988" title="url_ver=Z39.88-2004&amp;amp;ctx_ver=Z39.88-2004&amp;amp;rfr_id=info%3Asid%2Fzotero.org%3A2&amp;amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;amp;rft.type=webpage&amp;amp;rft.title=JSON-LD%20-%20JSON%20for%20Linking%20Data&amp;amp;rft.identifier=https%3A%2F%2Fjson-ld.org%2F"&gt;&lt;/span&gt;
    &lt;p style="margin-left: 2em"&gt;
    The benefits of JSON-LD are that it can be embedded in a single
    &amp;lt;meta&amp;gt; tag and that it is easily parsed by JavaScript in the browser
    client, whereas RDFa or microdata have to be embedded throughout the HTML
    template tags (making them prone to breaking through template updates) and
    require special JavaScript libraries for client-side parsing.
    &lt;/p&gt;
    &lt;p style="margin-left: 2em"&gt;
    This site includes useful tools for trying out JSON-LD, including an
    interactive "playground", as well as links to further documentation such
    as videos by Manu Sporny--a skilled and entertaining communicator.
    &lt;/p&gt;
    &lt;div class="csl-entry"&gt;JSON-LD 1.1 : A JSON-based Serialization for Linked Data. (2019, March 1). World Wide Web Consortium. Retrieved from &lt;a href="https://w3c.github.io/json-ld-syntax/"&gt;https://w3c.github.io/json-ld-syntax/&lt;/a&gt;&lt;/div&gt;
    &lt;span class="Z3988" title="url_ver=Z39.88-2004&amp;amp;ctx_ver=Z39.88-2004&amp;amp;rfr_id=info%3Asid%2Fzotero.org%3A2&amp;amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;amp;rft.type=document&amp;amp;rft.title=JSON-LD%201.1%20%3A%20A%20JSON-based%20Serialization%20for%20Linked%20Data&amp;amp;rft.publisher=World%20Wide%20Web%20Consortium&amp;amp;rft.description=JSON%20is%20a%20useful%20data%20serialization%20and%20messaging%20format.%20This%20specification%20defines%20JSON-LD%2C%20a%20JSON-based%20format%20to%20serialize%20Linked%20Data.%20The%20syntax%20is%20designed%20to%20easily%20integrate%20into%20deployed%20systems%20that%20already%20use%20JSON%2C%20and%20provides%20a%20smooth%20upgrade%20path%20from%20JSON%20to%20JSON-LD.%20It%20is%20primarily%20intended%20to%20be%20a%20way%20to%20use%20Linked%20Data%20in%20Web-based%20programming%20environments%2C%20to%20build%20interoperable%20Web%20services%2C%20and%20to%20store%20Linked%20Data%20in%20JSON-based%20storage%20engines.&amp;amp;rft.identifier=https%3A%2F%2Fw3c.github.io%2Fjson-ld-syntax%2F&amp;amp;rft.date=2019-03-01&amp;amp;rft.language=English"&gt;&lt;/span&gt;
    &lt;p style="margin-left: 2em"&gt;
    The current "editor's draft" for the JSON-LD 1.1 specification.
    &lt;/p&gt;
    &lt;div class="csl-entry"&gt;Scott, D. (2014, December 1). RDFa with schema.org codelab. Retrieved March 10, 2019, from &lt;a href="https://coffeecode.net/swib14/preconference/rdfa_exercises/"&gt;https://coffeecode.net/swib14/preconference/rdfa_exercises/&lt;/a&gt;&lt;/div&gt;
    &lt;span class="Z3988" title="url_ver=Z39.88-2004&amp;amp;ctx_ver=Z39.88-2004&amp;amp;rfr_id=info%3Asid%2Fzotero.org%3A2&amp;amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;amp;rft.type=webpage&amp;amp;rft.title=RDFa%20with%20schema.org%20codelab&amp;amp;rft.description=In%20this%20codelab%2C%20you're%20going%20to%20take%20a%20variety%20of%20library%20web%20pages%20and%20enhance%20them%20so%20that%20they%20contain%20structured%20data.%20You%20will%20use%20the%20schema.org%20vocabulary%20and%20express%20it%20via%20RDFa%20attributes.&amp;amp;rft.identifier=https%3A%2F%2Fcoffeecode.net%2Fswib14%2Fpreconference%2Frdfa_exercises%2F&amp;amp;rft.aufirst=Dan&amp;amp;rft.aulast=Scott&amp;amp;rft.au=Dan%20Scott&amp;amp;rft.date=2014-12-01&amp;amp;rft.language=English"&gt;&lt;/span&gt;
    &lt;p style="margin-left: 2em"&gt;
    Although I would recommend JSON-LD for publishing linked data within HTML
    documents, Resource Description Framework in Attributes (RDFa) might be
    suitable for situations in which you can only control the HTML templates
    for a web site. This hands-on tutorial teaches you to express linked data
    in HTML by adding attributes such as &lt;code&gt;@vocab&lt;/code&gt;,
    &lt;code&gt;@about&lt;/code&gt;, and &lt;code&gt;@property&lt;/code&gt; to HTML elements.
    &lt;/p&gt;
    &lt;div class="csl-entry"&gt;Verborgh, R. (2019, March). &lt;i&gt;Linked Data Publishing&lt;/i&gt;. Retrieved from &lt;a href="http://rubenverborgh.github.io/WebFundamentals/linked-data-publishing/"&gt;http://rubenverborgh.github.io/WebFundamentals/linked-data-publishing/&lt;/a&gt;&lt;/div&gt;
    &lt;span class="Z3988" title="url_ver=Z39.88-2004&amp;amp;ctx_ver=Z39.88-2004&amp;amp;rfr_id=info%3Asid%2Fzotero.org%3A2&amp;amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;amp;rft.type=presentation&amp;amp;rft.title=Linked%20Data%20Publishing&amp;amp;rft.identifier=http%3A%2F%2Frubenverborgh.github.io%2FWebFundamentals%2Flinked-data-publishing%2F&amp;amp;rft.aufirst=Ruben&amp;amp;rft.aulast=Verborgh&amp;amp;rft.au=Ruben%20Verborgh&amp;amp;rft.date=2019-03-07"&gt;&lt;/span&gt;
    &lt;p style="margin-left: 2em"&gt;
      Ruben is back with another presentation; this time he tackles mappings
      from relational databases and other formats to linked data, touches
      briefly on validation and provenance, and compares three major
      alternatives for publishing data in bulk:
    &lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;data dumps&lt;/li&gt;
      &lt;li&gt;SPARQL server&lt;/li&gt;
      &lt;li&gt;Triple Pattern Fragments&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/div&gt;
  &lt;h3&gt;Knowledge graphs&lt;/h3&gt;
  &lt;div class="csl-bib-body"&gt;
    &lt;div class="csl-entry"&gt;Dong, X., Gabrilovich, E., Heitz, G., Horn, W., Lao, N., Murphy, K., … Zhang, W. (2014). Knowledge Vault: A Web-scale Approach to Probabilistic Knowledge Fusion. In &lt;i&gt;Proceedings of the 20th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining&lt;/i&gt; (pp. 601–610). New York, NY, USA: ACM. &lt;a href="https://doi.org/10.1145/2623330.2623623"&gt;https://doi.org/10.1145/2623330.2623623&lt;/a&gt;&lt;/div&gt;
    &lt;span class="Z3988" title="url_ver=Z39.88-2004&amp;amp;ctx_ver=Z39.88-2004&amp;amp;rfr_id=info%3Asid%2Fzotero.org%3A2&amp;amp;rft_id=info%3Adoi%2F10.1145%2F2623330.2623623&amp;amp;rft_id=urn%3Aisbn%3A978-1-4503-2956-9&amp;amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;amp;rft.genre=proceeding&amp;amp;rft.atitle=Knowledge%20Vault%3A%20A%20Web-scale%20Approach%20to%20Probabilistic%20Knowledge%20Fusion&amp;amp;rft.btitle=Proceedings%20of%20the%2020th%20ACM%20SIGKDD%20International%20Conference%20on%20Knowledge%20Discovery%20and%20Data%20Mining&amp;amp;rft.place=New%20York%2C%20NY%2C%20USA&amp;amp;rft.publisher=ACM&amp;amp;rft.series=KDD%20'14&amp;amp;rft.aufirst=Xin&amp;amp;rft.aulast=Dong&amp;amp;rft.au=Xin%20Dong&amp;amp;rft.au=Evgeniy%20Gabrilovich&amp;amp;rft.au=Geremy%20Heitz&amp;amp;rft.au=Wilko%20Horn&amp;amp;rft.au=Ni%20Lao&amp;amp;rft.au=Kevin%20Murphy&amp;amp;rft.au=Thomas%20Strohmann&amp;amp;rft.au=Shaohua%20Sun&amp;amp;rft.au=Wei%20Zhang&amp;amp;rft.date=2014&amp;amp;rft.pages=601%E2%80%93610&amp;amp;rft.isbn=978-1-4503-2956-9"&gt;&lt;/span&gt;
    &lt;p style="margin-left: 2em"&gt;
    This is the canonical paper that describes how Google created and extends
    its Knowledge Vault, the RDF underpinnings of the Google Knowledge Graph.
    &lt;/p&gt;
    &lt;div class="csl-entry"&gt;Ehrlinger, L., &amp;amp; Wöß, W. (2016). Towards a Deﬁnition of Knowledge Graphs. In &lt;i&gt;Joint Proceedings of the Posters and Demos Track of the 12th International Conference on Semantic Systems - SEMANTiCS2016 and the 1st International Workshop on Semantic Change &amp;amp; Evolving Semantics (SuCCESS’16)&lt;/i&gt; (Vol. 1695, p. 4). Leipzig, Germany.&lt;/div&gt;
    &lt;span class="Z3988" title="url_ver=Z39.88-2004&amp;amp;ctx_ver=Z39.88-2004&amp;amp;rfr_id=info%3Asid%2Fzotero.org%3A2&amp;amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;amp;rft.genre=proceeding&amp;amp;rft.atitle=Towards%20a%20De%EF%AC%81nition%20of%20Knowledge%20Graphs&amp;amp;rft.btitle=Joint%20Proceedings%20of%20the%20Posters%20and%20Demos%20Track%20of%20the%2012th%20International%20Conference%20on%20Semantic%20Systems%20-%20SEMANTiCS2016%20and%20the%201st%20International%20Workshop%20on%20Semantic%20Change%20%26%20Evolving%20Semantics%20(SuCCESS'16)&amp;amp;rft.place=Leipzig%2C%20Germany&amp;amp;rft.aufirst=Lisa&amp;amp;rft.aulast=Ehrlinger&amp;amp;rft.au=Lisa%20Ehrlinger&amp;amp;rft.au=Wolfram%20W%C3%B6%C3%9F&amp;amp;rft.date=2016-09-13&amp;amp;rft.pages=4&amp;amp;rft.language=en"&gt;&lt;/span&gt;
    &lt;p style="margin-left: 2em"&gt;
    To distinguish knowledge graphs from ontologies and knowledge bases, the authors assert the following definition:
    &lt;blockquote&gt;
      A knowledge graph acquires and integrates information into an ontology and applies a reasoner to derive new knowledge.
    &lt;/blockquote&gt;
    &lt;/p&gt;
    &lt;div class="csl-entry"&gt;Paulheim, H. (2016). Knowledge graph refinement: A survey of approaches and evaluation methods. &lt;i&gt;Semantic Web&lt;/i&gt;, &lt;i&gt;8&lt;/i&gt;(3), 489–508. &lt;a href="https://doi.org/10.3233/SW-160218"&gt;https://doi.org/10.3233/SW-160218&lt;/a&gt;&lt;/div&gt;
    &lt;span class="Z3988" title="url_ver=Z39.88-2004&amp;amp;ctx_ver=Z39.88-2004&amp;amp;rfr_id=info%3Asid%2Fzotero.org%3A2&amp;amp;rft_id=info%3Adoi%2F10.3233%2FSW-160218&amp;amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;amp;rft.genre=article&amp;amp;rft.atitle=Knowledge%20graph%20refinement%3A%20A%20survey%20of%20approaches%20and%20evaluation%20methods&amp;amp;rft.jtitle=Semantic%20Web&amp;amp;rft.volume=8&amp;amp;rft.issue=3&amp;amp;rft.aufirst=Heiko&amp;amp;rft.aulast=Paulheim&amp;amp;rft.au=Heiko%20Paulheim&amp;amp;rft.au=Philipp%20Cimiano&amp;amp;rft.date=2016-12-06&amp;amp;rft.pages=489-508&amp;amp;rft.spage=489&amp;amp;rft.epage=508&amp;amp;rft.issn=22104968%2C%2015700844&amp;amp;rft.language=en"&gt;&lt;/span&gt;
    &lt;p style="margin-left: 2em"&gt;
    The introduction in this paper provides a good overview of the structure of
    knowledge graphs and the major examples at the time of publication: Cyc and
    OpenCyc, Freebase, Wikidata, DBpedia, YAGO, NELL, Google's Knowledge Graph,
    Google's Knowledge Vault, Yahoo!'s Knowledge Graph, Microsoft's Satori, and
    Facebook's Entities Graph.
    &lt;/p&gt;
    &lt;p style="margin-left: 2em"&gt;
    The subsequent survey of approaches to completion and error detection in
    knowledge graphs may also be of interest.
    &lt;/p&gt;
    &lt;div class="csl-entry"&gt;Stichbury, J. (2017, May 10). WTF is a knowledge graph? Retrieved March 12, 2019, from &lt;a href="https://hackernoon.com/wtf-is-a-knowledge-graph-a16603a1a25f"&gt;https://hackernoon.com/wtf-is-a-knowledge-graph-a16603a1a25f&lt;/a&gt;&lt;/div&gt;
    &lt;span class="Z3988" title="url_ver=Z39.88-2004&amp;amp;ctx_ver=Z39.88-2004&amp;amp;rfr_id=info%3Asid%2Fzotero.org%3A2&amp;amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;amp;rft.type=webpage&amp;amp;rft.title=WTF%20is%20a%20knowledge%20graph%3F&amp;amp;rft.description=Unpicking%20a%20tangle%20of%20terminology%20to%20conclude%20it%E2%80%99s%20semantic%2C%20smart%20and%20alive.&amp;amp;rft.identifier=https%3A%2F%2Fhackernoon.com%2Fwtf-is-a-knowledge-graph-a16603a1a25f&amp;amp;rft.aufirst=Jo&amp;amp;rft.aulast=Stichbury&amp;amp;rft.au=Jo%20Stichbury&amp;amp;rft.date=2017-05-10"&gt;&lt;/span&gt;
    &lt;p style="margin-left: 2em"&gt;
    Unpacks the definition of knowledge graph developed by Ehrlinger &amp;amp; Wöß (2016) with a plain language description.
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;h3&gt;Reasoning and inferences&lt;/h3&gt;
  &lt;div class="csl-bib-body"&gt;
    &lt;div class="csl-entry"&gt;Allemang, D., &amp;amp; Hendler, J. A. (2011). &lt;i&gt;Semantic Web for the working ontologist : effective modeling in RDFS and OWL&lt;/i&gt; (2nd ed.). Waltham, MA : Morgan Kaufmann/Elsevier,.&lt;/div&gt;
    &lt;span class="Z3988" title="url_ver=Z39.88-2004&amp;amp;ctx_ver=Z39.88-2004&amp;amp;rfr_id=info%3Asid%2Fzotero.org%3A2&amp;amp;rft_id=urn%3Aisbn%3A978-0-12-385966-2&amp;amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;amp;rft.genre=book&amp;amp;rft.btitle=Semantic%20Web%20for%20the%20working%20ontologist%20%3A%20effective%20modeling%20in%20RDFS%20and%20OWL&amp;amp;rft.place=Waltham%2C%20MA%20%3A&amp;amp;rft.publisher=Morgan%20Kaufmann%2FElsevier%2C&amp;amp;rft.edition=2nd&amp;amp;rft.aufirst=Dean&amp;amp;rft.aulast=Allemang&amp;amp;rft.au=Dean%20Allemang&amp;amp;rft.au=James%20A.%20Handler&amp;amp;rft.date=2011&amp;amp;rft.isbn=978-0-12-385966-2&amp;amp;rft.language=English"&gt;&lt;/span&gt;
    &lt;p style="margin-left: 2em"&gt;
    Still the definitive text for introducing reasoning into linked data. The
    book shows how to construct inferencing rules through RDFS and OWL schemas,
    illustrated with practical, easy-to-follow examples. Chapter 14, on good and
    bad modeling practices, is quite enjoyable.
    &lt;/p&gt;
    &lt;p style="margin-left: 2em"&gt;
    One of the book's limitations is that it touches on OWL 2, but does not go
    into depth. That said, a 2015 presentation by Hendler notes that OWL has not
    been broadly adopted, suggests some of the reasons why, and recommends
    possible paths forward.
    &lt;/p&gt;
    &lt;div class="csl-entry"&gt;Hendler, J. (2015, October). &lt;i&gt;On Beyond OWL: challenges for ontologies on the Web&lt;/i&gt;. Retrieved from &lt;a href="https://www.slideshare.net/jahendler/on-beyond-owl-challenges-for-ontologies-on-the-web"&gt;https://www.slideshare.net/jahendler/on-beyond-owl-challenges-for-ontologies-on-the-web&lt;/a&gt;&lt;/div&gt;
    &lt;span class="Z3988" title="url_ver=Z39.88-2004&amp;amp;ctx_ver=Z39.88-2004&amp;amp;rfr_id=info%3Asid%2Fzotero.org%3A2&amp;amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;amp;rft.type=presentation&amp;amp;rft.title=On%20Beyond%20OWL%3A%20challenges%20for%20ontologies%20on%20the%20Web&amp;amp;rft.description=The%20need%20for%20ontologies%20in%20the%20real%20world%20is%20manifest%20and%20increasing.%20On%20the&amp;amp;rft.identifier=https%3A%2F%2Fwww.slideshare.net%2Fjahendler%2Fon-beyond-owl-challenges-for-ontologies-on-the-web&amp;amp;rft.aulast=James%20Hendler&amp;amp;rft.au=James%20Hendler&amp;amp;rft.date=2015-10-09"&gt;&lt;/span&gt;
    &lt;p style="margin-left: 2em"&gt;
    In this presentation, the co-author of "Semantic Web for the working
    ontologist" delves into the reasons OWL has not been used and suggests
    potential directions for the evolution of OWL to better support reasoning.
    &lt;/p&gt;
  &lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dan Scott</dc:creator><pubDate>Sat, 09 Mar 2019 22:45:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2019-03-09:/linked-data-introductory-resources.html</guid><category>Linked Open Data</category><category>libraries</category><category>linked data</category></item><item><title>Linked Data for Production - 2018 Workshop</title><link>https://coffeecode.net/linked-data-for-production-2018-workshop.html</link><description>
  &lt;p&gt;
    &lt;strong&gt;Bonus&lt;/strong&gt;: Yesterday &lt;a href="http://journal.code4lib.org/articles/13424"&gt;Wikidata:
    a platform for your library’s linked open data&lt;/a&gt;, an article I
    co-authored with Stacy Allison-Cassin, was published in the latest issue of
    the Code4Lib Journal.
  &lt;/p&gt;
  &lt;h2&gt;LD4P Wikidata panel&lt;/h2&gt;
  &lt;p&gt;
    Last week, I was honoured to be an invited speaker and participant at the &lt;a href="https://wiki.duraspace.org/display/LD4P/LD4+Workshop+2018"&gt;Linked
      Data for Production (LD4P) - 2018 Workshop&lt;/a&gt;, held at Stanford
    University. LD4P represents the third round of Mellon Foundation funding
    for a set of partner organizations, including Stanford and Cornell, to
    advance the state of linked data adoption in libraries--and as the name
    states, the focus of this round was on putting linked data into production.
    My talk was just one of a block of talks on the potential role of Wikidata
    in library linked data adoption. 
  &lt;/p&gt;
  &lt;h3&gt;Surfacing Knowledge, Building Relationships: Indigenous Communities, ARL and Canadian Libraries&lt;/h3&gt;
  &lt;p&gt;
    Stacy Allison-Cassin and Anna St. Onge, a librarian
    and an archivist respectively, both from York University, opened with
    acknowledgements of the traditional territories of both Stanford and York
    University, situating their talk about their work within the context of
    Canada's Truth and Reconciliation Commission outcomes challenging
    libraries, archives, and museums to address historical wrongs against
    Indigenous communities and omissions of Indigenous cultures. They are
    leading &lt;a href="https://scbrwiki.library.yorku.ca/"&gt;a project&lt;/a&gt; that is
    sponsored by &lt;abbr title="Association of Research Libraries"&gt;ARL&lt;/abbr&gt; 
    to enact meaningful change within their institution, and
    have chosen a case study focused on the Native Persons Area from the
    Mariposa Folk Festival from 1972 to 1978, part of their archival collection
    that celebrates cultural expression.
  &lt;/p&gt;
  &lt;p&gt;
    One of the challenges they faced was
    that the decisions of what has been considered worthy of inclusion in
    settler-dominated authorities such as LC, VIAF, and LAC (based on
    assumptions about the relative superiority of written and recorded works
    over oral traditions) have rendered Indigenous people almost invisible.
    Trying to reconcile names against VIAF to derive URIs resulted in
    very few matches--a 7% success rate--and in this context, the ability to
    describe people and relationships in Wikidata and immediately obtain usable
    URIs, offers a path forward for their project and increases the chance that
    the data will be reused and the community will be broadened. Anna and Stacy
    covered an immense amount of difficult territory in a short time and did a
    great job raising awareness of issues that projects may face as they cover
    topics outside of the traditional colonial focus of academia.
  &lt;/p&gt;
  &lt;h3&gt;Accessing Wikidata: read and write&lt;/h3&gt;
  &lt;p&gt;
    My role was to follow Stacy and Anna with an overview of methods for
    accessing Wikidata programmatically, both to retrieve data and to update
    and load data to the platform. With just 15 minutes allocated to the topic,
    it was an impossible task--but I feel like the
    resulting talk and &lt;a href="https://stuff.coffeecode.net/2018/wikidata_access_ld4p/"&gt;accompanying
      slides&lt;/a&gt; did do justice to the topic, despite a few live-demo fails (one
    simply a matter of a slow network, one resulting from presenting on a borrowed
    laptop on which I was not logged into my Wikidata account). The reaction, 
    stated both publicly and privately, was quite positive, and I feel pleased to have
    played a part in advancing libraries' potential adoption of and
    contribution to a large body of linked data and a community that many
    libraries might have otherwise not considered.
  &lt;/p&gt;
  &lt;h3&gt;Wikidata in Libraries: a broader view&lt;/h3&gt;
  &lt;p&gt;
    Alex Stinson of the Wikimedia Foundation bookended our talks with a general
    overview of Wikidata, including its (currently) 47M items and 2,400 properties
    representing different sources of authority IDs, and highlighted a number of
    libraries that were already engaging with Wikidata in using it both as a source
    of data, contributing data to it, and (in the case of the National Library of
    Italy in Florence), building a catalogue on top of their data loaded into an
    instance of Wikibase, the software on which Wikidata is built.
  &lt;/p&gt;
  &lt;h3&gt;Discussion&lt;/h3&gt;
  &lt;p&gt;
    There was a lively discussion after our talks, including concerns raised
    about ensuring the quality of the data is maintained, as well as questions
    about where the boundaries of library data merge (or not) with Wikidata.
    I noted that there is a data contribution process that enables the existing
    Wikidata community to vet the data before it goes in, and Alex added that
    data contributors are expected to ensure that their contributions will have
    a community that will maintain the data. Notability was also raised as a
    concern, and Stacy responded that Wikidata differs from the English
    Wikipedia project in that an item is notable if it supports any of the
    content in other Wikimedia projects, or other Wikidata items. A Wikidata
    item which links to nothing and to which nothing links is a likely candidate
    for removal.
  &lt;/p&gt;
  &lt;h2&gt;LD4P day 2&lt;/h2&gt;
  &lt;p&gt;
    There was more Wikidata content on day 2 of the workshop.
  &lt;/p&gt;
  &lt;h3&gt;OCLC embraces Wikibase&lt;/h3&gt;
  &lt;p&gt;
    On the second day of the workshop, Bruce Washburn unveiled a pilot project that
    OCLC had been working on for some time: using Wikibase, which he called "great
    software", as a ready-made platform for all elements of linked data: a
    human-friendly editor, autocompletion and full-text search, a built-in
    performant triplestore with quality visualizations, and utilities such as
    pywikibot and QuickStatements for loading data.
  &lt;/p&gt;
  &lt;h3&gt;UC Davis strips it all down to URIs&lt;/h3&gt;
  &lt;p&gt;
    Carl Stahmer from UC Davis showed their experiment built almost entirely on
    URIs, including a module built on Wikibase for their local data, relying on
    realtime lookups against all of the triplestores behind the URIs (LC, VIAF,
    Wikidata, etc) to retrieve labels and associated relationships to support
    discovery. Given the oft-repeated concerns about the reliability of SPARQL
    endpoints, it is a brave approach; Carl justified it by stating that we as
    a community have to decide whether linked data is truly a viable solution,
    or not, and had found that the major endpoints were reliable in their
    experience.
  &lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dan Scott</dc:creator><pubDate>Tue, 08 May 2018 10:00:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2018-05-08:/linked-data-for-production-2018-workshop.html</guid><category>Libraries</category><category>libraries</category><category>linked data</category><category>wikidata</category></item><item><title>Creating and editing libraries in Wikidata</title><link>https://coffeecode.net/creating-and-editing-libraries-in-wikidata.html</link><description>
&lt;p&gt;&lt;strong&gt;Updated 2018-03-04&lt;/strong&gt;: &lt;em&gt;Added &lt;a href="#quantifiable"&gt;quantifiable properties&lt;/a&gt; per Philipp Zumstein&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
I originally created this guide to support the &lt;a href="http://www.olasuperconference.ca/SC-2018/event/wikimedia-edit-a-thon-get-your-library-on-wikidata-wikipedia-and-wikimedia-commons/"&gt;Wikimedia
edit-a-thon at OLA Superconference 2018&lt;/a&gt; that Stacy Allison-Cassin, Monica
Fazekas, and I led (see also our &lt;a href="https://en.wikipedia.org/wiki/Wikipedia:Meetup/olasuperconference"&gt;Meetup
page in Wikipedia&lt;/a&gt;). It seemed like teaching librarians how to describe
libraries in Wikidata might be a good idea, as the subject would be intimately
familiar, and there were only 85 Canadian libraries listed in Wikidata at the
time according to &lt;a href="https://query.wikidata.org/#%23%20Canadian%20libraries%0ASELECT%20%3Flibrary%20%3FlibraryLabel%20WHERE%20%7B%0A%20%20SERVICE%20wikibase%3Alabel%20%7B%20bd%3AserviceParam%20wikibase%3Alanguage%20%22%5BAUTO_LANGUAGE%5D%2Cen%2Cfr%22.%20%7D%0A%20%20%3Flibrary%20%28wdt%3AP31%2Fwdt%3AP279%2a%29%20wd%3AQ7075.%0A%20%20%3Flibrary%20wdt%3AP17%20wd%3AQ16.%0A%7D%0ALIMIT%20100"&gt;this
query&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
In the course of my explorations, I found that libraries are
described in many different ways in Wikidata, and decided to put forward a
prescriptive approach that would help newcomers from going down too many
ratholes. I'm hoping this will be helpful to the library community in general.
&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Start at &lt;a href="https://wikidata.org/"&gt;https://wikidata.org/&lt;/a&gt; and search for your library by name in the top-right search box.&lt;/p&gt;
&lt;p&gt;If you don't find a match in the results, you must create a new Wikidata item to represent the library: see &lt;a href="#adding_a_library"&gt;Adding a library to Wikidata&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you find a match in the results, jump ahead to &lt;a href="#editing_a_library"&gt;Editing a library in Wikidata&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="adding_a_library"&gt;Adding a library to Wikidata&lt;/h2&gt;
&lt;p&gt;If the library does not exist, you need to create a new Wikidata item.&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Select &lt;a href="https://www.wikidata.org/wiki/Special:NewItem"&gt;Create a new item&lt;/a&gt; from the left-hand menu.&lt;/li&gt;
  &lt;li&gt;Enter the name of the library in the &lt;strong&gt;Label&lt;/strong&gt; field; for example, "J.N. Desmarais Library".
    &lt;em&gt;There can be multiple items with the same label in Wikidata; descriptions disambiguate the labels.&lt;/em&gt;
  &lt;/li&gt;
  &lt;li&gt;Enter a brief description of the library in the &lt;strong&gt;Description&lt;/strong&gt; field; for example, "main library for Laurentian University". Descriptions should:
    &lt;ul&gt;
      &lt;li&gt;Be between two to twelve words&lt;/li&gt;
      &lt;li&gt;Be in lower case (except for proper nouns)&lt;/li&gt;
      &lt;li&gt;Should not begin with an article (&lt;em&gt;a&lt;/em&gt;, &lt;em&gt;an&lt;/em&gt;, &lt;em&gt;the&lt;/em&gt;)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Enter any other labels by which the library might be known in the &lt;strong&gt;Aliases&lt;/strong&gt; field; for example, "Jean Noel Desmarais Library", "Laurentian University Library".&lt;/li&gt;
  &lt;li&gt;Click &lt;strong&gt;CREATE&lt;/strong&gt; to create the item.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Once you create the item, you can add labels, descriptions, and aliases in
other languages by clicking &lt;strong&gt;Edit&lt;/strong&gt;.  Click
&lt;strong&gt;Publish&lt;/strong&gt; once you have made the necessary changes.
&lt;/p&gt;
&lt;h2&gt;Editing a library in Wikidata&lt;/h2&gt;
&lt;p&gt;
Add statements about the library. Click the &lt;strong&gt;+ add statement&lt;/strong&gt;
link and a new row will be added to the item, with autocomplete for the
property and value.
&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
  &lt;tr&gt;&lt;th&gt;Property&lt;/th&gt;&lt;th&gt;Value&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href="https://wikidata.org/entity/P31"&gt;instance of&lt;/a&gt;&lt;/td&gt;&lt;td&gt;public library, academic library, college library, research library, library&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href="https://wikidata.org/entity/P17"&gt;country&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Canada&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href="https://wikidata.org/entity/P856"&gt;official website&lt;/a&gt;&lt;/td&gt;&lt;td&gt;URL for the general website for the library--not the catalogue&lt;/td&gt;&lt;/td&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href="https://wikidata.org/entity/P571"&gt;inception&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Date the library was founded&lt;/td&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="adding_a_reference"&gt;Adding a reference&lt;/h3&gt;
&lt;p&gt;
When you add a statement, you should provide a reference for the claim. Click
&lt;strong&gt;+ add reference&lt;/strong&gt; for the statement, and fill in the following
properties:
&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
  &lt;tr&gt;&lt;th&gt;Property&lt;/th&gt;&lt;th&gt;Value&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href="https://wikidata.org/entity/P248"&gt;stated in&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Link to the Wikidata item for the journal, newspaper, or other media source.&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href="https://wikidata.org/entity/P1476"&gt;title&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Title of the article&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href="https://wikidata.org/entity/P854"&gt;reference URL&lt;/a&gt;&lt;/td&gt;&lt;td&gt;If the article is online, provide the complete URL&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href="https://wikidata.org/entity/P577"&gt;publication date&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Date the article was published&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href="https://wikidata.org/entity/P813"&gt;retrieved&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Date that you retrieved the article&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
&lt;em&gt;Hint&lt;/em&gt;: If you plan to use the same reference to support multiple
statements, this gets laborious quickly. Enable &lt;strong&gt;Preferences ➡ Gadgets ➡
DuplicateReferences&lt;/strong&gt; so that you can copy an existing reference in an
item and insert it into other statements.
&lt;/p&gt;
&lt;h2&gt;More library properties&lt;/h2&gt;
&lt;p&gt;
Now that you know how to add a reference for a statement, you can continue adding properties to enrich the description of the library.
&lt;/p&gt;

&lt;h3 id="location"&gt;Location properties&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
  &lt;tr&gt;&lt;th&gt;Property&lt;/th&gt;&lt;th&gt;Value&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href="https://wikidata.org/entity/P625"&gt;coordinate location&lt;/a&gt;&lt;/td&gt;&lt;td&gt;You can enter coordinates in a variety of latitude/longitude forms.
    &lt;p&gt;
    If you do not know the coordinates of the library, try finding it in OpenStreetMap:
    &lt;/p&gt;
    &lt;ol&gt;
      &lt;li&gt;Open &lt;a href="https://www.openstreetmap.org"&gt;https://www.openstreetmap.org&lt;/a&gt; and search for the name of the library&lt;/li&gt;
      &lt;li&gt;Select the library from the results&lt;/li&gt;
      &lt;li&gt;Right-click the library on the map and select &lt;strong&gt;Show address&lt;/strong&gt;. The coordinates will be displayed.&lt;/li&gt;
      &lt;li&gt;Copy and paste the coordinates into the Wikidata values field.&lt;/li&gt;
    &lt;/ol&gt;
    &lt;p&gt;
    You can also try finding the coordinates via Google Maps through &lt;a href="https://www.maps.ie/coordinates.html"&gt;https://www.maps.ie/coordinates.html&lt;/a&gt;
    &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href="https://wikidata.org/entity/P969"&gt;located at street address&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Full street address, including postal code&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href="https://wikidata.org/entity/P131"&gt;located in the administrative territorial entity&lt;/a&gt;&lt;/td&gt;&lt;td&gt;City or town&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href="https://wikidata.org/entity/P1329"&gt;phone number&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Format: +1-416-555-5555&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href="https://wikidata.org/entity/P968"&gt;email&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Format: mailto:example.user@example.com&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="quantifiable"&gt;Quantifiable properties&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Update 2018-03-04: Thanks to Philipp Zumstein for &lt;a href="https://twitter.com/zuphilip/status/966407915547561985"&gt;suggesting these properties&lt;/a&gt;!&lt;/em&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
  &lt;tr&gt;&lt;th&gt;Property&lt;/th&gt;&lt;th&gt;Value&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href="https://wikidata.org/entity/P1436"&gt;collection or exhibition size&lt;/a&gt;&lt;/td&gt;&lt;td&gt;# of items in the collection&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href="https://wikidata.org/entity/P1174"&gt;visitors per year&lt;/a&gt;&lt;/td&gt;&lt;td&gt;# of people that come through the gates&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="linking"&gt;Linking properties&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
  &lt;tr&gt;&lt;th&gt;Property&lt;/th&gt;&lt;th&gt;Value&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href="https://wikidata.org/entity/P972"&gt;catalog&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Link to the Wikidata item (instance of "online public access catalog") that describes the library catalogue&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href="https://wikidata.org/entity/P18"&gt;image&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Link to an image in &lt;a href="https://commons.wikimedia.org/"&gt;Wikimedia Commons&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href="https://wikidata.org/entity/P138"&gt;named after&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Link to the Wikidata item for the library's namesake (if applicable)&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href="https://wikidata.org/entity/P749"&gt;parent organization&lt;/a&gt;&lt;/td&gt;&lt;td&gt;If this library is one branch of a library network, link it to the Wikidata item for the parent system&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href="https://wikidata.org/entity/P463"&gt;member of&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Link the library to any organizations of which it is a member&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="identifier"&gt;Identifier properties&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
  &lt;tr&gt;&lt;th&gt;Property&lt;/th&gt;&lt;th&gt;Value&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href="https://wikidata.org/entity/P791"&gt;International Standard Identifier for Libraries&lt;/a&gt;&lt;/td&gt;&lt;td&gt;The ISIL code for Canadian libraries is "CA-" followed by the LAC library symbol; for example, "CA-OSUL"&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href="https://wikidata.org/entity/P4848"&gt;Libraries.org ID&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Numeric identifier found in the &lt;a href="https://libraries.org/"&gt;https://libraries.org directory&lt;/a&gt;; for example, 1144&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href="https://wikidata.org/entity/P214"&gt;VIAF ID&lt;/a&gt;&lt;/td&gt;&lt;td&gt;The library might be included as a &lt;em&gt;Corporate Name&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href="https://wikidata.org/entity/P2002"&gt;Twitter username&lt;/a&gt;&lt;/td&gt;&lt;td&gt;If the library has a Twitter account...&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href="https://wikidata.org/entity/P2013"&gt;Facebook&lt;/a&gt;&lt;/td&gt;&lt;td&gt;If the library has a Facebook account...&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href="https://wikidata.org/entity/P3836"&gt;Pinterest&lt;/a&gt;&lt;/td&gt;&lt;td&gt;If the library has a Pinterest account...&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href="https://wikidata.org/entity/P2939"&gt;Cage Match tag team ID&lt;/a&gt;&lt;/td&gt;&lt;td&gt;If your library is really into wrestling… Wait, what?&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id="adding_a_catalogue"&gt;Adding a catalogue&lt;/h2&gt;
&lt;p&gt;
Some instances of library items in Wikidata use "&lt;a href="https://www.wikidata.org/wiki/Property:P973"&gt;described at URL&lt;/a&gt;" with a
qualifier of "&lt;a href="https://www.wikidata.org/wiki/Property:P31"&gt;instance of&lt;/a&gt;: &lt;a href="https://www.wikidata.org/wiki/Q2352616"&gt;catalog&lt;/a&gt;" to link to their catalogues. However, this
prevents the catalogue itself from being fully described, and prevents multiple
libraries from linking to the same catalogue. Instead, create a new item for
the catalogue, and link to it from your library item.
&lt;/p&gt;
&lt;p&gt;
Create a new item with the label, description, and aliases for the library's catalogue.
&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
  &lt;tr&gt;&lt;th&gt;Property&lt;/th&gt;&lt;th&gt;Value&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href="https://wikidata.org/entity/P31"&gt;instance of&lt;/a&gt;&lt;/td&gt;&lt;td&gt;online public access catalog&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href="https://wikidata.org/entity/P856"&gt;official website&lt;/a&gt;&lt;/td&gt;&lt;td&gt;URL for the catalogue&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href="https://wikidata.org/entity/P408"&gt;software engine&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Identifies the software on which the catalogue runs&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href="https://wikidata.org/entity/P137"&gt;operator&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Link to the Wikidata item for the library&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dan Scott</dc:creator><pubDate>Mon, 19 Feb 2018 17:34:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2018-02-19:/creating-and-editing-libraries-in-wikidata.html</guid><category>Linked Open Data</category><category>libraries</category><category>linked data</category><category>wikidata</category></item><item><title>Voilà - Canada's new union catalogue is anti-discovery</title><link>https://coffeecode.net/voila-canadas-new-union-catalogue-is-anti-discovery.html</link><description>
&lt;p&gt;
I learned that Canada's new union catalogue, &lt;a href="https://canada.on.worldcat.org"&gt;Voilà&lt;/a&gt;, launched on February 1, 2018 at an OLA Superconference session titled &lt;a href="http://www.olasuperconference.ca/event/the-game-changer-replacement-of-lacs-national-union-catalogue/"&gt;The Game Changer: Replacement of LAC’s National Union Catalogue&lt;/a&gt;. Monica Fuijkschot told the story that lead to the replacement of the aging, in-house AMICUS with a custom interface that has been built on top of the OCLC Worldcat platform instead. I was interested to see how it satisfies the discovery needs of the nation. To be frank, it's rather disappointing.
&lt;/p&gt;
&lt;h2&gt;Voilà is not open for use&lt;/h2&gt;
&lt;p&gt;
The robots.txt file for a website controls what programs such as search engine crawlers that index websites are allowed to access. By default, any program is allowed to access any page on a site. However, Voilà currently &lt;a href="https://canada.on.worldcat.org/robots.txt"&gt;publishes a robots.txt file&lt;/a&gt; that blocks every program from accessing every page on the website:
&lt;/p&gt;
&lt;pre&gt;
User-agent: *
Disallow: /
&lt;/pre&gt;
&lt;p&gt;
When I asked whether this was a deliberate decision to prevent Canada's bibliographic holdings from being discoverable in Google, Bing, and other search engines, Daniel Boivin from OCLC Canada was in the audience; he replied that LAC would be required to purchase an additional subscription to make the holdings visible to the entire web.
&lt;/p&gt;
&lt;h2&gt;Voilà is linkless data&lt;/h2&gt;
&lt;p&gt;
The detailed records expose no linked data, neither in the HTML as RDFa, microdata, or JSON-LD, nor via content negotiation. This was an opportunity to strengthen our national collections by surfacing links to Canadian subject and name authorities, to broaden discovery and reinforce our national identities.
&lt;/p&gt;
&lt;h2&gt;Voilà doesn't use authorities?&lt;/h2&gt;
&lt;p&gt;
It may be that Voilà doesn't serve up any authority data because it doesn't seem to use authorities; for example, if I initiate a new search by selecting an author from the record details, the new search is based entirely on a string match. Searching for "Scott, Dan" this way turns up all of the works authored by every different Dan Scott, instead of works authored by the same Dan Scott. This surprises me in the context of a national union catalogue; I would have thought that identities would be even more important to making sense of our nation.
&lt;/p&gt;
&lt;h2&gt;OCLC membership requirements&lt;/h2&gt;
&lt;p&gt;
A major outcome of the outsourcing of the union catalogue to OCLC is that all libraries that want to contribute their records to, perform copy-cataloguing through, or request inter-library loans via Canada's national union catalogue are now required to be OCLC members. For a seven week period, LAC did open up applications for small public and academic libraries to request subsidization of a new OCLC membership; they found that they did not have many applicants.
&lt;/p&gt;
&lt;h2&gt;Domain name is worldcat.org&lt;/h2&gt;
&lt;p&gt;
The hostname is &lt;code&gt;canada.on.worldcat.org&lt;/code&gt;. I'm surprised that a national union catalogue would not be served up on the &lt;code&gt;gc.ca&lt;/code&gt; or &lt;code&gt;canada.ca&lt;/code&gt; domains. Instead, the hostname reads like an advertisement for WorldCat.
&lt;/p&gt;
&lt;h2&gt;No social media metadata&lt;/h2&gt;
&lt;p&gt;
One of the critiques of AMICUS that Monica shared during her presentation was that it didn't support the new world of social media. However, Voilà records currently do not include any of the common structured data formats that support rich social media sharing--schema.org, OpenGraph Protocol, or Twitter Card metadata. This could be addressed in an update to the catalogue, but, given the &lt;code&gt;robots.txt&lt;/code&gt; file, any conforming agent that Twitter, Facebook, or other social media networks would use to generate a rich display if that metadata was embedded in the detailed records wouldn't be allowed to access the record to parse the data anyway.
&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dan Scott</dc:creator><pubDate>Fri, 02 Feb 2018 23:00:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2018-02-02:/voila-canadas-new-union-catalogue-is-anti-discovery.html</guid><category>Libraries</category><category>libraries</category></item><item><title>Our nginx caching proxy setup for Evergreen</title><link>https://coffeecode.net/our-nginx-caching-proxy-setup-for-evergreen.html</link><description>
&lt;p&gt;
A long time ago, I experimented with using nginx as a caching proxy in front of
Evergreen but never quite got it to work. Since then, a lot has changed in both
nginx and Evergreen, and Bill Erickson figured out how to get nginx to proxy
the websockets that Evergreen now needs for its web-based staff client. This
spring, as part of my work towards &lt;a href="https://coffeecode.net/evergreen-progressive-web-app.html"&gt;building prototype offline support for the Evergreen catalogue's &lt;em&gt;My Account&lt;/em&gt; section&lt;/a&gt;, I dug in and started
figuring out some of the final pieces that are needed to enable nginx to proxy
most of the static content that Apache (with its bloated processes) would
otherwise have to serve up, and wrote a &lt;a href="http://git.evergreen-ils.org/?p=contrib/Conifer.git;a=blob;f=Open-ILS/src/support-scripts/webserver_config.py;h=0b74e6c2f764961088ae2136793ba845fd1cff17;hb=400ce5b233d33d08badcdc0887e97e748020301b"&gt;configuration generator script&lt;/a&gt; for the
nginx and Apache pieces. And in July, we went live with the configuration.
&lt;/p&gt;
&lt;p&gt;
This post documents what we currently (as of August 2017) are running on our
Evergreen 2.12 server with Ubuntu 16.04. If you have any questions about this
or our corresponding Apache configuration, please let me know and I'll attempt
to answer them!
&lt;p&gt;
&lt;h2&gt;/etc/nginx/sites-enabled/evergreen.conf&lt;/h2&gt;
&lt;p&gt;
This is the core configuration for the nginx server:
&lt;/p&gt;
&lt;pre&gt;proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=my_cache:10m max_size=1g
                 inactive=60m use_temp_path=off;
proxy_cache_key $scheme$http_host$request_uri;

server {
    listen 80;
    server_name clients.concat.ca;

    include /etc/nginx/concat_ssl.conf;
    include /etc/nginx/osrf_sockets.conf;

    location / {
        proxy_pass https://localhost:7443;

        rewrite ^/?$ /updates/manualupdate.html permanent;

        include /etc/nginx/concat_headers.conf;
    }
}&lt;/pre&gt;
&lt;ul&gt;
    &lt;li&gt;
        The &lt;code&gt;&lt;a href="http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_path"&gt;proxy_cache_path&lt;/a&gt;&lt;/code&gt;
        directive tells nginx where to store the data it is caching, what kind
        of directory structure it should create (&lt;em&gt;levels&lt;/em&gt;), the name of
        the shared memory zone to use (&lt;em&gt;keys_zone&lt;/em&gt;), the maximum size of
        the disk cache (&lt;em&gt;max_size&lt;/em&gt;), how long to retain a cached copy of
        the file (&lt;em&gt;inactive&lt;/em&gt;), and whether to use the value of the
        &lt;code&gt;&lt;a href="http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_temp_path"&gt;proxy_temp_path&lt;/a&gt;&lt;/code&gt;
        directive as a parent directory for the cache.
    &lt;/li&gt;
    &lt;li&gt;
        The &lt;code&gt;&lt;a href="http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_key"&gt;proxy_cache_key&lt;/a&gt;&lt;/code&gt; 
        tells nginx to use a combination of the request scheme (typically HTTP
        or HTTPS), the hostname, and the full request URI (including GET
        arguments) to store and lookup the cached data. Apache's response
        tells nginx how long the request should be cached (whether it should
        expire immediately, or as of
        &lt;a href="https://bugs.launchpad.net/evergreen/+bug/1681095"&gt;#1681095 "Extend browser cache-busting support"&lt;/a&gt;,
        cache for a full year for images, JavaScript, and CSS (at least until
        you run &lt;code&gt;autogen.sh&lt;/code&gt; again).
    &lt;/li&gt;
    &lt;li&gt;
        We currently include one &lt;code&gt;server&lt;/code&gt; directive per hostname
        that we support, which is quite repetitive. Looking at this with fresh
        eyes, we should probably simply use something like &lt;code&gt;server_name
        *.concat.ca&lt;/code&gt; to cover all of our hostnames on our domain with a
        single directive.
    &lt;/li&gt;
    &lt;li&gt;
        In this block, we only listen to port 80, which seems odd given that
        we're an HTTPS-only site. Read on!
    &lt;/li&gt;
    &lt;li&gt;
        &lt;code&gt;include /etc/nginx/concat_ssl.conf;&lt;/code&gt; keeps all of the
        TLS-related configuration in one place, including listening to port
        443. We'll pry open this file later. 
    &lt;/li&gt;
    &lt;li&gt;
        &lt;code&gt;include /etc/nginx/osrf_sockets.conf;&lt;/code&gt; keeps all of the
        OpenSRF websockets translator proxy configuration in one place. We'll
        also pry open this file later.
    &lt;/li&gt;
    &lt;li&gt;
        The &lt;code&gt;location /&lt;/code&gt; block handles the proxying. At first I was nervous
        and wanted to proxy the actual hostname instead of
        &lt;code&gt;localhost&lt;/code&gt; to ensure we got the right templates, etc, but
        it turns out the proxy headers guide the request to the right host. So
        now I'm relaxed and we simply pass the request on to
        &lt;code&gt;https://localhost:443&lt;/code&gt;. Be very careful with those trailing
        slashes!
    &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;/etc/nginx/concat_ssl.conf&lt;/h2&gt;
&lt;pre&gt;listen 443 ssl http2;
ssl_certificate /etc/apache2/ssl/server.crt;
ssl_certificate_key /etc/apache2/ssl/server.key;

if ($scheme != "https") {
    return 301 https://$host$request_uri;
}

# generate with openssl dhparam -out dhparams.pem 2048
ssl_dhparam /etc/apache2/dhparams.pem;

# From https://mozilla.github.io/server-side-tls/ssl-config-generator/
ssl_prefer_server_ciphers on;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;

# intermediate configuration. tweak to your needs.
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';

# HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
add_header Strict-Transport-Security max-age=15768000;

# OCSP Stapling ---
# fetch OCSP records from URL in ssl_certificate and cache them
ssl_stapling on;
ssl_stapling_verify on;&lt;/pre&gt;
&lt;p&gt;
    There's a fair bit going on here, but it's almost entirely related to TLS
    support and a lot of the content comes either from the
    &lt;a href="https://mozilla.github.io/server-side-tls/ssl-config-generator/"&gt;Mozilla TLS configuration generator&lt;/a&gt;
    or from Certbot's configuration plugin for nginx. Perhaps most interesting
    is the &lt;code&gt;listen 443 ssl http2;&lt;/code&gt; line that enables listening on
    the standard HTTPS port and also supports &lt;a href="https://http2.github.io/"&gt;HTTP/2&lt;/a&gt;
    for browsers that support it--effectively a way to use a single connection
    from a browser to a server to issue many parallel requests for resources,
    amongst other performance enhancements. 
&lt;/p&gt;
&lt;p&gt;
    We also force any HTTP request to use an HTTPS connection using the
    &lt;code&gt;if ($scheme != "https") {&lt;/code&gt; block.
&lt;/p&gt;

&lt;h2&gt;/etc/nginx/concat_headers.conf&lt;/h2&gt;
&lt;p&gt;
This is extracted from the &lt;a href="http://git.evergreen-ils.org/?p=OpenSRF.git;a=blob;f=examples/nginx/osrf-ws-http-proxy;h=d079230c62c3580c25435413570a6cc95b4bbd8a;hb=refs/heads/master"&gt;sample nginx configuration&lt;/a&gt; shipped with OpenSRF:
&lt;/p&gt;
&lt;pre&gt;location /osrf-websocket-translator {
    proxy_pass https://localhost:7682;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    # Needed for websockets proxying.
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

    # Raise the default nginx proxy timeout values to an arbitrarily
    # high value so that we can leverage osrf-websocket-translator's
    # timeout settings.
    proxy_connect_timeout 5m;
    proxy_send_timeout 1h;
    proxy_read_timeout 1h;
}&lt;/pre&gt;

&lt;h2&gt;/etc/nginx/concat_headers.conf&lt;/h2&gt;
&lt;p&gt;
    This is not perfectly named; while we do set up the proxy headers in this
    file, we also include some of the other statements we would otherwise have
    to repeat inside the &lt;code&gt;server&lt;/code&gt; block. Here's what the contents
    look like:
&lt;/p&gt;
&lt;pre&gt;proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

proxy_cache my_cache;
proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
proxy_cache_lock on;

rewrite ^/?$ /eg/opac/home permanent;&lt;/pre&gt;
&lt;ul&gt;
    &lt;li&gt;
    The &lt;code&gt;&lt;a href="http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header"&gt;proxy_set_header&lt;/a&gt;&lt;/code&gt;
    directive adds headers to the requests forwarded to Apache, so that Apache
    can figure out which host was actually requested, accurately log requests
    (instead of saying everything is coming from &lt;code&gt;localhost&lt;/code&gt;),
    etc. These directives were copied directly from the &lt;a href="http://git.evergreen-ils.org/?p=OpenSRF.git;a=blob;f=examples/nginx/osrf-ws-http-proxy;h=d079230c62c3580c25435413570a6cc95b4bbd8a;hb=refs/heads/master"&gt;sample nginx configuration&lt;/a&gt; shipped with OpenSRF.
    &lt;/li&gt;
    &lt;li&gt;
    &lt;code&gt;&lt;a href="http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache"&gt;proxy_cache&lt;/a&gt;&lt;/code&gt;
    tells this server to use the cache we previously named in our &lt;code&gt;keys_zone&lt;/code&gt; parameter.
    &lt;/li&gt;
    &lt;li&gt;
    &lt;code&gt;&lt;a href="http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_use_stale"&gt;proxy_cache_use_stale&lt;/a&gt;&lt;/code&gt;
    tells this server to return stale data (if it has a cached copy) if Apache
    returns an error or a timeout or any of the specified HTTP status codes
    while trying to fetch a fresh copy.
    &lt;/li&gt;
    &lt;li&gt;
    &lt;code&gt;&lt;a href="http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_lock"&gt;proxy_cache_lock&lt;/a&gt;&lt;/code&gt;
    tells this server to, should multiple identical requests for data that
    needs to be cached or refreshed arrive, only allow a single request to be
    passed through to Apache and have the other requests wait. This can be one
    way to avoid the "someone set a book down on a keyboard and caused 100
    identical requests in one second" problem.
    &lt;/li&gt;
    &lt;li&gt;
        The &lt;code&gt;rewrite&lt;/code&gt; simply directs the request for a bare hostname
        (with or without a trailing slash) to the catalogue home page.
    &lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;

</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dan Scott</dc:creator><pubDate>Thu, 24 Aug 2017 16:00:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2017-08-24:/our-nginx-caching-proxy-setup-for-evergreen.html</guid><category>Libraries</category><category>evergreen</category><category>coding</category><category>libraries</category></item><item><title>Enriching catalogue pages in Evergreen with Wikidata</title><link>https://coffeecode.net/enriching-catalogue-pages-in-evergreen-with-wikidata.html</link><description>
&lt;p&gt;
I'm part of the Music in Canada @ 150 Wikimedia project, organizing wiki
edit-a-thons across Canada to help improve the presence of Canadian music and
musicians in projects like Wikpedia, Wikidata, and Wikimedia Commons. It's
going to be awesome, and it's why I invested time in developing and delivering
the &lt;a href="https://coffeecode.net/wikidata-workshop-for-librarians.html"&gt;&lt;em&gt;Wikidata
for Librarians&lt;/em&gt;&lt;/a&gt; presentation at the
&lt;abbr title="Canadian Association of Music Libraries, Archives, and Document Centres"&gt;CAML&lt;/abbr&gt; preconference.
&lt;/p&gt;
&lt;p&gt;
Right now I'm at the Wikimania 2017 conference, because it is being held in
Montréal--just down the road from me when you consider it is an international
affair. The first two days were almost entirely devoted to a massive hackathon
consisting of hundreds of participants with a very welcoming, friendly ambiance.
It was inspiring, and I participated in several activities:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;installing Wikibase--the technical foundation for Wikidata--from scratch&lt;/li&gt;
&lt;li&gt;an ad-hoc data modelling session with &lt;a href="https://meta.wikimedia.org/wiki/User:Ainali"&gt;Jan&lt;/a&gt; and
&lt;a href="https://meta.wikimedia.org/wiki/User:smallison"&gt;Stacy
Allison-Cassin&lt;/a&gt; that resulted in enhancing the periodicals structure on
Wikidata&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
But I also had the itch to revisit and enhance the JavaScript widget that runs
in our Evergreen catalogue which delivers on-demand cards of additional
metadata about contributors to recorded works. I had originally developed the widget
as a proof-of-concept for the potential value to cultural institutions of
contributing data to Wikidata--bearing in mind a challenge put to the room at
an Evergreen 2017 conference session that asked what tangible value linked open
data offers--but it was quite limited:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;it would only show a card for the first listed contributor to the work&lt;/li&gt;
&lt;li&gt;it was hastily coded, and thus duplicated code, used shortcuts, and had no comments&lt;/li&gt;
&lt;li&gt;the user interface was poorly designed&lt;/li&gt;
&lt;li&gt;it was not explicitly licensed for reuse&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
So I spent some of my hackathon time (and some extra time stolen from various sessions)
fixing those problems--so now, when you look at the &lt;a href="https://laurentian.concat.ca/eg/opac/record/738234"&gt;catalogue record
  for a musical recording by the most excellent Canadian band Rush&lt;/a&gt;, you will find
that each of the contributors to the album has a musical note (♩) which, when clicked,
displays a card based on the data returned from Wikidata using &lt;a href="http://tinyurl.com/ya8gxcpo"&gt;a SPARQL query&lt;/a&gt; matching the
contributor's name (limited in scope to bands and musicians to avoid too many
ambiguous results).
&lt;/p&gt;
&lt;p&gt;
&lt;img src="/uploads/pics/rush_wikidata_enriched.png" /&gt;
&lt;/p&gt;
&lt;p&gt;
I'm not done yet: the design is still very basic, but I'm happier about the code quality
and it now supports queries for all of the contributors to a given album. It is also
licensed for reuse under the GPL version 2 or later license, so as long as you
can load the script in your catalogue and tweak a few CSS query selector
statements to identify where the script should find contributor names and where
it should place the cards, it should theoretically be usable in any catalogue of musical
recordings. And with the clear &lt;em&gt;"Edit on Wikidata"&lt;/em&gt; link, I hope that it
encourages users to jump in and contribute if they find one of their favourite performers
lacks (or shows incorrect!) information.
&lt;/p&gt;
&lt;p&gt;
You can find the code on the &lt;a href="https://goo.gl/XvEemr"&gt;Evergreen contributor git repository&lt;/a&gt;.
&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dan Scott</dc:creator><pubDate>Sat, 12 Aug 2017 16:00:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2017-08-12:/enriching-catalogue-pages-in-evergreen-with-wikidata.html</guid><category>Linked Open Data</category><category>evergreen</category><category>coding</category><category>libraries</category><category>structured data</category></item><item><title>Wikidata, Canada 150, and music festival data</title><link>https://coffeecode.net/wikidata-canada-150-and-music-festival-data.html</link><description>
      &lt;p&gt;
      Following my workshop at the &lt;a href="https://coffeecode.net/wikidata-workshop-for-librarians.html"&gt;Wikipedia/Canadian
          Music preconference&lt;/a&gt;, I had the opportunity to present with
      &lt;a href="http://sacassin.blog.yorku.ca/"&gt;Stacy Allison-Cassin&lt;/a&gt; on the
      subject of &lt;em&gt;Wikidata, Music, and Community: Leveraging Local Music
          Festival Data&lt;/em&gt; to a more general audience of music
      librarians--most of whom had never heard of Wikidata--on why we were
      advocating the use of Wikidata as one of the repositories of data about
      Canadian music festivals.
      &lt;/p&gt;
      &lt;p&gt;
      Our central argument was that, rather than focusing on directly enhancing
      our own local data repository silos (for example, library catalogues,
      digital exhibits), libraries and archives should invest their limited
      resources in enriching Wikidata, a centralized data repository, to
      maximize the visibility of those entities and the reusability of that
      data in the world at large… and then pull that data back into our local
      repositories to enrich our displays and integration with the broader
      world of data.
      &lt;/p&gt;
      &lt;p&gt;
      Having heard from colleagues at the Evergreen conference in April that
      they were tired of hearing about the promise of linked data and wanted to
      see some actual demonstrable value for users, I showed a proof of concept
      that I had implemented for Laurentian University's catalogue. Any record
      recognized as a "music album" adds a musical note to the primary
      contributor's name; clicking that note queries Wikidata for a band or
      musician with a matching name and displays a subset of available data,
      such as a description, an image, a link to their website, etc. In the
      following image you can see the result of pulling up a record for the
      fine Canadian band &lt;em&gt;Men Without Hats&lt;/em&gt; and clicking on the musical
      note:
      &lt;/p&gt;
      &lt;p&gt;
      &lt;img src="/images/men_without_linked_hats.png" style="border:0" alt="Catalogue record for Men Without Hats displaying an image of the band and data such as their website URL" /&gt;
      &lt;/p&gt;
      &lt;p&gt;
      It is a simple example: the user experience could be greatly improved,
      and it would be far better if we used the Wikidata entity ID as the
      authority control value in the underlying records to avoid any
      ambiguities in the cases of bands or musicians that have identical names,
      but for a quick hack put together over a few hours, I'm pretty happy with
      the results. The code is &lt;a href="http://git.evergreen-ils.org/?p=contrib/Conifer.git;a=shortlog;h=refs/heads/feature/wikidata_music_card"&gt;available&lt;/a&gt;,
      of course :)
      &lt;/p&gt;
      &lt;/p&gt;
      &lt;p&gt;
      Stacy and I began with a high-level overview of Wikidata, noting that it is:
      &lt;/p&gt;
      &lt;ul&gt;
          &lt;li&gt;Like Wikipedia, but machine &amp;amp; human-readable &amp;amp; writable&lt;/li&gt;
          &lt;li&gt;Focuses on entities, with statements of fact about those entities backed up by references&lt;/li&gt;
          &lt;li&gt;Open for participation: no organizational barriers such as having to be an OCLC member to contribute to LCNAF&lt;/li&gt;
          &lt;li&gt;Open for use: all data is &lt;a href="https://creativecommons.org/publicdomain/zero/1.0/"&gt;CC0 licensed&lt;/a&gt; (dedicated
              to the public domain) thus requiring no special acknowledgements,
              etc on the part of the user of the data&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;
      As an example of how Wikidata supports Wikipedia, I highlighted how
      authority control used to be accomplished in Wikipedia articles via
      manually-coded lists of authority references for a given person, but now
      that job can be delegated to the Wikidata entity counterpart via the
      &lt;code&gt;{{Authority control}}&lt;/code&gt; macro to dynamically generate an
      authority list, helping both humans &amp;amp; machines. The multilingual
      nature of the data means that those lists no longer need to be manually
      updated in every language variant!  But of course there is still plenty
      of labour-saving development to be done: for example, the &lt;em&gt;Infobox
      musical artist&lt;/em&gt; in Wikipedia is still maintained manually.
      &lt;/p&gt;
      &lt;p&gt;
      Stacy discussed some comparisons of the musical genres in Wikidata versus
      the Library of Congress vocabulary (in short: the quantity of genres is
      certainly there, but some work linking the vocabularies would be beneficial),
      and highlighting how we have been experimenting with structuring music festivals
      in Wikidata. Even with a recent example like the &lt;a href="https://www.wikidata.org/wiki/Q30039140"&gt;Northern Lights Festival
          Boréal 2015&lt;/a&gt;, we found only 25% of the performers already had
      corresponding entities in Wikidata. That leaves a lot of room for us to
      improve the visibility of Canadian musicians during the Canada 150 Wikipedia
      edit-a-thons--and with &lt;a href="https://www.wikidata.org/wiki/Wikidata:Notability"&gt;Wikidata's
          notability policy&lt;/a&gt; that allows new entities to be added if they
      fulfill a structural need by making statements made in other items more useful,
      we believe this is a positive way forward.
      &lt;/p&gt;
      &lt;p&gt;
      In the hopes that others may find our presentation useful, Stacy and I offer our &lt;a href="https://docs.google.com/presentation/d/1ve5ul7rVU5Icfbv-ICI0HIA2Bg_3YNhXIx1Gsa48qXQ/edit?usp=sharing"&gt;slides&lt;/a&gt;
      under the &lt;a href="http://creativecommons.org/licenses/by-sa/4.0/"&gt;&lt;abbr title="Creative Commons Attribution-Sharealike 4.0
        International"&gt;CC-BY-SA 4.0&lt;/abbr&gt;&lt;/a&gt; license.
      &lt;/p&gt;
      &lt;iframe src="https://docs.google.com/presentation/d/1ve5ul7rVU5Icfbv-ICI0HIA2Bg_3YNhXIx1Gsa48qXQ/embed?start=false&amp;amp;loop=false&amp;amp;delayms=3000" frameborder="0" width="960" height="749" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"&gt;&lt;/iframe&gt;
    </description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dan Scott</dc:creator><pubDate>Fri, 02 Jun 2017 13:15:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2017-06-02:/wikidata-canada-150-and-music-festival-data.html</guid><category>Linked Open Data</category><category>coding</category><category>libraries</category><category>structured data</category></item><item><title>Wikidata workshop for librarians</title><link>https://coffeecode.net/wikidata-workshop-for-librarians.html</link><description>
      &lt;p&gt;
      Lately I've been spending time working with and contributing to &lt;a href="https://wikidata.org"&gt;Wikidata&lt;/a&gt;, the Wikimedia
      Foundation project to build a database of structured date licensed
      under the &lt;a href="https://creativecommons.org/publicdomain/zero/1.0/"&gt;&lt;abbr title="Creative Commons 0 Public Domain Dedication"&gt;CC0&lt;/abbr&gt;&lt;/a&gt;
      license. And I like what I've seen: Wikidata contains a sizable
      amount of data describing entities that I care about; contributing and
      correcting data is straightforward; editors are expected to provide
      references supporting any statements that you make; and the entire
      dataset is queryable via a SPARQL endpoint (with good uptime, no
      less!)
      &lt;/p&gt;
      &lt;p&gt;
      Building on some of my &lt;a href="https://coffeecode.net/schema-org-wikidata-knowledge-graph.html"&gt;recent
        investigations into Wikidata&lt;/a&gt;, I was tasked with leading a
      workshop on editing Wikidata at last week's &lt;em&gt;Wikipedia/Canadian
        Music preconference&lt;/em&gt; for the &lt;abbr title="Canadian Association
        of Music Libraries, Archives, and Documentary Centres"&gt;CAML&lt;/abbr&gt;
      2017 conference. We put together the preconference to "train the
      trainers" who plan to run &lt;a href="https://meta.wikimedia.org/wiki/Grants:Project/Smallison/Music_in_Canada_@_150:_A_Wikipedia_and_Wikidata_Project"&gt;Wikipedia
        and Wikidata editathons across Canada in October with the goal of
        increasing the visibility of Canadian music in Wikimedia Foundation
        projects&lt;/a&gt;. Rather than rehash one of the existing, rather generic,
      Wikidata workshops, I created material tailored for an audience of
      librarians and archivists focused on music, musicians, and music
      festivals.
      &lt;/p&gt;
      &lt;p&gt;
      In the hopes that others may find my materials useful, I offer my &lt;a href="https://stuff.coffeecode.net/2017/wikidata_workshop/"&gt;slides&lt;/a&gt;
      and the &lt;a href="https://stuff.coffeecode.net/2017/wikidata_workshop/notes.html"&gt;rough
        notes&lt;/a&gt; (on which the slides were based) under the &lt;a href="http://creativecommons.org/licenses/by-sa/4.0/"&gt;&lt;abbr title="Creative Commons Attribution-Sharealike 4.0
        International"&gt;CC-BY-SA 4.0&lt;/abbr&gt;&lt;/a&gt; license.
      &lt;/p&gt;
      &lt;p&gt;
      In the near future, I also hope to link to the video that &lt;a href="https://music.utoronto.ca/our-people.php?fid=224"&gt;James Mason&lt;/a&gt;
      captured of the workshop; the participants raised a number of questions
      that led to fruitful discussions about Wikidata that enriched the
      workshop. I was fortunate to have a great group of workshop participants!
      &lt;/p&gt;
      &lt;div style="position: relative; width: 100%; height: 0; padding-bottom: 51%;"&gt;
        &lt;iframe src="https://stuff.coffeecode.net/2017/wikidata_workshop" style="position: absolute; width: 100%; height: 100%; left: 0; top: 0;"&gt;&lt;/iframe&gt;
      &lt;/div&gt;
    </description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dan Scott</dc:creator><pubDate>Sun, 28 May 2017 11:15:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2017-05-28:/wikidata-workshop-for-librarians.html</guid><category>Linked Open Data</category><category>coding</category><category>libraries</category><category>structured data</category></item><item><title>Evergreen as a Progressive Web App?</title><link>https://coffeecode.net/evergreen-progressive-web-app.html</link><description>&lt;p&gt;&lt;a class="reference external" href="https://developer.mozilla.org/en-US/Apps/Progressive"&gt;Progressive Web Apps&lt;/a&gt;
are  pretty cool, and for good reason: the idea is to take advantage of the
advanced features of our web browsers to provide capabilities that rival native
apps, while still offering good performance and functionality to users of other
browsers.&lt;/p&gt;
&lt;p&gt;However, if you've done much reading about PWAs, you could be forgiven for
thinking they require a client-side JavaScript framework like &lt;a class="reference external" href="https://facebook.github.io/react/"&gt;React&lt;/a&gt; or &lt;a class="reference external" href="https://angular.io"&gt;Angular&lt;/a&gt; to
be possible. So last week at the &lt;a class="reference external" href="https://evergreen-ils.org/conference/2017-evergreen-international-conference/"&gt;2017 Evergreen International Conference&lt;/a&gt;,
I demonstrated that it &lt;em&gt;is&lt;/em&gt; possible to graft PWA attributes onto Evergreen's
classic Perl-based Template Toolkit web architecture--to the point of scoring
100/100 on Google's &lt;a class="reference external" href="https://developers.google.com/web/tools/lighthouse/"&gt;Lighthouse web site audit tool&lt;/a&gt; (from a baseline of
37/100).&lt;/p&gt;
&lt;p&gt;You might enjoy my presentation, &lt;a class="reference external" href="https://stuff.coffeecode.net/2017/evergreen-progressive-web-app/"&gt;We aim to misbehave - Evergreen: Progressive
Web App&lt;/a&gt; (yes,
that's a &lt;em&gt;Firefly&lt;/em&gt; reference), or you might enjoy poking around the code I posted
in the &lt;a class="reference external" href="http://git.evergreen-ils.org/?p=working/Evergreen.git;a=shortlog;h=refs/heads/user/dbs/progressive_web_app_example"&gt;corresponding branch&lt;/a&gt;.
Check out the new &lt;a class="reference external" href="http://git.evergreen-ils.org/?p=working/Evergreen.git;a=tree;f=Open-ILS/examples/pwa;h=278a2eafa948bbf09d164617f337346127fc7a7a;hb=fc584eddbe695e08befed621802aaea281019c9a"&gt;pwa examples directory&lt;/a&gt;
for a README and the core examples.&lt;/p&gt;
&lt;p&gt;It's far from perfect at this point, but as a proof of concept, I'm quite
pleased, and I think it offers a possible vision of the way forward, particularly
for the &lt;strong&gt;My Account&lt;/strong&gt; section of the public catalogue, which really deserves to
become its own app. If nothing else, it has refocused attention on enhancing
Evergreen's web performance, and that can only be a good thing, right?&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 14 Apr 2017 00:35:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2017-04-14:/evergreen-progressive-web-app.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Truly progressive WebVR apps are available offline!</title><link>https://coffeecode.net/truly-progressive-webvr-apps-are-available-offline.html</link><description>&lt;p&gt;I've been dabbling with the &lt;a class="reference external" href="https://aframe.io"&gt;A-Frame framework&lt;/a&gt; for
creating WebVR experiences for the past couple of months, ever since Patrick
Trottier gave a lightning talk at the GDG Sudbury DevFest in November and a
&lt;a class="reference external" href="https://www.meetup.com/GDG-Sudbury/events/237154443/"&gt;hands-on session with AFrame&lt;/a&gt; in January. The
&lt;a class="reference external" href="https://twitter.com/aframevr"&gt;&amp;#64;AFrameVR Twitter feed&lt;/a&gt; regularly highlights
cool new WebVR apps, and one that caught my attention was &lt;a class="reference external" href="http://forestvr.onepopcorn.com/"&gt;ForestVR&lt;/a&gt; - a peaceful forest scene with birds
tweeting in the distance. &amp;quot;How nice would it be&amp;quot;, I thought, &amp;quot;if I could just
escape into that little scene wherever I am, without worrying about
connectivity or how long it would take to download?&amp;quot;&lt;/p&gt;
&lt;p&gt;Then I realized that WebVR apps are a great use case for &lt;a class="reference external" href="https://developers.google.com/web/progressive-web-apps/"&gt;Progressive Web App
(PWA) techniques&lt;/a&gt;
that allow web apps to be as fast, reliable, and engaging as native Android
apps. With the &lt;a class="reference external" href="https://github.com/onepopcorn/forestvr"&gt;source code for ForestVR&lt;/a&gt; at my disposal, I set out to add
offline support. And it turned out to be surprisingly easy to make this work on
Android in both the Firefox and Chrome browsers.&lt;/p&gt;
&lt;p&gt;If you just want to see the required changes for this specific example, you can
find the relevant two commits at the tip of my &lt;a class="reference external" href="https://github.com/dbs/forestvr/tree/relocatable_manifest"&gt;branch&lt;/a&gt;. The live demo
is at &lt;a class="reference external" href="https://stuff.coffeecode.net/forestvr/"&gt;https://stuff.coffeecode.net/forestvr/&lt;/a&gt;.&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;img alt="Firefox menu for &amp;quot;Add to Home Screen&amp;quot;" src="/uploads/pics/forestvr_firefox_51.png" style="width: 285px;" /&gt;
&lt;p class="caption"&gt;ForestVR with &amp;quot;Add to Home Screen&amp;quot; menu on Firefox for Android 51.0.3&lt;/p&gt;
&lt;/div&gt;
&lt;div class="figure"&gt;
&lt;img alt="Chrome &amp;quot;Add&amp;quot; prompt" src="/uploads/pics/forestvr_chrome_57.png" style="width: 285px;" /&gt;
&lt;p class="caption"&gt;ForestVR with &amp;quot;Add&amp;quot; prompt on Chrome for Android 57&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;In the following sections I've written an overview of the steps you have to
take to turn your web app into a PWA:&lt;/p&gt;
&lt;div class="section" id="describe-your-app-with-a-web-app-manifest"&gt;
&lt;h2&gt;Describe your app with a Web App Manifest&lt;/h2&gt;
&lt;p&gt;ForestVR already had a working Web App Manifest (&lt;a class="reference external" href="https://developer.mozilla.org/en-US/docs/Web/Manifest"&gt;Mozilla docs&lt;/a&gt; / &lt;a class="reference external" href="https://developers.google.com/web/fundamentals/engage-and-retain/web-app-manifest/"&gt;Google docs&lt;/a&gt;),
a simple JSON file that defines metadata about your web app such as the app
name and icon to use when it is added to your home screen, the URL to launch,
the splash screen to show when it is loading, and other elements that enable it
to integrate with the Android environment.&lt;/p&gt;
&lt;p&gt;The web app manifest for ForestVR is named &lt;tt class="docutils literal"&gt;manifest.json&lt;/tt&gt; and contains the
following code:&lt;/p&gt;
&lt;pre class="code json literal-block"&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Forest VR&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;quot;icons&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;quot;src&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;./assets/images/icons/android-chrome-144x144.png&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;quot;sizes&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;144x144&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;image/png&amp;quot;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;quot;theme_color&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;#ffffff&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;quot;background_color&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;#ffffff&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;quot;start_url&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;./index.html&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;quot;display&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;standalone&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;quot;orientation&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;landscape&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;You associate the manifest with your web app through a simple &lt;tt class="docutils literal"&gt;&amp;lt;link&amp;gt;&lt;/tt&gt;
element in the &lt;tt class="docutils literal"&gt;&amp;lt;head&amp;gt;&lt;/tt&gt; of your HTML:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;link&lt;/span&gt; &lt;span class="na"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;manifest&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;manifest.json&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="create-a-service-worker-to-handle-offline-requests"&gt;
&lt;h2&gt;Create a service worker to handle offline requests&lt;/h2&gt;
&lt;p&gt;A &lt;em&gt;service worker&lt;/em&gt; is a special chunk of JavaScript that runs independently from
a given web page, and can perform special tasks such as intercepting and
changing browser fetch requests, sending notifications, and synchronizing data
in the background (&lt;a class="reference external" href="https://developers.google.com/web/fundamentals/getting-started/primers/service-workers"&gt;Google docs&lt;/a&gt;
/ &lt;a class="reference external" href="https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers"&gt;Mozilla docs&lt;/a&gt;).
While implementing the required networking code for offline
support would be painstaking, bug-prone work, Google has fortunately made the
&lt;a class="reference external" href="https://github.com/GoogleChrome/sw-precache"&gt;sw-precache node module&lt;/a&gt; available to support generating a service worker from a
simple configuration file and any static files in your deployment directory.&lt;/p&gt;
&lt;p&gt;The configuration I added to the existing &lt;a class="reference external" href="https://gulp.js"&gt;gulp build system&lt;/a&gt; gulpfile uses runtime caching for assets that are hosted
at a different hostname or, in the case of the background soundtrack, is not
essential for the experience at launch and can thus be loaded and cached after
the main experience has been prepared. The &lt;tt class="docutils literal"&gt;staticFileGlobs&lt;/tt&gt; list, on the
other hand, defines all of the assets that must be cached before the app can
launch.&lt;/p&gt;
&lt;pre class="code javascript literal-block"&gt;
&lt;span class="nx"&gt;swConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;cacheId&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;packageJson&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;runtimeCaching&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
    &lt;span class="nx"&gt;urlPattern&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/^https:\/\/cdn\.rawgit\.com\//&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;handler&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'cacheFirst'&lt;/span&gt;
  &lt;span class="p"&gt;},{&lt;/span&gt;
    &lt;span class="nx"&gt;urlPattern&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/^https:\/\/aframe\.io\//&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;handler&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'cacheFirst'&lt;/span&gt;
  &lt;span class="p"&gt;},{&lt;/span&gt;
    &lt;span class="nx"&gt;urlPattern&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/\/assets\/sounds\//&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;handler&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'cacheFirst'&lt;/span&gt;
  &lt;span class="p"&gt;}],&lt;/span&gt;
  &lt;span class="nx"&gt;staticFileGlobs&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'assets/fonts/fabrica-webfont.woff'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'assets/images/bg.jpg'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'assets/images/tree_icon.png'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'assets/models/**.dae'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'bundle.css'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'bundle.js'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'index.html'&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;I defined the configuration inside a new &lt;tt class="docutils literal"&gt;writeServiceWorkerFile()&lt;/tt&gt; function
so that I could add it as a build task to the gulpfile:&lt;/p&gt;
&lt;pre class="code javascript literal-block"&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;writeServiceWorkerFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;swConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{...}&lt;/span&gt;
  &lt;span class="nx"&gt;swPrecache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'service-worker.js'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;swConfig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;In that gulp task, I declared the 'scripts' and 'styles' tasks as prerequisites
for generating the service worker, as those tasks generate the &lt;cite&gt;bundle.js&lt;/cite&gt; and
&lt;cite&gt;bundle.css&lt;/cite&gt; files. If the files are not present in the build directory when
sw-precache runs, then it will simply ignore their corresponding entry in the
configuration, and they will not be available for offline use.&lt;/p&gt;
&lt;pre class="code javascript literal-block"&gt;
&lt;span class="nx"&gt;gulp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'generate-service-worker'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'scripts'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'styles'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;writeServiceWorkerFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;I added the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;generate-service-worker&lt;/span&gt; task&lt;/tt&gt; to the deploy task so that the service worker will be generated every time we build the app:&lt;/p&gt;
&lt;pre class="code javascript literal-block"&gt;
&lt;span class="nx"&gt;gulp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'deploy'&lt;/span&gt;&lt;span class="p"&gt;,[&lt;/span&gt;&lt;span class="s1"&gt;'scripts'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'styles'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'generate-service-worker'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="register-the-service-worker"&gt;
&lt;h2&gt;Register the service worker&lt;/h2&gt;
&lt;p&gt;Just like the Web App Manifest, you need to register your service worker--but
it's a little more complex. I chose &lt;a class="reference external" href="https://github.com/GoogleChrome/sw-precache/blob/master/demo/app/js/service-worker-registration.js"&gt;Google's boilerplate service worker
registration script&lt;/a&gt;
because it contains self-documenting comments and hooks for adding more
interactivity, and added it in a &lt;tt class="docutils literal"&gt;&amp;lt;script&amp;gt;&lt;/tt&gt; element in the &lt;tt class="docutils literal"&gt;&amp;lt;head&amp;gt;&lt;/tt&gt; of the
HTML page.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="host-your-app-with-https"&gt;
&lt;h2&gt;Host your app with HTTPS&lt;/h2&gt;
&lt;p&gt;PWAs--specifically service workers--require the web app to be hosted on an
HTTPS-enabled site due to the potential for mischief that service workers could
cause if replaced by a man-in-the-middle attack that would be trivial with a
non-secure site. Fortunately, my personal VPS already runs HTTPS thanks to free
TLS certificates generated by &lt;a class="reference external" href="https://letsencrypt.org"&gt;Let's Encrypt&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="check-for-success-with-lighthouse"&gt;
&lt;h2&gt;Check for success with Lighthouse&lt;/h2&gt;
&lt;p&gt;Google has made &lt;a class="reference external" href="https://developers.google.com/web/tools/lighthouse/"&gt;Lighthouse&lt;/a&gt;, their PWA auditing
tool, available as both a command-line oriented node module and a Chrome
extension for grading the quality of your efforts. It runs a separate instance
of Chrome to check for offline support, responsiveness, and many other required
and optional attributes and generates succinct reports with helpful links for
more information on any less-than-stellar results you might receive.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="check-for-success-with-your-mobile-web-browser"&gt;
&lt;h2&gt;Check for success with your mobile web browser&lt;/h2&gt;
&lt;p&gt;Once you have satisfied Lighthouse's minimum requirements, load the URL in
Firefox or Chrome on Android and try adding it to your home screen.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;In Firefox, you will find the Add to Home Screen option in the browser menu
under the Page entry.&lt;/li&gt;
&lt;li&gt;In Chrome, the Add button (Chrome 57) or Add to Home Screen button (Chrome
56) will appear at the bottom of the page when you have visited it a few
times over a span of five minutes or more; a corresponding entry may also
appear in your browser menu.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Put your phone in airplane mode and launch the app from your shiny new home
screen button. If everything has gone well, it should launch and run
successfully even though you have no network connection at all!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="conclusion"&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;As a relative newbie to node projects, I spent most of my time in figuring out
how to integrate the sw-precache build steps nicely into the existing gulp
build, and in making the app relocatable on different hosts and paths for
testing purposes. The actual service worker itself was straightforward. While I
used ForestVR as my proof of concept, the process should be similar for turning
any other WebVR app into a Progressive WebVR App. I look forward to seeing
broader adoption of this approach for a better WebVR experience on mobile!&lt;/p&gt;
&lt;p&gt;As an aside for my friends in the library world, I plan to apply the same
principles to making the &lt;em&gt;My Account&lt;/em&gt; portion of the Evergreen library
catalogue a PWA in time for the &lt;a class="reference external" href="https://evergreen-ils.org/conference/2017-evergreen-international-conference/2017-conference-programs-and-schedule/"&gt;2017 Evergreen International Conference&lt;/a&gt;.
Here's hoping more library software creators are thinking about improving their
mobile experience as well...&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sun, 19 Feb 2017 17:15:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2017-02-19:/truly-progressive-webvr-apps-are-available-offline.html</guid><category>Virtual Reality</category><category>coding</category><category>libraries</category><category>progressive web apps</category><category>webvr</category></item><item><title>schema.org, Wikidata, Knowledge Graph: strands of the modern semantic web</title><link>https://coffeecode.net/schema-org-wikidata-knowledge-graph.html</link><description>&lt;p&gt;My slides from Ohio DevFest 2016: &lt;a class="reference external" href="https://stuff.coffeecode.net/2016/ohiodevfest/"&gt;schema.org, Wikidata, Knowledge Graph:
strands of the modern semantic web&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And the video, recorded and edited by the incredible amazing &lt;a class="reference external" href="https://plus.google.com/+PatrickHammond"&gt;Patrick Hammond&lt;/a&gt;:&lt;/p&gt;
&lt;iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/UzyIlAXOAP8" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;p&gt;In November, I had the opportunity to speak at &lt;a class="reference external" href="https://ohiodevfest.com/"&gt;Ohio DevFest 2016&lt;/a&gt;. One of the organizers, &lt;a class="reference external" href="https://plus.google.com/+CaseyBorders"&gt;Casey Borders&lt;/a&gt;, had invited me to talk about
schema.org, structured data, or something in that subject area based on &lt;a class="reference external" href="https://stuff.coffeecode.net/2013/GDG_DevFest_schema.org/"&gt;a talk
about schema.org and RDFa&lt;/a&gt; he had seem me
give at the DevFest Can-Am in Waterloo a few years prior. Given the
Google-oriented nature of the event and the 50-minute time slot, I opted to add
in coverage of the Google Knowledge Graph and its API, which I had been
exploring from time to time since its launch in late 2014.&lt;/p&gt;
&lt;p&gt;Alas, the Google Knowledge Graph Search API is still quite limited; it returns
quite minimal data in comparison to the rich cards that you see in regular
Google search results. The JSON results only include links for an image, a
corresponding Wikipedia page, and for the ID of the entity. I also &lt;a class="reference external" href="https://plus.google.com/+DanScottCAN/posts/fEpGSmKe7TU"&gt;uncovered
errors that had lurked in the documentation for quite some time&lt;/a&gt;; happily, the team
quickly responded to correct those problems.&lt;/p&gt;
&lt;p&gt;So I dug back in time and also covered Freebase, the database of linked and
structured data that had both allowed individual contributions and which had
made its database freely available--until it was purchased by Google, fed into
the Knowledge Graph, and shut down. Not many people knew what we had once had
until it was gone (&lt;a class="reference external" href="https://www.mail-archive.com/code4lib&amp;#64;lists.clir.org/msg00394.html"&gt;Ed Summers did&lt;/a&gt;, for
one), but such is the way of commercial entities.&lt;/p&gt;
&lt;p&gt;In that context, Wikidata looks something like the Second Coming of an open
(for contribution and access) linked and structured database, with
sustainability derived financially from the Wikimedia Foundation and
structurally by its role in underpinning Wikipedia and Wikimedia Commons.
Google also did a nice thing by putting resources into adding the appropriately
licensed data they could liberate from Freebase: &lt;a class="reference external" href="http://dl.acm.org/citation.cfm?id=2874809"&gt;approximately 19 million
statements and IDs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The inclusion of Google Knowledge Graph IDs in Wikidata means that we can
use the Google Search API to find an entity ID, then pull the corresponding
richer data from Wikidata for that ID to populate relationships and statements.
You &lt;em&gt;can&lt;/em&gt; get there from here! Ultimately, my thesis is that Wikidata can and
will play a very important role in the modern (much more pragmatic) semantic
web.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sun, 12 Feb 2017 16:05:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2017-02-12:/schema-org-wikidata-knowledge-graph.html</guid><category>Linked Open Data</category><category>coding</category><category>libraries</category><category>structured data</category></item><item><title>Concerns about copyright term extensions proposed for TPP</title><link>https://coffeecode.net/concerns-about-copyright-term-extensions-proposed-for-tpp.html</link><description>&lt;p&gt;I just sent the following email to the Government of Canada's
&lt;a class="reference external" href="http://international.gc.ca/trade-commerce/trade-agreements-accords-commerciaux/agr-acc/tpp-ptp/consultations.aspx?lang=eng&amp;amp;utm_source=tpp&amp;amp;utm_campaign=tpp-consult"&gt;Consulting Canadians on the Trans-Pacific Partnership
(TPP)&lt;/a&gt;
email address:&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Hello,&lt;/p&gt;
&lt;p&gt;As an academic librarian, software developer, and occasional author, I
would like to state my opposition to the proposals contained in the TPP
text that would extend the term of copyright in Canada.&lt;/p&gt;
&lt;p&gt;Specifically, in &lt;a class="reference external" href="http://www.international.gc.ca/trade-agreements-accords-commerciaux/agr-acc/tpp-ptp/text-texte/18.aspx?lang=eng"&gt;Chapter 18: Intellectual
Property&lt;/a&gt;,
Article 18.63: Term of Protection for Copyright and Related Rights
proposes a harmonized term of &amp;quot;the life of the author and 70 years after
the author’s death&amp;quot; for works, performances, and phonograms. This
represents an additional 20 years of copyright for most works.&lt;/p&gt;
&lt;p&gt;Should this extension be imposed upon Canadians, the number of works
that will be added to the common wealth of the public domain will be
reduced dramatically for our current generation of children, and
significant harm will be done to the Canadian public's ability to learn
from, enjoy, and build upon these works.&lt;/p&gt;
&lt;p&gt;With the proposed 70 years of copyright protection after the creator's
death, the intended beneficiaries are obviously not the creator's
potential children: a term of life + 25 years would be more than
sufficient for providing for children well into adulthood, even those
who might have been conceived moments before the creator's death.
Instead, those who will benefit are the publishers and agents who have
acquired the rights to that creator's works.&lt;/p&gt;
&lt;p&gt;As an academic librarian, the most egregious examples I see are
scholarly articles which faculty have written and then assigned their
copyright to publishers, who then charge individuals and institutions
alike for the right to access those articles. Our society, which has
been attempting to transform itself from a resource-based to a
knowledge-based economy, already suffers from these barriers with our
existing copyright terms.&lt;/p&gt;
&lt;p&gt;If we truly want to encourage increased knowledge, creativity, and
innovation in Canada by Canadians, we should be reducing, not extending,
terms of copyright. I therefore urge you to withdraw Canada's
participation in the effort to harmonize and extend our terms of
copyright through the TPP.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Sincerely,&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Dan Scott&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 27 Oct 2016 04:11:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2016-10-27:/concerns-about-copyright-term-extensions-proposed-for-tpp.html</guid><category>misc</category><category>Libraries</category><category>libraries</category></item><item><title>Google Scholar's broken Recaptcha hurts libraries and their users</title><link>https://coffeecode.net/google-scholars-broken-recaptcha-hurts-libraries-and-their-users.html</link><description>&lt;p&gt;&lt;strong&gt;Update 2016-11-28&lt;/strong&gt;: The brilliant folk at UNC figured out how to &lt;a class="reference external" href="http://libux.web.unc.edu/2016/11/28/how-we-fixed-google-scholar/"&gt;fix
Google Scholar&lt;/a&gt; using a pre-scoped search so that, if a search is launched
from the library web site, it will automatically associate that search with the
library's licensed resources. No EZProxy required!&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;&lt;img alt="Screenshot of a broken RECAPTCHA preventing Google Scholar from working" src="/uploads/google_scholar_proxy_recaptcha.png" /&gt;&lt;/p&gt;
&lt;p&gt;For libraries, proxying user requests is how we provide authenticated
access--and some level of anonymized access--to almost all of our
licensed resources. Proxying Google Scholar in the past would direct
traffic through a campus IP address, which prompted Scholar to
automatically include links to the licensed content that we had told it
about. It seemed like a win-win situation: we would drive traffic &lt;em&gt;en
masse&lt;/em&gt; to Google Scholar, while anonymizing our user's individual
queries, and enabling them swift access to our library's licensed
content as well as all the open access content that Google knows about.&lt;/p&gt;
&lt;p&gt;However, in the past few months things changed. Now when Google Scholar
detects proxied access it tries to throw up a Recaptcha test--which
would be an okay-ish speed bump, except it uses a key for a domain
(&lt;tt class="docutils literal"&gt;google.ca&lt;/tt&gt; of course) which doesn't match the proxied domain and
thus dies with a JS exception, preventing any access. That doesn't help
our users at all, and it hurts Google too because those users don't get
to search and generate anonymized academic search data for them.&lt;/p&gt;
&lt;p&gt;Folks on the EZProxy mailing list have tried a few different recipes to
try to evade the Recaptcha but that seems doomed to failure.&lt;/p&gt;
&lt;p&gt;If we don't proxy these requests, then every user would need to set
their preferred library(via the &lt;em&gt;Library Links&lt;/em&gt; setting) to include
convenient access to all of our licensed content. But that setting can
be hard to find, and relies on cookies, so behaviour can be inconsistent
as they move from browser to browser (as happens in universities with
computer labs and loaner laptops). And then the whole privacy thing is
lost.&lt;/p&gt;
&lt;p&gt;On the bright side, I think a link like
&lt;a class="reference external" href="https://scholar.google.ca/scholar_setprefs?instq=Laurentian+University+Get+full+text&amp;amp;inst=15149000113179683052"&gt;https://scholar.google.ca/scholar_setprefs?instq=Laurentian+University+Get+full+text&amp;amp;inst=15149000113179683052&lt;/a&gt;
makes it a tiny bit easier to help users set their preferred library in
the unproxied world. So we can include that in our documentation about
Google Scholar and get our users a little closer to off-campus
functionality.&lt;/p&gt;
&lt;p&gt;But I really wish that Google would either fix their Recaptcha API key
domain-based authentication so it could handle proxied requests, or
recognize that the proxy is part of the same set of campus IP addresses
that we've identified as having access to our licensed resources in
Library Links and just turn off the Recaptcha altogether.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 02 Sep 2016 17:35:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2016-09-02:/google-scholars-broken-recaptcha-hurts-libraries-and-their-users.html</guid><category>Libraries</category><category>coding</category></item><item><title>PHP's File_MARC gets a new release (1.1.3)</title><link>https://coffeecode.net/phps-file_marc-gets-a-new-release-113.html</link><description>&lt;p&gt;Yesterday, just one day before the anniversary of the 1.1.2 release, I
published the 1.1.3 release of the PEAR
&lt;a class="reference external" href="http://pear.php.net/package/File_MARC"&gt;File_MARC&lt;/a&gt; library. The only
change is the addition of a convenience method for fields called
&lt;tt class="docutils literal"&gt;getContents()&lt;/tt&gt; that simply concatenates all of the subfields together
in order, with an optional separator string. Many thanks to Carsten Klee
for &lt;a class="reference external" href="https://github.com/pear/File_MARC/pull/6"&gt;contributing the
code&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;You can install File_MARC through the usual channels: PEAR or composer.
Have fun!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 01 Sep 2016 04:00:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2016-09-01:/phps-file_marc-gets-a-new-release-113.html</guid><category>Libraries</category><category>Coding</category><category>PHP</category><category>coding</category><category>php</category></item><item><title>Chromebooks and privacy: not always at odds</title><link>https://coffeecode.net/chromebooks-and-privacy-not-always-at-odds.html</link><description>&lt;p&gt;On Friday, June 10th I gave a short talk at the OLITA Digital Odyssey
2016 conference, which had a theme this year of privacy and security. My
talk addressed the evolution of our public and loaner laptops over the
past decade, from bare Windows XP, to Linux, Windows XP with the
addition of Deep Freeze, to the decision two years ago to move to
Chromebooks.&lt;/p&gt;
&lt;p&gt;Given that Snowden made it clear that multinationals such as Google,
Apple, and Facebook co-operate with government agencies to make user
data available, we did not make the decision to adopt a product that
emphasizes cloud storage and thus potentially compromises the privacy of
our users lightly. Rather, we made that decision in the context of a
resource-constrained institution that had already adopted Google Apps
for Education for its student population--and with a reflection on the
vulnerabilities to which our particular implementation of Windows 7 +
Deep Freeze was exposing our users.&lt;/p&gt;
&lt;p&gt;I've made the presentation, with the speaker notes surfaced as callouts,
&lt;a class="reference external" href="https://goo.gl/70kr52"&gt;available&lt;/a&gt;, and embedded it below. I'd love
to hear your thoughts.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sat, 11 Jun 2016 17:33:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2016-06-11:/chromebooks-and-privacy-not-always-at-odds.html</guid><category>misc</category><category>Coding</category><category>coding</category></item><item><title>Library stories: 2020 vision: "Professional research tools"</title><link>https://coffeecode.net/library-stories-2020-vision-professional-research-tools.html</link><description>&lt;p&gt;For a recent strategic retreat, I was asked to prepare (as homework) a
story about a subject that I'm passionate about, with an idea of where
we might see the library in the next three to five years. Here's one of
the stories I came up with, in the form of a brief scene as we observe a
researcher at work:&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;&lt;strong&gt;*Scene&lt;/strong&gt;: a cluttered home office. Faculty member LISA stands at her
desk, tapping at a keyboard. She is distilling some of her recent
findings into a proposal for an upcoming conference. At the top of the
screen in front of her is the working title “Deliberate practice and
mining accidents: an inverse relationship”; the paper will tie leading
ideas from two different disciplines together.*&lt;/p&gt;
&lt;p&gt;At the moment, she is working on the second paragraph, which lays the
groundwork for her novel approach by drawing on some of the classic
works in each field. She types:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
The concept of “deliberate practice” was introduced by Ericsson et al
&lt;/pre&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;LISA: OK EasyWriter, insert footnote: Ericsson deliberate practice&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Taking the cue from the invocation phrase “OK EasyWriter”, the
microphone in one of her computing devices wakes up her AI research
assistant (AIRA) which accesses her personal bibliographic database. She
has been compiling a list of the papers she has been reading, along with
annotations. AIRA also has access to her research team’s extended
bibliographic database, which holds the citations, papers, research
data, and general wisdom accumulated by the core researchers of her team
since they set it up in 2016. AIRA also knows what subject-specific
databases she normally searches and which papers she has bookmarked,
downloaded, read, previously cited, or have cited her. It taps into
general online databases like BinGooHoo Academic Scholar for citation
trails, recent publications, and a comprehensive overview of the
available copies of a given paper, whether through freely available
versions online or those licensed by her library. As a fainter signal,
AIRA knows what she has commented on in social media channels
SnapTwitFaceSlackBook and uses sentiment analysis to determine whether
those comments were favourable or snarky.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;AIRA: [positions a list of three papers that LISA might want to cite, in order of likelihood based on all of this data, right under her cursor]&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;LISA hovers over the top entry. The citation information expands to
overlay more information, including the abstract, number of citations,
and annotations from her own copy of the paper. She clicks the top entry
for a 1993 paper.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;LISA: [mutters] Yep, let’s get that a bit closer to 6,000 citations.&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;LISA finishes the quick synopsis of Ericsson’s thesis but wants to show
that she is aware of his current thinking. Hovering over the citation
again, she checks Ericsson’s recent publications and finds a 2018 entry
that is reflecting on the 25th anniversary of his seminal paper.
Scanning the abstract, she notes with satisfaction that Ericsson still
considers the basic thesis sound and adds the citation to her personal
bibliographic database, which displays a green check indicating that a
copy of the paper has also been added to her personal reading list from
one of the library-licensed or reputable open access sources.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;LISA also wants to acknowledge at least the leading critical reaction to
the thesis. Hovering over the citation and the “Cited by” list breaks
those citations down into rough categories such as “Supportive”,
“Critiques”, and “Non-substantive”. Topping the “critiques” list is a
2007 paper by Hill that, according to the abstract, finds no significant
correlation between hours of deliberate practice and accomplishments of
spelling bee contestants competing in their second language.&lt;/p&gt;
&lt;p&gt;LISA then drills into the “critiques” list for Hill’s paper, and finds
that the defenders of Ericsson’s thesis have pointed out important
limitations to the breadth of Hill’s findings and overly broad
assertions. They accept that the lack of correlation holds for rote
vocabulary memorization, but point to studies that have repeatedly
demonstrated as having a significant impact on skills combining
cognitive and physical tasks--such as would be related to LISA’s overall
thesis concerning mining-related incidents. LISA adds Hill’s critique to
her personal reading list, as well as two of the selected
counter-responses.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;From a technology perspective, all of the pieces are pretty much in
place and just need to be pulled together—Zotero group bibliographies,
linked open data, voice recognition, artificial intelligence and agents,
and the likes of Google Scholar and Google Doc's ability to provide
citations upon demand—and I think most or all of it will inevitably
happen. So an interesting aspect to consider is what role we as
librarians will play as this comes to pass. I believe one role is to
help researchers make the most of the tools that are available; those
who adapt and harness the power of these tools have the potential to be
much more productive than their peers.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sun, 08 May 2016 23:07:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2016-05-08:/library-stories-2020-vision-professional-research-tools.html</guid><category>Libraries</category><category>Coding</category><category>coding</category></item><item><title>Querying Evergreen from Google Sheets with custom functions via Apps Script</title><link>https://coffeecode.net/querying-evergreen-from-google-sheets-with-custom-functions-via-apps-script.html</link><description>&lt;p&gt;Our staff were recently asked to check thousands of ISBNs to find out if
we already have the corresponding books in our catalogue. They in turn
asked me if I could run a script that would check it for them. It makes
me happy to work with people who believe in &lt;em&gt;better living through
automation&lt;/em&gt; (and saving their time to focus on tasks that only humans
can really achieve).&lt;/p&gt;
&lt;p&gt;Rather than taking the approach that I normally would, which would be to
just load the ISBNs into a table in our Evergreen database and then run
some queries to take care of the task as a one-off, I opted to try for
an approach that would enable others to run these sort of adhoc reports
themselves. As with most libraries, I suspect, we work with spreadsheets
a lot--and as our university has adopted Google Apps for Education, we
are slowly using Google Sheets more to enable collaboration. So I was
interested in figuring out how to build a custom function that would
look for the ISBN and then return a simple &amp;quot;Yes&amp;quot; or &amp;quot;No&amp;quot; value according
to what it finds.&lt;/p&gt;
&lt;p&gt;Evergreen has a robust SRU interface, which makes it easy to run complex
queries and get predictable output back, and it normalizes ISBNs in the
index so that a search for an 10-digit ISBN will return results for the
corresponding 13-digit ISBN. That made figuring out the lookup part of
the job easy; after that, I just needed to figure out how to create a
custom function in Google Sheets.&lt;/p&gt;
&lt;p&gt;As it turns out, there's a dead-simple &lt;a class="reference external" href="https://developers.google.com/apps-script/quickstart/macros"&gt;introductory tutorial for
creating a custom function in Apps
Script&lt;/a&gt;
which tells you how to create a new function. And to make a call to a
web service, there's the
&lt;a class="reference external" href="https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app"&gt;URLFetchApp&lt;/a&gt;
class. After that, it's a matter of basic JavaScript. In the end, my
custom function looks like the following:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt;* A custom function that checks for an ISBN in Evergreen&lt;/span&gt;
&lt;span class="cm"&gt;*&lt;/span&gt;
&lt;span class="cm"&gt;* Returns &amp;quot;Yes&amp;quot; if there is a match, or &amp;quot;No&amp;quot; if there is no match&lt;/span&gt;
&lt;span class="cm"&gt;*/&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;checkForISBN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isbn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;hostname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;https://example.org&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;urlBase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;hostname&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/opac/extras/sru&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="cm"&gt;/* Supply a numeric or shortname library identifier&lt;/span&gt;
&lt;span class="cm"&gt;  * to restrict the search to that part of the organization&lt;/span&gt;
&lt;span class="cm"&gt;  */&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;libraryID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;103&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;libraryID&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;urlBase&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;libraryID&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;urlBase&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;?version=1.1&amp;amp;operation=searchRetrieve&amp;amp;maximumRecords=1&amp;amp;query=&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;q&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;encodeURIComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;identifier|isbn:&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;isbn&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;urlBase&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;UrlFetchApp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getContentText&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Yes&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;No&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then I just add a column beside the column with ISBN values and invoke
the function as (for example) &lt;tt class="docutils literal"&gt;=CheckForISBN(C2)&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="CheckForISBN() function being invoked in a Google Sheet" class="serendipity-image-center" src="/uploads/pics/check_for_isbn.png" style="width: 462px; height: 346px;" /&gt;&lt;/p&gt;
&lt;p&gt;Given a bit more time, it would be easy to tweak the function to make it
more robust, offer variant search types, and contribute it as a module
to the &lt;a class="reference external" href="https://chrome.google.com/webstore"&gt;Chrome Web Store&lt;/a&gt; &amp;quot;Sheet
Add-ons&amp;quot; section, but for now I thought you might be interested in it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;*Caveats*&lt;/strong&gt;: With thousands of ISBNs to check, occasionally you'll get
an HTTP response error (&amp;quot;&lt;tt class="docutils literal"&gt;#ERROR&lt;/tt&gt;&amp;quot;) in the column. You can just paste
the formula back in again and it will resubmit the query. The sheet also
seems to resubmit the request on a periodic basis, so some of your &amp;quot;Yes&amp;quot;
or &amp;quot;No&amp;quot; values might change to &amp;quot;&lt;tt class="docutils literal"&gt;#ERROR&lt;/tt&gt;&amp;quot; as a result.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 15 Apr 2016 18:36:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2016-04-15:/querying-evergreen-from-google-sheets-with-custom-functions-via-apps-script.html</guid><category>Libraries</category><category>Coding</category><category>Evergreen</category><category>coding</category><category>evergreen</category></item><item><title>FibreOp PVR update (late 2015) causes Slingbox "Weak or no video signal" problem (SOLVED)</title><link>https://coffeecode.net/fibreop-pvr-update-late-2015-causes-slingbox-weak-or-no-video-signal-problem-solved.html</link><description>&lt;p&gt;&lt;em&gt;TLDR:&lt;/em&gt; Set the HDMI output resolution on your PVR to 1080i instead of
1080p, and the component outputs on your FibreOp PVR will start working
again, and therefore your Slingbox will start working again.&lt;/p&gt;
&lt;p&gt;I purchased a Slingbox 350 a few years ago for the rare time I want to
watch something on TV when I'm on the road. For the most part, it's
worked well--although the very tiny bit of TV I watch hasn't really
justified the cost.&lt;/p&gt;
&lt;p&gt;Recently, however, it stopped working, for no apparent reason. After a
few hours of searching for similar problems and monkeying around with
the firewall on our ActionTec router (which, BTW, has not had a firmware
update since it was installed two and a half years ago: how about that
mess of security vulnerabilities) to open up a port that was never
required before, based on advice from about 4 years ago, I was no
further ahead.&lt;/p&gt;
&lt;p&gt;Then I remembered that our PVR received an update just before Christmas
that introduced a brand new UI and features like Santa Tracker. &amp;quot;Hmm&amp;quot;,
thought I, &amp;quot;could this be related to the problem?&amp;quot; I dug into posts
about the update and discovered someone in the middle of a thread about
a different feature &lt;a class="reference external" href="http://www.digitalhome.ca/forum/192-bell-aliant-home-phone-internet-iptv/246873-new-dvr-enhancement-restart-like-fibe-5.html#post2645025"&gt;complaining about their component output ports no
longer working after the
update&lt;/a&gt;,
which lead to &lt;a class="reference external" href="http://www.digitalhome.ca/forum/192-bell-aliant-home-phone-internet-iptv/237953-1080p-resolution.html"&gt;this
thread&lt;/a&gt;
pointing out that only the video on demand content was available in
1080p anyway. (&lt;em&gt;Warning: those forums have obnoxious autoplay video
ads!&lt;/em&gt;)&lt;/p&gt;
&lt;p&gt;&amp;quot;But wait&amp;quot;, I thought to myself, &amp;quot;I've never changed that setting, why
would it be set to 1080p now?&amp;quot; As far as I can tell, it was purely a
result of the update. Changing the output resolution setting back to
1080i enabled the component outputs to start pumping out data again and
gave the Slingbox something to sling.&lt;/p&gt;
&lt;p&gt;I wouldn't mind getting those troubleshooting hours of my life--more
than I spend most weeks actually watching TV--back, even though figuring
out the solution did eventually provide some satisfaction. For the most
part, I have only myself to blame: I've put myself in a situation where
I'm relying on a ton of proprietary software and hardware (Slingbox,
ActionTec router, Arris PVR) over which I have very little control, and
no ability to dig into the internals to see what has changed. Hopefully
this helps someone jump directly to the solution.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sun, 03 Jan 2016 17:05:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2016-01-03:/fibreop-pvr-update-late-2015-causes-slingbox-weak-or-no-video-signal-problem-solved.html</guid><category>misc</category></item><item><title>That survey about EZProxy</title><link>https://coffeecode.net/that-survey-about-ezproxy.html</link><description>&lt;p&gt;OCLC recently asked EZProxy clients to fill out a survey about their
experiences with the product and to get feedback on possible future
plans for the product.&lt;/p&gt;
&lt;p&gt;About half-way through, I decided it might be a good idea to post my
responses. Because hey, if I'm working to help them, I might as well
share it with my friends out in the library systems world So here are a
few choice quotes from the comments section of the survey...&lt;/p&gt;
&lt;p&gt;&lt;em&gt;In response to a question about the &amp;quot;ease of use&amp;quot; of EZProxy&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
Nothing that requires configuration via a text file can be classed
as &amp;quot;easy to use&amp;quot; these days.&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;When asked why I scored satisfaction lower than the maximum&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;p&gt;The sluggishness to adopt current encryption protocols, and the
unwillingness to use dynamically linked libraries, is a major black
mark against the product.&lt;/p&gt;
&lt;p&gt;Rather than &amp;quot;doing the right thing&amp;quot;, it appears to be a marketing
tactic to encourage adoption of 6.0 by making 5.7 fall behind.
That's a disappointing tactic for a library cooperative to use in
the world of libraries where security and protection of our patrons
privacy is of great importance.&lt;/p&gt;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;What one thing would I change about EZProxy&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;p&gt;I would change the license to be an open source (GPL v3 or Apache
2.0) licence. OCLC could still derive revenue from providing hosted
solutions and as the well-known trusted name being the product, but
small segments of the community could vet the code and contribute
enhancements that meet their needs (that they have been asking for
without success for years now).&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;After being asked about the importance of five possible enhancements,
three of which reflected a tighter integration with WorldShare services&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
(roughly) This is why I don't like the proprietary revenue model for
the 6.x series--you're investing the revenue in shoring up your
WorldShare offerings with features that are not useful to the
customers that do not use the WorldShare platform.&lt;/blockquote&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 19 Nov 2015 17:42:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2015-11-19:/that-survey-about-ezproxy.html</guid><category>Libraries</category><category>Coding</category><category>coding</category></item><item><title>"The Librarian" - an instruction session in the style of "The Martian"</title><link>https://coffeecode.net/the-librarian-an-instruction-session-in-the-style-of-the-martian.html</link><description>&lt;p&gt;I had fun today. A colleague in Computer Science has been giving his C++
students an assignment to track down an article that is only available
in print in the library. When we chatted about it earlier this year, I
suggested that perhaps he could bring me in as a speaker to introduce
the students to their liaison librarian. It was also my chance to get my
foot further into the door with the faculty in the program, as well.&lt;/p&gt;
&lt;p&gt;But when I started putting together the supporting materials, I realized
that the class was more than half way through the year and that a
standard instructional session might be a little low-energy for them. I
wanted to do something that would be memorable. And I had just read
&lt;a class="reference external" href="http://www.amazon.com/gp/product/0553418025/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0553418025&amp;amp;linkCode=as2&amp;amp;tag=coffeecode-20&amp;amp;linkId=WVQOPOG6AHI5WE3M"&gt;The Martian&lt;/a&gt;
by Andy Weir over the weekend, and our campus had just had a visit from
Chris Hadfield a few weeks ago, so I thought that delivering a narrative
in the style of &lt;em&gt;The Martian&lt;/em&gt; might work.&lt;/p&gt;
&lt;p&gt;Without further ado, I give you:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external image-reference" href="https://goo.gl/XsPX3j"&gt;&lt;img alt="The Librarian (a modified version of The Martian book cover)" class="serendipity-image-left" src="/uploads/pics/the_martian_librarian.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://goo.gl/XsPX3j"&gt;The Librarian: an intro for COSC 2947 (C++)&lt;/a&gt; (&lt;em&gt;Open the Speaker Notes to
follow the narrative!&lt;/em&gt;)&lt;/p&gt;
&lt;p&gt;The students were chuckling throughout the presentation, so I think I
achieved my goals of increasing the energy level, presenting the
material as something memorable, and introducing myself as someone
approachable. Or at least giving the impression that I &lt;em&gt;try&lt;/em&gt; to have a
sense of humour.&lt;/p&gt;
&lt;p&gt;As an aside, I'm kicking myself for using Google Slides instead of
reveal.js. It's so much easier working with HTML + images instead of a
browser-driven proprietary Flash-using-when-it-can mess. It is what it
is, however.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 29 Oct 2015 17:17:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2015-10-29:/the-librarian-an-instruction-session-in-the-style-of-the-martian.html</guid><category>Libraries</category><category>Coding</category><category>coding</category></item><item><title>We screwed up: identities in loosely-coupled systems</title><link>https://coffeecode.net/we-screwed-up-identities-in-loosely-coupled-systems.html</link><description>&lt;p&gt;A few weeks ago, I came to the startling and depressing realization that we had
screwed up. It started when someone I know and greatly respect ran into me in
the library and said &amp;quot;We have a problem&amp;quot;.&lt;/p&gt;
&lt;p&gt;I'm the recently appointed Chair of our library and archives department, so
being approached about a problem isn't surprising. However, the severity of the
problem was.&lt;/p&gt;
&lt;p&gt;Here's what happened: the person in question had asked for a group study key at
the circulation desk, and handed over the university photo ID card to check the
item out. The library staff person noted that the name on the photo ID card
didn't match the name in the library system. Even though the photo was an exact
match, the staff person refused to check out the item to the patron.&lt;/p&gt;
&lt;p&gt;The next day, after the person who suffered that indignity approached me, I was
able to update the name for the account in the library system in about a
minute. While apologizing profusely. And I had to explain why our system had
failed this person. A few years back we were able to start automatically
polling our university's LDAP server for new university accounts and
immediately create the corresponding library system account, with a unique
barcode, and update the LDAP account with that new barcode. That removed an
entire set of (essentially duplicated) paperwork that new students and faculty
used to have to fill out to get a university photo ID card, as well as reduced
the amount of personally identifiable information held in our library system to
the bare minimum of name, email address, and university ID number.&lt;/p&gt;
&lt;p&gt;However, we have never been able to poll the university LDAP server for
updates.&lt;/p&gt;
&lt;p&gt;Admittedly, my primary interest in updates was to synchronize accounts when
students become alumni, or staff retire, etc., but in retrospect the ability to
synchronize name changes (and email addresses, which are often derived from
names) is blindingly obvious and absolutely necessary. When a person goes
through the effort of changing their name, they are changing their identity in
a very meaningful, significant fashion. To have the identity they have
consciously abandoned resurface in various systems is (at best) frustrating,
but can also be utterly demeaning. This is not the experience we want for our
patrons.&lt;/p&gt;
&lt;p&gt;In retrospect, at least two problems have surfaced with this incident:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;The name attached to the account in the library system should have
matched the name on the card.&lt;/li&gt;
&lt;li&gt;In a conflict between systems, given a choice between believing the
person in front of you or one of the systems, staff should respect the
person in front of them and note the problem for someone to follow up on.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I've held initial conversations with our university IT department to try and
figure out strategies for closing that synchronization gap. In the short term,
I'm willing to handle identity changes in a purely manual way (having the
Registrar notify me when a change needs to be made). We have also reminded
staff to defer to people rather than systems, as the people who make and
maintain the systems are fallible (&lt;em&gt;mea culpa&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;In the slightly longer term, I'm building the synchronization piece so that we
can trigger an update for an individual account at any given time. And I'm
posting this in the hopes that it might prompt you to consider your various
loosely-coupled systems and the identity management for the accounts within,
just in case there are some synchronization gaps that you might be able to
close.&lt;/p&gt;
&lt;p&gt;Because our patrons deserve respect, in person, and in the systems we design to
serve them.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sun, 04 Oct 2015 14:16:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2015-10-04:/we-screwed-up-identities-in-loosely-coupled-systems.html</guid><category>misc</category><category>Coding</category><category>coding</category></item><item><title>Research across the Curriculum</title><link>https://coffeecode.net/research-across-the-curriculum.html</link><description>&lt;p&gt;&lt;em&gt;The following post dates back to January 15, 2007, when I had been
employed at Laurentian for less than a year and was getting an
institutional repository up and running.... I think old me had some
interesting thoughts!&lt;/em&gt;&lt;/p&gt;
&lt;div class="section" id="abstract"&gt;
&lt;h2&gt;Abstract&lt;/h2&gt;
&lt;p&gt;The author advocates an approach to university curriculum that
re-emphasizes the student's role in the search for truth and knowledge
by providing essential critical thinking skills and treating
undergraduate students as full participants in the academic discussion.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="preamble"&gt;
&lt;h2&gt;Preamble&lt;/h2&gt;
&lt;p&gt;The academy is a place to develop critical thinking skills, and a place
to develop those skills by participating in discussions seeking truth
and knowledge. These conversations may occur between students in
informal spaces; they may be facilitated by a professor and take place
during a single class session or over multiple sessions during a course;
or they may take place over centuries (most commonly through the medium
of the written word).&lt;/p&gt;
&lt;p&gt;As a university, we recognize the value of all of these conversations in
developing citizens with well-honed critical thinking skills. However, I
would argue that our focus (at least at the undergraduate level) has
been on the level of single and multiple class discussions. Students are
often assigned course work for which the only intended audience is the
professor or marking T.A.; the audience for presentations is normally
just the rest of the class. A typical unit of work is the “essay” (from
the French: essayer, meaning “to try”).&lt;/p&gt;
&lt;p&gt;(&lt;em&gt;Rhetorical question alert!&lt;/em&gt;) But what are the students trying for?
Typically, they are trying for grades; some for an A, some simply to
pass. But are they trying to contribute to the greater academic
discussions? Where do those essays go in a month, or a year? Do students
see their papers as parts of a greater continuum of the academic
discussion, or do they see them as a means to an end? Are students
exhorted to aspire to publishing their papers on any scale? What effect
does the treatment of course work as an ephemeral entity, rather than a
permanent contribution to the field of knowledge, have on the motivation
of students to excel in the application of their critical thinking
skills, to be creative, to write high quality papers? Does the knowledge
that their days and nights of hard work going to quickly be consigned to
the trash bin cause students to treat the work of the intellectual
giants that preceded them with a similar disregard?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="inspiration"&gt;
&lt;h2&gt;Inspiration&lt;/h2&gt;
&lt;p&gt;I initially started worrying about this because of a third-year
assignment that simply cited “Google” as its sole source. The sad
confusion of search tool with source immediately raised my concern about
the student's ability to evaluate alternative sources of information and
opinion for authority. I doubted that this student had completed the
Library's introductory tutorial on searching and citing sources, and
that reinforced my desire to encourage programs to make this course a
mandatory requirement. During a casual conversation with Dr. David
Robinson, he disclosed that he assigned basic literature research tasks
to every one of his courses because he could not guarantee that his
students had learned those skills outside of his courses. I continued to
reflect on this problem in the attempt to develop an approach to
motivating the student to want to participate in the overarching
discussions – and that is where the idea of “research across the
curriculum” came to mind.&lt;/p&gt;
&lt;p&gt;I will credit Dr. Laurence Steven with the idea of motivating higher
quality undergraduate work through the expectation of publication. In
his fourth-year Literary Criticism course in 1996, he told students at
the outset of the class that he planned to compile and publish the
complete set of our final assignments. Even though the press run was
undoubtedly under 100, the commitment to taking our work seriously
positively influenced our efforts to produce high-quality assignments.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="emphasizing-the-academic-discussion"&gt;
&lt;h2&gt;Emphasizing the academic discussion&lt;/h2&gt;
&lt;p&gt;The overarching message we can send to students is: “We take your effort
seriously, and will help you contribute to your chosen discipline.”&lt;/p&gt;
&lt;p&gt;Publishing offers the carrot of fame and the stick of exposure. I cannot
help but think that the expectation of publishing your work will improve
the quality of that work.&lt;/p&gt;
&lt;p&gt;We obviously cannot expect a first year student to publish their work in
a traditional academic journal. However, the Web has given us an
alternative publishing method that can be controlled to meet the
student's comfort level: publishing visibility could be limited to the
author herself, to the professor, to the class, to the program, to the
university, and to the world. If we created a simple Web-based
repository, we could allow a student to first work on drafts of their
assignment, then open it up to their professor or a TA for initial
review, then open it up to the class to exchange their work with their
classmates and participate in peer review. Outstanding work could be
surfaced at wider levels of availability. Of course, given that the
student retains copyright over their work, they would be free to
republish their work as they see fit (on a personal Web log, on a
discipline-related mailing list, to an academic journal, etc). This
opens up an opportunity to discuss intellectual property issues and the
characteristics of various publishing mechanisms.&lt;/p&gt;
&lt;p&gt;Through the course of a student's career, this Web-based publishing
mechanism would serve as an electronic portfolio of their work. If a
student chose to make their work visible outside of the class, they
would be able to track citations to that work over time - particularly
if professors chose to surface the work of previous students in a given
class as optional or required references in addition to traditional
sources. We know that one of the primary uses of the Laurentian
University Archives today is by students seeking the fourth-year papers
of previous students in their disciplines so that they can find work to
build upon.&lt;/p&gt;
&lt;p&gt;At the fourth-year level, we could strongly encourage (to the point of
making it an unstated assumption) that fourth-year work should be
published in some fashion. The publishing schedule of traditional
journals makes it unlikely that a student could achieve publication
within the normal class schedule, however we could commit some resources
to assisting those alumni who want to polish their fourth-year papers
for journal publication (without necessarily requiring a complete
graduate program). Assuming that the J.N. Desmarais Library goes forward
with the Laurentian University Institutional Repository, we could offer
that as a venue for publishing fourth year work (or exceptional work
from previous years).&lt;/p&gt;
&lt;p&gt;If there are doubts that fourth-year work is of publishable quality, I
would like to refer back to an evaluation (???) of the fourth-year
papers that are held by the Laurentian University archives. Many of
these papers were found to be of a quality comparable to Master's theses
(the hypothesis was that that the lack of graduate programs resulted in
higher-quality undergraduate work).&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 15 Apr 2015 21:10:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2015-04-15:/research-across-the-curriculum.html</guid><category>misc</category><category>Coding</category><category>Libraries</category><category>coding</category><category>libraries</category></item><item><title>Library and Archives Canada: Planning for a new union catalogue</title><link>https://coffeecode.net/library-and-archives-canada-planning-for-a-new-union-catalogue.html</link><description>&lt;p&gt;&lt;strong&gt;Update 2015-03-03&lt;/strong&gt;: Clarified (in the Privacy section) that only
NRCan runs Evergreen.&lt;/p&gt;
&lt;p&gt;I attended a meeting with Library and Archives Canada today in my role
as an &lt;a class="reference external" href="http://accessola.org"&gt;Ontario Library Association&lt;/a&gt; board
member to discuss the plans around a new Canadian union catalogue based
on OCLC's hosted services. Following are some of the thoughts I prepared
in advance of the meeting, based on the relatively limited materials to
which I had access. (I will update this post once those materials have
been shared openly; they include rough implementation timelines, perhaps
the most interesting of which being that it the replacement system is
not expected to be in production until August 2016.) Let me say at the
outset that there were no solid answers on potential costs to
participating libraries, other than that LAC is striving to keep the
costs as low as possible.&lt;/p&gt;
&lt;div class="section" id="basic-question-what-form-does-lac-envision-the-solution-taking"&gt;
&lt;h2&gt;Basic question: What form does LAC envision the solution taking?&lt;/h2&gt;
&lt;p&gt;Will it be:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&amp;quot;Library and Archives Canada begins adding records and holdings to
WorldCat&amp;quot; as listed for many other countries in
&lt;a class="reference external" href="http://www.oclc.org/worldcat/catalog/national/timeline.en.html"&gt;http://www.oclc.org/worldcat/catalog/national/timeline.en.html&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;Or a separate, standalone but openly searchable WorldCat Local
catalogue that Canadians can use like the
&lt;a class="reference external" href="http://adamnet.worldcat.org"&gt;Dutch&lt;/a&gt; or &lt;a class="reference external" href="http://fablibraries.worldcat.org/"&gt;United
Kingdom&lt;/a&gt; union catalogues
(which lack significant functionality that standard WorldCat
possesses, like the integrated schema.org discovery markup)?&lt;/li&gt;
&lt;li&gt;Or a separate, standalone but closed catalogue like the &lt;a class="reference external" href="https://www.oclc.org/nl-NL/ggc.html"&gt;Dutch union
catalogue GGC&lt;/a&gt; and the
&lt;a class="reference external" href="http://www.oclc.org/en-UK/unityuk.html"&gt;Combined Regions UnityUK&lt;/a&gt;
that require a subscription to access?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The answer was &amp;quot;yes, we will be adding records and holdings to WorldCat,
and yes, you will be able to search a WorldCat Local instance for both
LAC-specific and AMICUS as a whole&amp;quot; - but they're still working out the
exact details. Later we determined that it will actually be WorldCat
Discovery--essentially a rewrite of WorldCat Local--which assuaged some
of my concerns about the current examples we can see of other OCLC-based
union catalogues.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="privacy-of-canadian-citizens"&gt;
&lt;h2&gt;Privacy of Canadian citizens&lt;/h2&gt;
&lt;p&gt;The &amp;quot;Canadian office and data centre locations&amp;quot; requirement does not
mean that usage data is exempt from Patriot Act concerns. Specifically,
OCLC is an American company and thus the USA Patriot Act &amp;quot;allows US
authorities to obtain records from any US-linked company operating in
Canada&amp;quot; (per a &lt;a class="reference external" href="https://cippic.ca/en/US_access_to_Canadian_data"&gt;2004 brief submitted to the BC Privacy Commissioner by
CIPPIC&lt;/a&gt;). Canadians
should not be subject to this invasion of their privacy by the agents of
another nation simply to use their own national union catalogue.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The response:&lt;/em&gt; The Justice, Agricultural, and NRCan agencies use
US-hosted library systems (the latter running the open-source Evergreen,
by Equinox). However, one of the other participants from a federal
agency reported that they had been trying to update to Sierra from their
Millenium instance but have been stalled for two years because whatever
policy allowed them to go live with US-hosted Millenium is not being
allowed now.&lt;/p&gt;
&lt;p&gt;LAC claimed that, due to NAFTA, they are not allowed to insist that data
be held in Canada unless it is for national security reasons. They noted
that any usage data collected wouldn't be the same volume of patron data
that would be seen in public libraries. They did point out that
Netherlands sends anonymized data to OCLC, but that costs money and
impacts response time. Apparently the OCLC web site, they claim not to
have had a request under Patriot Act.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="privacy-of-canadian-citizens-part-2"&gt;
&lt;h2&gt;Privacy of Canadian citizens, part 2&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;I didn't get the chance to bring this up during the call...&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;LAC noted in their background that modern systems have links to social
media, and apparently want this as part of a new AMICUS. This would also
open up potential privacy leaks; see &lt;a class="reference external" href="http://go-to-hellman.blogspot.ca/2014/12/stop-making-web-surveillance-bugs-by.html"&gt;Eric Hellman on this
topic&lt;/a&gt;,
for example; it is also an area of interest for the recently launched
&lt;a class="reference external" href="http://www.ala.org/lita/about/igs/public/lit-Pp"&gt;ALA Patron Privacy Technologies Interest
Group&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="open-data"&gt;
&lt;h2&gt;Open data&lt;/h2&gt;
&lt;p&gt;Opening up access to data is part of the federal government's stated
mission.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://open.canada.ca/en/content/canadas-action-plan-open-government-2014-16"&gt;Canada's Action Plan on Open Government
2014-16&lt;/a&gt;
says &amp;quot;Open Government Foundation - Open By Default&amp;quot; is a keystone of its
plan; &amp;quot;Eligible data and information will be released in standardized,
open formats, free of charge, and without restrictions on reuse&amp;quot; under
the Open Government Licence - Canada 2.0. I therefore asserted:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;A relaunched National Union Catalogue should therefore support open
data per the federal initiative from launch.&lt;/li&gt;
&lt;li&gt;The open data should include bibliographic, authority, and holdings
records. Guy Berthiaume's reply to
&lt;a class="reference external" href="http://www.cla.ca/Content/NavigationMenu/CLAatWork/Advocacy/LAC_Response_CLA_letter_OCLC_access_26aug2014.pdf"&gt;CLA&lt;/a&gt;
and
&lt;a class="reference external" href="http://capalibrarians.org/wp/wp-content/uploads/2014/09/LAC-response-September-62014.pdf"&gt;CAPAL&lt;/a&gt;
that libraries can use the Z39.50 protocol to try to access records
from individual library's Z39.50 servers ignores one of the primary
purposes of a union catalogue, which is to avoid that time-consuming
search across the various Z39.50 servers of the institutions that
contributed their data to the union catalogue in the first place.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;The response:&lt;/em&gt; The ACAN requirements document indicated a requirement
that the data be made available under an ODC-BY license (matching OCLC's
general WorldCat license); and LAC needs to get the data back to support
their federated search tool.&lt;/p&gt;
&lt;p&gt;I asked if they had checked to see if ODC-BY and Open Government License
- Canada 2.0 licenses are compatible; they responded that that was
something they would need to look into.&lt;/p&gt;
&lt;p&gt;Happily, the &lt;a class="reference external" href="http://clipol.org/licences/69?tab=licence_compatibility"&gt;CLIPol
tool&lt;/a&gt;
indicates that the ODB-BY 1.0 and Open Government License - Canada 2.0
licenses are mostly compatible.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="contemporary-features-are-we-achieving-the-stated-goals"&gt;
&lt;h2&gt;Contemporary features: are we achieving the stated goals?&lt;/h2&gt;
&lt;p&gt;The backgrounder benefits/objectives section stated: &amp;quot;In the current
AMICUS?based context, the NUC has not kept pace with new technological
functions, capabilities, and client needs. Contemporary features such as
a user?oriented display and navigation, user customization, links to
social media, and linked open data output were not available when AMICUS
was implemented in the 1990s.&amp;quot;&lt;/p&gt;
&lt;div class="section" id="canadian-resource-visibility"&gt;
&lt;h3&gt;Canadian resource visibility&lt;/h3&gt;
&lt;p&gt;To preserve and promote our unique national culture, we want Canadian
library resources to be as visible as possible on the web. This is
generally accomplished by publishing a sitemap (a list of the web pages
for a given web site, along with when each page was last updated) and
allowing search engines like Google, Bing, and Yahoo to crawl those web
pages and index their data.&lt;/p&gt;
&lt;p&gt;To maximize the visibility of Canadian library resources on the open
web, we need our union catalogue to generate a sitemap that points to
only the actual records with holdings for Canadian libraries, not just
WorldCat.org in general. For example,
&lt;a class="reference external" href="http://adamnet.worldcat.org/robots.txt"&gt;http://adamnet.worldcat.org/robots.txt&lt;/a&gt; simply points to the generic
&lt;a class="reference external" href="http://www.worldcat.org/libraries/sitemap_index.xml"&gt;http://www.worldcat.org/libraries/sitemap_index.xml&lt;/a&gt;, not a specific
sitemap for the Dutch union catalogue.&lt;/p&gt;
&lt;p&gt;Our union catalogue should publish schema.org metadata to improve the
discoverability of our resources in search engines (which initiated the
schema.org standard for that purpose). WorldCat includes schema.org
metadata, but WorldCat Local instances do not.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The response:&lt;/em&gt; There was some confusion about schema.org, and they
asked if I didn't think that OCLC's syndication program was sufficient
for enabling web discoverability. I replied in the negative.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="standards-support-marc21-rda-iso-etc"&gt;
&lt;h3&gt;Standards support (MARC21, RDA, ISO etc.)&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;I didn't get a chance to raise these questions.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;What standards, exactly, are meant by this?&lt;/p&gt;
&lt;p&gt;&amp;quot;Technical requirements including volumetrics and W3C compliance&amp;quot; is
also very broad and vague. With respect to &amp;quot;W3C compliance&amp;quot;, &lt;a class="reference external" href="http://www.w3.org/standards/"&gt;W3C
Standards&lt;/a&gt; is just the start of many
standards.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Presumably there will be WCAG compliance for accessibility - but to
what extent?&lt;/li&gt;
&lt;li&gt;Both the adamnet and fablibraries instances landing pages state that
their canonical URL is www.worldcat.org, which effectively hides them
from search engines.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="mobile-support"&gt;
&lt;h3&gt;Mobile support&lt;/h3&gt;
&lt;p&gt;The &lt;a class="reference external" href="http://www.w3.org/standards/"&gt;W3C Standards&lt;/a&gt; page mentions
mobile friendliness as part of its standards.&lt;/p&gt;
&lt;p&gt;WorldCat.org itself is not mobile friendly. It uses a separate website
with different URLs to serve up mobile web pages, and does not
automatically detect mobile browsers; the onus is on the user to find
the &lt;a class="reference external" href="http://www.worldcatmobile.org/"&gt;&amp;quot;WorldCat Mobile&amp;quot; page&lt;/a&gt;, and
that has been in a &amp;quot;Beta&amp;quot; state since 2009. The &amp;quot;beta&amp;quot; contravenes the
stated requirements for the AMICUS replacement service to &lt;em&gt;not&lt;/em&gt; be an
alpha or beta, unless you choose to ignore the massive adoption of
mobile devices for searching and browsing purposes, and the beta mobile
experience lacks functionality compared to the desktop version.&lt;/p&gt;
&lt;p&gt;The adamnet and fablibraries WorldCat Local instances don't advertise
the mobile option, which is slightly different than the standard
WorldCat Mobile version (for example, it offers record detail pages),
but the navigation between desktop and mobile is sub-par. If you have
bookmarked a page on the desktop, then open that bookmark on your
synchronized browser on a mobile device, you can only get the desktop
view.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="linked-open-data"&gt;
&lt;h3&gt;Linked open data&lt;/h3&gt;
&lt;p&gt;Linked open data around records, holdings, and participating libraries
has arguably been a standard since the W3 Library Linked Data working
group issued its &lt;a class="reference external" href="http://www.w3.org/2005/Incubator/lld/XGR-lld-20111025/%20"&gt;final report in
2011&lt;/a&gt;.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Data--including library holdings--should be available both as bulk
downloads and as linked open data&lt;/li&gt;
&lt;li&gt;Records need to be linked to libraries and holdings. For humans, that
missing link in WorldCat is supplied by a JavaScript lookup based on
geographic location info that the human supplies. This prevents other
automated services from aggregating the data and creating new
services based on it (including entirely Canadian-built and hosted
services which would then protect Canadians from USA Patriot Act
concerns).&lt;/li&gt;
&lt;li&gt;MARC records should be one of the directly downloadable formats via
the web. Currently download options are limited to experimental &amp;amp;
incomplete ntriple, turtle, JSON-LD, and RDF-XML formats.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="application-programming-interface-api"&gt;
&lt;h3&gt;Application programming interface (API)&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;I didn't get the chance to bring this up during the call...&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;OCLC offers the xID API in a very limited fashion to non-members, which
is one of the only ways to match ISBN, LCCN, and OCLC numbers. LAC
should ensure that Canadian libraries have access to some similarly
efficient means of finding matching records without having to become
full OCLC Cataloguing members.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="updating-the-nuc"&gt;
&lt;h3&gt;Updating the NUC&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;I didn't get the chance to bring this up during the call...&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In an ideal world, the NUC would adopt the standard web indexing
practice of checking sitemaps (for those libraries that produce them) on
a regular (daily or weekly basis) and add/replace any new/modified
records &amp;amp; holdings from the contributing libraries accordingly, rather
than requiring libraries to upload their own records &amp;amp; holdings on an
irregular basis.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 03 Mar 2015 03:46:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2015-03-03:/library-and-archives-canada-planning-for-a-new-union-catalogue.html</guid><category>Libraries</category><category>Coding</category><category>Structured data</category><category>coding</category><category>structured data</category></item><item><title>Library catalogues and HTTP status codes</title><link>https://coffeecode.net/library-catalogues-and-http-status-codes.html</link><description>&lt;p&gt;I noticed in Google's &lt;a class="reference external" href="https://www.google.com/webmasters/tools/"&gt;Webmaster
Tools&lt;/a&gt; that our catalogue
had been returning some &lt;em&gt;Soft 404s&lt;/em&gt;. Curious, I checked into some of the
URIs suffering from this condition, and realized that Evergreen returns
an HTTP status code of &lt;tt class="docutils literal"&gt;200 OK&lt;/tt&gt; when it serves up a record details
page for a record that has been deleted. The HTML itself has a nice big
red alert box warning users that the record has been deleted to help
humans realize that what was once there is no longer, but machines
typically don't read English. However, at some point in the past few
months, Google started parsing the HTML and recognizing when HTTP status
codes are misleading.&lt;/p&gt;
&lt;p&gt;That led me to wonder what happens when you request a record detail page
by ID for a record that doesn't exist in Evergreen. As it turns out, it
currently returns HTTP status code &lt;tt class="docutils literal"&gt;200&lt;/tt&gt; with a detail page devoid of
any details. Also not good! Being a good little Evergreen community
member, I &lt;a class="reference external" href="https://bugs.launchpad.net/evergreen/+bug/1406025"&gt;opened a
bug&lt;/a&gt; and put
together a fairly simple fix so that the catalogue will return a
&lt;tt class="docutils literal"&gt;404 Not Found&lt;/tt&gt; for non-existent records and &lt;tt class="docutils literal"&gt;410 Gone&lt;/tt&gt; for deleted
records. Huzzah for HTTP standards compliance. We build a better web one
small step at a time.&lt;/p&gt;
&lt;p&gt;That, in turn, led me to wonder what happens when you request record
details for non-existent records in other library systems. Here's what I
found:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;strong&gt;Bibliocommons&lt;/strong&gt;: Status &lt;tt class="docutils literal"&gt;302 Moved temporarily&lt;/tt&gt; that then leads
back to an empty search form. Not good.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Blacklight&lt;/strong&gt;: Status &lt;tt class="docutils literal"&gt;404 Not Found&lt;/tt&gt;. Good!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Encore&lt;/strong&gt;: N/A - appears to send up session based URLs for records.
Really?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;III&lt;/strong&gt;: Status &lt;tt class="docutils literal"&gt;200 OK&lt;/tt&gt;. Not good.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Koha&lt;/strong&gt;: Status &lt;tt class="docutils literal"&gt;302 Found&lt;/tt&gt; with a &lt;tt class="docutils literal"&gt;Location:&lt;/tt&gt; header leading to
a page with a status &lt;tt class="docutils literal"&gt;404 Not Found&lt;/tt&gt;. That redirect probably makes
it harder for the machines to recognize that the resource does not at
all exist than if it directly returned a &lt;tt class="docutils literal"&gt;404&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Polaris&lt;/strong&gt;: N/A - it seems that the normal web interface doesn't
link directly to titles; instead it serves up titles in the context
of search results by position. The mobile web interface offers
persistent URLs, but requests for non-existent records return a
status &lt;tt class="docutils literal"&gt;302 Found&lt;/tt&gt; that redirects back to an empty search form. Not
good.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Primo (using a permalink)&lt;/strong&gt;: Status &lt;tt class="docutils literal"&gt;302 Found&lt;/tt&gt; that then leads
to an empty record details page with a status &lt;tt class="docutils literal"&gt;200 OK&lt;/tt&gt;. Not good.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Symphony&lt;/strong&gt;: N/A - I tried a few systems (Houston Public Library,
Oxnard Public Library) and it seems SirsiDynix still doesn't use
persistent URLs, nor surface permalinks for records in the default
interface.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Voyager&lt;/strong&gt;: Status &lt;tt class="docutils literal"&gt;200 OK&lt;/tt&gt;. Not good.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vufind&lt;/strong&gt;: Status &lt;tt class="docutils literal"&gt;404 Not Found&lt;/tt&gt;. Good!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WorldCat&lt;/strong&gt;: Status &lt;tt class="docutils literal"&gt;200 OK&lt;/tt&gt;. Not good.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Overall, this is a pretty dismal picture of the state of some of the
most commonly used library catalogue systems when it comes to compliance
with basic web standards. Kudos to Blacklight and Vufind for getting it
right--and assuming that my branch gets integrated, Evergreen should
join them in the near future.&lt;/p&gt;
&lt;p&gt;&lt;img alt="404 Library Catalogue Web Standards Compliance Not Found" src="/uploads/files/404-web-standards-compliance.png" /&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 29 Dec 2014 16:50:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2014-12-29:/library-catalogues-and-http-status-codes.html</guid><category>Libraries</category><category>Coding</category><category>Evergreen</category><category>coding</category><category>evergreen</category></item><item><title>Dear database vendor: defending against sci-hub.org scraping is going to be very difficult</title><link>https://coffeecode.net/dear-database-vendor-defending-against-sci-huborg-scraping-is-going-to-be-very-difficult.html</link><description>&lt;p&gt;Our library receives formal communications from various content/database
vendors about &amp;quot;serious intellectual property infringement&amp;quot; on a
reasonably regular basis, that urge us to &amp;quot;pay particular attention to
proxy security&amp;quot;. Here is part of the response I sent to the most recent
such request:&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;p&gt;We use the UsageLimit directives that OCLC's EZProxy solution offers
to block users who go over certain thresholds. However, the
UsageLimit directives are really too coarse to be extremely useful.
For example, you can set a limit based on the number of transfers in
a given time period, but you can't set different thresholds for
content types (such as CSS, JavaScript, HTML, images, or PDFs). The
compromised account had gathered a set of URLs that enabled them to
directly request a series of PDFs, thus staying below the general
threshold for transfers. If EZProxy offered a &amp;quot;transfer threshold by
MIME type&amp;quot; directive, then we could easily block users who tried to
download more than, say, 100 PDFs in an hour.&lt;/p&gt;
&lt;/p&gt;&lt;p&gt;We also set UsageLimit directives for total bandwidth consumed.
However, again this is limited by the coarseness of the directives
available to us in EZProxy, as well as the increased richness of the
variety of content available from electronic resources these days.
With individual PDFs varying in size from 0.25 MB to 2.5 MB, not to
mention streaming audio and video services, finding the right
threshold without locking out legitimate users is quite challenging.&lt;/p&gt;
&lt;/p&gt;&lt;p&gt;I therefore urge you to contact OCLC directly and demand that they
add the ability to include finer-grained directives for UsageLimit
throttling to EZProxy. As EZProxy is by far the most common proxy
solution deployed by libraries worldwide, this would enable many of
your customers to benefit from the enhancement. While OCLC's
customers have been &lt;a class="reference external" href="http://thread.gmane.org/gmane.education.ezproxy/2276"&gt;requesting functionality like this for
years&lt;/a&gt; via
the EZProxy mailing list, they are slow to react (having taken
months to update EZProxy to address &lt;a class="reference external" href="http://thread.gmane.org/gmane.education.ezproxy/19726"&gt;recent SSL
vulnerabilities&lt;/a&gt;,
for example). Perhaps OCLC will listen to an enterprise partner.&lt;/p&gt;
&lt;/p&gt;&lt;p&gt;For our part, at Laurentian, I have asked our IT Services department
(who controls our proxy server) to write a simple script that parses
the EZProxy event logs and emails us when a user is blocked due to
going past a threshold. This would have helped us catch the
compromised account much earlier on, and should also be another
basic feature of EZProxy. Right now, every library has to implement
their own solution for this basic requirement, and many do not.&lt;/p&gt;
&lt;/p&gt;&lt;p&gt;All that said, even with finer-grained threshold directives and
active monitoring of account blocking events, I have to note that a
savvy attacker intent on harvesting your content will, once they
have compromised an account, simply slow down the number of requests
to the level that emulates the activity that a normal human would
generate, and spread the requests out across all of the accounts
they have compromised, and introduce a level of randomness into the
requests so that they aren't detectable patterns (such as linear
requests for only PDFs), etc. No system is going to offer a perfect
defence against those efforts.&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;I'm sympathetic to the content vendors' concerns, but really, even if
OCLC does add some of these features to their core EZProxy offering, the
content-scraping approaches will simply increase in sophistication.
Removing proxy access isn't a real option for our users, even though
cutting off proxy access is what the content vendors do. This is a game
that nobody is going to win.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 10 Dec 2014 16:16:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2014-12-10:/dear-database-vendor-defending-against-sci-huborg-scraping-is-going-to-be-very-difficult.html</guid><category>Libraries</category><category>Coding</category><category>Libraries</category><category>coding</category><category>libraries</category></item><item><title>Putting the "Web" back into Semantic Web in Libraries 2014</title><link>https://coffeecode.net/putting-the-web-back-into-semantic-web-in-libraries-2014.html</link><description>&lt;p&gt;I was honoured to lead a workshop and speak at this year's edition of &lt;a class="reference external" href="http://swib.org/swib14"&gt;Semantic
Web in Bibliotheken (SWIB)&lt;/a&gt; in Bonn, Germany. It was
an amazing experience; there were so many rich projects being described with
obvious dividends for the users of libraries, once again the European library
community fills me with hope for the future success of the semantic web.&lt;/p&gt;
&lt;p&gt;The subject of my talk &amp;quot;Cataloguing for the open web with RDFa and schema.org&amp;quot;
(&lt;a class="reference external" href="/swib14/talk"&gt;slides&lt;/a&gt; and
&lt;a class="reference external" href="http://www.scivee.tv/node/63282"&gt;video recording&lt;/a&gt; - &lt;em&gt;gulp&lt;/em&gt;) pivoted while
I was preparing materials for the workshop. I was searching library catalogues
around Bonn looking for a catalogue with persistent URIs that I could use for
an example. To my surprise, catalogue after catalogue used session-based URLs;
it took me quite some time before I was able to find ULB, who had hosted a
VuFind front end for their catalogue. Even then, the &lt;tt class="docutils literal"&gt;robots.txt&lt;/tt&gt; restricted
crawling by any user agent. This reminded me rather depressingly of my findings
from current &amp;quot;discovery layers&amp;quot;, which entirely restrict crawling and therefore
put libraries into a black hole on the web.&lt;/p&gt;
&lt;p&gt;These findings in the wild are so antithetical to the basic principles of
enabling discovery of web resources that, in a conference about the semantic
web, I opted to spend over half of my talk making the argument that libraries
need to pay attention to the old-fashioned web of documents first and foremost.&lt;/p&gt;
&lt;p&gt;The basic building blocks that I advocated were, in priority order:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Persistent URIs, on which everything else is built&lt;/li&gt;
&lt;li&gt;Sitemaps, to facilitate discovery of your resources&lt;/li&gt;
&lt;li&gt;A robots.txt file to filter portions of your website that should not
be crawled (for example, search results pages)&lt;/li&gt;
&lt;li&gt;RDFa, microdata, or JSON-LD only after you've sorted out the first
three&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Only after setting that foundation did I feel comfortable launching into my
rationale for RDFa and schema.org as a tool for enabling discovery on the web:
a mapping of the access points that cataloguers create to the world of HTML and
aggregators. The key point for SWIB was that RDFa and schema.org can enable
full RDF expressions in HTML; that is, we can, should, and must go beyond
surfacing structured data to surfacing linked data through &lt;tt class="docutils literal"&gt;&amp;#64;resource&lt;/tt&gt;
attributes and &lt;a class="reference external" href="http://schema.org/sameAs"&gt;schema:sameAs&lt;/a&gt; properties.&lt;/p&gt;
&lt;blockquote&gt;
The Semantic Web is an extension of the current web in which information is
given well-defined meaning, better enabling computers and people to work in
cooperation. Tim Berners-Lee, Scientific American, 2001&lt;/blockquote&gt;
&lt;p&gt;I also argued that using RDFa to enrich the document web was, in fact,
truer to Berners-Lee's 2001 definition of the semantic web, and that we should
focus on enriching the document web so that both humans and machines can
benefit before investing in building an entirely separate and disconnected
semantic web.&lt;/p&gt;
&lt;p&gt;I was worried that my talk would not be well received; that it would be
considered obvious, or scolding, or just plain off-topic. But to my relief I
received a great deal of positive feedback. And on the next day, both Eric
Miller and Richard Wallis gave talks on a similar, but more refined, theme:
that libraries need to do a much, much better job of enabling their resources
to be found on the web--not by people who already use our catalogues, but by
people who are &lt;em&gt;not&lt;/em&gt; library users today.&lt;/p&gt;
&lt;p&gt;There were also some requests for clarification, which I'll try to address
generally here (for the benefit of anyone who wasn't able to talk with me, or
who might watch the livestream in the future).&lt;/p&gt;
&lt;div class="section" id="when-you-said-anything-could-be-described-in-schema-org-did-you-mean-we-should-throw-out-marc-and-bibframe-and-ead"&gt;
&lt;h2&gt;&amp;quot;When you said anything could be described in schema.org, did you mean we should throw out MARC and BIBFRAME and EAD?&amp;quot;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;tldr:&lt;/em&gt; I intended &lt;strong&gt;and&lt;/strong&gt;, not &lt;strong&gt;instead of&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;The first question I was asked was whether there was anything that I had not
been able to describe in schema.org, to which I answered &amp;quot;No&amp;quot;--especially since
the work that the W3C SchemaBibEx group had done to ensure that some of the
core bibliographic requirements were added to the vocabulary. It was not as
coherent or full a response as I would have liked to have made; I blame the
livestream camera &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;p&gt;But combined with a part of the presentation where I countered a myth about
schema.org being a very coarse vocabulary by pointing out that it actually
contained 600 classes and over 800 properties, a number of the attendees
interpreted one of the takeaways of my talk as suggesting that libraries should
adopt schema.org as &lt;em&gt;the&lt;/em&gt; descriptive vocabulary, and that MARC, BIBFRAME, EAD,
RAD, RDA, and other approaches for describing library resources were no longer
necessary.&lt;/p&gt;
&lt;p&gt;This is not at all what I'm advocating! To expand on my response, you &lt;em&gt;can&lt;/em&gt;
describe anything in schema.org, but you might lose significant amounts of
richness in your description. For example, short stories and poems would best
be described in schema.org as a &lt;a class="reference external" href="http://schema.org/CreativeWork"&gt;CreativeWork&lt;/a&gt;.  You would have to look at the associated
description or keyword properties to be able to figure out the form of the
work.&lt;/p&gt;
&lt;p&gt;What I was advocating was that you should map your rich bibliographic
description into corresponding schema.org classes and properties in RDFa at the
time you generate the HTML representation of that resource and its associated
entities. So your poem might be represented as a
href=&amp;quot;&lt;a class="reference external" href="http://schema.org/CreativeWork"&gt;http://schema.org/CreativeWork&lt;/a&gt;&amp;quot;&amp;gt;CreativeWork, with a &lt;a class="reference external" href="http://schema.org/name"&gt;name&lt;/a&gt;, &lt;a class="reference external" href="http://schema.org/author"&gt;author&lt;/a&gt;,
&lt;a class="reference external" href="http://schema.org/description"&gt;description&lt;/a&gt;, &lt;a class="reference external" href="http://schema.org/keywords"&gt;keywords&lt;/a&gt;, and &lt;a class="reference external" href="http://schema.org/about"&gt;about&lt;/a&gt; values
and relationships. Ideally, the &lt;tt class="docutils literal"&gt;author&lt;/tt&gt; will include at least one link
(either via &lt;a class="reference external" href="http://schema.org/sameAs"&gt;sameAs&lt;/a&gt;, &lt;a class="reference external" href="http://schema.org/url"&gt;url&lt;/a&gt;, or &lt;tt class="docutils literal"&gt;&amp;#64;resource&lt;/tt&gt;) to an entity on the web; and you
could do the same with &lt;tt class="docutils literal"&gt;about&lt;/tt&gt; if you are using a controlled vocabulary.&lt;/p&gt;
&lt;p&gt;If you take that approach, then you can serve up schema.org descriptions of
works in HTML that most web-oriented clients will understand (such as search
engines) and provide basic access points such as name / author / keywords,
while retaining and maintaining the full richness of the underlying
bibliographic description--and potentially providing access to that, too, as
part of the embedded RDFa, via content negotiation, or &lt;tt class="docutils literal"&gt;&amp;lt;link &lt;span class="pre"&gt;rel=&amp;quot;&amp;quot;&amp;gt;&lt;/span&gt;&lt;/tt&gt;, for
clients that can interpret richer formats.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="what-makes-you-think-google-will-want-to-surface-library-holdings-in-search-results"&gt;
&lt;h2&gt;&amp;quot;What makes you think Google will want to surface library holdings in search results?&amp;quot;&lt;/h2&gt;
&lt;p&gt;There is a perception that Google and other search engines just want to sell
ads, or their own products (such as Google Books). While Google certainly does
want to sell ads and products, they also want to be the most useful tool for
satisfying users' information needs--possibly so they can learn more about
those users and put more effective ads in front of them--but nonetheless, the
motivation is there.&lt;/p&gt;
&lt;p&gt;Imagine marking up your resources with the Product / Offer portion of
schema.org you are able to provide search engines with availability information
in the same way that Best Buy, AbeBooks, and other online retailers do (as
Evergreen, Koha, and VuFind already do). That makes it much easier for the
search engines to use everything they may know about their users, such as their
current location, their institutional affiliations, their typical commuting
patterns, their reading and research preferences... to provide a link to a
library's electronic or print copy of a given resource in a knowledge graph box
as one of the possible ways of satisfying that person's information needs.&lt;/p&gt;
&lt;p&gt;We don't see it happening with libraries running Evergreen, Koha, and VuFind
yet, realistically because the open source library systems don't have enough
penetration to make it worth a search engine's effort to add that to their set
of possible sources. However, if we as an industry make a concerted effort to
implement this as a standard part of crawlable catalogue or discovery record
detail pages, then it wouldn't surprise me in the least to see such suggestions
start to appear. The best proof that we have that Google, at least, is
interested in supporting discovery of library resources is the continued
investment in Google Scholar.&lt;/p&gt;
&lt;p&gt;And as I argued during my talk, even if the search engines never add direct
links to library resources from search results or knowledge graph sidebars,
having a reasonably simple standard like the GoodRelations product / offer
pattern for resource availability enables new web-based approaches for building
appplications. One example could be a fulfillment system that uses sitemaps to
intelligently crawl all of its participating libraries, normalizes the item
request to a work URI, and checks availability by parsing the offers at the
corresponding URIs.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 04 Dec 2014 21:15:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2014-12-04:/putting-the-web-back-into-semantic-web-in-libraries-2014.html</guid><category>Linked Open Data</category><category>Coding</category><category>Evergreen</category><category>Libraries</category><category>Structured data</category><category>coding</category><category>evergreen</category><category>libraries</category><category>structured data</category></item><item><title>Social networking for researchers: ResearchGate and their ilk</title><link>https://coffeecode.net/social-networking-for-researchers-researchgate-and-their-ilk.html</link><description>&lt;p&gt;The &lt;a class="reference external" href="http://crosh.ca"&gt;Centre for Research in Occupational Safety and
Health&lt;/a&gt; asked me to give a lunch'n'learn
&lt;a class="reference external" href="http://stuff.coffeecode.net/2014/lul/research_networking/"&gt;presentation on
ResearchGate&lt;/a&gt;
today, which was a challenge I was happy to take on... but I took the
liberty of stretching the scope of the discussion to focus on social
networking in the context of research and academics in general,
recognizing four high-level goals:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Promotion (increasing citations, finding work positions)&lt;/li&gt;
&lt;li&gt;Finding potential collaborators&lt;/li&gt;
&lt;li&gt;Getting advice from experts in your field&lt;/li&gt;
&lt;li&gt;Accessing other's work&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I'm a librarian, so naturally my take veered quickly into the waters of
copyright concerns and the burden (to the point of indemnification) that
ResearchGate, Academia.edu, Mendeley, and other such services put on
their users to ensure that they are in compliance with copyright and the
researchers' agreements with publishers... all while heartily
encouraging their users to upload their work with a single click. I also
dove into the darker waters of r/scholar, LibGen, and SciHub, pointing
out the direct consequences that our university has suffered due to the
abuse of institutional accounts at the library proxy.&lt;/p&gt;
&lt;p&gt;Happily, the audience opened up the subject of publishing in open access
journals--not just from a &amp;quot;covering our own butts&amp;quot; perspective, but also
from the position of the ethical responsibility to share knowledge as
broadly as possible. We briefly discussed the open access mandates that
some granting agencies have put in place, particularly in the States, as
well as similar Canadian initiatives that have occurred or are still
emerging with respect to public funds (SSHRC and the Tri-Council). And I
was overjoyed to hear a suggestion that, perhaps, research funded by the
Laurentian University Research Fund should be required to publish in an
open access venue.&lt;/p&gt;
&lt;p&gt;I'm hoping to take this message back to our library and, building on
&lt;a class="reference external" href="http://www.slideshare.net/kurtdebelder/introduction-to-leiden-university-libraries"&gt;Kurt de Belder's vision of the library as a *Partner in
Knowledge*&lt;/a&gt;
help drive our library's mission towards assisting researchers in not
only accessing knowledge, but most effectively sharing and promoting the
knowledge they create.&lt;/p&gt;
&lt;p&gt;That leaves lots of work to do, based on one little presentation &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 18 Nov 2014 20:48:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2014-11-18:/social-networking-for-researchers-researchgate-and-their-ilk.html</guid><category>misc</category><category>Coding</category><category>Libraries</category><category>coding</category><category>libraries</category></item><item><title>How discovery layers have closed off access to library resources, and other tales of schema.org from LITA Forum 2014</title><link>https://coffeecode.net/how-discovery-layers-have-closed-off-access-to-library-resources-and-other-tales-of-schemaorg-from-lita-forum-2014.html</link><description>&lt;p&gt;At the LITA Forum yesterday, I accused
(&lt;a class="reference external" href="http://stuff.coffeecode.net/2014/lita_forum"&gt;presentation&lt;/a&gt;) most
discovery layers of not solving the discoverability problems of
libraries, but instead exacerbating them by launching us headlong to a
closed, unlinkable world. Coincidentally, Lorcan Dempsey's opening
keynote contained a subtle criticism of discovery layers. I wasn't that
subtle.&lt;/p&gt;
&lt;p&gt;Here's why I believe commercial discovery layers are not &amp;quot;of the web&amp;quot;:
check out their &lt;a class="reference external" href="http://robotstxt.org"&gt;robots.txt&lt;/a&gt; files. If
you're not familiar with robots.txt files, these are what search engines
and other well-behaved automated crawlers of web resources use to
determine whether they are allowed to visit and index the content of
pages on a site. Here's what the &lt;tt class="docutils literal"&gt;robots.txt&lt;/tt&gt; files look like for a
few of the best-known discovery layers:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
User-Agent: *
Disallow /
&lt;/pre&gt;
&lt;p&gt;That effectively says &amp;quot;Go away, machines; your kind isn't wanted in
these parts.&amp;quot; And that, in turn, closes off access to your libraries
resources to search engines and other aggregators of content, and is
completely counter to the overarching desire to evolve to a linked open
data world.&lt;/p&gt;
&lt;p&gt;During the question period, Marshall Breeding challenged my assertion as
being unfair to what are meant to be merely indexes of library content.
I responded that most libraries have replaced their catalogues with
discovery layers, closing off open access to what have traditionally
been their core resources, and he rather quickly acquiesced that that
was indeed a problem.&lt;/p&gt;
&lt;p&gt;(By the way, a possible solution might be to simply offer two different
URL patterns, something like &lt;tt class="docutils literal"&gt;/library/*&lt;/tt&gt; for library-owned resources
to which access should be granted, and &lt;tt class="docutils literal"&gt;/licensed/*&lt;/tt&gt; for resources to
which open access to the metadata is problematic due to licensing
issues, and which robots can therefore be restricted from accessing.)&lt;/p&gt;
&lt;p&gt;Compared to commercial discovery layers on my very handwavy usability
vs. discoverability plot, general search engines rank pretty high on
both axes; they're the ready-at-hand tool in browser address bars. And
they grok schema.org, so if we can improve our discoverability by
publishing schema.org data, maybe we get a discoverability win for our
users.&lt;/p&gt;
&lt;p&gt;But even if we don't (SEO is a black art at best, and maybe the general
search engines won't find the right mix of signals that makes them
decide to boost the relevancy of our resources for specific users in
specific locations at specific times) we get access to that structured
data across systems in an extremely reusable way. With sitemaps, we can
build our own specialized search engines (Solr or ElasticSearch or
Google Custom Search Engine or whatever) that represent specific use
cases. Our more sophisticated users can piece together data to, for
example, build dynamic lists of collections, using a common,
well-documented vocabulary and tools rather than having to dip into the
arcane world of library standards (Z39.50 and MARC21).&lt;/p&gt;
&lt;p&gt;So why not iterate our way towards the linked open data future by
building on what we already have now?&lt;/p&gt;
&lt;p&gt;As &lt;a class="reference external" href="http://kcoyle.blogspot.ca/2014/10/schemaorg-where-it-works.html"&gt;Karen Coyle
wrote&lt;/a&gt;
in a much more elegant fashion, the transition looks roughly like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Stored data -&amp;gt; transform/template -&amp;gt; human readable HTML page&lt;/li&gt;
&lt;li&gt;Stored data -&amp;gt; transform/template (tweaked) -&amp;gt; machine &amp;amp; human
readable HTML page&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is, by simply tweaking the same mechanism you already use to
generate a human readable HTML page from the data you have stored in a
database or flat files or what have you, you can embed machine readable
structured data as well.&lt;/p&gt;
&lt;p&gt;That is, in fact, exactly the approach I took with Evergreen, VuFind,
and Koha. And they now expose structured data and generate sitemaps out
of the box using the same old MARC21 data. Evergreen even exposes
information about libraries (locations, contact information, hours of
operation) so that you can connect its holdings to specific locations.&lt;/p&gt;
&lt;p&gt;And what about all of our resources outside of the catalogue? Research
guides, fonds descriptions, institutional repositories, publications...
I've been lucky enough to be working with Camilla McKay and Karen Coyle
on applying the same process to the Bryn Mawr Classical Review. At this
stage, we're exposing basic entities (&lt;a class="reference external" href="http://schema.org"&gt;Reviews&lt;/a&gt;
and &lt;a class="reference external" href="http://schema.org/Person"&gt;People&lt;/a&gt;) largely as literals, but
we're laying the groundwork for future iterations where we link them up
to external entities. And all of this is built on a Tcl + SGML
infrastructure.&lt;/p&gt;
&lt;p&gt;So why schema.org? It has the advantage of being a de-facto generalized
vocabulary that can be understood and parsed across many different
domains, from car dealerships to streaming audio services to libraries,
and it can be relatively simply embedded into existing HTML as long as
you can modify the templating layer of your system.&lt;/p&gt;
&lt;p&gt;And schema.org offers much more than just static structured data;
schema.org Actions are surfacing in applications like Gmail as a way of
providing directly actionable links--and there's no reason we shouldn't
embrace that approach to expose &amp;quot;SearchAction&amp;quot;, &amp;quot;ReadAction&amp;quot;,
&amp;quot;WatchAction&amp;quot;, &amp;quot;ListenAction&amp;quot;, &amp;quot;ViewAction&amp;quot;--and &amp;quot;OrderAction&amp;quot;
(Request), &amp;quot;BorrowAction&amp;quot; (Borrow or Renew), &amp;quot;Place on Reserve&amp;quot;, and
other common actions as a standardized API that exists well beyond
libraries (see Hydra for a developing approach to this problem).&lt;/p&gt;
&lt;p&gt;I want to thank Richard Wallis for inviting me to co-present with him;
it was a great experience, and I really enjoy meeting and sharing with
others who are putting linked data theory into practice.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sat, 08 Nov 2014 16:41:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2014-11-08:/how-discovery-layers-have-closed-off-access-to-library-resources-and-other-tales-of-schemaorg-from-lita-forum-2014.html</guid><category>Libraries</category><category>Coding</category><category>Evergreen</category><category>Structured data</category><category>coding</category><category>evergreen</category><category>structured data</category></item><item><title>DCMI 2014: schema.org holdings in open source library systems</title><link>https://coffeecode.net/dcmi-2014-schemaorg-holdings-in-open-source-library-systems.html</link><description>&lt;p&gt;My slides from DCMI 2014:
&lt;a class="reference external" href="http://stuff.coffeecode.net/2014/dcmi_schemabibex/#/"&gt;schema.org in the wild: open source libraries++&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Last week I was at the
&lt;a class="reference external" href="http://dcevents.dublincore.org/IntConf/dc-2014"&gt;Dublin Core Metadata&lt;/a&gt;
Initiative 2014 conference, where Richard Wallis, Charles MacCathie Nevile and
I were slated to present on schema.org and the work of the W3C Schema.org
Bibliographic Extension Community Group (#schemabibex). As a first-timer at
DCMI, I wasn't sure what kind of an audience to expect: there is a
peer-reviewed papers track, and a series of sessions on a truly intimidating
topic (RDF Application Profiles), but on the other hand our own topic was
fairly basic. As it turned out, there was an invigoratingly mixed set of
backgrounds present, and Eric Miller's opening keynote, which gave an oral
history of the origins of DCMI and a look towards the future challenges for the
organization, reassured me that I wasn't going to be out of my depth.&lt;/p&gt;
&lt;p&gt;Special kudos to Eric for his analogy of the Web to a credit card, which offers
both human-readable and machine-readable data. A nice, clean image!&lt;/p&gt;
&lt;p&gt;Richard, Charles and I opted to structure our 1.5 hour session as a series of
short talks followed by a long period of discussion. However, as often happens,
the excitement of speaking in front of a room that drew so many attendees that
we had to jam with more chairs led to that plan breaking down. I cut my own
materials back to illustrating how one of my primary contributions to the
#schemabibex effort--representing library holdings using schema.org's
GoodRelations-based Product/Offer model--had been implemented in free software
library systems, including Evergreen, Koha, and VuFind. I walked from a basic
bibliographic record (represented as a
&lt;a class="reference external" href="http://schema.org/Product"&gt;Product&lt;/a&gt;), through to the associated borrowable
items (represented as &lt;a class="reference external" href="http://schema.org/Offer"&gt;Offers&lt;/a&gt; with a price of
$0.00, call numbers as &lt;a class="reference external" href="http://schema.org/sku"&gt;SKUs&lt;/a&gt;, and barcodes as
&lt;a class="reference external" href="http://schema.org/serialNumber"&gt;serialNumbers&lt;/a&gt;), that were offered by a
specific &lt;a class="reference external" href="http://schema.org/Library"&gt;Library&lt;/a&gt; with its own set of operating
hours, address, and contact information... all published out of the box as RDFa
in modern Evergreen systems.&lt;/p&gt;
&lt;p&gt;I did stray a little to posit that the use case for schema.org is not and
should not be limited to &amp;quot;search engine optimization&amp;quot;, but that this very
simple level of structured data could fairly easily form the basis of an API.
In the rather limited discussion that we were able to hold at the end of the
session (and encroaching on break time), Charles counselled that libraries
shouldn't really bother with dumbing down their beautiful metadata simply to
publish schema.org... while I countered that the pursuit of publishing
beautiful metadata in the past has generally led librarians to publish no
metadata at all, and that schema.org was a great first step towards building a
web of cultural heritage metadata meant for machine consumption.&lt;/p&gt;
&lt;p&gt;I wish I could have stayed longer at DCMI, but it was Thanksgiving in Canada
and there were families to visit and feast with--not to mention children to
help take car of--so I had to depart after just a day and a half. I'm
encouraged by the steps the organization is taking to renew itself, and I hope
to be able to participate again in the future.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 14 Oct 2014 01:07:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2014-10-14:/dcmi-2014-schemaorg-holdings-in-open-source-library-systems.html</guid><category>Linked Open Data</category><category>coding</category><category>evergreen</category><category>libraries</category><category>structured data</category></item><item><title>My small contribution to schema.org this week</title><link>https://coffeecode.net/my-small-contribution-to-schemaorg-this-week.html</link><description>&lt;p&gt;&lt;a class="reference external" href="http://schema.org/docs/releases.html#v1.91"&gt;Version 1.91&lt;/a&gt; of the
&lt;a class="reference external" href="http://schema.org"&gt;http://schema.org&lt;/a&gt; vocabulary was released a few days ago, and I once
again had a small part to play in it.&lt;/p&gt;
&lt;p&gt;With the addition of the &lt;a class="reference external" href="http://schema.org/workExample"&gt;workExample&lt;/a&gt;
and &lt;a class="reference external" href="http://schema.org/exampleOfWork"&gt;exampleOfWork&lt;/a&gt; properties, we
(Richard Wallis, Dan Brickley, and I) realized that examples of these
CreativeWork example properties were desperately needed to help clarify
their appropriate usage. I had developed one for the &lt;a class="reference external" href="http://blog.schema.org/2014/09/schemaorg-support-for-bibliographic_2.html"&gt;blog
post&lt;/a&gt;
that accompanied the launch of those properties, but the question was,
where should those examples live in the official schema.org docs?
CreativeWork has so many children, and the properties are so broadly
applicable, that it could have been added to dozens of type pages.&lt;/p&gt;
&lt;p&gt;It turns out that an until-now unused feature of the schema.org
infrastructure is that examples &lt;em&gt;can&lt;/em&gt; live on property pages; even Dan
Brickley didn't think this was working. However, a quick test in my
sandbox showed that it _was_ in perfect working order, so we could
locate the examples on their most relevant documentation pages...
Huzzah!&lt;/p&gt;
&lt;p&gt;I was then able to put together a nice, juicy example showing
relationships between a Tolkien novel (&lt;em&gt;The Fellowship of the Ring&lt;/em&gt;),
subsequent editions of that novel published by different companies in
different locations at different times, and movies based on that novel.
From this librarian's perspective, it's pretty cool to be able to do
this; it's a realization of a desire to express relationships that, in
most library systems, are hard or impossible to accurately specify.
(Should be interesting to try and get this expressed in Evergreen and
Koha...)&lt;/p&gt;
&lt;p&gt;In an ensuing conversation on public-vocabs about the appropriateness of
this approach to work relationships, I was pleased to hear Jeff Young
&lt;a class="reference external" href="http://lists.w3.org/Archives/Public/public-vocabs/2014Sep/0045.html"&gt;say&lt;/a&gt;
&amp;quot;+1 for using exampleOfWork / workExample as many times as necessary to
move vaguely up or down the bibliographic abstraction layers.&amp;quot;... To me,
that's a solid endorsement of this pragmatic approach to what is
inherently messy bibliographic stuff.&lt;/p&gt;
&lt;p&gt;Kudos to Richard for having championed these properties in the first
place; sometimes we're a little slow to catch on!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sat, 13 Sep 2014 07:27:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2014-09-13:/my-small-contribution-to-schemaorg-this-week.html</guid><category>Linked Open Data</category><category>Coding</category><category>Structured data</category><category>coding</category><category>structured data</category></item><item><title>Posting on the Laurentian University library blog</title><link>https://coffeecode.net/posting-on-the-laurentian-university-library-blog.html</link><description>&lt;p&gt;Since returning from my sabbatical, I've felt pretty strongly that one
of the things our work place is lacking is open communication about the
work that we do--not just outside of the library, but within the library
as well. I'm convinced that the more that we know about the demands on
each other's time and the goals that we're trying to achieve, the more
likely we'll be able to work together towards the same goals and have a
better understanding of each other's challenges.&lt;/p&gt;
&lt;p&gt;Towards that end, I've decided to try maintaining a work blog so that my
colleagues will have a better idea about what I've been up to. I
wouldn't be surprised if some of my peers think that I sit in my office
all day browsing the internet (which, actually, happens sometimes but &lt;em&gt;I
swear I'm doing it to try and find a solution for a problem!&lt;/em&gt;), because
the day-to-day work of a systems librarian can be pretty esoteric. And
when you know that they have many expectations for you to fix the many
small annoyances they have to deal with, it might help them to develop
some empathy if they understand what you actually are spending your time
on.&lt;/p&gt;
&lt;p&gt;Anyway, I decided not to mirror the content here because, well, it's
probably too site-specific to really be of interest to you, my dear
readers. Whoever you are. However, I will link to the two entries that
I've cranked out so far; you can decide if you want to follow along from
there:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://blog.laurentian.ca/library/?p=72"&gt;The systems librarian returns: week
1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://blog.laurentian.ca/library/?p=76"&gt;Library systems, week 2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 18 Jul 2014 21:40:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2014-07-18:/posting-on-the-laurentian-university-library-blog.html</guid><category>Libraries</category><category>Coding</category><category>Structured data</category><category>coding</category><category>structured data</category></item><item><title>Cataloguing for the open web: schema.org in library catalogues and websites</title><link>https://coffeecode.net/cataloguing-for-the-open-web-schemaorg-in-library-catalogues-and-websites.html</link><description>&lt;div vocab="http://schema.org/" typeof="Article"&gt;&lt;p&gt;&lt;em&gt;tldr;&lt;/em&gt; my slides are
href=&amp;quot;&lt;a class="reference external" href="http://stuff.coffeecode.net/2014/understanding_schema"&gt;http://stuff.coffeecode.net/2014/understanding_schema&lt;/a&gt;&amp;quot;&amp;gt;here, and the
slides from Jenn and Jason are also available from
href=&amp;quot;&lt;a class="reference external" href="http://connect.ala.org/node/222959"&gt;http://connect.ala.org/node/222959&lt;/a&gt;&amp;quot;&amp;gt;ALA Connect.&lt;/p&gt;
&lt;p&gt;On Sunday, June 29th Jenn Riley, Jason Clark, and I presented at the ALCTS/LITA
jointly sponsored session href=&amp;quot;&lt;a class="reference external" href="http://ala14.ala.org/node/14382"&gt;http://ala14.ala.org/node/14382&lt;/a&gt;&amp;quot;&amp;gt;Understanding
schema.org. The build-up to the session was pretty amazing; I was delighted to
learn that Jason and I had been working on pretty much parallel efforts over
the past couple of years. Jenn did a great job of organizing the session, and
by the time we started talking 276 people had indicated their interest in
attending: that was two more than those who had indicated an interest in
attending the BIBFRAME Forum Update scheduled in the same time slot. Our room
was large and quite full.&lt;/p&gt;
&lt;p&gt;Jenn started the session out string by advancing her concept that libraries
need to target &lt;em&gt;discovery elsewhere&lt;/em&gt;: that is, that there is no way that
libraries can compete directly with major search engines like Google, Bing, and
Yahoo, either through the discovery tools that we have to offer, our presence
in the consciousness of most of the population as the starting point for
discovery, or in the resources we can direct towards closing the huge gap in
technology, usability, and mindshare that the search engines have opened up
over the past two decades. &lt;em&gt;But&lt;/em&gt;, we can take steps to start working with the
search engines to enable our resources to be discovered and accessed more
directly by them.&lt;/p&gt;
&lt;p&gt;That led quite naturally to my own part of the session, in which I talked about
my attempt to turn cataloguing's efforts to provide access points in our niche
catalogues into access points for the open web by publishing schema.org
structured data from library catalogues like Evergreen, Koha, and VuFind. I
started things out by pointing out the legacy of restrictive &lt;tt class="docutils literal"&gt;robots.txt&lt;/tt&gt;
files that still live on in many catalogues today, then worked through some
basics like how sitemaps enable search engines--which strive to provide
relevant, useful results that matter to users in their context at a particular
place and time--to efficiently crawl just the most recently changed pages of
interest. Then I launched into the heart of the talk that showed how catalogues
that publish schema.org structured data can turn an undifferentiated mass of
presentation-oriented HTML and words into machine-comprehensible entities:
classes like &lt;tt class="docutils literal"&gt;Book&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Organization&lt;/tt&gt;, connected by properties like
&lt;tt class="docutils literal"&gt;publisher&lt;/tt&gt;, and with values for properties like &lt;tt class="docutils literal"&gt;author&lt;/tt&gt;,
&lt;tt class="docutils literal"&gt;datePublished&lt;/tt&gt;, and &lt;tt class="docutils literal"&gt;isbn&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;For this talk I used visualizations generated by the
href=&amp;quot;&lt;a class="reference external" href="http://rdfa.info/play"&gt;http://rdfa.info/play&lt;/a&gt;&amp;quot;&amp;gt;RDFa playground to illustrate the structured data
contained in some real examples of a production Evergreen system (thanks to
&lt;a class="reference external" href="http://biblio.org"&gt;Bibliomation&lt;/a&gt;). Given that I'm normally a text-and-talk
kind of guy, the illustrations seemed to help out--particularly in showing how
holdings map quite readily to the &lt;tt class="docutils literal"&gt;Product&lt;/tt&gt; / &lt;tt class="docutils literal"&gt;Offer&lt;/tt&gt; structure more
commonly used by commercial enterprises to reflect the prices, locations, and
availability of their products.&lt;/p&gt;
&lt;p&gt;Of course, the evolution from unstructured, to structured, to linked data had
its payoff beginning with the link from holdings to the libraries that hold the
resources. We have plenty more we can and must do, but unlike other efforts
which are still crystallizing and which will require significant architectural
work to happen before libraries can even begin trying out real systems, you can
use schema.org-enabled systems &lt;em&gt;today&lt;/em&gt;. And adapting systems to publish
schema.org structured data only requires access to the HTML templates for your
system (which, hopefully, you have: otherwise you have bigger problems to deal
with!) and following the patterns that have already been established by
Evergreen, Koha, and VuFind.&lt;/p&gt;
&lt;p&gt;Jason did a great job showing both a broader use case for schema.org, including
work he has led on digital collections such as embedding the &lt;tt class="docutils literal"&gt;Recipe&lt;/tt&gt; type in
a book of recipes. And he covered some of the evolution of the vocabulary,
including the exciting possibilities introduced by the &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt; type and
&lt;tt class="docutils literal"&gt;potentialAction&lt;/tt&gt; property for describing RESTful APIs... which naturally led
to an off-the-top-of-the-head enumeration of such actions as &lt;tt class="docutils literal"&gt;BorrowAction&lt;/tt&gt;
and &lt;tt class="docutils literal"&gt;LendAction&lt;/tt&gt; that are perfect for libraries.&lt;/p&gt;
&lt;p&gt;Perhaps the best part of the session, however, were the insightful questions
from the audience (along with the genuinely enthusiastic response to our
talks). We had deliberately left 15 minutes for questions, and we were not
disappointed: from questions about how we move from structured data to more
linked data (I riffed on the Dodds/Davis
href=&amp;quot;&lt;a class="reference external" href="http://patterns.dataincubator.org/book/progressive-enrichment.html"&gt;http://patterns.dataincubator.org/book/progressive-enrichment.html&lt;/a&gt;&amp;quot;&amp;gt;Progressive
Enrichment linked data pattern, suggesting that we should be able to
href=&amp;quot;/archives/278-Broadening-support-for-linked-data-in-MARC.html&amp;quot;&amp;gt;store
links for each field or value of interest directly in our MARC records), to
questions about what proprietary systems are doing this with schema.org today
(alas, none that I'm aware of, unless something has changed since
href=&amp;quot;/archives/282-Were-not-waiting-for-the-ILS-to-change.html&amp;quot;&amp;gt;February).&lt;/p&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 01 Jul 2014 20:00:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2014-07-01:/cataloguing-for-the-open-web-schemaorg-in-library-catalogues-and-websites.html</guid><category>Libraries</category><category>Coding</category><category>Evergreen</category><category>Structured data</category><category>coding</category><category>evergreen</category><category>structured data</category></item><item><title>Linked data interest panel, part 1</title><link>https://coffeecode.net/linked-data-interest-panel-part-1.html</link><description>&lt;p&gt;Good talk by Richard Wallis this morning at the ALA Annual Conference on
publishing entities on the web. Many of his points map extremely closely
to what I've been saying and will be saying tomorrow during my own
session (albeit with ten fewer minutes).&lt;/p&gt;
&lt;p&gt;I was particularly heartened to hear him talk about the great potential
for disintermediation of discovery of library resources, from
aggregation by national and global providers like OCLC to directly
crawling a library's own data and providing links directly to the
library resources. This was one of the conclusions of the paper I
published earlier this year.&lt;/p&gt;
&lt;p&gt;I would have liked to have heard some mention of Evergreen, Koha, VuFind
and other open source systems that are already publishing schema.org
linked data, either in the context of SchemaBibEx where they served as
reference implementations and proofs of concept, or in the context of
system procurement. But you can't win them all!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sat, 28 Jun 2014 16:14:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2014-06-28:/linked-data-interest-panel-part-1.html</guid><category>Linked Open Data</category><category>Coding</category><category>Evergreen</category><category>Structured data</category><category>coding</category><category>evergreen</category><category>structured data</category></item><item><title>RDFa introduction and codelabs for libraries</title><link>https://coffeecode.net/rdfa-introduction-and-codelabs-for-libraries.html</link><description>&lt;p&gt;My &lt;a class="reference external" href="http://stuff.coffeecode.net/2014/lld_preconference"&gt;RDFa introduction and codelab
materials&lt;/a&gt; for
the ALA 2014 preconference on &lt;a class="reference external" href="http://ala14.ala.org/node/14524"&gt;Practical linked data with open
source&lt;/a&gt; are now online!&lt;/p&gt;
&lt;p&gt;And now I've finished leading the RDFa + schema.org codelab that I've
been stressing over and refining for about a month at the American
Library Association annual conference &lt;em&gt;Practical linked data with open
source&lt;/em&gt; preconference. Long story short, most people got about as far as
I expected (part-way through the first exercise), but they all got
through the initial hurdles and learned enough to keep learning on their
own. My hopes are that this leads to:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;the implementation of structured or even linked data in existing
systems, for those that at least have systems that give them the
ability to edit their HTML templates&lt;/li&gt;
&lt;li&gt;the addition of linked data to library web pages the next time they
get refreshed or redesigned (it happens pretty often!)&lt;/li&gt;
&lt;li&gt;some patterns of implementation, so that we hopefully arrive at a
relatively standard way of marking up the same metadata (given the
many alternatives that we have just within schema.org for something
like a publisher)&lt;/li&gt;
&lt;li&gt;when tweaking templates for display or design purposes, to avoid
mangling existing structured data that a system like Evergreen, Koha,
or VuFind publishes by default&lt;/li&gt;
&lt;li&gt;more awesomeness in the world of library metadata!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Oh, and for posterity, I temporarily marked up this page to link to our
pizza order form as a really lame short URL service, and as I did that
impishly polluted the schema.org vocabulary with the new type
&lt;tt class="docutils literal"&gt;PizzaOrderPreferences&lt;/tt&gt;. I don't think that's going to make it into
the official vocab though! The code was:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
 &amp;lt;p vocab=&amp;quot;http://schema.org/&amp;quot; typeof=&amp;quot;PizzaOrderPreferences&amp;quot;&amp;gt;  And &amp;lt;a href=&amp;quot;http://doodle.com/exampleblahblah&amp;quot; property=&amp;quot;url&amp;quot;&amp;gt;order pizza here&amp;lt;/a&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;If our pizza order doesn't get gamed, that just shows how few people visit my blog!
&amp;lt;/p&amp;gt;
&lt;/pre&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 27 Jun 2014 15:06:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2014-06-27:/rdfa-introduction-and-codelabs-for-libraries.html</guid><category>Libraries</category><category>Coding</category><category>Evergreen</category><category>Structured data</category><category>coding</category><category>evergreen</category><category>structured data</category></item><item><title>Dropping back into the Semantic Web</title><link>https://coffeecode.net/dropping-back-into-the-semantic-web.html</link><description>&lt;p&gt;I've been at the 2014 Extended (formerly European) Semantic Web Conference (
&lt;a class="reference external" href="http://2014.eswc-conferences.org/"&gt;ESWC&lt;/a&gt;) in Anissaras, Greece for four
days now. My reason for attending was to present my paper &lt;em&gt;Seeding structured
data by default in open source library systems&lt;/em&gt; (&lt;a class="reference external" href="http://stuff.coffeecode.net/2014/eswc/"&gt;presentation&lt;/a&gt;) (&lt;a class="reference external" href="http://zone.biblio.laurentian.ca/dspace/handle/10219/2178"&gt;paper&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;It has been fantastic. As a librarian attending a conference dominated by
computer science academics, I was met with genuine interest in my work on
expressing schema.org metadata via RDFa in library catalogue web pages.
Despite my relative inexperience in this milieu of PhD candidates and faculty,
I was able to participate productively in the opening workshops and tutorials,
and enjoyed the keynotes and panel sessions (I'll happily admit, though, that I
was out of my depth in many of the main track sessions). And I was welcomed
into (and enjoyed) social events and situations, something I tend to worry
about when joining a new community.&lt;/p&gt;
&lt;p&gt;After many discussions, and particularly after attending the cleverly named
&lt;a class="reference external" href="http://salad2014.linkedservices.org/"&gt;SALAD2014&lt;/a&gt; (Services and
Applications over Linked APIs and Data) workshop and the keynote on day one by
&lt;a class="reference external" href="http://userpages.uni-koblenz.de/~staab/"&gt;Stefan Staab&lt;/a&gt;, my hope for many of
the promises of the Semantic Web proper has been rekindled. The awareness
amongst attendees of the need for pragmatism--support for developers and actual
results--beyond just the interesting academic research.&lt;/p&gt;
&lt;p&gt;These are good people, and this is a good community. Conference:
recommended!&lt;/p&gt;
&lt;p&gt;Oh, and there's this...&lt;/p&gt;
&lt;figure&gt;&lt;p&gt;&lt;img alt="image0" src="/uploads/pics/greece.jpg" /&gt;&lt;/p&gt;
&lt;figcaption&gt;&lt;p&gt;Sunset on the beach at Anissaras, Greece&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 28 May 2014 15:13:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2014-05-28:/dropping-back-into-the-semantic-web.html</guid><category>Linked Open Data</category><category>Coding</category><category>Structured data</category><category>coding</category><category>structured data</category></item><item><title>Tales of a semantic web dropout (or what I meant to say at code4lib 2014)</title><link>https://coffeecode.net/tales-of-a-semantic-web-dropout-or-what-i-meant-to-say-at-code4lib-2014.html</link><description>&lt;p&gt;Last week I had the fantastic experience of returning to the &lt;a class="reference external" href="http://code4lib.org/conference"&gt;code4lib
conference&lt;/a&gt; for the first time since
2008, and as a speaker to boot.&lt;/p&gt;
&lt;p&gt;The title of my talk was &lt;strong&gt;Structured data NOW: seeding schema.org in
library systems&lt;/strong&gt;. I had given two talks the prior week on a
substantially similar subject (about teaching Koha, Evergreen, and
VuFind how to express schema.org structured data via RDFa), but all
three conferences had very different audiences. I felt great about my
talks at LibTechConf and the Evergreen International Conference, but
those were one hour long and 45 minutes long respectively. code4lib, on
the other hand, schedules 20 minute slots; it is a veritable crucible
for speakers. I remixed and rewrote my code4lib talk obsessively leading
up to the conference, and ultimately ended up &lt;em&gt;adding&lt;/em&gt; content to my
overall message, which was obviously the wrong direction to take
things... but before this audience of my peers, I felt an absolute need
to explain &lt;em&gt;why&lt;/em&gt; I had chosen to spend much of the past year and a half
focused on RDFa and schema.org. And that ultimately led to having to cut
a significant amount out of the actual delivery, which meant that the
audience didn't get the takeaway message that I actually wanted to
deliver. One peer, in fact, described it as &amp;quot;a good refresher on
microdata&amp;quot; which was almost exactly what I had wanted to avoid doing
(microdata vs. RDFa aside) for this audience!&lt;/p&gt;
&lt;p&gt;So, let me pick things up where I left off; but first, I'll give you
time to go &lt;a class="reference external" href="https://www.youtube.com/watch?v=fCaBnzZZDug&amp;amp;feature=share&amp;amp;t=2m3s"&gt;watch the video
(YouTube)&lt;/a&gt;
or &lt;a class="reference external" href="http://stuff.coffeecode.net/2014/structured_data_now/"&gt;read through the
slides&lt;/a&gt; until
we get to the slide titled &lt;a class="reference external" href="http://stuff.coffeecode.net/2014/structured_data_now/#/10"&gt;Structured library
information&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;.............................&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;All caught up? Good! Now let's pretend that I had about ten more
minutes; here's roughly what I wanted to impart:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Structured library information&lt;/strong&gt;: given that schema.org offers the
&lt;a class="reference external" href="http://schema.org/Library"&gt;Library&lt;/a&gt; type, and library systems often
contain information such as the hours of operation, contact information,
physical address, and branch relationships, we can teach our library
systems to express that as structured data. And good news, Evergreen (as
of the 2.6 release) will do exactly that! So if you remember all the way
back to the start of the presentation where I was pointing at various
map services that had differing levels of knowledge about our libraries
often requiring different social media accounts, publishing your data
out in an openly accessible, standard format &lt;em&gt;should&lt;/em&gt; make it possible
for those map services (including
&lt;a class="reference external" href="http://openstreetmap.org"&gt;OpenStreetMap&lt;/a&gt;) to do a better job of
reflecting our presence in the world.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Thought experiment&lt;/strong&gt;: Now that we're publishing our holdings in a
commonly understood &lt;a class="reference external" href="http://schema.org/Offer"&gt;Offer&lt;/a&gt; format, and
linking those holdings to the library that holds them, and (in the case
of Evergreen) providing information about those libraries, &lt;em&gt;when can we
stop batch uploading MARC at irregular intervals just to create union
catalogs&lt;/em&gt;? In fact, wouldn't we be able to build ILL systems that can do
a much better, more competitive job once we're making this information
openly available on the web?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sitemaps&lt;/strong&gt;: Of course, to tell search engines and crawlers what pages
are of interest and when they have been updated, you have to offer a
&lt;a class="reference external" href="http://sitemaps.org"&gt;sitemap&lt;/a&gt;. Fortunately, Koha, VuFind, and
Evergreen (to a lesser extent) all support generation of sitemaps today.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quick union catalogues&lt;/strong&gt;: As a proof of concept, I proved that we can
build union catalogues on the backs of existing general search engines
by creating a Google Custom Search Engine (CSE) that tied together the
holdings of two different VuFind instances along with an Evergreen
instance &lt;a class="reference external" href="https://www.google.com/cse/publicurl?cx=001640895724279509587:bicww4ntllg"&gt;under a single search
box&lt;/a&gt;.
It is as ugly as sin, but it took me all of about ten minutes to cobble
together; Google had already crawled all of the pages, so I just had to
tell it what hostnames and URL patterns I cared about. The CSE even
gives you some limited support for directly querying the underlying
structured data. Later on, Sean Aery from Duke gave a lightning talk
that showed off how they had taken exactly this approach to provide a
search interface for their finding aids and digital collections and
&lt;a class="reference external" href="http://blogs.library.duke.edu/bitstreams/2014/03/27/schema-org-and-google-for-local-discovery-some-key-takeaways/"&gt;made it
beautiful&lt;/a&gt;` &amp;lt;&amp;gt;`__!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quick union catalogues: in progress&lt;/strong&gt;: As a firm believer in the
importance of decentralization, I pointed at a simple in-progress Python
script that would crawl sitemaps and extract structured data from all of
the indexed pages. My intention was to provide a complete indexed
solution with a simple web frontend, but I got a bit bogged down in
first &lt;a class="reference external" href="https://bugzilla.redhat.com/show_bug.cgi?id=1070074"&gt;updating&lt;/a&gt;
the Fedora packages for several of the
&lt;a class="reference external" href="https://bugzilla.redhat.com/show_bug.cgi?id=1070082"&gt;dependencies&lt;/a&gt;,
then tackling some &lt;a class="reference external" href="https://bugzilla.redhat.com/show_bug.cgi?id=1070082"&gt;bugs in the upstream libraries
themselves&lt;/a&gt;.
More to be done here!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;.............................&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Hmm. Well maybe I didn't miss conveying as much as I had feared. On the
bright side, there was a great deal of interest in the SchemaBibEx &amp;quot;best
practices and recommendations&amp;quot; documentation that I had promised we were
working on... and today Richard Wallis described some of &lt;a class="reference external" href="http://lists.w3.org/Archives/Public/public-schemabibex/2014Apr/0000.html"&gt;his work in
this
area&lt;/a&gt;.
So that's a good thing. And even if some of the audience walked away
from my talk with just an introduction to RDFa and schema.org, that put
them in an extremely good position to be able to enjoy and understand
Sean's subsequent lightning talk.&lt;/p&gt;
&lt;p&gt;Oh, and my admission of being a semantic web dropout (due to the
complexity of content negotiation and heterogeneous vocabularies and
billions of triples and RDF/XML) ended up being a perfect setup for the
immediately following talk &lt;em&gt;Next Generation Catalogue - RDF as a Basis
for New Services&lt;/em&gt; by Anne-Lena Westrum and Asgeir Rekkavik from the Oslo
Public Library, who basically said &amp;quot;Semantic web? Oh yeah, we can
totally do that!&amp;quot; and proceeded to show their MARC2RDF and RDF2MARC
workflows. Very cool stuff (and delightful scheduling by the conference
program committee!)&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 03 Apr 2014 01:19:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2014-04-03:/tales-of-a-semantic-web-dropout-or-what-i-meant-to-say-at-code4lib-2014.html</guid><category>Linked Open Data</category><category>Structured data</category><category>structured data</category></item><item><title>The state of structured data in Evergreen: 2.6 edition</title><link>https://coffeecode.net/the-state-of-structured-data-in-evergreen-26-edition.html</link><description>&lt;p&gt;Yesterday at the &lt;a class="reference external" href="http://evergreen-ils.org/conference/eg14/"&gt;2014 Evergreen International
Conference&lt;/a&gt; I presented
&lt;a class="reference external" href="http://goo.gl/hDxUep"&gt;Structured library data: holdings, libraries, and
beyond&lt;/a&gt;--a talk about the work I've done
specifically with Evergreen and making some of the connections with Koha
and VuFind's capabilities. Lots of attendees seemed happy with the talk
and the direction that we're going with Evergreen, and have hope for the
future relevance of our libraries' resources within normal search
engines, as well as all of the possibilities opened up by exposing this
open data about our libraries (locations, hours, branch relationships,
contact informatoin) and their resources in a much more consumable form.&lt;/p&gt;
&lt;p&gt;There was so much energy in the room, I could have talked for another
hour... I love the Evergreen community!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sat, 22 Mar 2014 15:23:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2014-03-22:/the-state-of-structured-data-in-evergreen-26-edition.html</guid><category>Libraries</category><category>Evergreen</category><category>Structured data</category><category>evergreen</category><category>structured data</category></item><item><title>RDFa, schema.org, and open source library systems</title><link>https://coffeecode.net/rdfa-schemaorg-and-open-source-library-systems.html</link><description>&lt;p&gt;Two things of note:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;I recently submitted the camera-ready copy for my ESWC 2014 paper,
&lt;a class="reference external" href="https://zone.biblio.laurentian.ca/dspace/handle/10219/2178"&gt;Seeding Structured Data by Default via Open Source Library Systems
(**preprint**)&lt;/a&gt;.
The paper focuses on the work I've done with Evergreen, Koha, and
VuFind to use emerging web standards such as RDFa Lite and schema.org
to attempt to improve the discoverability of library resources in the
search engines with which most people start their research, and
includes discussions about how that work informed my contributions to
the SchemaBibEx community group and our proposals to the W3C
WebSchemas group for extending schema.org. (&lt;em&gt;Aside:&lt;/em&gt; It is written in
LaTeX, per conference requirements, so PDF is the primary output and
you won't find much structured data in the paper itself...)&lt;/li&gt;
&lt;li&gt;Slightly earlier in the day, I
&lt;a class="reference external" href="http://2014librarytechnologyconference.sched.org/event/3831b52a0e5951553393cc138ae9fd83"&gt;presented&lt;/a&gt;
a more introductory take on my work and the work of SchemaBibEx at
the Library Technology Conference in St. Paul, Minnesota. People
seemed to be interested in finding out that roughly 4,000 library
systems will begin publishing structured data by default as the
Evergreen, VuFind, and Koha sites upgrade to the latest versions, and
also seemed intrigued by my ideas around turning the union catalogue
&amp;quot;perioidically upload MARC dumps&amp;quot; into a standard sitemap-based crawl
and extract pull operation. That presentation was called &lt;a class="reference external" href="http://stuff.coffeecode.net/2014/structured_data_on_it"&gt;Structuring
library data on the web: we are on
it!&lt;/a&gt; and
you can find the slides, well... where I just linked &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It has been fun and invigorating to hear the responses of those who are
seeing the results and direction of this work for the first time! More
thoughts to come...&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 20 Mar 2014 12:34:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2014-03-20:/rdfa-schemaorg-and-open-source-library-systems.html</guid><category>Libraries</category><category>Coding</category><category>FSOSS</category><category>Structured data</category><category>coding</category><category>fsoss</category><category>structured data</category></item><item><title>Building the Mozilla Location Service</title><link>https://coffeecode.net/building-the-mozilla-location-service.html</link><description>&lt;p&gt;&lt;strong&gt;tl;dr&lt;/strong&gt; Mozilla is building &lt;a class="reference external" href="https://location.services.mozilla.com/"&gt;a location service&lt;/a&gt; and you can help by running
&lt;a class="reference external" href="https://github.com/mozilla/MozStumbler/releases"&gt;MozStumbler&lt;/a&gt; on your
Android device.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external image-reference" href="https://location.services.mozilla.com/map#7/45.599/-78.080"&gt;&lt;img alt="Map showing Northern Ontario with line from Sudbury to Ottawa" class="serendipity-image-center" src="/uploads/pics/sudbury-ottawa.png" style="width: 972px; height: 603px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Last week I drew the blue line from Sudbury to Ottawa you see in the above map
by running MozStumbler on my phone as we headed out to celebrate Winterlude.
One day, that line might help you figure out where you are on your FirefoxOS
phone! Here's what's going on:&lt;/p&gt;
&lt;p&gt;GPS triangulates your position based on satellites, requires a line of sight to
those satellites, and can take minutes to get a lock on your location. If you
have a smartphone, you've probably noticed that running a maps application will
return your location in seconds, not minutes; that's because modern smartphones
use cell towers and wifi routers for triangulation purposes.&lt;/p&gt;
&lt;p&gt;Unlike GPS, your phone is usually continuously scanning for cell and wifi
routers, so the data is immediately available at no extra cost to your phone's
battery or CPU.&lt;/p&gt;
&lt;p&gt;However, while the major smartphone operating system manufacturers have built
databases that correlate cell towers and wifi routers with coordinates (and
raised some privacy concerns while they were at it -
&lt;a class="reference external" href="http://www.apple.com/ca/pr/library/2011/04/27Apple-Q-A-on-Location-Data.html"&gt;Apple&lt;/a&gt;,
&lt;a class="reference external" href="http://googleblog.blogspot.ca/2010/05/wifi-data-collection-update.html"&gt;Google&lt;/a&gt;),
this data is not openly available. A new operating system, such as Mozilla's
FirefoxOS, must licence a service such as
&lt;a class="reference external" href="http://www.skyhookwireless.com/apps-enterprise/"&gt;Skyhook's&lt;/a&gt;, or build
their own.&lt;/p&gt;
&lt;p&gt;True to its open principles, Mozilla is building its own database of location
information--the Mozilla Location Service--that aims &amp;quot;to provide an open
service to provide location data&amp;quot; (that page needs wordsmithing but I digress).
To collect the data, Mozilla offers an Android application called MozStumbler
that you can run while you're out and about; it will build a collection of
coordinates with wifi access points and cell towers, and then upload it to
Mozilla (either via your data connection, or later when you have wifi
connectivity if you prefer).&lt;/p&gt;
&lt;p&gt;Currently you have to
&lt;a class="reference external" href="https://github.com/mozilla/MozStumbler/releases"&gt;sideload the APK&lt;/a&gt; onto
your phone; it is not available on the Google Play Store (although it is on
&lt;a class="reference external" href="https://f-droid.org/repository/browse/?fdfilter=mozstumbler&amp;amp;fdid=org.mozilla.mozstumbler"&gt;F-Droid&lt;/a&gt;).
While the fledgling location API is &lt;a class="reference external" href="https://mozilla-ichnaea.readthedocs.org/en/latest/api/search.html"&gt;already available&lt;/a&gt;, it
remains to be seen how Mozilla will run this service: if, for example, it will
make data dumps available, or if it will rate-limit calls to the service. But
given Mozilla's long and laudable track record, it seems worthwhile to trust
that they will do the right thing and help them build their database.&lt;/p&gt;
&lt;p&gt;They have a long way to go. Comparing
&lt;a class="reference external" href="https://location.services.mozilla.com/stats"&gt;Mozilla's stats&lt;/a&gt; to
Skyhook's, Mozilla has collected observations about 0.7 million cell towers and
17.5 million wifi access points, vs. Skyhook's 30 million and 1 billion
respectively.&lt;/p&gt;
&lt;p&gt;So why not fire up MozStumbler on your phone? Hey, if a lowly guy from Sudbury
can, in a little over a week, get into the
&lt;a class="reference external" href="https://location.services.mozilla.com/leaders"&gt;top 200 data contributors&lt;/a&gt;
(me = &lt;strong&gt;``dbs``&lt;/strong&gt; and yes it was smart of Mozilla to gamify this effort), I
have no doubt that my peers in more heavily inhabited locations can blow past
me in no time!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 24 Feb 2014 06:02:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2014-02-24:/building-the-mozilla-location-service.html</guid><category>misc</category><category>Android</category><category>FSOSS</category><category>android</category><category>fsoss</category></item><item><title>We're not waiting for the ILS to change</title><link>https://coffeecode.net/were-not-waiting-for-the-ils-to-change.html</link><description>&lt;p&gt;Over at the &lt;strong&gt;Metadata Matters&lt;/strong&gt; blog, Diane Hillman wrote &lt;a class="reference external" href="http://managemetadata.com/blog/2014/02/18/why-are-we-waiting-for-the-ils-to-change/"&gt;Why Are We
Waiting for the ILS to
Change?&lt;/a&gt;,
asking (in the context of the difficulties libraries experience in
making their systems work with RDA):&lt;/p&gt;
&lt;blockquote&gt;
What I saw underlying that conversation was the assumption that the
only way change could happen was if the ILS’s themselves changed; in
other words if the ILS vendors decided to lead rather than follow.
The situation now is that system vendors say they’ll build RDA
compliant systems when their customers ask for them, and libraries
say that they’ll use ‘real’ RDA when there are systems that can
support it. This is a dance of death, and nobody wins.&lt;/blockquote&gt;
&lt;p&gt;I took this as a jumping-off point to discuss the state of linked data
support in library systems and discovery software and posted the
following comment (currently awaiting moderation):&lt;/p&gt;
&lt;blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Who's waiting? Sweden's LIBRIS took essentially the approach you
suggested back in 2007, and Bibliothèque Nationale de France and
Deutsche Nationalbibliothek have also followed similar paths.&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;On the smaller-scale, traditional library &amp;quot;integrated&amp;quot; side of
things Evergreen and Koha, and on the &amp;quot;disintegrated discovery
layer&amp;quot; side VuFind and Blacklight, have integrated RDFa or
microdata to publish structured data using schema.org. Here's
hoping these open source systems can spur the proprietary
alternatives to start competing and doing better.&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Ross Singer mentioned that Capita Prism offers linked data in N3 /
Turtle / RDF/XML / JSON from record details pages like
&lt;a class="reference external" href="http://capitadiscovery.co.uk/surrey-ac/items/1173856"&gt;http://capitadiscovery.co.uk/surrey-ac/items/1173856&lt;/a&gt;, so happily
there is at least one proprietary catalogue in the smaller-scale
library space doing work in this field.&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jumping from RDA to linked data might be a bit of a stretch, but the
lack of movement by proprietary vendors in particular hit a sore point
that I developed during some of our early W3 Schema.org Bibliographic
Extension Community Group discussions. I had asked if anyone else was
trying to actually implement what we were discussing. A response from
one of the proprietary software representatives was &amp;quot;No, we're waiting
to see what develops...&amp;quot; -- which is exactly the attitude that leads to
the &amp;quot;dance of death&amp;quot; that Diane described. It can also lead to decisions
that are suboptimal, ambiguous, or unimplementable because nobody
actually tried to put theory into practice.&lt;/p&gt;
&lt;p&gt;Thankfully, a small investment of effort into modifying open source
systems to serve as reference implementations can provide a significant
amount of insight into flaws or possibilities with otherwise theoretical
directions, as well as delivering practical benefits to everyone who
uses that software if those modifications are accepted by the parent
projects. Here's hoping that the more agile options like Koha,
Evergreen, VuFind, and Blacklight continue to push the evolution of
their proprietary competitors.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 21 Feb 2014 15:30:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2014-02-21:/were-not-waiting-for-the-ils-to-change.html</guid><category>misc</category><category>Evergreen</category><category>evergreen</category></item><item><title>Mapping library holdings to the Product / Offer mode in schema.org</title><link>https://coffeecode.net/mapping-library-holdings-to-the-product-offer-mode-in-schemaorg.html</link><description>&lt;p&gt;Back in August, I
&lt;a class="reference external" href="%20/archives/271-RDFa-and-schema.org-all-the-library-things.html"&gt;mentioned&lt;/a&gt;
that I taught Evergreen, Koha, and VuFind how to express library
holdings in schema.org via the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;http://schema.org/Offer&lt;/span&gt;&lt;/tt&gt; class. What I
failed to mention was how others can do the same with their own library
systems (well, okay, I linked to the &lt;a class="reference external" href="%20http://www.w3.org/community/schemabibex/wiki/Holdings_via_Offer"&gt;W3C Schema.org Bibliographic
Extension Community Group proposal for representing holdings via
Offer&lt;/a&gt;
but didn't focus on how one would go about doing that). This might have
led to Diane Hillman recently &lt;a class="reference external" href="http://managemetadata.com/blog/2014/02/03/talking-points-report/"&gt;finding the wrong, abandoned holdings
proposal&lt;/a&gt;
(thankfully Richard Wallis helped clear things up!). So, better late
than never, here is a quick summary:&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p class="first"&gt;Each copy that the library holds is marked up as an individual
&lt;tt class="docutils literal"&gt;`Offer&lt;/tt&gt; &amp;lt;&lt;a class="reference external" href="http://schema.org/Offer"&gt;http://schema.org/Offer&lt;/a&gt;&amp;gt;`__.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;The &lt;tt class="docutils literal"&gt;`itemOffered&lt;/tt&gt; &amp;lt;&lt;a class="reference external" href="http://schema.org/itemOffered"&gt;http://schema.org/itemOffered&lt;/a&gt;&amp;gt;`__ property
attaches an &lt;tt class="docutils literal"&gt;Offer&lt;/tt&gt; to a corresponding
&lt;tt class="docutils literal"&gt;`Product&lt;/tt&gt; &amp;lt;&lt;a class="reference external" href="http://schema.org/Product"&gt;http://schema.org/Product&lt;/a&gt;&amp;gt;`__ that contains the main
description of the goods. In most library systems, this is going to
be the title of the item, list of creators, abstract, subject
classifications, etc; that which we generally refer to as the
bibliographic record. While this will probably have its own type
already (&lt;tt class="docutils literal"&gt;Book&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;Movie&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;MusicAlbum&lt;/tt&gt; or the like), you
can also include &lt;tt class="docutils literal"&gt;Product&lt;/tt&gt; as a secondary type (either via a
whitespace-delimited list or via the schema.org &lt;tt class="docutils literal"&gt;additionalType&lt;/tt&gt;
property).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Mapping more familiar library terminology to the pertinent properties
from &lt;tt class="docutils literal"&gt;Offer&lt;/tt&gt; goes something like this:&lt;/p&gt;
&lt;/p&gt;&lt;ul class="simple"&gt;
&lt;li&gt;Library = &lt;tt class="docutils literal"&gt;seller&lt;/tt&gt; - the range of &lt;tt class="docutils literal"&gt;Organization&lt;/tt&gt; includes
&lt;tt class="docutils literal"&gt;Library&lt;/tt&gt; as a child type, so you can link to a highly
structured description of the library including hours of
operation, contact information, location... and that's exactly
what we now do in Evergreen&lt;/li&gt;
&lt;li&gt;Call number / shelf number = &lt;tt class="docutils literal"&gt;sku&lt;/tt&gt; - because a stock-keeping
unit number is &amp;quot;a merchant-specific identifier for a product or
service&amp;quot;, and what is a call number if not a means by which you
identify stock on the shelf?&lt;/li&gt;
&lt;li&gt;Barcode = &lt;tt class="docutils literal"&gt;serialNumber&lt;/tt&gt; - the unique &amp;quot;alphanumeric identifier
of a particular product&amp;quot;, am I right?&lt;/li&gt;
&lt;li&gt;Shelving location = &lt;tt class="docutils literal"&gt;availableAtOrFrom&lt;/tt&gt; - &amp;quot;[t]he place(s) from
which the offer can be obtained&amp;quot;; with a range of &lt;tt class="docutils literal"&gt;Place&lt;/tt&gt; this
really should be linked to sub-units of the &lt;tt class="docutils literal"&gt;Library&lt;/tt&gt; type you
pointed to for the &lt;tt class="docutils literal"&gt;seller&lt;/tt&gt; property, but schema.org does accept
reality and the inevitability that some plain text values are
going to be supplied where a typed range was indicated.&lt;/li&gt;
&lt;li&gt;Item status = &lt;tt class="docutils literal"&gt;availability&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;Borrowing terms = &lt;tt class="docutils literal"&gt;businessFunction&lt;/tt&gt; - another enumeration, for
which the most likely value for a library is
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;http://purl.org/goodrelations/v1#LeaseOut&lt;/span&gt;&lt;/tt&gt;. After all, what is
a library loan other than a lease with a limited period during
which the price is $0.00?&lt;/li&gt;
&lt;li&gt;Price = &lt;tt class="docutils literal"&gt;price&lt;/tt&gt; - while theoretically unnecessary, explicitly
specifying a price of $0.00 may satisfy search engines that always
expect to see a price attached to an offer (I'm looking at you,
&lt;a class="reference external" href="http://www.google.com/webmasters/tools/richsnippets"&gt;Google Structured Data Testing
Tool&lt;/a&gt;!)&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The language for some of the terminology may seem a little overly
commercial right now, but the next iteration of the schema.org standard
will adopt language that more broadly supports non-commercial
activities... and this broadening of a number of schema.org definitions
is also an outcome of the Schema BibEx community efforts. I'm pretty
happy with the results of the group over the last six months! Hopefully
this sheds some long-overdue light on some of the results of our
efforts, and helps other systems adopt our group's recommended practices
for exposing metadata via schema.org.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 03 Feb 2014 18:35:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2014-02-03:/mapping-library-holdings-to-the-product-offer-mode-in-schemaorg.html</guid><category>Libraries</category><category>Coding</category><category>Evergreen</category><category>Structured data</category><category>coding</category><category>evergreen</category><category>structured data</category></item><item><title>What would you understand if you read the entire world wide web?</title><link>https://coffeecode.net/what-would-you-understand-if-you-read-the-entire-world-wide-web.html</link><description>&lt;div vocab="http://schema.org/"&gt;&lt;p&gt;On Tuesday, February 4th, I'll be participating in Laurentian
University's Research Week lightning talks. Unlike most five-minute
lightning talk events in which I've participated, the time limit for
each talk tomorrow will be &lt;strong&gt;one&lt;/strong&gt; minute. Imagine 60 different
researchers getting up to summarize their research in one minute each,
and you have what is likely to be a brain-melting hour. Should be fun!&lt;/p&gt;
&lt;p&gt;Here's a rough draft of what I'm planning to say (which, when read at an
even cadence with decent intonation, comes out to exactly one minute:)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What would you understand if you read the _entire_ world wide web?&lt;/p&gt;
&lt;/p&gt;&lt;p&gt;As humans, we would understand a lot: but we can rely on the
context, structure, and significance of elements of web pages to
derive meaning.&lt;/p&gt;
&lt;/p&gt;&lt;p&gt;The algorithms behind search engines adopt a similar approach, but
struggle with ambiguity; when a web page mentions &amp;quot;Dan Scott&amp;quot;, is
it:&lt;/p&gt;
&lt;/p&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&amp;quot;Dan Scott&amp;quot; the character from the One Tree Hill TV show&lt;/li&gt;
&lt;li&gt;&amp;quot;Dan Scott&amp;quot; the artist from Magic the Gathering card game&lt;/li&gt;
&lt;li&gt;&amp;quot;Dan Scott&amp;quot; the Ontario academic professor from the University of
Waterloo&lt;/li&gt;
&lt;li&gt;&amp;quot;Dan Scott&amp;quot; the Ontario academic librarian from Laurentian
University&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;&lt;p&gt;schema.org is a vocabulary for embedding explicit meaning and intent
within web pages that offers a way to disambiguate those entities.&lt;/p&gt;
&lt;/p&gt;&lt;p&gt;My research is a collaborative effort--within the auspices of the
World Wide Web Consortium--to define bibliographic extensions for
schema.org where necessary, and best practices based on concrete
implementations in three different library systems.&lt;/p&gt;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 03 Feb 2014 15:40:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2014-02-03:/what-would-you-understand-if-you-read-the-entire-world-wide-web.html</guid><category>Linked Open Data</category><category>Coding</category><category>Evergreen</category><category>Structured data</category><category>coding</category><category>evergreen</category><category>structured data</category></item><item><title>Ups and downs</title><link>https://coffeecode.net/ups-and-downs.html</link><description>&lt;p&gt;Tuesday was not the greatest day, but at least each setback resulted in
a triumph...&lt;/p&gt;
&lt;p&gt;First, the &lt;a class="reference external" href="http://www.w3.org/community/schemabibex/wiki/Article"&gt;periodical proposal for
schema.org&lt;/a&gt;--that I
have poured a good couple of months of effort into--took a step closer to
reality when Dan Brickley &lt;a class="reference external" href="http://lists.w3.org/Archives/Public/public-vocabs/2014Jan/0180.html"&gt;announced on the public-vocabs list&lt;/a&gt; that
he had created a test build that incorporated the RDFS that I had written up.
Excitement rapidly turned to horror, though, as I realized that I had made a
classic copy/paste error, in which I had changed the displayed name of the
&lt;tt class="docutils literal"&gt;domainIncludes&lt;/tt&gt; value but had not changed the actual URI... Long story
short, the test build looked nothing like what the schemabibex group had agreed
on, and I was terribly embarrassed.&lt;/p&gt;
&lt;p&gt;Luckily, after I fixed the RDFS, Dan was able to put together a revised test
build later that day that actually reflected our intentions. So that can
continue moving forward...&lt;/p&gt;
&lt;p&gt;Second, our Evergreen instance started acting up rather badly. All of the
connections to the database server were being gobbled up, and we were
scrambling to figure out why. While I'm on sabbatical I'm not really supposed
to be involved in the day-to-day operations, but when a core service stops
running it's okay for research to wait for a little bit... Eventually I tracked
down a fix for a potential denial of service problem (
&lt;a class="reference external" href="https://bugs.launchpad.net/evergreen/+bug/1200770"&gt;Search result rendering can crush the system&lt;/a&gt;) that hadn't been merged
into our production system (the fix came out after the start of my sabbatical),
and shortly after I put that into production we were back up and running.&lt;/p&gt;
&lt;p&gt;Third, after the Evergreen problem was resolved, Bill Dueber pinged me
innocently on IRC. He had run into a problem with File_MARC; when serializing
MARC as MARC-in-JSON format, fields with a subfield &lt;tt class="docutils literal"&gt;$0&lt;/tt&gt; were getting
trashed. Data corrupting bugs are one of the most serious classes of bugs for
any package maintainer, so I jumped on this problem too...  After a little bit
of analysis, I figured out that PHP's type coercion for integer-like keys when
creating arrays and its &lt;a class="reference external" href="http://php.net/json_encode"&gt;json_encode()&lt;/a&gt;
implementation were combining to ruin the MARC-in-JSON serialization in this
one particular case. Faced with rewriting the entire serialization logic, I did
what any (in)sane programmer would and ended up running a regex against the
result of &lt;tt class="docutils literal"&gt;json_encode()&lt;/tt&gt; to turn the array-ified subfield &lt;tt class="docutils literal"&gt;$0&lt;/tt&gt; back into a
key/value pair. File_MARC 1.1.1 is now available at your nearest PEAR
mirror...&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 30 Jan 2014 15:00:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2014-01-30:/ups-and-downs.html</guid><category>misc</category><category>Coding</category><category>Evergreen</category><category>PHP</category><category>Structured data</category><category>coding</category><category>evergreen</category><category>php</category><category>structured data</category></item><item><title>Broadening support for linked data in MARC</title><link>https://coffeecode.net/broadening-support-for-linked-data-in-marc.html</link><description>&lt;p&gt;The following is an
&lt;a class="reference external" href="http://listserv.loc.gov/cgi-bin/wa?A2=ind1401&amp;amp;L=marc&amp;amp;T=0&amp;amp;P=1637"&gt;email&lt;/a&gt;
that I sent to the &lt;a class="reference external" href="http://listserv.loc.gov/listarch/marc.html"&gt;MARC mailing
list&lt;/a&gt; on January 24, 2014
that might be of interest to those looking to provide better support for
linked data in MARC (hopefully as just a transitional step):&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;In the spirit of making it possible to express linked data in MARC for
any data field, would it be worthwhile exploring the possibility of
defining subfield $0 as valid for all data fields, and then relaxing the
definition such that in the absence of a specific &lt;a class="reference external" href="http://www.loc.gov/marc/organizations/orgshome.html"&gt;MARC Organization
Code&lt;/a&gt; or &lt;a class="reference external" href="http://www.loc.gov/standards/sourcelist/standard-identifier.html"&gt;Source
Identifier
code&lt;/a&gt;,
it would be understood to be the default of Source Identifier &amp;quot;(uri)&amp;quot;
(that is, a URI)?&lt;/p&gt;
&lt;p&gt;Right now the mechanism for fields that can be controlled by authority
records would be to either figure out the mapping between the MARC
Organization code or Source Identifier code and some URI (if the
subfield 0 directly identifies the source of the authority record or
source identifier), or (in many systems) look up the local authority
record that controls the field, then look up the source for the
authority record (again having to use localized logic for the MARC
Organization code / Source Identifier code).&lt;/p&gt;
&lt;p&gt;The current limitations are that:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;subfield $0 can only currently be applied to a handful of fields&lt;/li&gt;
&lt;li&gt;systems have to parse out the code and number and reassemble them to
(potentially) find a linked source on the other side. For example, I
could teach Evergreen or VuFind or Koha (all systems to which I've
contributed varying amounts of code) to take any $0 that starts with
&amp;quot;(LoC)n&amp;quot; and know that it needs to map that to
&amp;quot;&lt;a class="reference external" href="http://id.loc.gov/authorities/names/n"&gt;http://id.loc.gov/authorities/names/n&lt;/a&gt; + number&amp;quot;, as well as mapping
&amp;quot;(LoC)sh&amp;quot; to &amp;quot;&lt;a class="reference external" href="http://id.loc.gov/authorities/subjects/sh"&gt;http://id.loc.gov/authorities/subjects/sh&lt;/a&gt; + number&amp;quot;,
but that's laborious and repetitive and likely to get out of sync
between systems rather rapidly.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The alternative that I'm proposing--to allow $0 on any field, and to
assume a default Source Identifier of &amp;quot;(uri)&amp;quot; in the absence of any
explicit identifier--would enable systems to provide links for entities
that are currently uncontrolled. For example, field 264
(producers/publishers/distributors/manufacturers) are currently not
controllable fields. If the proposal was accepted, however, when systems
generate record detail pages, they could include structured data that
identifies the producer/publisher/distributor/manufacturer.&lt;/p&gt;
&lt;p&gt;I will certainly acknowledge that it's not a perfect proposal as-is, as
for a 264 you would most likely want to provide a link for subfield $b
and a separate link for subfield $a, whereas for many other fields
you're providing a link for the entire combination of subfields -- but
it would be a step forward from where we are now.&lt;/p&gt;
&lt;p&gt;An extension, then, would be to provide some optional means of defining
for which subfield(s) the $0 provides a controlling link; for example,
using square-brackets and 1-indexed positional integers you could do
something slightly horrible like:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
264 #1 $a Cambridge : $b Elsevier, $c 2013 $0 [1]http://dbpedia.org/resource/Cambridge,_Massachusetts $0 [2]http://dbpedia.org/resource/Elsevier
&lt;/pre&gt;
&lt;p&gt;The advantage here is that you can maintain the existing punctuation but
have tightly defined linked entities that you can then express when you
publish information about this record elsewhere--and you have a ready
handle for pulling in more information about any of the linked resources
within your MARC-based systems--without having to subsequently do string
clean-up and entity matching, etc. And this gives us, perhaps, a way
forward from MARC to something else that is more focused on linked data.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: I want to thank Karen Coyle for first getting me to think
about this problem with her blog post &lt;a class="reference external" href="http://kcoyle.blogspot.ca/2013/07/linked-data-first-steps-catch-21.html"&gt;Linked Data First Steps &amp;amp;
Catch-21&lt;/a&gt;&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Thanks for any consideration that might go into this informal
proposal,&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Dan Scott&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 24 Jan 2014 19:38:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2014-01-24:/broadening-support-for-linked-data-in-marc.html</guid><category>Libraries</category><category>Coding</category><category>Structured data</category><category>coding</category><category>structured data</category></item><item><title>Want citations? Release your work!</title><link>https://coffeecode.net/want-citations-release-your-work.html</link><description>&lt;p&gt;Last week I was putting the finishing touches on the first serious
academic paper I have written in a &lt;em&gt;long&lt;/em&gt; time, and decided that I
wanted to provide backup for some of the assertions I had made.
Naturally, the deadline was tight, so getting any articles via
interlibrary loan was out of the question. This was going to be a purely
electronic, immediate access affair.&lt;/p&gt;
&lt;p&gt;So what does a systems librarian with a vast array of licensed materials
(the &lt;em&gt;dark web&lt;/em&gt; as the info lit people like to say) at his university's
disposal do when faced with a research problem like this? Well, turn to
&lt;strong&gt;Google Scholar&lt;/strong&gt;, naturally.&lt;/p&gt;
&lt;p&gt;As it turns out, I was able to find the majority of what I needed
through Google Scholar: this will come as a surprise to no-one who has
used it, but it's remarkably good at finding electronic copies of
articles and conference proceedings. Sometimes they are preprints on the
conference website; sometimes they are copies posted in the
institutional repository or on the researcher's own website; sometimes
they are what appears to be illicit copies&lt;sup&gt;*&lt;/sup&gt; (you can tell by
the watermark) posted on random domains. The more recent the article,
the more likely it seemed I was able to find an on-demand copy.&lt;/p&gt;
&lt;p&gt;My work is in the intersection of the semantic web and library systems,
so it's perhaps not surprising that the library-oriented articles tended
to have been published further in the past and were less likely to have
a freely available copy available, whereas almost anything of interest
on the semantic web side was immediately available. I suspect that not
many people were thinking about open access to research in the 90's;
still, it made me cringe a little to find familiar names amongst the
authors of papers on open source library software that I would have
liked to cite, but which were locked behind a paywall that not even my
university (with its amazing provincial and federal consortium deals)
had licensed access. So, of course, the citations went to papers that
were available to me.&lt;/p&gt;
&lt;p&gt;Call it anecdotal, call me a lazy researcher, but to me the evolution
seems inevitable. If your work is freely available (ideally via a
properly legal venue, like publishing in an open access journal, or
deposiiting copy of your paper in your institutional repository or on
your web site--assuming your publication contract allows it) then you
are more likely to get citations; and if that pattern continues and
coincides with citation counts as one measure of a researcher's
effectiveness, what will the incentive be for keeping your work locked
behind a paywall?&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;&lt;strong&gt;*&lt;/strong&gt;A notable example is the seminal article &amp;quot;The Semantic Web&amp;quot;
written by Tim Berners-Lee, James Hendler, and Ora Lassila and published
in &lt;em&gt;Scientific American&lt;/em&gt; in 2001. The official version of the paper is
locked behind Scientific American's paywall at
&lt;a class="reference external" href="http://www.scientificamerican.com/article/the-semantic-web/"&gt;http://www.scientificamerican.com/article/the-semantic-web/&lt;/a&gt; and they
serve up interstitial ads between searches on their site(!). The primary
electronic version offered up by Google Scholar, on the other hand, is a
PDF posted at &lt;a class="reference external" href="http://isel2918929391.googlecode.com/svn-history/r347/trunk/RPC/Slides/p01_theSemanticWeb.pdf"&gt;Google
Code&lt;/a&gt;.
Google Code is hardly a notable scholarly publishing site, but I bet it
serves up way more copies than SciAm does.&lt;sup&gt;**&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;**&lt;/strong&gt;Note that if you dig into all of the available copies of the
article, there are hundreds scattered across university course pages and
semantic web community sites. (Cue Darth Vader: &amp;quot;The infringement is
strong in this one.&amp;quot;) I assume SciAm knows that the blowback of trying
to enforce copyright measures against infringers with this particular
high-profile article would be intense; I'm not sure what lesson we're
supposed to derive from that.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 21 Jan 2014 14:51:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2014-01-21:/want-citations-release-your-work.html</guid><category>misc</category><category>Coding</category><category>Structured data</category><category>coding</category><category>structured data</category></item><item><title>A slice of sabbatical</title><link>https://coffeecode.net/a-slice-of-sabbatical.html</link><description>&lt;p&gt;Yesterday I tested, signed off, and pushed a
&lt;a class="reference external" href="https://bugs.launchpad.net/evergreen/+bug/1047485"&gt;bunch&lt;/a&gt;
&lt;a class="reference external" href="https://bugs.launchpad.net/evergreen/+bug/803817"&gt;of&lt;/a&gt;
&lt;a class="reference external" href="https://bugs.launchpad.net/evergreen/+bug/1235474"&gt;bug&lt;/a&gt;
&lt;a class="reference external" href="https://bugs.launchpad.net/evergreen/+bug/1238240"&gt;fixes&lt;/a&gt;
&lt;a class="reference external" href="https://bugs.launchpad.net/evergreen/+bug/1192058"&gt;for&lt;/a&gt; the
Evergreen library system. Not going to lie; I'm hoping that by clearing
up some of the backlog, a few of my own code contributions (like &lt;a class="reference external" href="https://bugs.launchpad.net/evergreen/+bug/1261939"&gt;&amp;quot;Add
per-library info pages with schema.org structured data
support&amp;quot;&lt;/a&gt; and
&lt;a class="reference external" href="https://bugs.launchpad.net/evergreen/+bug/1267231"&gt;Enhanced title
display&lt;/a&gt;) might
get some attention... both branches go a long way towards improving the
state of &lt;a class="reference external" href="http://schema.org"&gt;schema.org structured data&lt;/a&gt; support in
Evergreen.&lt;/p&gt;
&lt;p&gt;Today, I took the W3C Schema.org Bibliographic Extension &lt;a class="reference external" href="http://www.w3.org/community/schemabibex/wiki/Article"&gt;proposal for
adding support for
periodicals&lt;/a&gt;
and converted it from wiki format into the RDF Schema format desired by
the &lt;a class="reference external" href="http://www.w3.org/wiki/WebSchemas"&gt;W3C Web Schemas&lt;/a&gt; group. That
draft lives
&lt;a class="reference external" href="https://github.com/dbs/schemabibex/blob/master/schema.org/ext/periodicals.html"&gt;here&lt;/a&gt;
and doesn't look like much. Funny to think that that represents a few
months of committee work (two hundred emails or thereabouts, with three
conference calls in the mix as well).&lt;/p&gt;
&lt;p&gt;I also pushed updated versions of the Perl MARC::Charset and
MARC::Record packages to the Fedora Linux distribution. We library types
need our tools in top condition, and I had let the packages lag behind
the released versions for a while. Nice to clear that off my plate.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 21 Jan 2014 03:22:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2014-01-21:/a-slice-of-sabbatical.html</guid><category>misc</category><category>Evergreen</category><category>Structured data</category><category>evergreen</category><category>structured data</category></item><item><title>File_MARC: 1.0.1 release fixes data corruption bug</title><link>https://coffeecode.net/file_marc-101-release-fixes-data-corruption-bug.html</link><description>&lt;p&gt;I released &lt;a class="reference external" href="http://pear.php.net/package/File_MARC/"&gt;File_MARC 1.0.1&lt;/a&gt;
yesterday after receiving a bug report from the most excellent &lt;a class="reference external" href="http://www.sfu.ca/~mjordan/"&gt;Mark
Jordan&lt;/a&gt; about a basic (but data
corrupting) problem that had existed since the very early days (almost
seven years ago). If you generate MARC binary output from File_MARC,
you should upgrade &lt;strong&gt;immediately&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;In the MARC binary output code, I was testing a string for the presence
of a value--roughly, &amp;quot;if ($value)&amp;quot;--and returning false if no value was
present. Which is fine, except when said value was '0', in which case
that test returns FALSE. Whoops.&lt;/p&gt;
&lt;p&gt;It's one of the oldest gotchas in PHP, and it lived for a very long time
in this library. Probably because very few people want to generate MARC
binary output. But now, that bug is squashed, and a unit test will
ensure that it does not come back.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 31 Oct 2013 19:14:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2013-10-31:/file_marc-101-release-fixes-data-corruption-bug.html</guid><category>Libraries</category><category>Coding</category><category>coding</category></item><item><title>Talk proposal: Structuring library data on the web with schema.org: we're on it!</title><link>https://coffeecode.net/talk-proposal-structuring-library-data-on-the-web-with-schemaorg-were-on-it.html</link><description>&lt;p&gt;I submitted the following proposal to the &lt;a class="reference external" href="http://libtechconf.org/"&gt;Library Technology Conference
2014&lt;/a&gt; and thought it might be of general
interest.&lt;/p&gt;
&lt;div vocab="http://schema.org/" typeof="Article"
style="margin-left: 2em; margin-right: 2em; margin-top: 1em;"&gt;
&lt;h3 property="name"&gt;&lt;p&gt;Structuring library data on the web with schema.org: we're on it!&lt;/p&gt;
&lt;/h1&gt;
&lt;/p&gt;&lt;p class="rubric" id="abstract"&gt;Abstract&lt;/p&gt;
&lt;div property="description"&gt;&lt;p&gt;Until recently, there has been a disappointing level of adoption of
schema.org structured data in traditional core library systems such as
catalogues and institutional repositories. But there is still hope!&lt;/p&gt;
&lt;p&gt;In this session, l'll briefly (re)introduce you to the schema.org
vocabulary as expressed in microdata and RDFa and convince you that it
matters to libraries, explain how our W3 Schema Bib Extend group
participates in the schema.org development process, identify library
systems that now publish schema.org structured data by default, and
explore emerging possibilities for enhancing libraries' presence on the
web with structured data.&lt;/p&gt;
&lt;/div&gt;&lt;p class="rubric" id="full-description"&gt;Full description&lt;/p&gt;
&lt;div property="articleBody"&gt;&lt;p&gt;While the semantic web surfaced in the popular consciousness around 2001
with Tim Berners-Lee's &lt;a class="reference external" href="http://www.sciam.com/article.cfm?articleID=00048144-10D2-1C70-84A9809EC588EF21"&gt;article in Scientific
American&lt;/a&gt;,
concrete efforts to populate the semantic web were largely academic
exercises weighed down by RDF/XML and focuses on millions and billions
of &amp;quot;triples&amp;quot;. Some vocabularies such as FOAF enjoyed pockets of real
adoption, and lightweight structured data approaches such as
microformats made progress through the mid-to-late 2000s in offering
machine-readable data on the web. However, everything changed in 2011
when Google, Bing, and Yahoo &lt;a class="reference external" href="http://blog.schema.org/2011/07/on-june-2-nd-we-announced-collaboration.html"&gt;published the schema.org
vocabulary&lt;/a&gt;
and announced their intention to offer richer search results for web
pages that incorporated schema.org structured data.&lt;/p&gt;
&lt;p&gt;While search engine optimization experts and publishers on the web
quickly realized the value of schema.org, the library community has been
more reserved in its adoption of schema.org. The &lt;a class="reference external" href="http://evergreen-ils.org"&gt;Evergreen open source
integrated library system&lt;/a&gt; began publishing
basic schema.org microdata in its catalogue with its 2.2.0 release in
June 2012, and &lt;a class="reference external" href="http://www.oclc.org/news/releases/2012/201238.en.html"&gt;OCLC
WorldCat&lt;/a&gt; also
began publishing schema.org via JSON in June 2012. Until recently, those
were effectively the only library systems to implement schema.org
structured data, but the efforts helped inform the creation of the &lt;a class="reference external" href="http://www.w3.org/community/schemabibex/"&gt;W3
Schema Bib Extend community
group&lt;/a&gt; in September 2012.
This group is focused on identifying best practices for the use of and
proposals for enhancements to schema.org as it relates to bibliographic
data. In this presentation, I will highlight the work of the W3 Schema
Bib Extend group and outline the schema.org enhancement process to show
that mere mortals like us can influence the development of structured
data vocabularies used by major search engines.&lt;/p&gt;
&lt;p&gt;In October 2013, library systems became much more credible participants
to the schema.org community: Evergreen greatly improved its schema.org
implementation, and &lt;a class="reference external" href="http://koha-community.org/"&gt;Koha&lt;/a&gt; and
&lt;a class="reference external" href="http://vufind.org/"&gt;VuFind&lt;/a&gt; added their own equally robust
schema.org implementations. We will walk through examples of the rich
structured data exposed by these systems to demonstrate how approachable
schema.org can be for developers of other library systems. We will also
see how a simple discovery layer can be built solely from the structured
data extracted from these systems.&lt;/p&gt;
&lt;p&gt;As an active member of the W3 Schema Bib Extend group and the developer
behind the schema.org support in Evergreen, Koha, and VuFind, I will
wrap up the session with some thoughts about how we are still only at
the beginning of schema.org adoption and search result enrichment in the
library world, and suggest some concrete steps that system and web
developers in libraries can take to improve the state of structured data
on their section of the web.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Most of this was written between 1:00 am and 3:00 am, and unfortunately
that shows through here and there. Given that most of you are &lt;em&gt;way&lt;/em&gt;
smarter than me, maybe you can point out other library systems that now
have schema.org baked into their web pages, or you can offer
corrections? Also, if you're organizing a library technology conference
or symposium and are interested in a similar presentation, get in touch
with me!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 17 Oct 2013 14:09:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2013-10-17:/talk-proposal-structuring-library-data-on-the-web-with-schemaorg-were-on-it.html</guid><category>Libraries</category><category>Coding</category><category>Structured data</category><category>coding</category><category>structured data</category></item><item><title>File_MARC makes it to stable 1.0.0 release (finally!)</title><link>https://coffeecode.net/file_marc-makes-it-to-stable-100-release-finally.html</link><description>&lt;p&gt;Way back in 2006, I thought &amp;quot;&lt;em&gt;It's a shame there is no PHP library for
parsing MARC records!&lt;/em&gt;&amp;quot;, and given that much of my most recent coding
experience was in the PHP realm, I thought it would be a good way of
contributing to the world of &lt;a class="reference external" href="http://code4lib"&gt;code4lib&lt;/a&gt;. Thus
&lt;a class="reference external" href="/archives/92-Double-barreled-PHP-releases.html"&gt;File_MARC&lt;/a&gt;
was born in October 2006. At the time, I had aspirations of quickly
iterating to a 1.0.0 stable release. &lt;strong&gt;Hah!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Seven years later, I have finally cut a 1.0.0 stable release of the
&lt;a class="reference external" href="http://pear.php.net/File_MARC"&gt;File_MARC library for PHP&lt;/a&gt;. The
major reason I had been hesitating was that I really wanted to &lt;a class="reference external" href="/archives/148-Oooh...-looks-like-Ive-got-even-more-work-cut-out-for-me.html"&gt;cut over
to the
native&lt;/a&gt;
&lt;a class="reference external" href="http://php.net/SplDoublyLinkedList"&gt;SplDoublyLinkedList class&lt;/a&gt;
instead of my own user-space linked list. In the end, I still had to add
a small shim to enable nodes to be inserted anywhere in the linked list
(&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;SplDoublyLinkedList::add()&lt;/span&gt;&lt;/tt&gt; was not added to PHP until 5.5.0, to
which few users will have easy access for a while), but I'm much happier
about the result.&lt;/p&gt;
&lt;p&gt;The best thing about this release is that it means you no longer have to
add &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-beta&lt;/span&gt;&lt;/tt&gt; to your install command, which tripped many people up, I'm
sure. That is, you can simply install it with:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
pear install File_MARC
&lt;/pre&gt;
&lt;p&gt;Thanks to Bill Dueber and Ross Singer for pestering me to go ahead and
get this thing stable, and to Demian Katz and Mark Jordan for testing
out the final code!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 04 Oct 2013 14:42:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2013-10-04:/file_marc-makes-it-to-stable-100-release-finally.html</guid><category>Libraries</category><category>Coding</category><category>PHP</category><category>coding</category><category>php</category></item><item><title>Finally tangoed with reveal.js to create presentations</title><link>https://coffeecode.net/finally-tangoed-with-revealjs-to-create-presentations.html</link><description>&lt;p&gt;... and I have enjoyed the dance. Yes, I know I'm way behind the times.
Over the past few years I was generating presentations via
&lt;a class="reference external" href="http://asciidoc.org"&gt;asciidoc&lt;/a&gt;, and I enjoyed its very functional
approach and basic output. However, recently I used Google Drive to
quickly create a few slightly prettier but much less reusable
presentations. Where &lt;em&gt;reusable&lt;/em&gt; means having quick access to the images,
version control for tweaking code snippets, etc.&lt;/p&gt;
&lt;p&gt;I was starting to feel pretty hypocritical, partially because Google
Drive is not free software (and using and advancing free-as-in-freedom /
open source software is very important to me), but also because my work
has been focused on structured data. Google Drive does not generate
content that contains structured data, so using purely
presentation-oriented materials as a way of talking about structured
data seemed deeply wrong.&lt;/p&gt;
&lt;p&gt;Fortunately, &lt;a class="reference external" href="http://lab.hakim.se/reveal-js"&gt;reveal.js&lt;/a&gt; relies on
plain old HTML5 + CSS, meaning that I can:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Embed structured data, such as &lt;a class="reference external" href="http://schema.org"&gt;schema.org&lt;/a&gt;, in
the presentation itself&lt;/li&gt;
&lt;li&gt;Get all the benefits of version control for the granular assets, and&lt;/li&gt;
&lt;li&gt;Put my hard-won CSS knowledge to work when I want the &lt;em&gt;pretties&lt;/em&gt;
(well, as pretty as anything I create).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For an example of a presentation I just put together with reveal.js, see
&lt;a class="reference external" href="http://stuff.coffeecode.net/2013/GDG_DevFest_schema.org"&gt;Structuring data on the web with
schema.org&lt;/a&gt;.
Not a bad look with the default stylesheets, although I did remove the
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;text-transform:&lt;/span&gt; uppercase&lt;/tt&gt; for headings. (I mean, who does that?!?)&lt;/p&gt;
&lt;p&gt;Now I just need to overhaul my blog infrastructure...&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 26 Sep 2013 18:11:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2013-09-26:/finally-tangoed-with-revealjs-to-create-presentations.html</guid><category>Software Freedom</category><category>Coding</category><category>Structured data</category><category>coding</category><category>structured data</category></item><item><title>RDFa and schema.org all the library things</title><link>https://coffeecode.net/rdfa-and-schemaorg-all-the-library-things.html</link><description>&lt;p&gt;&lt;em&gt;TLDR&lt;/em&gt;: The &lt;a class="reference external" href="http://evergreen-ils.org"&gt;Evergreen&lt;/a&gt; and
&lt;a class="reference external" href="http://koha-community.org"&gt;Koha&lt;/a&gt; integrated library systems now express
their record details in the schema.org vocabulary out of the box using RDFa.&lt;/p&gt;
&lt;p&gt;Individual holdings are expressed as &lt;a class="reference external" href="http://schema.org/Offer"&gt;Offer&lt;/a&gt;
instances per the
&lt;a class="reference external" href="http://www.w3.org/community/schemabibex/wiki/Holdings_via_Offer"&gt;W3C Schema Bib Extension community group proposal&lt;/a&gt; to
parallel commercial sales offers. &lt;em&gt;And&lt;/em&gt; I have published a branch to give the
same capabilities to the &lt;a class="reference external" href="http://vufind.org"&gt;VuFind&lt;/a&gt; discovery layer, as
well.&lt;/p&gt;
&lt;p&gt;In the spring of 2012, I took my first steps in the structured data world by
teaching Evergreen 2.2 how to express some record details in
&lt;a class="reference external" href="http://schema.org"&gt;schema.org&lt;/a&gt;. It was a small step towards taking the
machine-readable data that we had made useful to humans on the record detail
catalogue page and marking it up so that it was once again machine readable. At
that time, Evergreen only knew how to map MARC data to two schema.org types
(&lt;tt class="docutils literal"&gt;Book&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;MusicRecording&lt;/tt&gt;--which should have been &lt;tt class="docutils literal"&gt;MusicAlbum&lt;/tt&gt;, but I
eventually fixed that) and a handful of attributes: &lt;tt class="docutils literal"&gt;name&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;ISBN&lt;/tt&gt;,
&lt;tt class="docutils literal"&gt;publisher&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;publication date&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;author&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;contributor&lt;/tt&gt;, and
&lt;tt class="docutils literal"&gt;keywords&lt;/tt&gt;. Pretty barebones, but a start nonetheless.&lt;/p&gt;
&lt;p&gt;I used the HTML5 microdata approach because I was new to structured data and
microdata was what was demonstrated in all of the schema.org examples, so it
seemed like the obvious choice. Over the last year, however, I realized that
&lt;a class="reference external" href="http://www.w3.org/TR/rdfa-syntax/"&gt;RDFa&lt;/a&gt; is a W3C standard for
accomplishing the same goals as microdata, bolstered by an open community
standards-making process, and featuring the ability to mix in properties and
types from multiple vocabularies. I touched on this in my Evergreen 2013
conference presentation: &lt;a class="reference external" href="/archives/264-Structured-data-making-metadata-matter-for-machines.html"&gt;Structured data: making metadata matter for machines&lt;/a&gt;.
While &lt;a class="reference external" href="http://www.w3.org/TR/rdfa-lite/"&gt;RDFa Lite&lt;/a&gt; is extremely easy to get
started with, I have been diving deeper into RDFa proper to make use of some of
the more advanced properties, such as &lt;tt class="docutils literal"&gt;&amp;#64;about&lt;/tt&gt; to work around unwanted
chaining introduced by &lt;tt class="docutils literal"&gt;&amp;#64;href&lt;/tt&gt; attributes.&lt;/p&gt;
&lt;p&gt;Over the last few weeks, I was able to concentrate on improving the schema.org
mapping for Evergreen--introducing holdings as instances of the
&lt;a class="reference external" href="http://schema.org/Offer"&gt;http://schema.org/Offer&lt;/a&gt; class, providing much more granular author and
contributor data--and cut over to RDFa. While the tools at
&lt;a class="reference external" href="http://rdfa.info/tools"&gt;RDFa Tools&lt;/a&gt; were quite useful for debugging my
efforts, I also have to thank the denizens of the
&lt;a class="reference external" href="irc://irc.w3.org:6665/#rdfa"&gt;#rdfa IRC channel&lt;/a&gt; (and
&lt;a class="reference external" href="http://manu.sporny.org/about"&gt;Manu Sporny&lt;/a&gt; in particular) for patiently
helping me understand some of my rookie mistakes. Ben Shum also kept me honest
by patiently testing multiple iterations of my branches with the Google Rich
Snippets tool and reporting any issues that he encountered; this led to my
realization that using &lt;tt class="docutils literal"&gt;&amp;#64;resource&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;&amp;#64;about&lt;/tt&gt; were necessary in some
contexts.&lt;/p&gt;
&lt;p&gt;Once I had worked out a decent mapping in Evergreen (a library system I have
been contributing to for over six years now), I decided to tackle the VuFind
discovery layer. VuFind uses a straightforward template system, and I was able
to put together a branch that integrated schema.org as RDFa (details at
&lt;a class="reference external" href="http://vufind.org/jira/browse/VUFIND-425"&gt;VuFind bug 425&lt;/a&gt;), building on
Eoghan Ó Carragáin's initial efforts. Once again I included holdings-as-Offers,
as the Evergreen driver for VuFind made that easy enough to test. As part of my
work, I contributed some enhancements for the Evergreen driver that have
already been integrated into VuFind. The initial reception from the VuFind
community was positive, although my branch arrived too late for the VuFind 2.1
release; if all goes well, it will be integrated for the VuFind 2.2 release. In
the mean time, sites running VuFind that want schema.org structured data can
integrate my branch themselves--and please provide feedback!&lt;/p&gt;
&lt;p&gt;As I was on a roll, I also opted to tackle the Koha integrated library system.
With some initial pointers from Galen Charlton and Chris Cormack to the
XSLT-based templating system that Koha uses, I was able to implement schema.org
with holdings-as-Offers in a matter of hours for the first iteration.  Jared
Camins then worked patiently with me as I added small commits to address issues
that came up on the Evergreen side, but in under a week from start to finish
the branch was signed off, passed QA, and and pushed to master.&lt;/p&gt;
&lt;p&gt;(It actually broke the build due to a coding violation--&lt;strong&gt;doh!&lt;/strong&gt;--but that
was quickly cleaned up.)&lt;/p&gt;
&lt;p&gt;The upshot? We now have two library systems set to publish rich
schema.org structured data--including holdings--in RDFa, out of the box by
default, in their record detail pages on the Web, and a third system ready to
go.&lt;/p&gt;
&lt;p&gt;Let me simply say that I &lt;em&gt;love&lt;/em&gt; the agility of open source software. So, for
the future, I intend to tackle a few more library systems; digital repositories
seem like they would be worthwhile targets. On that front, I have
&lt;a class="reference external" href="http://sourceforge.net/mailarchive/message.php?msg_id=31245519"&gt;inquired&lt;/a&gt;
on the DSpace developers' list about whether there is still interest in
integrating schema.org (as had been expressed a year ago), but have not yet
received a reply. Perhaps ArchivesSpace, or furthering the existing support on
Islandora? Let me know if you're interested!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 30 Aug 2013 16:56:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2013-08-30:/rdfa-and-schemaorg-all-the-library-things.html</guid><category>Libraries</category><category>Coding</category><category>Evergreen</category><category>coding</category><category>evergreen</category></item><item><title>A Flask of full-text search in PostgreSQL</title><link>https://coffeecode.net/a-flask-of-full-text-search-in-postgresql.html</link><description>&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; More conventional versions of the slides are available from
&lt;a class="reference external" href="https://docs.google.com/presentation/d/1xKwBDYQUjrwMIMh3N64lhKK5H60F3C8SWX49KWJBshM/edit?usp=sharing"&gt;Google
Docs&lt;/a&gt;
or in &lt;a class="reference external" href="https://speakerdeck.com/pyconca/a-flask-of-full-text-search-with-postgresql-dan-scott"&gt;on Speakerdeck
(PDF)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;On August 10, 2013, I gave the following talk at the &lt;a class="reference external" href="http://2013.pycon.ca"&gt;PyCon Canada
2013&lt;/a&gt; conference:&lt;/p&gt;
&lt;p&gt;&lt;img alt="image0" class="serendipity-image-center" src="/uploads/talks/2013/postgresql_fts_0.png" style="width: 960px; height: 720px;" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image1" class="serendipity-image-center" src="/uploads/talks/2013/postgresql_fts_1.png" style="width: 960px; height: 720px;" /&gt;&lt;/p&gt;
&lt;p&gt;I’m a systems librarian at Laurentian University.&lt;/p&gt;
&lt;p&gt;For the past six years, my day job and research have enabled me to
contribute pretty heavily to Evergreen, an open source library system
written largely in Perl and built on PostgreSQL.&lt;/p&gt;
&lt;p&gt;But when I have the opportunity to create a project from scratch, for
work or play, Python is my go-to language.&lt;/p&gt;
&lt;p&gt;&lt;img alt="image2" class="serendipity-image-center" src="/uploads/talks/2013/postgresql_fts_2.png" style="width: 960px; height: 720px;" /&gt;&lt;/p&gt;
&lt;p&gt;I promised to provide an example of a full-text search engine built with
Flask and PostgreSQL written in under 200 lines of code; you can find
that at either
&lt;a class="reference external" href="https://gitorious.org/postgresql-full-text-search-engine"&gt;Gitorious&lt;/a&gt;
or
&lt;a class="reference external" href="https://github.com/dbs/postgresql-full-text-search-engine"&gt;Github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="image3" class="serendipity-image-center" src="/uploads/talks/2013/postgresql_fts_3.png" style="width: 960px; height: 720px;" /&gt;&lt;/p&gt;
&lt;p&gt;Last summer, the Laurentian University Library digitized 50 years of
student newspapers - over 1,000 issues.&lt;/p&gt;
&lt;p&gt;We posted them all to the Internet Archive and got OCR’d text as a
result.&lt;/p&gt;
&lt;p&gt;But finding things within a particular collection on the Internet
Archive can be difficult for most people, so we felt the need to create
a local search solution.&lt;/p&gt;
&lt;p&gt;&lt;img alt="image4" class="serendipity-image-center" src="/uploads/talks/2013/postgresql_fts_4.png" style="width: 960px; height: 720px;" /&gt;&lt;/p&gt;
&lt;p&gt;We were already using PostgreSQL to track all of the individual issues,
with attributes like newspaper name, volume, edition, publication date.&lt;/p&gt;
&lt;p&gt;This gave us the ability to filter through the issues by year and issue
number, which was a good start. But we also wanted to be able to search
the full text for strings like “Pierre Trudeau” or “Mike Harris”.&lt;/p&gt;
&lt;p&gt;A common approach is to feed the data into a dedicated search engine
like Solr or Sphinx, and build a search interface on top of that.&lt;/p&gt;
&lt;p&gt;But PostgreSQL has featured full-text search support since the 8.3
release in 2008. So I opted to keep the moving parts to a minimum and
reuse my existing database as my search platform.&lt;/p&gt;
&lt;p&gt;&lt;img alt="image5" class="serendipity-image-center" src="/uploads/talks/2013/postgresql_fts_5.png" style="width: 960px; height: 720px;" /&gt;&lt;/p&gt;
&lt;p&gt;Our example table contains a “doc” column of type TEXT; that’s where we
store the text that we want to search and display. We also have a “tsv”
column of type TSVECTOR to store the normalized text.&lt;/p&gt;
&lt;p&gt;The TSVECTOR column is typically maintained by a trigger that fires
whenever the corresponding row is created or updated. So... you just
insert TEXT into the doc column, and the trigger maintains the tsv
column for you.&lt;/p&gt;
&lt;p&gt;PostgreSQL includes the tsvector_update_trigger() for your
convenience, as well as a trigger that uses different language-oriented
normalizations based on the value of a specified column. Naturally, you
can define your own trigger that invokes the to_tsvector() function.&lt;/p&gt;
&lt;p&gt;To provide good performance, as with any relational table, you need to
define appropriate indexes. In the case of full-text search, you want to
define a GIN (or GiST) index on the TSVECTOR column.&lt;/p&gt;
&lt;p&gt;Note: GIN indexes take longer to build, but provide faster lookup than
GiST.&lt;/p&gt;
&lt;p&gt;Finally, we INSERT the text documents into the database. The ID and
TSVECTOR columns are automatically generated for us.&lt;/p&gt;
&lt;p&gt;&lt;img alt="image6" class="serendipity-image-center" src="/uploads/talks/2013/postgresql_fts_6.png" style="width: 960px; height: 720px;" /&gt;&lt;/p&gt;
&lt;p&gt;Each text document is:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Parsed into tokens (words, white space, URIs, file paths)&lt;/li&gt;
&lt;li&gt;Each token is then normalized with one or more dictionaries (word
tokens may get stemming and stop words; URIs might have “www.”
stripped; everything gets folded to lower case)&lt;/li&gt;
&lt;li&gt;Et voila: the text-search vector for our text document has been
created!&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PostgreSQL bundles a number of language-specific dictionaries to support
different stemming algorithms and default sets of stopwords.&lt;/p&gt;
&lt;p&gt;In this example, we can see that PostgreSQL has stemmed “sketching” to
remove the verb suffix, removed “the” altogether as a stop word, and
stemmed “trees” to its singular form.&lt;/p&gt;
&lt;p&gt;You can also see that the TSVECTOR stores the position where each token
occurs, to support relevancy ranking algorithms that boost the relevancy
of terms that are located closely together.&lt;/p&gt;
&lt;p&gt;&lt;img alt="image7" class="serendipity-image-center" src="/uploads/talks/2013/postgresql_fts_7.png" style="width: 960px; height: 720px;" /&gt;&lt;/p&gt;
&lt;p&gt;But it's a doozy of a query!&lt;/p&gt;
&lt;p&gt;&lt;img alt="image8" class="serendipity-image-center" src="/uploads/talks/2013/postgresql_fts_8.png" style="width: 960px; height: 720px;" /&gt;&lt;/p&gt;
&lt;p&gt;Yes, there is a &lt;em&gt;lot&lt;/em&gt; going on here.&lt;/p&gt;
&lt;p&gt;First, this is just a regular SQL statement that happens to use the WITH
clause to define named subqueries (“q” and “ranked”).&lt;/p&gt;
&lt;p&gt;The to_tsquery() function takes an incoming full-text search query and
converts that into a parsed, normalized query.&lt;/p&gt;
&lt;p&gt;The ts_rank_cd() function compares the TS_VECTOR column against the
query to determine its relevancy score.&lt;/p&gt;
&lt;p&gt;We need to restrict it to rows that match our query, so we use the &amp;#64;&amp;#64;
operator (PostgreSQL allows data-type specific operators like this) and
then take the top ten.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;*Note*&lt;/strong&gt;: the query, limit, and offset are hardcoded here for
illustrative purposes, but in the actual application these are supplied
as parameters to the prepared SQL statement.&lt;/p&gt;
&lt;p&gt;Finally, we use the ts_headline() function to give us a highlighted
snippet of the results.&lt;/p&gt;
&lt;p&gt;&lt;img alt="image9" class="serendipity-image-center" src="/uploads/talks/2013/postgresql_fts_9.png" style="width: 960px; height: 720px;" /&gt;&lt;/p&gt;
&lt;p&gt;The harvester is a Python 3 application that uses the ‘postgresql’
module to connect to the database.&lt;/p&gt;
&lt;p&gt;The REST and Web applications in the IA Harvester application are Python
2, largely because they use Flask (which iswas Python 2 only). But in
the demo application, I’ve converted them to Python 3.&lt;/p&gt;
&lt;p&gt;While I could have simply written the Web and REST applications as a
single Flask Web app that talks directly to the database, I opted to
couple them via a JSON interface for a few reasons:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Decoupling the web front end from the search back end means that I
can augment or swap out either piece entirely without affecting the
overall experience.&lt;/li&gt;
&lt;li&gt;If performance becomes an issue, I could add caching where profiling
warrants it.&lt;/li&gt;
&lt;li&gt;If the service ends up being incredibly popular and PostgreSQL turns
into a bottleneck, even with caching, I could set up a Solr or Sphinx
instance instead.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I can change from Flask to another Web application framework on either
piece.&lt;/p&gt;
&lt;p&gt;I can separate the hosts if I need to throw more hardware at the
service, and/or virtualize it on something like Google App Engine.&lt;/p&gt;
&lt;p&gt;&lt;img alt="image10" class="serendipity-image-center" src="/uploads/talks/2013/postgresql_fts_10.png" style="width: 960px; height: 720px;" /&gt;&lt;/p&gt;
&lt;p&gt;With so many Python web frameworks available, why Flask?&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Routes as decorators was admittedly the biggest draw, simplifying
routing enormously!&lt;/li&gt;
&lt;li&gt;Solid Unicode support was a must as well, as our newspapers are
bilingual (English / French).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At the time I opted to try out Flask, the project’s public stance
towards Python 3 was not warm. However, with the 0.10 release in June
2013, all that has (thankfully!) changed; Python 3.3 is supported.&lt;/p&gt;
&lt;p&gt;&lt;img alt="image11" class="serendipity-image-center" src="/uploads/talks/2013/postgresql_fts_11.png" style="width: 960px; height: 720px;" /&gt;&lt;/p&gt;
&lt;p&gt;Flexible format:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;query: gives us the original query so we can echo that back to the
user&lt;/li&gt;
&lt;li&gt;results: is a list of the highlighted snippets that we returned from
our full-text search&lt;/li&gt;
&lt;li&gt;years: a facet that for the years in which hits were found, including
the number of hits per year&lt;/li&gt;
&lt;li&gt;collections: a facet for the collections in which hits were found,
including the number of hits per collection&lt;/li&gt;
&lt;li&gt;meta:&lt;ul&gt;
&lt;li&gt;total: the total number of hits&lt;/li&gt;
&lt;li&gt;page: the page we’re on&lt;/li&gt;
&lt;li&gt;limit: the number of hits per page&lt;/li&gt;
&lt;li&gt;results: the number of hits on this page of results&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="image12" class="serendipity-image-center" src="/uploads/talks/2013/postgresql_fts_12.png" style="width: 960px; height: 720px;" /&gt;&lt;/p&gt;
&lt;p&gt;We’ve already seen the decorator-route pattern before, and of course we
need to quote, encode, and decode our search URL and results.&lt;/p&gt;
&lt;p&gt;The Flask-specific parts are helper methods for getting GET params from
the query string, and rendering the template (in this case, via Jinja2),
by passing in values for the template placeholders.&lt;/p&gt;
&lt;p&gt;&lt;img alt="image13" class="serendipity-image-center" src="/uploads/talks/2013/postgresql_fts_13.png" style="width: 960px; height: 720px;" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image14" class="serendipity-image-center" src="/uploads/talks/2013/postgresql_fts_14.png" style="width: 960px; height: 720px;" /&gt;&lt;/p&gt;
&lt;p&gt;At this point, the UI is functional but spartan. I’m a database / code
guy, not a designer. Luckily, I have a student working on improving the
front end (hi Emily!)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Further information:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;Demonstration application:&lt;/p&gt;
&lt;/p&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://gitorious.org/postgresql-full-text-search-engine"&gt;Gitorious
repository&lt;/a&gt;
/
&lt;a class="reference external" href="https://github.com/dbs/postgresql-full-text-search-engine"&gt;Github&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Internet Archive harvester project:
&lt;a class="reference external" href="https://gitorious.org/ia-harvester"&gt;https://gitorious.org/ia-harvester&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;PostgreSQL full-text search:&lt;/p&gt;
&lt;/p&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://postgresql.org/docs/9.3/static/textsearch.html"&gt;PostgreSQL official
documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="/archives/260-Seek-and-ye-shall-find-full-text-search-in-PostgreSQL.html"&gt;Seek and ye shall find: PostgreSQL full-text search (presentation
at PostgresOpen
2012)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;a class="reference external" href="http://flask.pocoo.org/docs"&gt;Flask official docs&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;a class="reference external" href="http://jinja.pocoo.org/docs"&gt;Jinja2 official docs&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sun, 11 Aug 2013 15:38:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2013-08-11:/a-flask-of-full-text-search-in-postgresql.html</guid><category>Python</category><category>Coding</category><category>PostgreSQL</category><category>Python</category><category>coding</category><category>postgresql</category><category>python</category></item><item><title>Parsing the schema.org vocabulary for fun and frustration</title><link>https://coffeecode.net/parsing-the-schemaorg-vocabulary-for-fun-and-frustration.html</link><description>&lt;p&gt;For various reasons I've spent a few hours today trying to parse the
&lt;a class="reference external" href="http://schema.org"&gt;schema.org vocabulary&lt;/a&gt; into a nice, searchable
database structure. Unfortunately, for a linked data effort that's two
years old now and arguably one of the most important efforts out there,
it's been an exercise in frustration.&lt;/p&gt;
&lt;div class="section" id="owl-oww-oww-oww"&gt;
&lt;h2&gt;OWL - oww, oww, oww&lt;/h2&gt;
&lt;p&gt;My first attempt was to work through the &amp;quot;&lt;em&gt;`official OWL version of the
terms &amp;lt;http://schema.org/docs/schemaorg.owl&amp;gt;`__&lt;/em&gt;&amp;quot; (per
&lt;a class="reference external" href="http://schema.rdfs.org/"&gt;http://schema.rdfs.org/&lt;/a&gt;). That quickly led me to filing a bug asking for
the OWL to be served up as MIME type &lt;tt class="docutils literal"&gt;application/xml&lt;/tt&gt; rather than
&lt;tt class="docutils literal"&gt;text.html&lt;/tt&gt; so that my browser would do a better job of rendering it.
But that was a minor issue. As I worked through the OWL, I discovered
that it was not at all in sync with the vocabulary as documented via the
&lt;a class="reference external" href="http://schema.org"&gt;http://schema.org&lt;/a&gt; web site.&lt;/p&gt;
&lt;p&gt;For example, looking at the OWL for
&lt;a class="reference external" href="http://schema.org/datePublished"&gt;datePublished&lt;/a&gt;, things look okay at
first glance:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;lt;!-- http://schema.org/datePublished --&amp;gt;&amp;lt;owl:DatatypeProperty rdf:about=&amp;quot;http://schema.org/datePublished&amp;quot;&amp;gt;    &amp;lt;rdfs:label xml:lang=&amp;quot;en&amp;quot;&amp;gt;datePublished&amp;lt;/rdfs:label&amp;gt;    &amp;lt;rdfs:comment xml:lang=&amp;quot;en&amp;quot;&amp;gt;Date of first broadcast/publication.&amp;lt;/rdfs:comment&amp;gt;    &amp;lt;rdfs:range rdf:resource=&amp;quot;http://www.w3.org/2000/01/rdf-schema#Literal&amp;quot;/&amp;gt;    &amp;lt;rdfs:domain&amp;gt;        &amp;lt;owl:Class&amp;gt;            &amp;lt;owl:unionOf rdf:parseType=&amp;quot;Collection&amp;quot;&amp;gt;                &amp;lt;rdf:Description rdf:about=&amp;quot;http://schema.org/CreativeWork&amp;quot;/&amp;gt;            &amp;lt;/owl:unionOf&amp;gt;        &amp;lt;/owl:Class&amp;gt;    &amp;lt;/rdfs:domain&amp;gt;&amp;lt;/owl:DatatypeProperty&amp;gt;
&lt;/pre&gt;
&lt;p&gt;But the first problem is that the &lt;strong&gt;range&lt;/strong&gt; property is a lie. Per
&lt;a class="reference external" href="http://schema.org/datePublished"&gt;http://schema.org/datePublished&lt;/a&gt;, the value is supposed to be restricted
to &lt;a class="reference external" href="http://schema.org/Date"&gt;http://schema.org/Date&lt;/a&gt; (backed up by an RDF(S) assertion in the page
itself.&lt;/p&gt;
&lt;p&gt;In fact, this problem affects all of the range declarations in the OWL
document. &lt;em&gt;Everything&lt;/em&gt; has a range of &amp;quot;literal&amp;quot;. Not good.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="rdf-xml"&gt;
&lt;h2&gt;RDF/XML&lt;/h2&gt;
&lt;p&gt;Next, I tried the &lt;a class="reference external" href="http://schema.rdfs.org/all.rdf"&gt;RDF/XML&lt;/a&gt; format.
Looking at &lt;a class="reference external" href="http://schema.org/datePublished"&gt;http://schema.org/datePublished&lt;/a&gt; again, we see:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;lt;rdf:Description rdf:about=&amp;quot;http://schema.org/datePublished&amp;quot;&amp;gt; &amp;lt;rdf:type rdf:resource=&amp;quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#Property&amp;quot;/&amp;gt;    &amp;lt;rdfs:label xml:lang=&amp;quot;en&amp;quot;&amp;gt;Date Published&amp;lt;/rdfs:label&amp;gt;  &amp;lt;rdfs:comment xml:lang=&amp;quot;en&amp;quot;&amp;gt;Date of first broadcast/publication.&amp;lt;/rdfs:comment&amp;gt;    &amp;lt;rdfs:domain rdf:resource=&amp;quot;http://schema.org/CreativeWork&amp;quot;/&amp;gt;  &amp;lt;rdfs:range rdf:resource=&amp;quot;http://www.w3.org/2001/XMLSchema#date&amp;quot;/&amp;gt;    &amp;lt;rdfs:isDefinedBy rdf:resource=&amp;quot;http://schema.org/CreativeWork&amp;quot;/&amp;gt;&amp;lt;/rdf:Description&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Better, in that the &lt;strong&gt;range&lt;/strong&gt; property is not literal, but instead of
pointing to &lt;a class="reference external" href="http://schema.org/Date"&gt;http://schema.org/Date&lt;/a&gt;, it's pointing to
&lt;a class="reference external" href="http://www.w3.org/2001/XMLSchema#date"&gt;http://www.w3.org/2001/XMLSchema#date&lt;/a&gt;? That seems weird and concerning.
In addition, working with this format quickly becomes difficult because
you have to dereference assertions like the following to make sense of
things:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;lt;rdf:Description rdf:nodeID=&amp;quot;node180s0ohklx169&amp;quot;&amp;gt;    &amp;lt;rdf:type rdf:resource=&amp;quot;http://www.w3.org/2002/07/owl#Class&amp;quot;/&amp;gt;&amp;lt;/rdf:Description&amp;gt;&amp;lt;rdf:Description rdf:nodeID=&amp;quot;node180s0ohklx170&amp;quot;&amp;gt;   &amp;lt;rdf:first rdf:resource=&amp;quot;http://schema.org/Distance&amp;quot;/&amp;gt;    &amp;lt;rdf:rest rdf:nodeID=&amp;quot;node180s0ohklx171&amp;quot;/&amp;gt;&amp;lt;/rdf:Description&amp;gt;&amp;lt;rdf:Description rdf:nodeID=&amp;quot;node180s0ohklx171&amp;quot;&amp;gt;   &amp;lt;rdf:first rdf:resource=&amp;quot;http://schema.org/QuantitativeValue&amp;quot;/&amp;gt;   &amp;lt;rdf:rest rdf:resource=&amp;quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#nil&amp;quot;/&amp;gt;&amp;lt;/rdf:Description&amp;gt;&amp;lt;rdf:Description rdf:nodeID=&amp;quot;node180s0ohklx169&amp;quot;&amp;gt;    &amp;lt;owl:unionOf rdf:nodeID=&amp;quot;node180s0ohklx170&amp;quot;/&amp;gt;&amp;lt;/rdf:Description&amp;gt;&amp;lt;rdf:Description rdf:about=&amp;quot;http://schema.org/depth&amp;quot;&amp;gt;   &amp;lt;rdfs:range rdf:nodeID=&amp;quot;node180s0ohklx169&amp;quot;/&amp;gt;  &amp;lt;rdfs:isDefinedBy rdf:resource=&amp;quot;http://schema.org/Product&amp;quot;/&amp;gt;&amp;lt;/rdf:Description&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Insert &lt;em&gt;Ain't nobody got time for that!&lt;/em&gt; meme image here, if you will...&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="json"&gt;
&lt;h2&gt;JSON&lt;/h2&gt;
&lt;p&gt;Somewhat ironically, given the XML orientation of the semantic web
world, the best option I've found so far ends up being the
&lt;a class="reference external" href="http://schema.rdfs.org/all.json"&gt;JSON&lt;/a&gt; representation of the schema.
Here's our &lt;a class="reference external" href="http://schema.org/datePublished"&gt;http://schema.org/datePublished&lt;/a&gt; friend, again:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;quot;datePublished&amp;quot;: {      &amp;quot;comment&amp;quot;: &amp;quot;Date of first broadcast/publication.&amp;quot;,       &amp;quot;comment_plain&amp;quot;: &amp;quot;Date of first broadcast/publication.&amp;quot;,       &amp;quot;domains&amp;quot;: [        &amp;quot;CreativeWork&amp;quot;      ],       &amp;quot;id&amp;quot;: &amp;quot;datePublished&amp;quot;,       &amp;quot;label&amp;quot;: &amp;quot;Date Published&amp;quot;,       &amp;quot;ranges&amp;quot;: [        &amp;quot;Date&amp;quot;      ]    },
&lt;/pre&gt;
&lt;p&gt;Very easy to work with, and the data seems to be accurate! So far I've
noticed only a few quirks:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;strong&gt;datatypes&lt;/strong&gt; and &lt;strong&gt;properties&lt;/strong&gt; have valid &lt;tt class="docutils literal"&gt;comment&lt;/tt&gt; properties,
but &lt;strong&gt;types&lt;/strong&gt; only have an empty string. Of course I could harvest
those myself for each type by hitting the corresponding schema.org
page, but I shouldn't &lt;em&gt;have&lt;/em&gt; to do that.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;datatypes&lt;/strong&gt; and &lt;strong&gt;types&lt;/strong&gt; have &lt;tt class="docutils literal"&gt;url&lt;/tt&gt; properties, but
&lt;strong&gt;properties&lt;/strong&gt; do not. It's straightforward to create them yourself
by appending the &lt;tt class="docutils literal"&gt;id&lt;/tt&gt; property to &amp;quot;&lt;a class="reference external" href="http://schema.org/"&gt;http://schema.org/&lt;/a&gt;&amp;quot;, but
consistency would be nice.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class="section" id="summary"&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;I would recommend anyone looking to do something meaningful with the
schema.org vocabulary currently to start with the JSON format; you will
likely be much more efficient than if you wade into one of the other
formats and start dealing with multiple namespaces, etc before
ultimately realizing that the format you're working with is deeply
flawed or out of sync... And I've given myself the task of offering up a
merge request or two to &lt;a class="reference external" href="https://github.com/mhausenblas/schema-org-rdf/tree/master/scrapers"&gt;Git
repository&lt;/a&gt;
where the scrapers that generate these formats live, so hopefully these
problems will be resolved sooner rather than later &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 01 Aug 2013 20:59:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2013-08-01:/parsing-the-schemaorg-vocabulary-for-fun-and-frustration.html</guid><category>misc</category><category>Coding</category><category>coding</category></item><item><title>Linked data irony, example one of probably many</title><link>https://coffeecode.net/linked-data-irony-example-one-of-probably-many.html</link><description>&lt;p&gt;I'm currently ramping up my knowledge of the linked dataworld, and ran
across the &lt;a class="reference external" href="http://ceur-ws.org/Vol-996/"&gt;Proceedings of the WWW2013 Workshop on Linked Data on the
Web&lt;/a&gt;. Which are published on the web
(yay!) as open access (yay!) in PDF (what?). Thus, the papers from the
linked data workshop at the W3 conference cannot, themselves, offer up
any linked data. The content looks great and includes tons of
references, but although the references themselves mostly offers URLs to
resources available on the web, even those URLs aren't clickable links!&lt;/p&gt;
&lt;p&gt;This is almost certainly an artifact of the still dominant academic
publishing process, in which print rules, but it's still a bit
surprising and disappointing. That said, I'm happy to have access to the
papers in whatever format... hopefully to help evolve towards a
publishing approach that is more friendly to linked data and the web.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 30 Jul 2013 17:37:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2013-07-30:/linked-data-irony-example-one-of-probably-many.html</guid><category>Linked Open Data</category><category>Coding</category><category>coding</category></item><item><title>PyCon Canada 2013 - PostgreSQL full-text search and Flask</title><link>https://coffeecode.net/pycon-canada-2013-postgresql-full-text-search-and-flask.html</link><description>&lt;p&gt;On August 10, 2013, I'll be giving a twenty-minute talk at PyCon Canada
on &lt;a class="reference external" href="https://2013.pycon.ca/en/schedule/presentation/19/"&gt;A Flask of full-text search with
PostgreSQL&lt;/a&gt;. I'm
very excited to be talking about Python, at a Python conference, and to
be giving the Python audience a peek at PostgreSQL's full-text search
capabilities. With a twenty minute slot, I'll be leaning on my code4lib
experience to compress the right amount of technical information into an
entertaining package.&lt;/p&gt;
&lt;p&gt;Setting aside my talk, the line-up for PyCon Canada looks fantastic; the
keynote speakers are &lt;a class="reference external" href="https://2013.pycon.ca/en/speaker/profile/92/"&gt;Karen
Brennan&lt;/a&gt;, &lt;a class="reference external" href="https://2013.pycon.ca/en/speaker/profile/93/"&gt;Hilary
Mason&lt;/a&gt;, and &lt;a class="reference external" href="https://2013.pycon.ca/en/speaker/profile/91/"&gt;Jakob
Kaplan-Moss&lt;/a&gt;, and there
are a &lt;em&gt;ton&lt;/em&gt; of great talks. Did I mention that I'm really looking
forward to this conference?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2013-07-11:&lt;/strong&gt; Now that the schedule is official, the
presentation URL needed to be updated. Also, the impetus for this
proposal came straight from PGCon 2013, where the PostgreSQL community
was urged to get the good word out about PostgreSQL to other
communities. Et voila!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 05 Jul 2013 09:00:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2013-07-05:/pycon-canada-2013-postgresql-full-text-search-and-flask.html</guid><category>Python</category><category>Coding</category><category>FSOSS</category><category>PostgreSQL</category><category>Python</category><category>coding</category><category>fsoss</category><category>postgresql</category><category>python</category></item><item><title>CARLCore Metadata Application Profile for institutional repositories</title><link>https://coffeecode.net/carlcore-metadata-application-profile-for-institutional-repositories.html</link><description>&lt;p&gt;A long time ago, in what seemed like another life, I attended the
&lt;a class="reference external" href="http://www.coffeecode.net/archives/90-Backlog-of-Access-2006-notes.html"&gt;Access 2006
conference&lt;/a&gt;
as a relatively new systems librarian at Laurentian University. The
subject of the preconference was this totally new-to-me thing called
&amp;quot;institutional repositories&amp;quot;, which I eventually worked out were
basically web applications oriented towards content preservation and
dissemination. One of the presenters was &lt;a class="reference external" href="http://www.sfu.ca/~mjordan/"&gt;Mark
Jordan&lt;/a&gt;, who talked about his efforts to
build a harvester and search engine for the institutional repositories
for all Canadian academic libraries. And an outcome of &lt;em&gt;that&lt;/em&gt; effort was
another effort, to build a Dublin Core application profile that academic
libraries could adopt to improve the consistency (and thus the
usefulness) of the metadata that was harvested.&lt;/p&gt;
&lt;p&gt;Fast-forward to a discussion I participated in today as part of the
ScholarsPortal Technical Advisory Group, in which the subject of working
towards a standard set of metadata for institutional repositories in
Ontario was raised. &amp;quot;Wait&amp;quot;, I thought, as my hardening synapses
attempted to fire, &amp;quot;isn't this a solved problem?&amp;quot; And indeed, I was able
to dig up my notes from Access 2006, quickly refreshed my poor
biological memory, and tried to track down the CARLCore Metadata
Application Profile guidelines that I had thought all Canadian academic
institutions had agreed to adopt. And then... 404 galore. The document
had vanished from the net.&lt;/p&gt;
&lt;p&gt;However, through the power of social networking, the amazing Mark Jordan
was able to produce a copy and sent it to me via email, with the okay to
redistribute it freely. So... here we go. Let the hard work of the
members of that group find a new life, as the guidelines are now once
again available at: &lt;a class="reference external" href="/uploads/files/CARLCore_Application_Profile_eng_1-0.pdf"&gt;CARLCore Metadata Application
Profile&lt;/a&gt;
(PDF)&lt;/p&gt;
&lt;p&gt;Thanks, Mark!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Aside:&lt;/em&gt; Holy heck, when I was a new systems librarian I sure did stay
quiet and listen a lot. I should go back to doing more of that. Also:
extensive notes published on blog &lt;em&gt;can&lt;/em&gt; pay dividends years down the
road!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 25 Jun 2013 19:39:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2013-06-25:/carlcore-metadata-application-profile-for-institutional-repositories.html</guid><category>Libraries</category><category>Coding</category><category>coding</category></item><item><title>Making the Evergreen catalogue mobile-friendly via responsive CSS</title><link>https://coffeecode.net/making-the-evergreen-catalogue-mobile-friendly-via-responsive-css.html</link><description>&lt;p&gt;Back in November the Evergreen community was discussing the desire for a
mobile catalogue, and &lt;a class="reference external" href="http://markmail.org/message/tdvihpd63lu6ksbs"&gt;expressed a strong
opinion&lt;/a&gt; that the right
way forward would be to teach the current catalogue to be
mobile-friendly by applying principles of responsive design. In fact, I
stated:&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;p&gt;Almost all of this can be achieved via CSS, possibly with some
changes to the underlying HTML (e.g. tables to divs or whatever so
that &amp;quot;Place Hold&amp;quot; appears under the bib info instead of way over to
the right).&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;I have this bad habit of talking more than doing. So when I saw the
Beanstalk mobile catalogue resurrected again at the Evergreen 2013
lightning talks, it bugged me that I still hadn't put any effort into a
proof of concept of what was possible with &lt;a class="reference external" href="https://developer.mozilla.org/en-US/docs/CSS/Media_queries"&gt;CSS media
queries&lt;/a&gt;.
Thus, today, on the last day of my holidays, I spent a few hours trying
things out on our development server and came up with &lt;a class="reference external" href="http://git.evergreen-ils.org/?p=working/Evergreen.git;a=shortlog;h=refs/heads/user/dbs/responsive_tpac"&gt;this *rough*
branch&lt;/a&gt;
to work towards making the exact same HTML that we serve up for desktops
provide an experience similar to that of the Beanstalk generation of
catalogues for mobile, just via CSS.&lt;/p&gt;
&lt;p&gt;As you can see from the commits, I made one change to the HTML to define
a viewport, and added one set of CSS rules wrapped in a media query; in
essence:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
...&amp;lt;head&amp;gt;...&amp;lt;meta content=&amp;quot;initial-scale=1.0,width=device-width&amp;quot; name=&amp;quot;viewport&amp;quot;&amp;gt;&amp;lt;style&amp;gt;&amp;#64;media only screen and (max-width: 600px) {    #header {        padding: 0px;        margin: 0px;    }    .facet_sidebar {        display: none;    }    ...}&amp;lt;/style&amp;gt;&amp;lt;head&amp;gt;...
&lt;/pre&gt;
&lt;div class="section" id="results-and-trade-offs"&gt;
&lt;h2&gt;Results and trade-offs&lt;/h2&gt;
&lt;p&gt;Here are a few example URLs from our test server (which is slow, and
might get wiped any day, so test them quickly if you have a mobile
device around!):&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://laurentian-test.concat.ca/eg/opac/results?query=open+source&amp;amp;qtype=keyword&amp;amp;locg=103&amp;amp;detail_record_view=1"&gt;Search
results&lt;/a&gt;
- sacrificed facets, per-item actions, and the language picker&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://laurentian-test.concat.ca/eg/opac/record/729926?query=open%20source;qtype=keyword;locg=103;detail_record_view=1"&gt;Record
details&lt;/a&gt;
- sacrificed per-item actions, flattened the item table vertically&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In general, I removed a lot of the frippery from the header, while
trying to retain the most valuable pieces. However, some bits are
broken: &lt;strong&gt;Another Search&lt;/strong&gt; doesn't actually let you do another search
because the search bar is totally hidden. Other bits haven't been
touched (&lt;strong&gt;Advanced search&lt;/strong&gt; is still overwhelming, and &lt;strong&gt;My Account&lt;/strong&gt;,
while functional, could be much prettier.&lt;/p&gt;
&lt;p&gt;What I've done so far is oriented towards our 2.3-ish lightly customized
Laurentian skin (we force full details in search results, for example)
but the principles should be applicable to an out-of-the-box Evergreen
catalogue. In working through some of the challenges, I've determined
that I was pretty much on target back in November; with a few HTML
tweaks that would improve the layout for desktops as well, we could keep
the per-item actions and facets around, but just move them to a
different location.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="less-talk-more-action"&gt;
&lt;h2&gt;Less talk, more action&lt;/h2&gt;
&lt;p&gt;So who's with me? What we have to gain is a single set of HTML to
support for TPAC, and a single set of CSS, all available from the same
URL, rather than trying to maintain overlays and monkeying about with
mobile-vs-desktop URLs and the like. Feel free to dig in and start
pushing branches with improvements over my rough attempts and let's make
this thing happen for Evergreen 2.5.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="with-thanks-to-firefox"&gt;
&lt;h2&gt;With thanks to Firefox...&lt;/h2&gt;
&lt;p&gt;I would be remiss if I did not mention the marvellous &lt;a class="reference external" href="https://developer.mozilla.org/en-US/docs/Tools/Responsive_Design_View"&gt;Responsive Design
View&lt;/a&gt;
introduced in Firefox 15, along with the &lt;a class="reference external" href="https://developer.mozilla.org/en-US/docs/Tools/Style_Editor"&gt;Style
Editor&lt;/a&gt;;
together, these tools (built into Firefox) made my developing and
testing work &lt;em&gt;so&lt;/em&gt; much easier.&lt;/p&gt;
&lt;p&gt;If you want to live on the cutting edge of Firefox, you want Aurora - go
and get it &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external image-reference" href="http://affiliates.mozilla.org/link/banner/36536"&gt;&lt;img alt="Download Aurora" src="http://affiliates.mozilla.org/media/uploads/banners/6f0132062588b248d44968734668226f9c19d994.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 22 Apr 2013 02:48:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2013-04-22:/making-the-evergreen-catalogue-mobile-friendly-via-responsive-css.html</guid><category>Libraries</category><category>Coding</category><category>Evergreen</category><category>coding</category><category>evergreen</category></item><item><title>Structured data: making metadata matter for machines</title><link>https://coffeecode.net/structured-data-making-metadata-matter-for-machines.html</link><description>&lt;p&gt;&lt;strong&gt;Update 2013-04-18:&lt;/strong&gt; Now with &lt;a class="reference external" href="https://archive.org/details/Microdata"&gt;video of the
presentation&lt;/a&gt;, thanks to the
awesome #egcon2013 volunteers!&lt;/p&gt;
&lt;p&gt;I've been attending the &lt;a class="reference external" href="http://eg2013.evergreen-ils.org"&gt;Evergreen 2013
Conference&lt;/a&gt; in beautiful Vancouver.
This morning, I was honoured to be able to give a presentation on some
of the work I've been doing on implementing linked data via
&lt;a class="reference external" href="http://schema.org"&gt;schema.org&lt;/a&gt; in Evergreen. I &lt;em&gt;think&lt;/em&gt; I did a good
job of explaining the potential value of linked data and arguing for
improving Evergreen's schema.org publishing ninja skills.&lt;/p&gt;
&lt;p&gt;My slides, with a reasonable number of useful speaker notes to provide
context, are available in &lt;a class="reference external" href="/uploads/talks/2013/structured_data_matters.odp"&gt;LibreOffice
format&lt;/a&gt;.&lt;a class="reference external" href="#fn1"&gt;[1]&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In addition, the amazing organizers of the conference also streamed
most&lt;a class="reference external" href="#fn2"&gt;[2]&lt;/a&gt; of the talk and the recording will be available on
the &lt;a class="reference external" href="http://eg2013.evergreen-ils.org"&gt;conference web site&lt;/a&gt; in a week
or two.&lt;/p&gt;
&lt;div class="section" id="footnotes"&gt;
&lt;h2&gt;Footnotes&lt;/h2&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;div id="fn1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;I felt pretty dirty not using HTML5 + RDFa Lite to actually mark the
whole thing up; there was some question close to the time of the
conference as to whether anything but PPT or perhaps PDF would be an
acceptable format... a concern that was subsequently removed, but a
little too late to be worthwhile changing course.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;div id="fn2"&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;The room was standing-room only (well, sitting-on-the-floor-room
only), and one of the organizers accidentally sat on and unplugged
the Ethernet cable, so something like ten minutes were lost. Heh!&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 12 Apr 2013 19:11:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2013-04-12:/structured-data-making-metadata-matter-for-machines.html</guid><category>Linked Open Data</category><category>Coding</category><category>Evergreen</category><category>coding</category><category>evergreen</category></item><item><title>Introducing SQL to Evergreen administrators, round two</title><link>https://coffeecode.net/introducing-sql-to-evergreen-administrators-round-two.html</link><description>&lt;p&gt;&lt;a class="reference external" href="/archives/212-Introduction-to-SQL-for-Evergreen-administrators.html"&gt;Three years ago&lt;/a&gt; I was
asked to create and deliver a two-day course introducing SQL to Evergreen
users. Things went well and I was able to share the resulting materials with
the Evergreen and PostgreSQL community. Perhaps one of my happiest moments at
the Evergreen conference last year was when one of the participants in that
course, told me that many of his fellow participants were still successfully
writing SQL queries and getting work done. Huzzah!&lt;/p&gt;
&lt;p&gt;Time goes by and another group, &lt;a class="reference external" href="http://www.ohionet.org"&gt;OHIONET&lt;/a&gt;, was
running into difficulties getting started with PostgreSQL and Evergreen. They
asked me if I would be willing to give the same sort of training I had given a
few years back.  &amp;quot;Sure&amp;quot;, I said, thinking it would be a great opportunity to
polish the materials and add some updates to cover new features in PostgreSQL
and Evergreen. We also opted to skip the travel and do an entirely virtual
training session via Google Hangouts, which worked out rather nicely (but
that's a different story).&lt;/p&gt;
&lt;p&gt;As it turned out, I probably ended up putting about four days worth of effort
(crammed into lots of late nights, weekends, and vacation days) into
overhauling the instruction materials. But the results were worth it, in my
opinion; I'm rather proud of the content, and while I believe it stands up on
its own, the guidance that I was able to provide during the live instruction
sessions was well-received by the participants.&lt;/p&gt;
&lt;p&gt;Thus, I am pleased to be able to offer to the broader community the latest
version of the Introduction to SQL for Evergreen Administrators, under a
Creative Commons Attribution-ShareAlike 3.0 (Unported) license.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Reference documentation--30 pages introducing SQL with examples drawn
from the Evergreen schema:
(&lt;a class="reference external" href="http://bzr.coffeecode.net/intro_to_sql/v2/introduction_to_sql.html"&gt;HTML&lt;/a&gt;)
(&lt;a class="reference external" href="http://bzr.coffeecode.net/intro_to_sql/v2/introduction_to_sql.pdf"&gt;PDF&lt;/a&gt;)
(&lt;a class="reference external" href="http://bzr.coffeecode.net/intro_to_sql/v2/introduction_to_sql.epub"&gt;ePub&lt;/a&gt;)
(&lt;a class="reference external" href="http://bzr.coffeecode.net/intro_to_sql/introduction_to_sql.txt"&gt;AsciiDoc&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Presentation:
(&lt;a class="reference external" href="http://bzr.coffeecode.net/intro_to_sql/SQL_instruction.odp"&gt;LibreOffice Impress&lt;/a&gt;)
(&lt;a class="reference external" href="http://bzr.coffeecode.net/intro_to_sql/v2/SQL_instruction.pdf"&gt;PDF&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Solutions to exercises:
(&lt;a class="reference external" href="http://bzr.coffeecode.net/intro_to_sql/solutions_day_1.txt"&gt;Day 1&lt;/a&gt;)
(&lt;a class="reference external" href="http://bzr.coffeecode.net/intro_to_sql/solutions_day_2.txt"&gt;Day 2&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, a huge thanks to OHIONET for giving me the impetus to overhaul this
material, and for giving me a chance to introduce them to the wonders of SQL
with PostgreSQL, and to the inner workings of the Evergreen schema.  It was a
blast! And thanks for agreeing to let me share these materials with the broader
community.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sat, 16 Feb 2013 02:32:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2013-02-16:/introducing-sql-to-evergreen-administrators-round-two.html</guid><category>Libraries</category><category>Evergreen</category><category>PostgreSQL</category><category>evergreen</category><category>postgresql</category></item><item><title>Introducing version control &amp; git in 1.5 hours to undergraduates</title><link>https://coffeecode.net/introducing-version-control-git-in-15-hours-to-undergraduates.html</link><description>&lt;p&gt;&lt;a class="reference external" href="http://laurentian.ca"&gt;Our university&lt;/a&gt; offers a Computer Science
degree, but the formal curriculum does not cover version control (or a
number of other common tools and practices in software development).
Students that have worked for me in part-time jobs or summer positions
have said things like:&lt;/p&gt;
&lt;blockquote&gt;
if it wasn't for that one summer I worked at the library for/with
you using the version control software (which was my first real time
ever using it) I'd have been really confused in my first job after
graduating&lt;/blockquote&gt;
&lt;p&gt;That kind of statement reaffirms my belief that a Computer Science
degree should include some form of introduction to software development
norms--you could perhaps call it &lt;em&gt;software development literacy&lt;/em&gt;. While
I've heard the &amp;quot;sink or swim&amp;quot; argument when it comes to having a clue
about what you are expected to do when you land an actual programming
job (as in, &amp;quot;students that don't learn this on their own probably aren't
going to learn it from us&amp;quot;), I'm sure that some minimal level of
exposure to these norms and specific tools from future peers will help
more students swim. As I am particularly interested in development
within free software projects, I've been in close contact with the
Computer Science Club to try to start providing this outside of the
formal curriculum.&lt;/p&gt;
&lt;p&gt;So, as part of this mission, a few days ago I gave a presentation to the
Club on &amp;quot;version control&amp;quot;, with a particular emphasis on using &lt;strong&gt;git&lt;/strong&gt;.
The turnout was low, alas; not a sexy subject, perhaps, or just the
start of term, or perhaps I need to improve my marketing efforts. In any
case, I believe it went well--heads were nodding and I had the complete
attention of the participants for 1.5 hours while I built up a
conceptual framework for understanding version control as practiced in
git.&lt;/p&gt;
&lt;p&gt;I'm happy to make my presentation materials available under a CC BY-SA
3.0 license; maybe you can use them and improve on them!&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://stuff.coffeecode.net/2013/git_tutorial"&gt;HTML slides&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://gitorious.org/intro_to_git"&gt;git repo for the
presentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sun, 20 Jan 2013 13:22:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2013-01-20:/introducing-version-control-git-in-15-hours-to-undergraduates.html</guid><category>misc</category><category>Coding</category><category>coding</category></item><item><title>Triumph of the tiny brain: Dan vs. Drupal / Panels</title><link>https://coffeecode.net/triumph-of-the-tiny-brain-dan-vs-drupal-panels.html</link><description>&lt;p&gt;A while ago I inherited responsibility for a Drupal 6 instance and a
rather out-of-date server. (You know it's not good when your production
operating system is so old that it is no longer getting security
updates).&lt;/p&gt;
&lt;p&gt;I'm not a Drupal person. I dabbled with Drupal years and years ago when
I was heavily into PHP, but it never stuck with me. Every time I poked
around at the database schema, with serialized objects stuck inside
columns, I found something else that I wanted to work on instead. Thus,
inheriting a Drupal instance wasn't something I had been looking forward
to. As this production server was running a number of different services
that were in use by our library, I went through a number of trial runs
to ensure that the base packages wouldn't introduce regressions or
outages. Fast-forward past a reasonably successful early-morning upgrade
from Debian Lenny to Squeeze and I was able to start looking at
addressing the Drupal instance that was also approximately 18 months out
of date.&lt;/p&gt;
&lt;p&gt;Initially, after I worked out the how-to of Drupal upgrades (in short:
upgrade just Drupal core, then upgrade the modules), I thought all was
well. I even got over the hump of realizing that our instance had had
all of the modules dumped into Drupal's core directory, rather than
&lt;tt class="docutils literal"&gt;sites/all/modules&lt;/tt&gt;, and (even more impressively) got over the problem
that the core &lt;em&gt;bluemarine&lt;/em&gt; them had been hacked directly rather than
having been separated out into a new custom theme. After working through
those learning pains, I realized that somewhere in all of the Drupal and
module upgrades, that something got &amp;quot;more secure&amp;quot; and started truncating
IMG links to files with spaces in them at the first space. So
&amp;quot;foo%20bar.jpg&amp;quot; was becoming &amp;quot;foo.jpg&amp;quot; and we were getting 404s
everywhere.&lt;/p&gt;
&lt;p&gt;Did I mention that I didn't notice this until I upgraded our production
instance? Oh yes, I went through iteration after iteration of upgrades
on the test server, and dutifully fixed up the problems that I found in
the subset of content that I was testing against. I discovered and fixed
problems like the production server content linking directly to the test
server (slight copy-and-paste errors on the part of the content
creators, I suppose). But I didn't notice all of the 404s, because who
uploads images with spaces in their filename?&lt;/p&gt;
&lt;p&gt;Turns out, everyone else in my library does that. Of course! And from
what I was able to piece together via Google and browsing drupal.org,
there was supposed to be some sanitization of the incoming filenames so
that spaces would be normalized, etc. But either that wasn't introduced
until well after our content had been created, or my predecessor had
lightly hacked one of the modules, or Drupal itself, and hadn't bothered
to use a source code repository to track those customizations. So,
realizing that I needed to make some bulk changes, I went at it with a
two-step plan:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Create symbolic links for both the truncated filename and the
spaces-normalized-to-underscores filenames. Creating symlinks for the
truncated filenames would fix the 404s immediately, at the cost of
some clash in the intended targets; there were plenty of
&lt;tt class="docutils literal"&gt;Foo illustration.JPG&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Foo info.JPG&lt;/tt&gt; pairs of files, but
like the Highlander, there can be only on &lt;tt class="docutils literal"&gt;Foo.JPG&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Munge the database entries so that all of those now apparently
insecure %20-containing filenames would become underscores.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you're a Drupal user or a Drupal with Panels module user, you might
know that the database schema suffers from some fairly horrible tricks
being played on it. In this case, the Panels module creates a
&lt;tt class="docutils literal"&gt;panels_pane&lt;/tt&gt; table with a &lt;tt class="docutils literal"&gt;configuration&lt;/tt&gt; TEXT column. Based on the
name alone, it might seem odd that column is used to store the HTML
content of the corresponding panel. Even odder to me is that this is not
just a TEXT column, it's a column that expects a very particular
structure - something like:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
a:5:{s:11:&amp;quot;admin_title&amp;quot;;s:5:&amp;quot;RACER&amp;quot;;s:5:&amp;quot;title&amp;quot;;s:0:&amp;quot;&amp;quot;;s:4:&amp;quot;body&amp;quot;;s:639:&amp;quot;&amp;lt;p&amp;gt;&amp;lt;img width=&amp;quot;225&amp;quot; height [...]}
&lt;/pre&gt;
&lt;p&gt;Ah, nothing like storing an object within a single database column. Of
particular interest was the result that I had when I tested updating the
column value with a basic &amp;quot;replace(configuration, '%20', '_')&amp;quot; - the
panel showed only &lt;strong&gt;n/a&lt;/strong&gt;, presumably because the size (defined by the
&lt;tt class="docutils literal"&gt;s&lt;/tt&gt; properties in the object) for the &amp;quot;body&amp;quot; text property was no
longer a match. That would be an instance of
&lt;a class="reference external" href="http://drupal.org/node/926448"&gt;http://drupal.org/node/926448&lt;/a&gt; - so okay, clearly I had to change tactics
and update the entire object.&lt;/p&gt;
&lt;p&gt;I tried quickly finding the Drupal way to do this: clearly there's an
API and there must be some simple way to retrieve an object, change it's
values, and update it so that the serialized object gets stored in the
database and Drupal is happy. However, I couldn't find a simple
tutorial, and trying #drupal on Freenode was unfortunately fruitless as
well (although some people did try to suggest running REPLACE() at the
database level, that was nice but they didn't recognize that that would
actually damage things significantly).&lt;/p&gt;
&lt;p&gt;So... out came the Perl, and here's what I hacked together:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
#!/bin/perluse strict;use warnings;foreach (&amp;lt;DATA&amp;gt;) {    chomp();    my $i = 0;    my $body = 0;    my &amp;#64;fixed;    my &amp;#64;row = split /\t/;    my $pid = $row[1];    my $configuration = $row[0];    my &amp;#64;chunks = split /&amp;quot;;s:/, $configuration;    foreach my $chunk (&amp;#64;chunks) {        if (!$i++) {            push &amp;#64;fixed, $chunk;            next;        }        if ($chunk =~ m/&amp;quot;body/) {            $body = 1;            push &amp;#64;fixed, $chunk;            next;        }        if ($body) {            my ($length, $content) = $chunk =~ m/^(\d+):&amp;quot;(.+)$/;          for (my $j = 0; $j &amp;lt; 50; $j++) {            $content =~ s{(/pictures/[^\./]+?)%20}{$1_}g;         }            $content =~ s{%20}{+}g;            $length = length($content);            $chunk = &amp;quot;$length:\&amp;quot;$content&amp;quot;;            $body = 0;        }        push &amp;#64;fixed, $chunk;    }    print 'UPDATE panels_pane SET configuration = $ashes$' .         join('&amp;quot;;s:', &amp;#64;fixed) . '$ashes$' . &amp;quot; WHERE pid = $pid;\n&amp;quot;;}__DATA__
&lt;/pre&gt;
&lt;p&gt;Against the trusty database (I ? PostgreSQL!), I ran
&lt;tt class="docutils literal"&gt;COPY (SELECT configuration, pid FROM panels_pane WHERE configuration ~ '%20') TO 'conf_pids.out';&lt;/tt&gt;,
then slapped the Perl code on top and generated a load of UPDATE
statements. It's far from my best Perl code, but it worked and once I
gave up on doing things the Drupal way I was able to put it together in
a handful of minutes. I now have a functional Drupal 6 instance again,
updated such that there are no known security vulnerabilities with
either core or the modules we're using, and there are no broken image
links.&lt;/p&gt;
&lt;p&gt;And now I need to begin working towards either grokking Drupal, or
finding a content management system that my tiny brain can comprehend,
because I don't want to have to go through these kinds of contortions
again with future upgrades... Suggestions welcome!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 18 Oct 2012 21:48:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2012-10-18:/triumph-of-the-tiny-brain-dan-vs-drupal-panels.html</guid><category>misc</category><category>Coding</category><category>Perl</category><category>PostgreSQL</category><category>coding</category><category>perl</category><category>postgresql</category></item><item><title>Seek and ye shall find: full-text search in PostgreSQL</title><link>https://coffeecode.net/seek-and-ye-shall-find-full-text-search-in-postgresql.html</link><description>&lt;p&gt;I'm at &lt;a class="reference external" href="http://postgresopen.org/2012"&gt;PostgresOpen&lt;/a&gt; in Chicago, and
just gave my talk on &lt;a class="reference external" href="http://stuff.coffeecode.net/2012/pgopen_fulltext/pgsql-fulltext-intro.html"&gt;Implementing full-text search in
PostgreSQL&lt;/a&gt;.
The goal was to give novice users the understanding and examples they
needed to build a workable search solution using PostgreSQL's full-text
search. And it went (in my opinion) well - an almost full room, lots of
audience interaction (thanks Bruce Momjian, Jonathan Scott, Jonathan
Katz, et al) a lot of nodding heads, and nobody running out of the room
screaming. So... yay!&lt;/p&gt;
&lt;p&gt;A few takeaways from prepping for the presentation:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I suspect that some effort on making the full-text search parser
extensible would go a long way towards resolving problems that you
currently have to work around by manipulating the text before it hits
the parser. For example, if you pass in a string like &lt;tt class="docutils literal"&gt;file/path&lt;/tt&gt;,
PostgreSQL classifies that as a &lt;tt class="docutils literal"&gt;file&lt;/tt&gt; token and stores it as-is -
but you might want to be able to search against either &amp;quot;file&amp;quot; or
&amp;quot;path&amp;quot; as well as the concatenated form. Right now you have to
preparse that string to break it up yourself (via regexp_replace()
or the like), but it would be much nicer if you could teach the
parser new tricks (without having to modify the source and recompile
it).&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;ts_headline()&lt;/tt&gt; might be a bottleneck for large documents - and (a)
solution might be to just bust the document up. *Note to self*: dig
into the underlying code to see if there's any chance of using
indexes to enable improvement.&lt;/li&gt;
&lt;li&gt;Ran into a bug with &lt;tt class="docutils literal"&gt;ts_rewrite()&lt;/tt&gt; while building the tutorial, and
have not yet worked out whether that was due to my local
configuration or an actual bug... &lt;strong&gt;TO DO!&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Also - PostgresOpen has had a great vibe so far; a relatively small but
very high-quality conference with lots of knowledgeable, friendly
participants. Selena (one of the organizers) had a goal of creating an
environment similar to PgCon, and I would say from my limited experience
attending one PgCon and one PostgresOpen that she and the rest of the
conference team have done a great job!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 18 Sep 2012 22:19:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2012-09-18:/seek-and-ye-shall-find-full-text-search-in-postgresql.html</guid><category>Databases</category><category>PostgreSQL</category><category>postgresql</category></item><item><title>Leaving SELinux in enforcing mode with Evergreen on Fedora 17</title><link>https://coffeecode.net/leaving-selinux-in-enforcing-mode-with-evergreen-on-fedora-17.html</link><description>&lt;p&gt;Ever since I switched over to Fedora a few years back (hi Fedora 13!),
I've been guilty of a dirty secret: to run Evergreen, I've had to run
&lt;tt class="docutils literal"&gt;setenforce 0&lt;/tt&gt; to disable the most excellent SELinux security policies
before I could start up the Apache web server to serve up the Evergreen
goodness. This worked for development purposes, but tonight something
snapped and I decided that it was no longer acceptable to throw away a
great layer of operating system security simply for the sake of hacking
on Evergreen. So... I stepped into the world of what had formerly seemed
to be inscrutable SELinux concepts, and came out with something that
seems to work (at least for my fairly limited purposes thus far of
searching the TPAC catalogue).&lt;/p&gt;
&lt;p&gt;This was a pretty iterative process that involved trying to start the
&lt;strong&gt;httpd.service&lt;/strong&gt;, then checking &lt;tt class="docutils literal"&gt;/var/log/messages&lt;/tt&gt; and
&lt;tt class="docutils literal"&gt;/var/log/audit/audit.log&lt;/tt&gt; for clues as to why httpd.service was
either not starting, or (once I passed that hurdle) was simply returning
internal server errors.&lt;/p&gt;
&lt;p&gt;First, due to my recent experience with running a web.py script under
Fedora, I had learned that the httpd SELinux policy had a number of
booleans for enforcing or allowing particular behaviours, so I
immediately ran the following command to enable httpd to connect to the
network:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
setsebool httpd_can_network_connect on
&lt;/pre&gt;
&lt;p&gt;I then needed to change the labels on many of the OpenSRF and Evergreen
files that were installed and which Fedora gave a default type of
&lt;tt class="docutils literal"&gt;unconfined_t&lt;/tt&gt;, which is understandably restrictive:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
# Mark web content as, well, web contentchcon -R --type=httpd_sys_content_t /openils/lib/javascriptchcon -R --type=httpd_sys_content_t /openils/var/webchcon -R --type=httpd_sys_content_t /openils/var/templates*chcon -R --type=httpd_sys_content_t /openils/var/datachcon -R --type=httpd_sys_content_t /openils/var/xslchcon --type=httpd_sys_content_t /openils/conf/opensrf_core.xmlchcon --type=httpd_sys_content_t /openils/conf/fm_IDL.xml # Mark the custom Apache modules chcon --user=system_u --type=httpd_modules_t /usr/lib64/httpd/modules/mod_xmlent.so chcon --user=system_u --type=httpd_modules_t /usr/lib64/httpd/modules/osrf_*# Mark the dynamic libraries we need to load# &amp;quot;-h&amp;quot; changes the context of symlinks as well as fileschcon -h --type=lib_t /openils/lib/*# Mark executable scriptschcon -t httpd_sys_script_exec_t /openils/bin/openurl_map.pl chcon -t httpd_sys_script_exec_t /openils/bin/offline-blocked-list.pl # Might not have been necessarychcon -R --user=system_u /usr/local/share/perl5/chcon --user=system_u /etc/httpd/conf.d/eg.conf chcon --user=system_u /etc/httpd/startup.pl chcon --user=system_u /etc/httpd/eg_vhost.conf chcon -R --user=system_u /etc/httpd/ssl/
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;*Note:*&lt;/strong&gt; I'm aware that simply running &lt;tt class="docutils literal"&gt;chcon&lt;/tt&gt; won't survive a
relabelling of the files. We really need to turn this into a policy, or
alternately use &lt;tt class="docutils literal"&gt;semanage&lt;/tt&gt; to make the changes permanent...&lt;/p&gt;
&lt;p&gt;Next, I opted to finally start running Apache as the stock apache:apache
user/group rather than as the &lt;tt class="docutils literal"&gt;opensrf&lt;/tt&gt; user. This turned out to
require only a few steps:&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p class="first"&gt;Change the &lt;tt class="docutils literal"&gt;User&lt;/tt&gt; setting in &lt;tt class="docutils literal"&gt;/etc/httpd/conf/httpd.conf&lt;/tt&gt; back to
&lt;tt class="docutils literal"&gt;apache&lt;/tt&gt;, reverting the change we made following the default
install documentation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;To avoid errors writing to the &lt;tt class="docutils literal"&gt;/openils/var/log&lt;/tt&gt; directory, cut
over to using syslog - which, on Fedora, is provided by &lt;strong&gt;rsyslogd&lt;/strong&gt;.&lt;/p&gt;
&lt;/p&gt;&lt;ol class="arabic simple"&gt;
&lt;li&gt;Copy the very handy &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Open-ILS/examples/evergreen-rsyslog.conf&lt;/span&gt;&lt;/tt&gt;
file that Bill Erickson created into &lt;tt class="docutils literal"&gt;/etc/rsyslog.d/&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;Restart the &lt;tt class="docutils literal"&gt;rsyslogd&lt;/tt&gt; service with
&lt;tt class="docutils literal"&gt;systemctl restart rsyslog.service&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Edit &lt;tt class="docutils literal"&gt;/etc/httpd/eg_vhost.conf&lt;/tt&gt; and
&lt;tt class="docutils literal"&gt;/openils/conf/opensrf_core.xml&lt;/tt&gt; to use syslog instead of
writing to log files.&lt;/li&gt;
&lt;li&gt;Restart the OpenSRF services.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;One more restart of the httpd service and I was in business.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So this is a start. I think this has broader implications than for just
Fedora; we should stop using the &lt;tt class="docutils literal"&gt;opensrf&lt;/tt&gt; user to run the Apache
service in the default configuration on all distributions (we've
discussed this several times in the past, but never really done anything
about it).&lt;/p&gt;
&lt;p&gt;I hope to update the README accordingly, and I also hope to take the
SELinux work a step further to provide a modified policy so that Fedora
and Red Hat (and derivative) distributions can offer a more secure
environment for running Evergreen.&lt;/p&gt;
&lt;p&gt;Oh, and some handy resources:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://wiki.centos.org/HowTos/SELinux"&gt;CentOS SELinux HOWTO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://wiki.centos.org/TipsAndTricks/SelinuxBooleans"&gt;CentOS SELinux
Booleans&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://docs.fedoraproject.org/en-US/Fedora/13/html/SELinux_FAQ/"&gt;Fedora SELinux
FAQ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sun, 02 Sep 2012 05:26:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2012-09-02:/leaving-selinux-in-enforcing-mode-with-evergreen-on-fedora-17.html</guid><category>Libraries</category><category>Evergreen</category><category>evergreen</category></item><item><title>Finding DRM-free books on the Google Play store</title><link>https://coffeecode.net/finding-drm-free-books-on-the-google-play-store.html</link><description>&lt;p&gt;John Mark Ockerbloom recently said, while trying to buy a DRM-free copy
of John Scalzi's
&lt;a class="reference external" href="https://play.google.com/store/books/details/John_Scalzi_Redshirts?id=2myG-uWq5zQC"&gt;Redshirts&lt;/a&gt;
on the Google Play Store: “&lt;a class="reference external" href="http://everybodyslibraries.com/2012/07/30/in-which-i-finally-buy-an-ebook/"&gt;The catalog page doesn’t tell me what format
it’s in, or whether it has DRM; it instead just asks me to sign in to
buy
it.&lt;/a&gt;”
I noted that if you read the full description (you have to click
&lt;strong&gt;More&lt;/strong&gt;), it actually does say:&lt;/p&gt;
&lt;blockquote&gt;
At the publisher's request, this title is being sold without Digital
Rights Management software (DRM) applied.&lt;/blockquote&gt;
&lt;p&gt;And that lead to the realization you search for the magic phrase: &lt;em&gt;this
title is being sold without Digital Rights Management software&lt;/em&gt;, you'll
find plenty of books up for sale on Google Play without DRM. When you
buy one, you can then download the ePub from the &lt;strong&gt;How to Read&lt;/strong&gt; tab for
the book. Pretty straightforward, no?&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 01 Aug 2012 05:13:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2012-08-01:/finding-drm-free-books-on-the-google-play-store.html</guid><category>misc</category><category>Coding</category><category>coding</category></item><item><title>Enabling mod_wsgi with LDAP access under Fedora 17</title><link>https://coffeecode.net/enabling-mod_wsgi-with-ldap-access-under-fedora-17.html</link><description>&lt;p&gt;Continuing my path of &lt;em&gt;new problem to solve = opportunity to try
something new&lt;/em&gt;, I opted to give &lt;a class="reference external" href="http://webpy.org"&gt;web.py&lt;/a&gt; a shot as
a Web front-end for an existing script I had put together to &lt;a class="reference external" href="http://git.evergreen-ils.org/?p=contrib/Conifer.git;a=blob;f=tools/patron-load/ldap_osrf_sync"&gt;provision
users in our Evergreen library system based on their LDAP
entry&lt;/a&gt;.
The goal was to provide access to the functionality of the script,
without having me as a single point of failure... something I have
intended to put in place for a long time, but which jumped up in
priority once I went on vacation and received a few requests (surprise,
surprise).&lt;/p&gt;
&lt;p&gt;Creating a web.py front end was easy enough. It was a bit more
challenging to put it into production, because my production box for
this task runs Fedora 17, and that means SELinux. In the past, my
knee-jerk reaction during development would be to &lt;tt class="docutils literal"&gt;setenforce 0&lt;/tt&gt; and
be done with it, but exposing it to more than just me at the terminal
means taking some care. So, fortunately, it was pretty easy to sort out
(thanks largely to the assistance gleaned from &lt;a class="reference external" href="http://www.packtpub.com/article/selinux-secured-web-hosting-python-based-web-applications"&gt;this Packtpub.com
article&lt;/a&gt;,
minus the compiling mod_wsgi from source bits).&lt;/p&gt;
&lt;p&gt;The pertinent bits for my case were:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Install mod_wsgi and web.py: &lt;tt class="docutils literal"&gt;yum install mod_wsgi &lt;span class="pre"&gt;python-webpy&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;Configure &lt;tt class="docutils literal"&gt;/etc/httpd/conf/httpd.conf&lt;/tt&gt; to include the appropriate
&lt;tt class="docutils literal"&gt;WSGIScriptAlias&lt;/tt&gt; line&lt;/li&gt;
&lt;li&gt;Fix the SELinux label on the WSGI files:
&lt;tt class="docutils literal"&gt;chcon &lt;span class="pre"&gt;-R&lt;/span&gt; httpd_user_content_t &lt;span class="pre"&gt;patron-load&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;Allow Apache to connect to an LDAP server:
&lt;tt class="docutils literal"&gt;setsebool &lt;span class="pre"&gt;-P&lt;/span&gt; httpd_can_connect_ldap=1&lt;/tt&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;And poof: my server still has the protection of SELinux, and my desired
functionality works. Yay!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 11 Jul 2012 14:23:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2012-07-11:/enabling-mod_wsgi-with-ldap-access-under-fedora-17.html</guid><category>misc</category><category>Evergreen</category><category>evergreen</category></item><item><title>First Go program: converting Google Scholar XML holdings to EBSCO Discovery Service holdings</title><link>https://coffeecode.net/first-go-program-converting-google-scholar-xml-holdings-to-ebsco-discovery-service-holdings.html</link><description>&lt;p&gt;&lt;strong&gt;Update 2012-06-19&lt;/strong&gt;: And here's how to &lt;a class="reference external" href="http://blog.davidsingleton.org/parsing-huge-xml-files-with-go/"&gt;implement stream-oriented XML
parsing&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Many academic libraries are already generating electronic resource
holdings summaries in the &lt;a class="reference external" href="http://scholar.google.ca/intl/en/scholar/institutional_holdings.xml"&gt;Google Scholar XML
holdings&lt;/a&gt;format, and it seems to provide most of the metadata you would need to
provide a discovery layer summary in a nice, granular format... but
unfortunately EBSCO doesn't want that for their Discovery Service. They
want a tab-delimited file with just a few fields, and they don't want to
go and fetch the Google Scholar XML holdings file and parse it
themselves--even though that would seem to be a nice way to avoid having
to teach each potential library client how to export holdings in their
own desired input format. &lt;em&gt;Lots of libraries don't expose their Google
Scholar XML holdings publicly for some reason; I don't get why not, but
have to investigate locally...&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;That gave me the excuse and opportunity to go off and invest some time
in learning something new. I could have whipped up a script in Perl or
Python or PHP, or written an XSL transform, but I opted to try out
&lt;a class="reference external" href="http://golang.org"&gt;Go&lt;/a&gt; for this task. I've been introduced to Go
twice in the past two years and was impressed by the language, but
there's only so much you absorb in a one-hour workshop, and unless you
need to get real work done, you never really learn a programming
language.&lt;/p&gt;
&lt;p&gt;Thus, I present to you my first crappy Go program:
&lt;a class="reference external" href="/uploads/files/eds_holdings.go"&gt;eds_holdings.go&lt;/a&gt;
As I wrote this, I noted:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I appreciate the clear reference documentation at &lt;a class="reference external" href="http://golang.org"&gt;http://golang.org&lt;/a&gt;
but it would really benefit from more inline examples. I ended up
writing the XML parsing portion of this using
&lt;a class="reference external" href="http://golang.org/pkg/encoding/xml/#Unmarshal"&gt;xml.Unmarshal&lt;/a&gt;
primarily because there was an example for it. Of course,
&lt;tt class="docutils literal"&gt;Unmarshal&lt;/tt&gt; parses the entire document into structures in memory at
once... I knew that wasn't what I wanted, but for whatever reason I
didn't find any mention of &amp;quot;SAX&amp;quot; or &amp;quot;event&amp;quot; or &amp;quot;pull&amp;quot; that would lead
me to a stream-oriented, low-memory parsing option on the page.&lt;/li&gt;
&lt;li&gt;However, the &lt;a class="reference external" href="irc://chat.freenode.net/#go-nuts"&gt;#go-nuts&lt;/a&gt; IRC
channel on Freenode gave me a reply within minutes, pointing me at
&lt;tt class="docutils literal"&gt;xml.Decoder&lt;/tt&gt; for that purpose. Which is really great - a
supportive community is critical. My only problem is that without a
simple example to follow, I didn't want to dive into rewriting my
quasi-working code, so I ploughed onward.&lt;/li&gt;
&lt;li&gt;My current approach to I/O is far from optimal. Not only am I parsing
the entire XML structure in memory, I'm also reading the entire XML
file into memory to begin with (via &lt;tt class="docutils literal"&gt;ioutil.FileRead&lt;/tt&gt; as a natural
outgrowth of my &amp;quot;begin by parsing a hard-coded string&amp;quot;). Don't follow
my example! Please point me at a better example &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/li&gt;
&lt;li&gt;The standards and consistency wonk in me likes that Go delegates
whitespace wars to &lt;tt class="docutils literal"&gt;go fmt &amp;lt;filename&amp;gt;&lt;/tt&gt;. Problem solved and
time-wasting arguments averted for everyone.&lt;/li&gt;
&lt;li&gt;Go is (subjectively) fast and for all of my worrying about in-memory
work, it was pretty lean -- at its maximum, consuming less than 200
MB of RAM while iterating over a 32 MB XML file. For comparison,
Firefox was consuming around 750 MB the entire time.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In summary: I enjoyed writing in Go, and hope to find an excuse to do it
again. Also, I have much to learn!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 11 Jun 2012 20:41:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2012-06-11:/first-go-program-converting-google-scholar-xml-holdings-to-ebsco-discovery-service-holdings.html</guid><category>Libraries</category><category>Coding</category><category>coding</category></item><item><title>Running libraries on PostgreSQL: PGCon 2012 talk</title><link>https://coffeecode.net/running-libraries-on-postgresql-pgcon-2012-talk.html</link><description>&lt;p&gt;On Friday, May 18th I gave &lt;a class="reference external" href="http://www.pgcon.org/2012/schedule/events/465.en.html"&gt;a talk&lt;/a&gt; at the PGCon 2012
conference on the use of PostgreSQL by the Evergreen project.  My talk fell in
the &lt;em&gt;case study&lt;/em&gt; track, which meant that I had been asked to describe to
PostgreSQL developers what Evergreen was, why it was a project they might want
to care about, enumerate the advantages that Evergreen gets from using
PostgreSQL, and where our project has some difficulties with PostgreSQL.&lt;/p&gt;
&lt;p&gt;I have given a lot of talks before, but I’m used to being on the developer side
of the discussion. In this case, the tables were turned; with noted PostgreSQL
contributors like Josh Berkus, Chris Brown, Simon Riggs, and Robert Treat in
the audience, I was a user talking to the developers of something that I was
very much dependent on and which I understood at a much more basic level than
they did. This was both liberating &lt;em&gt;and&lt;/em&gt; humbling; it definitely adds some
perspective to my experiences as a developer in the Evergreen project.&lt;/p&gt;
&lt;p&gt;Along with my slides, the whole talk has been professionally recorded - both
video and audio - thanks to Heroku’s sponsorship, so you will be able to relive
each and every word if you really want to. I’ll summarize the main points that
I wanted to convey to the PostgreSQL developers:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I was quite candid that most libraries can’t afford dedicated database
administrators, and that therefore the more that PostgreSQL can provide
reasonable out-of-the-box configuration settings, the better. For example,
results from &lt;a class="reference external" href="http://evergreen-ils.org/~denials/postgresql_survey.html"&gt;the survey that I sent out at the last minute&lt;/a&gt; (THANK YOU to
the nine sites that responded!) showed many sites running with a default
statistics target of 50, whereas the default had been increased to 100 back
in PostgreSQL 8.1 and much higher settings are often recommended to help the
planner make its decisions. That said, my survey didn’t ask for table-level
statistics settings (did you &lt;strong&gt;know&lt;/strong&gt; that you could change the statistics
for particular tables?), so perhaps some sites are using higher statistics
levels for particular tables and a lower default threshold.&lt;/li&gt;
&lt;li&gt;It was probably hokey, but I noted that as libraries are often called the
heart of their community, that PostgreSQL was effectively the heart of
Evergreen — and I invited the PostgreSQL community to help our heart beat
faster. With the Evergreen Oversight Board contemplating a strategic
investment fund for initiatives that will have a long-term benefit to
Evergreen, this might be an avenue for getting PostgreSQL experts to assist
us on areas that represent particular bottlenecks (beyond helping us out of
the goodness of their own hearts). As well, I invited the PostgreSQL
community to join in advocacy efforts to get their local libraries to
consider adopting Evergreen.&lt;/li&gt;
&lt;li&gt;I described, at a high-level, many of the PostgreSQL features that Evergreen
relies on (full-text search, stored procedures, Hstore, inheritance) and
tried to convey why our schema takes up 355 tables (and counting) to deal
with what, from outside a library perspective, must seem like a relatively
simple problem to deal with. And of course I gave most of the credit for
Evergreen’s PostgreSQL-savviness on multiple levels to Mike Rylander.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The talk was well-received, based on a number of people who approached me
afterward to continue the discussion. Josh called it one of the first times he
had seen a presentation designed to solicit assistance directly from the
developers in attendance (I probably overplayed the &amp;quot;help us poor harried
library system administrators&amp;quot; hand) and thought that it hit the mark for a
case study; similarly, Simon was quite interested in Evergreen’s adoption
patterns with (I suspect) an eye towards offering possible consulting in
administration and optimization efforts.&lt;/p&gt;
&lt;p&gt;On the &amp;quot;immediate takeaways&amp;quot; from that talk:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;For straightforward connection pooling, pgbouncer is the current
recommendation over the more flexible but more complicated pgpool-II.&lt;/li&gt;
&lt;li&gt;Recent versions of Slony have lifted limitations that bit us in the
past, like the inability to replicate a TRUNCATE command.&lt;/li&gt;
&lt;li&gt;Solr, as a potential alternative to PostgreSQL’s full-text search, is
seen as fast but brittle to manage, and adds in overhead to maintain
consistency with the contents of the database. (I’m not so sure about the
brittleness, given Hathitrust’s ability to run a massive Solr index, but it
is worth following up on…)&lt;/li&gt;
&lt;li&gt;Streaming replication in 9.1 has improved significantly over 9.0,
although you’ll still want to have WAL archiving in case of disaster.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I have a lot more to say about the intersection of the PostgreSQL and Evergreen
communities in general, but on the whole I think that a closer relationship has
been long overdue. I was delighted that Ben Shum and Robin Isard were both able
to attend the conference, and I firmly believe that building more PostgreSQL
development and administration expertise within the Evergreen community is
critical to our long-term success. While I have long been an advocate of
pointing community members to the documentation of the underlying
infrastructure components for specific administration recommendations, I
believe that effective PostgreSQL tuning and administration is so critical to
the successful implementation of a production Evergreen site that we should add
a section to the Evergreen documentation containing a small set of
considerations and/or processes for going into production—and I hope to start
that relatively soon.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sun, 20 May 2012 17:57:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2012-05-20:/running-libraries-on-postgresql-pgcon-2012-talk.html</guid><category>Libraries</category><category>Evergreen</category><category>PostgreSQL</category><category>evergreen</category><category>postgresql</category></item><item><title>The State / Stats of Evergreen development: 2011-2012</title><link>https://coffeecode.net/the-state-stats-of-evergreen-development-2011-2012.html</link><description>&lt;p&gt;On Thursday, April 26, I was part of &lt;strong&gt;The State of Evergreen&lt;/strong&gt; talk,
organized by Grace Dunbar, that also included sections by the dynamic
combo of Kathy Lussier, Ben Hyman, and &lt;a class="reference external" href="http://tararobertson.ca"&gt;Tara
Robertson&lt;/a&gt;. We opened the &lt;a class="reference external" href="http://evergreen2012.org/"&gt;Evergreen 2012
conference&lt;/a&gt; and lead into the day's
featured keynote speaker &lt;a class="reference external" href="http://jonobacon.org"&gt;Mr. Jono Bacon&lt;/a&gt; (who,
by the way, gave a good talk about community at an important time in
Evergreen's growth).&lt;/p&gt;
&lt;p&gt;My assigned mission was, with a time limit of 5 minutes, to give the
audience an update on the progress in Evergreen development since the
2011 conference. Naturally, I turned to
&lt;a class="reference external" href="http://code.google.com/p/gource/"&gt;gource&lt;/a&gt; to generate a
visualization of the &lt;a class="reference external" href="http://archive.org/details/Evergreen2011-2012SourceCodeVisualization"&gt;changes committed to the Evergreen git
repository&lt;/a&gt;
since April 2011.&lt;/p&gt;
&lt;p&gt;With the visualization running in the background, I ran over the
following numbers (&lt;em&gt;statistics&lt;/em&gt; is probably too strong of a word) with
the audience...&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;div id="header" class="slide"&gt;&lt;p class="rubric" id="state-of-evergreen-development-2012"&gt;State of Evergreen Development, 2012&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Dan Scott&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/div&gt;&lt;div id="preamble" class="slide"&gt;&lt;div class="sectionbody" style="max-width:45em"&gt;&lt;div class="paragraph"&gt;&lt;p&gt;Let’s go with &lt;strong&gt;*Stats&lt;/strong&gt; of Evergreen development*&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/div&gt;
&lt;p&gt;&lt;/div&gt;&lt;div class="sect1 slide"&gt;&lt;p class="rubric" id="code-contributors"&gt;Code contributors&lt;/p&gt;
&lt;div class="sectionbody" style="max-width:45em"&gt;&lt;div class="paragraph"&gt;&lt;p&gt;Over the past year, we have seen:&lt;/p&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;2209 commits from a total of &lt;strong&gt;29&lt;/strong&gt; different authors (8 active core
committers)&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;9 contributors outside of the core committer group with 5 or more
commits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Jason Stephenson&lt;/em&gt; - 48&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Michael Peters&lt;/em&gt; - 26&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Scott Prater&lt;/em&gt; - 20&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Joseph Lewis&lt;/em&gt; - 19&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;James Fournie&lt;/em&gt; - 16&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Robin Isard&lt;/em&gt; - 12&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Liam Whalen&lt;/em&gt; - 6&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Ben Shum&lt;/em&gt; - 6&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Steven Callender&lt;/em&gt; - 5&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;One female contributor - &lt;em&gt;Sarah Chodrow&lt;/em&gt; (More, please!)&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;&lt;a class="reference external" href="http://archive.org/details/Evergreen2011-2012SourceCodeVisualization"&gt;Source code
visualization&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/div&gt;
&lt;p&gt;&lt;/div&gt;&lt;div class="sect1 slide"&gt;&lt;p class="rubric" id="features"&gt;Features&lt;/p&gt;
&lt;div class="sectionbody" style="max-width:45em"&gt;&lt;ul class="simple"&gt;
&lt;li&gt;Autosuggest for searches&lt;/li&gt;
&lt;li&gt;TPAC - a sane, fast, functional catalogue
- Print &amp;amp; email &amp;amp; SMS record details
- Opt-in circulation &amp;amp; hold history&lt;/li&gt;
&lt;li&gt;Authentication proxy - with example support for LDAP authentication in JSPAC&lt;/li&gt;
&lt;li&gt;Custom library hierarchies, library visibility, and copy location
groups&lt;/li&gt;
&lt;li&gt;Staff client enhancements: secondary sorting columns, row numbers,
double-clickery, configurable toolbars&lt;/li&gt;
&lt;li&gt;Patron statistical categories: defaults, freetext control,
required-ness&lt;/li&gt;
&lt;li&gt;Acquisitions, MARC Batch Import/Export, and serials UI enhancements&lt;/li&gt;
&lt;li&gt;Circulation limits&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="policies-and-procedures"&gt;Policies and procedures&lt;/p&gt;
&lt;div class="sectionbody" style="max-width:45em"&gt;&lt;ul&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Master is always stable&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;To avoid time-wasting regressions, every commit must be reviewed&lt;/p&gt;
&lt;p&gt;and tested by a second developer&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Timed releases&lt;/em&gt; - for predictability&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;One major release every six months, starting with 2.2.0&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Patch releases - no timed policy as of yet&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Community support policy&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Each major release gets 12 months of full support, followed by 3&lt;/p&gt;
&lt;p&gt;months of security patches&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Therefore, sites should plan on one major upgrade per year&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Database upgrade script sanity&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="communication"&gt;Communication&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;a class="reference external" href="http://libmail.georgialibraries.org/mailman/listinfo/open-ils-dev"&gt;Developer mailing
list&lt;/a&gt;
-  970 messages&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;a class="reference external" href="http://evergreen-ils.org/irc.php"&gt;Internet relay chat (IRC)
channel&lt;/a&gt;
-  76,476 lines &lt;a class="reference external" href="http://goo.gl/E0fxd"&gt;and other stats&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;strong&gt;tsbere&lt;/strong&gt; and &lt;strong&gt;dbs&lt;/strong&gt; in a neck-and-neck race with 13,474 and 12,062 lines, respectively&lt;/li&gt;
&lt;li&gt;26 people averaged more than one lines per day&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;a class="reference external" href="http://evergreen-ils.org/dokuwiki/doku.php?id=dev:meetings"&gt;Developer IRC
meetings&lt;/a&gt;
-  19 meetings held&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="documentation"&gt;Documentation&lt;/p&gt;
&lt;div class="sectionbody" style="max-width:45em"&gt;&lt;div class="paragraph"&gt;&lt;p&gt;Since last year:&lt;/p&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;12 meetings&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;200 commits, covering 2.0, 2.1, and 2.2&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Conversion from DocBook to AsciiDoc&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Single sourcing install documentation and release notes&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Kudos to:&lt;/p&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Karen Collier for direction and organization&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Robert Soulliere for tirelessly formatting and publishing&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Yamil Suarez for picking up the torch from Karen&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Many other members of the Documentation Interest Group (&lt;em&gt;DIG&lt;/em&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="releases"&gt;Releases&lt;/p&gt;
&lt;div class="sectionbody" style="max-width:45em"&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;strong&gt;2.0 series&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;em&gt;April 2011&lt;/em&gt; - 2.0.5&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;em&gt;May 2011&lt;/em&gt; - 2.0.6&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;em&gt;June 2011&lt;/em&gt; - 2.0.7&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;August 2011&lt;/em&gt; - 2.0.8, 2.0.9&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;October 2011&lt;/em&gt; - 2.0.10, 2.0.10a&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2.1 series&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;October 2011&lt;/em&gt; - 2.1.0, 2.1.0a&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;November 2011&lt;/em&gt; - 2.1.1&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2.2 series&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;November 2011&lt;/em&gt; - 2.2 alpha1&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;March 2012&lt;/em&gt; - 2.2 alpha2, 2.2 alpha3&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;April 2012&lt;/em&gt; - 2.2 beta1, 2.2 beta2&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 30 Apr 2012 00:56:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2012-04-30:/the-state-stats-of-evergreen-development-2011-2012.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Why I donated to the Software Freedom Conservancy</title><link>https://coffeecode.net/why-i-donated-to-the-software-freedom-conservancy.html</link><description>&lt;p&gt;A few days ago I made a small donation to the &lt;a class="reference external" href="http://sfconservancy.org"&gt;Software Freedom Conservancy&lt;/a&gt;, a 501(c)(3) non-profit organization registered
in the United States. There are many organizations to which I could have
donated, and indeed Lynn and I have donated to a number of charities again this
year, but I felt it was important to direct some funds to the Conservancy for a
number of reasons - which I will attempt to describe and hopefully convince you
as well.&lt;/p&gt;
&lt;p&gt;First, for those who know that the Evergreen open source integrated library
system is a member project of the Conservancy and the the project on which I
invest much of my professional and person time, an obvious question might be:
&amp;quot;Why didn't you just &lt;a class="reference external" href="http://evergreen-ils.org/sfc.php"&gt;donate to
Evergreen?&lt;/a&gt;&amp;quot;. Donating to Evergreen does result in a small percentage of those
funds being directed to the Conservancy. Currently, Evergreen directs 5% of its
income to the Conservancy, but I feel that even with $20,000 passing through
the project's hands for the purposes of the 2012 Evergreen conference, that
$1,000 that goes to the Conservancy is far below the value our project has
received in return in the form of Conservancy services.  One of those services
is the provision of a trusted third-party home for project assets such as the
aforementioned finances, but also including domain names, trademarks, logos,
and (if desired) copyright. While distributed ownership of these assets is not
a problem for projects when everything is going fine, personal disputes, a
change of business strategy, or new ownership of a contributing company can
lead to severe difficulties for a project.  Evergreen's sister project, &lt;a class="reference external" href="http://koha-community.org"&gt;Koha&lt;/a&gt;, found itself forced to change its domain name
and fight trademark battles over its very name when one company adopted an
aggressive business strategy.&lt;/p&gt;
&lt;p&gt;Another service from which Evergreen has thus far derived great benefit is
access to legal counsel familiar with software freedom issues. In September the
Conservancy &lt;a class="reference external" href="http://sfconservancy.org/news/2011/sep/30/general-counsel/"&gt;added Tony Sebro as General Counsel&lt;/a&gt; to offer basic
legal assistance to its member projects. The Conservancy was most recently
involved in a discussion about Evergreen documentation licensing that evolved
from an unfortunately adversarial position to, shortly after the Conservancy
became involved, a mutually satisfactory agreement. I believe this result was
due not only to Conservancy's legal expertise and familiarity with the specific
licenses in question and the general mechanism of granting licenses, but also
with their ability to understand the goals of the project and its participants
in helping to guide all parties to their desired goals.&lt;/p&gt;
&lt;p&gt;The Conservancy also has a wealth of experience to draw upon to offer guidance
expertise on many matters that free software projects have in common, but which
each project tends to rediscover on its own. For example, the Evergreen project
has been able to run conferences on an annual basis for the past three years,
but has historically relied on Equinox's willingess to assume the financial
risks when signing venue contracts. This year, due to the positive results of
the previous conferences, the Conservancy was able to provide the deposit for
the Evergreen 2012 conference in Indiana. While personally I deeply appreciate
the role that Equinox has played in helping to build such a core part of our
community experience, it is an important step for our project that the
Conservancy be able to assume this role.&lt;/p&gt;
&lt;p&gt;In addition, the Conservancy's experience with various conference management
packages and the payment fees associated with online financial services such as
Google Checkout and PayPal provided some important guidance early on in the
Evergreen conference 2012 planning process. That advice probably paid for
itself!&lt;/p&gt;
&lt;p&gt;I expect that the Evergreen project will continue to benefit from our
membership in the Software Freedom Conservancy as we work towards a mechanism
for electing members of the Evergreen Oversight Board and continue growing and
evolving the project. The $1,000 or so that the Conservancy has earned as a
result of the 5% of revenue that Evergreen directs its way is far below the
value that we have derived from our relationship thus far, and that is why I
have chosen to donate to the Conservancy again this year.&lt;/p&gt;
&lt;p&gt;P.S. As a 501(c)(3) non-profit, donations to the Conservancy are tax-deductible
for American citizens. As a Canadian, this particular benefit does not apply to
me - however, the rest of the benefits that the Conservancy provides to free
software projects are international in scope and deserve to be supported.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 26 Dec 2011 14:15:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2011-12-26:/why-i-donated-to-the-software-freedom-conservancy.html</guid><category>Software Freedom</category><category>Evergreen</category><category>FSOSS</category></item><item><title>What does a system librarian do?</title><link>https://coffeecode.net/what-does-a-system-librarian-do.html</link><description>&lt;p&gt;&lt;em&gt;Preface:&lt;/em&gt; I'm talking to my daughter's kindergarten class tomorrow
about my job. Exciting! So I prepped a little bit; it will probably go
entirely different, but here's how it's going to go in my mind...&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;My name is Dan Scott. I’m Amber’s dad. I’m a systems librarian at
Laurentian&lt;/p&gt;
&lt;p&gt;University.&lt;/p&gt;
&lt;/div&gt;&lt;div class="paragraph"&gt;&lt;p&gt;Today you’re going to learn what a systems librarian does. Exciting, eh?&lt;/p&gt;
&lt;/div&gt;&lt;div class="paragraph"&gt;&lt;p&gt;I bet you have all been to a library. When you think about a library,
what do&lt;/p&gt;
&lt;p&gt;you think of first?&lt;/p&gt;
&lt;/div&gt;&lt;div class="ulist"&gt;&lt;ul&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Books&lt;/em&gt;&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;div class="paragraph"&gt;&lt;p&gt;Yep - books! I do a lot of work with books! Can you guess what sorts of
things&lt;/p&gt;
&lt;p&gt;I do with books?&lt;/p&gt;
&lt;/div&gt;&lt;div class="ulist"&gt;&lt;ul&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Choose which books to add to the library: &lt;strong&gt;Selection&lt;/strong&gt;&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;And when we get new books, where do we put them? : &lt;strong&gt;Organization&lt;/strong&gt;&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;And when we have too many books, choose which books to give away:
&lt;strong&gt;Weeding&lt;/strong&gt;&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;div class="paragraph"&gt;&lt;p&gt;But there’s more to libraries than books! What else can you think of
that are&lt;/p&gt;
&lt;p&gt;in libraries?&lt;/p&gt;
&lt;/div&gt;&lt;div class="ulist"&gt;&lt;ul&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Movies&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Music&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Magazines&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Newspapers&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Puppets&lt;/p&gt;
&lt;/p&gt;&lt;div class="ulist"&gt;&lt;ul&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Yes, puppets&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Computers&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;div class="paragraph"&gt;&lt;p&gt;Ah, computers. That’s where I &lt;em&gt;really&lt;/em&gt; spend a lot of time. When I was a
little&lt;/p&gt;
&lt;p&gt;boy, I was a voracious reader - I would read &lt;strong&gt;anything&lt;/strong&gt;, including
cereal boxes&lt;/p&gt;
&lt;p&gt;and encyclopedia - and I was &lt;strong&gt;fascinated&lt;/strong&gt; by computers. Completely
obsessed.&lt;/p&gt;
&lt;p&gt;So, naturally, when I went to high school I also got a job at the
children’s&lt;/p&gt;
&lt;p&gt;library as a &amp;quot;computer page&amp;quot;. I was a big kid, and I helped all the
little kids&lt;/p&gt;
&lt;p&gt;use the computers at the library.&lt;/p&gt;
&lt;/div&gt;&lt;div class="paragraph"&gt;&lt;p&gt;Now that I’m grown up, I’m still doing pretty much the same thing -
except now&lt;/p&gt;
&lt;p&gt;I’m helping the adults use computers. Except now I’m helping them by
making it&lt;/p&gt;
&lt;p&gt;easier for them to get the books or magazines or music or movies or
puppets&lt;/p&gt;
&lt;p&gt;(yes! puppets!) that they need; and a lot of the time, they don’t even
have to&lt;/p&gt;
&lt;p&gt;come to the library. They can read or watch or listen to whatever they
need&lt;/p&gt;
&lt;p&gt;right on their computers - and sometimes they need help, but that’s what
I’m&lt;/p&gt;
&lt;p&gt;there for.&lt;/p&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 22 Nov 2011 21:50:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2011-11-22:/what-does-a-system-librarian-do.html</guid><category>Libraries</category><category>Coding</category></item><item><title>10 years ago you...</title><link>https://coffeecode.net/10-years-ago-you.html</link><description>&lt;div class="line-block"&gt;
&lt;div class="line"&gt;... walked out of a pub ...&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;... stood with me before the falls, in front of our friends and family
...&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;... looked radiant in the harvest sun ...&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;... said your vows (after I valiantly flicked a ladybug away) ...&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;... improved my life immeasurably.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Thank you Lynn. You are my sun and moon and stars.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 20 Oct 2011 14:48:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2011-10-20:/10-years-ago-you.html</guid><category>Family</category><category>Personal</category></item><item><title>Current state of academic reserves support for Evergreen</title><link>https://coffeecode.net/current-state-of-academic-reserves-support-for-evergreen.html</link><description>&lt;p&gt;One of the relatively frequent questions that I run into with Evergreen
is &amp;quot;Does Evergreen have an academic reserves module?&amp;quot; And the answer is:
well, yes, and no. There is no official academic reserves module that is
part of the standard Evergreen package that you download and install
from &lt;a class="reference external" href="http://evergreen-ils.org"&gt;http://evergreen-ils.org&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;However, I am aware of two free-and-open-source modules that are
available as extensions to Evergreen:&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p class="first"&gt;A relatively simple, straightforward module, written by my colleague
Kevin Beswick, is in use at Laurentian University and recently was
adopted by the &lt;strong&gt;emily carr university of art + design&lt;/strong&gt;. It builds
on Evergreen's bookbags feature to organize reserves of physical
items by class code and instructor name. The module for that code--a
mix of PHP, Dojo, and SQLite--is available on
&lt;a class="reference external" href="https://github.com/kbeswick/library/tree/master/reserves"&gt;Github&lt;/a&gt;,
and you can see it in action at &lt;a class="reference external" href="http://biblio.laurentian.ca/reserves/"&gt;Laurentian
University&lt;/a&gt;.&lt;/p&gt;
&lt;/p&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;strong&gt;UPDATE 2012-12-21&lt;/strong&gt;: See the version I forked at
&lt;a class="reference external" href="https://github.com/dbs/library/tree/master/reserves"&gt;https://github.com/dbs/library/tree/master/reserves&lt;/a&gt; with updates
supporting TPAC integration&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;Syrup&lt;/strong&gt; is a more sophisticated reserve system (you know it's a
serious project when it has a name!), which supports all kinds of
features - such as mixes of electronic and physical materials,
organizing course content by arbitrary groupings (e.g. readings per
week), limiting user access to the content of specific courses based
on LDAP integration, and much much more. You can see a running
instance at the &lt;a class="reference external" href="http://reserves.uwindsor.ca/syrup/browse/"&gt;University of
Windsor&lt;/a&gt; and the code
(primarily written in Python) is freely available from the &lt;a class="reference external" href="http://git.evergreen-ils.org/?p=Syrup.git;a=summary"&gt;Syrup git
repository&lt;/a&gt;
on Evergreen's git server. If you need help getting up and running,
Syrup's &lt;a class="reference external" href="%20http://groups.google.com/group/syrup-reserves-discuss"&gt;mailing
list&lt;/a&gt; is
probably a good place to start.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So, there are at least two choices for academic reserves for Evergreen.
Go ahead and pick the one that meets your needs!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 08 Sep 2011 03:09:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2011-09-08:/current-state-of-academic-reserves-support-for-evergreen.html</guid><category>Libraries</category><category>Evergreen</category><category>evergreen</category></item><item><title>The wonderful new OpenLibrary Read API and Evergreen integration</title><link>https://coffeecode.net/the-wonderful-new-openlibrary-read-api-and-evergreen-integration.html</link><description>&lt;p&gt;Back in early May, I was in San Francisco for Google I/O. I had booked an extra
day with the hopes of either doing some site-seeing or meeting up with the
&lt;a class="reference external" href="http://openlibrary.org"&gt;OpenLibrary&lt;/a&gt; team. After firing off an email to
find out if anyone there was interested on working on some tighter integration
between OpenLibrary and Evergreen, the answer from George Oates was an
enthusiastic &amp;quot;Yes!&amp;quot;. So, we spent a beautiful sunny day inside the Internet
Archive headquarters discussing possible directions for this integration.
Alcatraz, you can wait for my next trip...&lt;/p&gt;
&lt;p&gt;As it turned out, the timing was great. I had spent a day hacking on the
OpenLibrary &amp;quot;added content&amp;quot; module for Evergreen during the Evergreen hackfest
(which I spent in an airport due to an eight-hour fog delay... different
story), so I was quite familiar with the existing OpenLibrary Book API and
their patterns of use were fresh in my brain. The biggest problem with the
existing Book API, from my perspective, was that I had to make two calls for
each work that I was interested in retrieving information about; one call
returned the &lt;em&gt;data&lt;/em&gt; (stable elements) and one call returned the &lt;em&gt;details&lt;/em&gt;
(unstable, but quite interesting elements like the table of contents, excerpts,
etc).&lt;/p&gt;
&lt;p&gt;The OpenLibrary team had this in their sights as well - but they wanted to
tackle a bigger target. Rather than making one or more calls per work, they
wanted to expose an API that would let users request info for multiple works in
one shot: the &lt;em&gt;Shotgun API&lt;/em&gt; (known amongst more polite company as the &lt;em&gt;Read&lt;/em&gt;
API). Loosely modelled on the Hathitrust API, it would also focus on exposing
URLs for reading or borrowing (using the relatively recent OpenLibrary
borrowing program) exact matches or similar editions. It sounded great, and we
spent the afternoon fleshing out how we wanted it to look and work. My role was
largely that of the third-party developer - the API customer - and we had great
discussions.&lt;/p&gt;
&lt;div class="section" id="working-code-wins"&gt;
&lt;h2&gt;Working code wins&lt;/h2&gt;
&lt;p&gt;Of course, discussions are one thing, and working code is another.  OpenLibrary
developer Mike McCabe was riding shotgun on the development of the Read API,
and once he had enough working code in place, he contacted me to ask me to
start developing against it. It was the usual development process: I started
with a hard-coded sample JSON output, then as Mike pushed more functionality
into a server environment I was able to test and expand my client-side code.&lt;/p&gt;
&lt;p&gt;So where are we now? I can vouch that working with the all-in-one Read API, as
a developer, is sweet. All of the data elements are readily visible in sweet,
sweet JSON, in a single call, and it is utterly simple to pull the bits that
you want to expose. I had been trying to pull together ebook links and the like
from the Books API, and the use of the &lt;tt class="docutils literal"&gt;items&lt;/tt&gt; list makes that absolutely
painless for developers. Kudos!&lt;/p&gt;
&lt;p&gt;Evergreen has a largely rewritten OpenLibrary added content module built
against the Read API sitting in the Evergreen working repository
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;user/dbs/openlibrary-read-api&lt;/span&gt;&lt;/tt&gt; branch. As the &lt;strong&gt;Borrow&lt;/strong&gt; and &lt;strong&gt;Read&lt;/strong&gt;
functions depend on IP address range matching, I have added the ability to
proxy the Read API requests via the Evergreen server - so that if an Evergreen
institution has special access rights to the OpenLibrary collection, their
patrons will see the appropriate levels of access in the catalogue. Oh yes, the
catalogue; as we were already using OpenLibrary by default for cover art,
tables of content, and excerpts in Evergreen since the 2.0 release, the major
difference that will be visible to Evergreen users will be in search results:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/files/openlibrary-evergreen.png"&gt;&lt;img alt="Search results showing OpenLibrary Read integration" class="serendipity-image-left" src="/uploads/files/openlibrary-evergreen.serendipityThumb.png" style="width: 110px; height: 66px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As you can see, if you have left the &lt;tt class="docutils literal"&gt;OpenLibraryLinks&lt;/tt&gt; variable turned on in
the &lt;tt class="docutils literal"&gt;result_common.js&lt;/tt&gt; file, Evergreen will search for a matching record in
OpenLibrary and tell you if an online version is available. It tells you
whether the online version is an exact match, or similar, and will also expose
items that you can borrow from OpenLibrary. Given the preponderance of print
materials that still remains in our collections, and our users' general
preference for anything electronic, I think this will be an extremely popular
feature.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="moving-forward"&gt;
&lt;h2&gt;Moving forward&lt;/h2&gt;
&lt;p&gt;There are a number of areas that could use more polish and tender loving
care.&lt;/p&gt;
&lt;p&gt;First and foremost, OpenLibrary supports matching based on ISBNs, LCCNs,
OCLC numbers, and OpenLibrary IDs; right now, the Evergreen support is based
strictly on ISBNs, which of course don't exist for many of the older materials
in our collections. So a fruitful direction would be to take the regular dump
of data that OpenLibrary thoughtfully provides (yay for open data) and use that
to augment our records to include OpenLibrary ID numbers to use as a match
point.&lt;/p&gt;
&lt;p&gt;There is the small matter of merging these changes back into Evergreen
proper.&lt;/p&gt;
&lt;p&gt;I developed against the Evergreen 2.0 branch because I wanted to be able to put
this code into production as soon as possible, so there will be a tiny bit of
merging pain to get this into master and backported properly.  However, the
changes are quite localized and should be agreeable, so hopefully this will not
sit in a branch for too long.&lt;/p&gt;
&lt;p&gt;At this early stage in the Read API's release, I have also found that it can be
a bit slow to respond to requests containing a number of identifiers (or
perhaps a large number of records and items). It is to be expected that
functionality comes first and optimization comes later, so I have great hopes
for improved performance once the Read API settles down.&lt;/p&gt;
&lt;p&gt;Of course, once you have the Read API, you need an Write API - and I hope to be
able to help pilot that as well, because the potential communal benefit of a
Write API for library systems that have integrated with OpenLibrary is huge.
Imagine a system where, when you ask for added content based on a given
identifier, if the system says &amp;quot;Huh, I don't know anything about that
identifier&amp;quot; it follows up with &amp;quot;Hey, can you POST what you know about it to
this URL?&amp;quot;.&lt;/p&gt;
&lt;p&gt;OpenLibrary could then run its algorithms and either add an edition to an
existing work or generate a new work. We should also be able to expose
OpenLibrary's metadata editing tools for our users, so they can flag bad cover
art, or add a table of contents to works that they are passionate about, or
post a favourite excerpt... Enabling a bi-directional give and take between
systems has the potential to quickly make OpenLibrary a huge knowledgebase of
open data.  It would be a great boon for libraries, and I hope we can make it
happen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2011-06-02 21:54 EDT&lt;/strong&gt;: The omission of Mike McCabe's name has been
corrected. Also, I forgot to thank my employer, Laurentian University, and the
University of Windsor for allowing me to invest some of my time on
strengthening Evergreen's ties to OpenLibrary. I believe this is the beginning
of a solid, mutually beneficial partnership!&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 02 Jun 2011 20:06:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2011-06-02:/the-wonderful-new-openlibrary-read-api-and-evergreen-integration.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Farewell, old Google Books APIs</title><link>https://coffeecode.net/farewell-old-google-books-apis.html</link><description>&lt;p&gt;Since the announcement of the new v1 Google Books API, I've been doing a
bit of work with it in Python (following up on &lt;a class="reference external" href="/archives/246-The-new-Google-Books-API-and-possibilities-for-libraries.html"&gt;my part of the
conversation&lt;/a&gt;).
Today, Google
&lt;a class="reference external" href="http://googlecode.blogspot.com/2011/05/spring-cleaning-for-some-of-our-apis.html"&gt;announced&lt;/a&gt;
that many of their older APIs were now officially deprecated. Included
in that list are the &lt;a class="reference external" href="https://code.google.com/apis/books/docs/gdata/developers_guide_protocol.html"&gt;Google Books Data
API&lt;/a&gt;
and the &lt;a class="reference external" href="https://code.google.com/apis/books/docs/js/devguide.html"&gt;Google Books JavaScript
API&lt;/a&gt;. These
APIs will be retired as of December 1, 2011. (Thanks to &lt;em&gt;jgeerdes&lt;/em&gt; in
the #googleapis IRC channel for the heads up today).&lt;/p&gt;
&lt;p&gt;There already has been &lt;a class="reference external" href="http://groups.google.com/group/google-ajax-search-api/browse_thread/thread/dc32b9a7df09eaf5"&gt;some
outrage&lt;/a&gt;
expressed over the switch to new APIs; five months is not a lot of time
to shift gears if you've built a significant architecture on top of the
old APIs. But I have some sympathy for Google, in this case; the new
&amp;quot;Discovery&amp;quot; APIs are based on a common, consistent architecture that
will be easier for them to document, maintain, manage, and ... monetize,
of course. (Good time for full disclosure, I suppose: I am a Google
stockholder.)&lt;/p&gt;
&lt;p&gt;So far, the only major concern I have with the new v1 Google Books API
is one missing function that was available in the Data API: the ability
to do a full-text search of a custom bookshelf. Accordingly, I've filed
&lt;a class="reference external" href="http://code.google.com/p/google-ajax-apis/issues/detail?id=587"&gt;a
bug&lt;/a&gt;
in the AJAX APIs issue tracker. Here's hoping that the deprecation of
the old APIs enables Google to focus on their anointed APIs on all
fronts: documentation, features, and support. Bug 587 should be a good
testcase.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 27 May 2011 02:08:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2011-05-27:/farewell-old-google-books-apis.html</guid><category>misc</category><category>Coding</category></item><item><title>Reducing cached content pain after Evergreen upgrades</title><link>https://coffeecode.net/reducing-cached-content-pain-after-evergreen-upgrades.html</link><description>&lt;p&gt;If you have been through an Evergreen upgrade, you know that the days
after the upgrade can be painful. Users complain that the catalogue
doesn't work right, there are mysterious glitches that happen on some
machines and not others (even though the browser and operating systems
are identical on each machine!), rebooting doesn't help... and then
eventually the problem goes away.&lt;/p&gt;
&lt;p&gt;The problem isn't all that mysterious, really, it's the result of the
browser caching content. Normally, browser caching is a very positive
experience: when a browser requests a file from a Web server, the Web
server tells it to how long the browser should hold onto the file via a
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Cache-control&lt;/span&gt;&lt;/tt&gt; directive. This means that if a page on your Web site
is dozens of hundreds of images and CSS and JavaScript files, your
browser doesn't have to download every one of those files on every page
you visit; as long as the file hasn't expired, the browser can just
serve it up from the local cache and only the fresh content needs to be
fetched from the server. It's how the Web works, and it's really
important for performance reasons.&lt;/p&gt;
&lt;p&gt;However, if your Web server has told your browser to cache files for a
month, and then during that month you upgrade your Web site so that
there is new JavaScript and CSS files that your fresh content depends
on, then you can run into trouble until those cached files expire. And
that is exactly the case that we run into with Evergreen upgrades - only
the problem is amplified by how heavily the Evergreen catalogue (which
is just a Web site) relies on JavaScript for basic operations.&lt;/p&gt;
&lt;p&gt;On the user side, you can handle the problem a few ways:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Doing a &lt;em&gt;hard refresh&lt;/em&gt; to force the browser to fetch fresh versions
of all the files in its cache. You can force a hard refresh on most
browsers by holding down the &lt;tt class="docutils literal"&gt;Shift&lt;/tt&gt; key and clicking the
&lt;tt class="docutils literal"&gt;Refresh&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;Reload&lt;/tt&gt; button.&lt;/li&gt;
&lt;li&gt;Emptying the browser cache.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Neither of these user-side approaches is particularly convenient. Doing
a hard refresh may work for one page, but as the user navigates to a
different page that uses different CSS and JavaScript, they will have to
do another hard refresh... and so on, which in the case of Evergreen
means users will have to refresh around a half-dozen different pages
(home page, search results, record details, account, advanced search).
Hard refreshes are also not reliable, as resources fetched by XHR are
not actually refreshed (this is &lt;a class="reference external" href="http://code.google.com/p/chromium/issues/detail?id=37711"&gt;a long-standing bug with Chrome and
Firefox&lt;/a&gt;).
If you don't know what XHR is, just know that Evergreen uses a lot of
them. And emptying the browser cache is both painful (every browser has
a different way of emptying browser cache) and overkill (you just want
to discard the cache for one site, but most browsers will discard the
cache for every site they have visited).&lt;/p&gt;
&lt;p&gt;The &amp;quot;right&amp;quot; solution is to have the server tell the browser to fetch a
new version of the resource. You could change the caching settings to be
very short-lived - for example, change the cache time from one month
down to one day for JavaScript and CSS - but unless you upgrade your
site very frequently, that would mean that 99% of the time your users'
browsers will be making unnecessary requests, and their experience of
your catalogue will be that it is slower to load than other sites on the
Web. Not so good.&lt;/p&gt;
&lt;p&gt;The other approach is to change the pathname for the cached resources at
upgrade time so that the browser doesn't find a match in its local cache
and has to fetch the new version. There's some good news: some work has
been going on in the Evergreen 2.1 release to tackle this problem, but
it is not yet complete. And most sites are only looking at moving to 2.0
right now. As it happens, we made the jump from 1.6.1.8 to 2.0.6+
yesterday and boy howdy the browser cache was a problem after the
upgrade, as one would expect. I took a quick stab at identifying the
most likely paths that needed to be refreshed and threw together some
shell commands to &amp;quot;munge&amp;quot; our catalogue skins so that browsers would be
forced to pick up the new versions of the content.&lt;/p&gt;
&lt;p&gt;Post-upgrade panic, I refactored those commands into &lt;a class="reference external" href="http://git.evergreen-ils.org/?p=contrib/Conifer.git;a=blob;f=tools/migration-scripts/cache-munger.pl;h=aa2a49a030e9b4d9aeb1213562609dc640d3e453;hb=master"&gt;a Perl script
named
cache-munger.pl&lt;/a&gt;
(well, more precisely, a Perl script that generates shell commands). The
Perl script has two hardcoded variables: a datestamp (which is really
any uniquely identifying string that can appear in a directory name and
URL) and a list of catalogue skins to munge. When you run the script, it
generates a set of shell commands that you should be able to run on your
Evergreen 2.0 instance to force browsers to cache the new version of
your catalogue's JavaScript and CSS files.&lt;/p&gt;
&lt;p&gt;Some limitations: I haven't written a script to convert your skins back
to pristine mode (that's mostly a matter of updating the ack-grep
commands and reversing the sed commands). And I haven't written a script
to update a munged set of skins. And, I'm not 100% sure that I've hit
every set of JavaScript and CSS that needs to be refreshed after an
upgrade from 1.6 to 2.0. But it's a reasonable start, in my opinion, and
hopefully it helps inform the Evergreen 2.1 effort so that we can have a
standard, supported, painless means of telling browsers to fetch new
resources as an automatic part of any upgrade in the future.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 23 May 2011 15:16:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2011-05-23:/reducing-cached-content-pain-after-evergreen-upgrades.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>The new Google Books API and possibilities for libraries</title><link>https://coffeecode.net/the-new-google-books-api-and-possibilities-for-libraries.html</link><description>&lt;p&gt;On the subject of the new Google Books API that was unveiled during the
Google IO 2011 conference last week, Jonathan Rochkind
&lt;a class="reference external" href="http://bibwild.wordpress.com/2011/05/12/new-google-books-api/"&gt;states&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;p&gt;Once you have an API key, it can keep track of # requests for that
key — it’s not clear to me if they rate limit you, and if so at what
rate.&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;I can answer that. There's no mystery to how many queries per day you're
allowed per API key; as &lt;a class="reference external" href="https://code.google.com/apis/console"&gt;the Google API Console
shows&lt;/a&gt;, the default limit is
1,000 per day. Note: &lt;em&gt;default&lt;/em&gt; - this suggests that Google is willing to
be flexible on this front. Now, I can imagine the immediate grousing
response along the lines of &amp;quot;Good luck getting Google to respond&amp;quot;, etc.
This is one of the reasons I attended Google IO last year and this year:
human contact is much more valuable than email, forum posts, or whinging
blogs. I have paid for the conference and all expenses out of my own
pocket each year because, as a librarian/developer, there aren't many
entities that are more relevant to our overall information landscape
than Google at the moment. So, I sat in on the &lt;a class="reference external" href="http://www.google.com/events/io/2011/sessions/integrating-to-ebooks-apis-to-sell-and-read-ebooks-for-affiliates-retailers-and-device-makers.html"&gt;Integrating to eBooks:
APIs to Sell and Read eBooks for Affiliates, Retailers and Device
Makers&lt;/a&gt;
session and took advantage of the public Q&amp;amp;A session at the end to ask
some questions (skip ahead to 31:39 if you want to hear the questions
and answers).&lt;/p&gt;
&lt;p&gt;The default limit of 1,000 queries per day per API key was a bit of a
concern, as one direction that my colleague Art Rhyno &lt;a class="reference external" href="http://infoservices.uwindsor.ca/leddywebdev/?p=131"&gt;has been
exploring&lt;/a&gt; for
the creation of a local federated search solution is the creation of a
&amp;quot;bookshelf&amp;quot; in Google Books that represents the entire collection of the
University of Windsor. There is no documentation about the limits on the
size of this bookshelf, and I was able to get an answer that that is
because there currently is no limit. Good news to these ears. Also, I
was told that the limit of 1,000 queries per day was just a starting
point that could be upped, given a reasonable request.&lt;/p&gt;
&lt;p&gt;Noting the absence of any sort of loaning feature, I asked what plans
(if any) Google Books had to offer users the ability to loan purchased
books. I received the expected answer (&amp;quot;We can't talk about future
plans&amp;quot;) but by being present at the session I was able to ensure that
the question was impressed not only on the people responsible for Google
Books, but also for all of the other attendees and for subsequent
viewers of the online session. Baby steps, eh?&lt;/p&gt;
&lt;p&gt;Beyond that, I was also able to talk directly with Pratip and Kevin, the
speakers at the session, to further describe this particular use case
that libraries have for Google Books (enabling full-text search of the
bulk of their collection, whether print or electronic) and some of the
possible advantages to Google, and despite their session's clear focus
on selling books via affiliate links, they appeared to be genuinely open
to the possibilities of partnerships with libraries (hey, there is even
the possibility of libraries acting as affiliate sellers for Google
Books and reaping revenue that way; others have done it with Amazon, so
as much as I may find the practice distasteful personally, some places
find it acceptable).&lt;/p&gt;
&lt;p&gt;So, the conversation has begun, as conversations should - person to
person - and I'll report back when / if we make further progress.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 16 May 2011 13:32:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2011-05-16:/the-new-google-books-api-and-possibilities-for-libraries.html</guid><category>Libraries</category><category>Coding</category></item><item><title>Authority support in Evergreen 2.0</title><link>https://coffeecode.net/authority-support-in-evergreen-20.html</link><description>&lt;p&gt;I'm at the Evergreen 2011 conference in balmy Decatur, Georgia... which wasn't
a sure thing yesterday, given that the day started with an eight hour delay at
the Sudbury airport due to fog - not to mention having to fly through the storm
that spawn a tornado in Alabama. After all that, though, it's great to be back
in the same physical space as the vibrant Evergreen community!&lt;/p&gt;
&lt;p&gt;Yesterday afternoon I gave a presentation on &lt;a class="reference external" href="http://bzr.coffeecode.net/eg2011_authorities"&gt;Authorities in Evergreen 2.0&lt;/a&gt;, covering (as the title
suggests) Evergreen's support for authority records in the 2.0 release (as well
as a peek at the future of Evergreen 2.2).&lt;/p&gt;
&lt;p&gt;The session appeared to be well-received - yay! - and I tried recording it on
my colleague Rick Scott's Sansa Clip+. Hopefully that worked out and I'll be
able to update this post with the audio, so you can have the full-on audio and
slide experience.&lt;/p&gt;
&lt;p&gt;The presentation is available under the &lt;a class="reference external" href="http://creativecommons.org/licenses/by-sa/2.5/ca/"&gt;Creative Commons Attribution Share
Alike license&lt;/a&gt;, in the
hopes that others will be able to use it for training purposes, to extend and
improve it, and generally help out with the adoption of Evergreen.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 29 Apr 2011 15:09:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2011-04-29:/authority-support-in-evergreen-20.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Evergreen's continuous integration servers - past, present, and future</title><link>https://coffeecode.net/evergreens-continuous-integration-servers-past-present-and-future.html</link><description>&lt;p&gt;&lt;em&gt;tldr&lt;/em&gt; version: the Evergreen project now has a &lt;a class="reference external" href="http://testing.evergreen-ils.org"&gt;continuous integration
server and build farm&lt;/a&gt; and needs
testcases to make the best use of that infrastructure to help us provide
higher-quality releases in the future.&lt;/p&gt;
&lt;div class="section" id="evergreen-buildbot-past"&gt;
&lt;h2&gt;Evergreen buildbot - past&lt;/h2&gt;
&lt;p&gt;Back in November 2009, Evergreen developer Shawn Boyette &lt;a class="reference external" href="http://markmail.org/message/j6hd6634oimpum6x"&gt;launched&lt;/a&gt; the Evergreen &lt;em&gt;buildbot&lt;/em&gt; -
a continuous integration server that ran basic tests with every commit to the
OpenSRF and Evergreen repositories and created nightly tarballs of the code. It
was a promising start towards a system that would provide us with instant
feedback about the state of our code - at least as much as we had tests for it.
Unfortunately, the server ran for only a few months before disappearing when
Shawn parted ways with Equinox in early 2010.&lt;/p&gt;
&lt;p&gt;I always thought it was a shame we had lost this piece of the development
infrastructure, but Equinox had offered accounts on a server for anyone in the
Evergreen community interested in taking on the task of setting up a new
continuous integration test server - and through the rest of 2010, nobody
stepped up to take on that responsibility. Most of us were busy developing and
testing Evergreen 2.0, I suspect. So, in January of 2011, when I had a bit of
breathing room, I scoped out the current state of continuous integration
frameworks and discovered that the &lt;a class="reference external" href="http://buildbot.net"&gt;buildbot&lt;/a&gt; project
(no relation to Shawn's code, other than a serendipitous name) was written in
Python and therefore was much more approachable to me than the other leading
alternative, Hudson... so I wrote up &lt;a class="reference external" href="http://markmail.org/message/2ke455rplbrpcxuv"&gt;my findings and a quick proposal&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="evergreen-buildbot-present"&gt;
&lt;h2&gt;Evergreen buildbot - present&lt;/h2&gt;
&lt;p&gt;A few days later I had the buildbot running on the &lt;a class="reference external" href="http://testing.evergreen-ils.org&amp;quot;"&gt;server provided by Equinox&lt;/a&gt;, providing reports on the status of the
OpenSRF builds on Ubuntu Lucid.  After putting out a call to the community for
build servers to provide coverage for Evergreen on different operating systems,
I had enough responses to focus my mind on improving the Evergreen build.
Evergreen now has the same standard layout for Perl modules that we adopted a
year ago for OpenSRF, along with some basic sanity tests in Perl (such as are
there any syntax errors in this module?).&lt;/p&gt;
&lt;p&gt;So, thanks to &lt;a class="reference external" href="http://esilibrary.com"&gt;Equinox&lt;/a&gt; for providing the testing
server that serves as the mothership for controlling all of the build tests.
And many thanks to the University of Prince Edward Island Robertson Library and
the &lt;a class="reference external" href="http://georgialibraries&amp;quot;"&gt;Georgia Public Library Service&lt;/a&gt; for providing
build servers for the build farm. We now have Evergreen test coverage on the
Ubuntu Lucid and Debian Squeeze Linux distributions (huzzah) and OpenSRF test
coverage on Ubuntu Lucid. If you have an interest in getting test coverage for
a different distribution and have a server to spare, please feel free to
&lt;a class="reference external" href="mailto:dan&amp;#64;coffeecode.net"&gt;contact me&lt;/a&gt; and we can get your server
&lt;a class="reference external" href="http://evergreen-ils.org/dokuwiki/doku.php?id=dev:testing:buildbot#setting_up_the_buildbot_slave&amp;quot;"&gt;added to the build farm&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="checking-build-status"&gt;
&lt;h2&gt;Checking build status&lt;/h2&gt;
&lt;p&gt;You can check the current state of the code for various OpenSRF and Evergreen
branches at any time by visiting the &lt;a class="reference external" href="http://testing.evergreen.ils.org"&gt;Evergreen buildbot page&lt;/a&gt; and choosing one of the menu options.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://testing.evergreen-ils.org/buildbot/one_line_per_build&amp;quot;"&gt;Recent builds&lt;/a&gt; provides
a simple list of the success or failure of the 20 most
recent builds.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://testing.evergreen-ils.org/buildbot/waterfall"&gt;Waterfall&lt;/a&gt;, on the
other hand, provides the detailed status of every tested combination of Linux
distribution and code branch.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="evergreen-buildbot-future"&gt;
&lt;h2&gt;Evergreen buildbot - future&lt;/h2&gt;
&lt;p&gt;We still have work to do to deliver on the promise of the buildbot. Most
important, I think, is that a continuous integration server can only run the
tests that it has been given - and we have not given it many tests.&lt;/p&gt;
&lt;p&gt;It kills me that people discovered some fairly fundamental problems with the
Evergreen 2.0 release (some recent examples include most identifier searches
not working and limitations with Unicode in patron names). Now that we have a
continuous integration server, we need a testing framework so that it becomes
easy to add tests along the lines of &amp;quot;Import a set of sample bibliographic
records, then run the following sets of searches (ISSN and ISBN with and
without hyphens; EAN; UPC...) and ensure that the returned results match these
expected results&amp;quot;. It should be a human's job to set up that automated test
&lt;em&gt;once&lt;/em&gt; so that we're forever confident in the future that we're not screwing up
those basic features, no matter what we change in our database schema or
underlying code.&lt;/p&gt;
&lt;p&gt;Now, there are very few people that can currently create that sort of a test.
There might be none at the moment, in fact, because we need that previously
mentioned testing framework to be sorted out and integrated into the buildbot.&lt;/p&gt;
&lt;p&gt;However, in the short term we &lt;em&gt;can&lt;/em&gt; create these testing scenarios so that
humans can reproduce them during testing blitzes, until such time as we have
the testing framework sorted out and can begin automating these tests.&lt;/p&gt;
&lt;p&gt;Otherwise, I fear that we'll go into the Evergreen 2.1 alpha/beta/release
candidate cycle and get reports from testing that indicate that all is well -
but only because some of the more complex tasks haven't actually been attempted
- and we'll find ourselves scrambling once again after the release to fix
problems that become evident when sites actually start moving to the release.&lt;/p&gt;
&lt;p&gt;Beyond tests, we need to teach it to create cleanly packaged tarballs on a
regular basis - although that should arguably be nothing more than, or not much
more than, the equivalent of running &lt;tt class="docutils literal"&gt;make package&lt;/tt&gt; rather than pushing all
kinds of specialized packaging logic into the buildbot itself.&lt;/p&gt;
&lt;p&gt;Autotools wizards, your assistance would be greatly appreciated.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="spreading-evergreen-buildbot-knowledge"&gt;
&lt;h2&gt;Spreading Evergreen buildbot knowledge&lt;/h2&gt;
&lt;p&gt;To ensure that our project can survive the loss of the current master build
server (or me, for that matter!), I've been committing a password-sanitized
copy of the buildbot configuration to the examples directory of the OpenSRF
repository. In addition to reducing the dependency on one person and one
server, it also gives anyone else interested in contributing to the Evergreen
buildbot the ability to easily define a build master and build slaves in a
local environment.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 14 Mar 2011 02:13:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2011-03-14:/evergreens-continuous-integration-servers-past-present-and-future.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Creating a MARC record from scratch in PHP using File_MARC</title><link>https://coffeecode.net/creating-a-marc-record-from-scratch-in-php-using-file_marc.html</link><description>&lt;p&gt;In the past couple of days, two people have written me email essentially
saying: &amp;quot;Dan, this &lt;a class="reference external" href="http://pear.php.net/File_MARC"&gt;File_MARC&lt;/a&gt;
library sounds great - but I can't figure out how to create a record
from scratch with it! Can you please help me?&amp;quot;&lt;/p&gt;
&lt;p&gt;Yes, when you're dealing with MARC, you'll quickly get all weepy and get
help from anyone you can. So, first things first - there is a really
basic example that you can find in the File_MARC tests directory called
&lt;tt class="docutils literal"&gt;marc_record_001.phpt&lt;/tt&gt;. What, you couldn't find that? I'm not
surprised, to be honest. Tests are great but when you install PEAR
libraries the tests get separated from the code and you might not even
know that there _are_ tests to cadge code from.&lt;/p&gt;
&lt;p&gt;So instead, here's a whack of code that should provide a good starter
for you:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;lt;?phprequire 'File/MARC.php';$marc = new File_MARC_Record();$marc-&amp;gt;appendField(new File_MARC_Data_Field('100', array(        new File_MARC_Subfield('a', 'Doe, John'),    ), null, null));$marc-&amp;gt;appendField(new File_MARC_Data_Field('245', array(        new File_MARC_Subfield('a', 'Main title: '),        new File_MARC_Subfield('b', 'subtitle'),        new File_MARC_Subfield('c', 'author')    ), null, null));print &amp;quot;Yes, we do pretty print\n&amp;quot;;print $marc . &amp;quot;\n&amp;quot;;print &amp;quot;Yes, we write MARC21&amp;quot;;$fh = fopen('marcy.mrc', 'w');fwrite($fh, $marc-&amp;gt;toRaw());fclose($fh);print &amp;quot;... written.\n\n&amp;quot;;print &amp;quot;Yes, we write MARCXML\n&amp;quot;;print $marc-&amp;gt;toXML() . &amp;quot;\n\n&amp;quot;;print &amp;quot;Yes, we write MARC-in-JSON\n&amp;quot;;print $marc-&amp;gt;toJSON() . &amp;quot;\n\n&amp;quot;;print &amp;quot;Yes, we even write the MARC-HASH JSON serialization\n&amp;quot;;print $marc-&amp;gt;toJSONHash() . &amp;quot;\n\n&amp;quot;;?&amp;gt;
&lt;/pre&gt;
&lt;p&gt;and here's the not very exciting output...&lt;/p&gt;
&lt;pre class="literal-block"&gt;
bash$ $ php marcy.php Yes, we do pretty printLDR                         100    _aDoe, John245    _aMain title:        _bsubtitle       _cauthorYes, we write MARC21... written.Yes, we write MARCXML&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&amp;lt;collection xmlns=&amp;quot;http://www.loc.gov/MARC21/slim&amp;quot;&amp;gt; &amp;lt;record&amp;gt;  &amp;lt;leader&amp;gt;00099na   2200049   4500  &amp;lt;datafield tag=&amp;quot;100&amp;quot; ind1=&amp;quot; &amp;quot; ind2=&amp;quot; &amp;quot;&amp;gt;   &amp;lt;subfield code=&amp;quot;a&amp;quot;&amp;gt;Doe, John  &amp;lt;/datafield&amp;gt;  &amp;lt;datafield tag=&amp;quot;245&amp;quot; ind1=&amp;quot; &amp;quot; ind2=&amp;quot; &amp;quot;&amp;gt;   &amp;lt;subfield code=&amp;quot;a&amp;quot;&amp;gt;Main title:    &amp;lt;subfield code=&amp;quot;b&amp;quot;&amp;gt;subtitle   &amp;lt;subfield code=&amp;quot;c&amp;quot;&amp;gt;author  &amp;lt;/datafield&amp;gt; &amp;lt;/record&amp;gt;&amp;lt;/collection&amp;gt;Yes, we write MARC-in-JSON{&amp;quot;leader&amp;quot;:&amp;quot;00099     2200049   4500&amp;quot;,&amp;quot;fields&amp;quot;:[  {&amp;quot;100&amp;quot;:{&amp;quot;ind1&amp;quot;:&amp;quot; &amp;quot;,&amp;quot;ind2&amp;quot;:&amp;quot; &amp;quot;,&amp;quot;subfields&amp;quot;:[    {&amp;quot;a&amp;quot;:&amp;quot;Doe, John&amp;quot;}]}},  {&amp;quot;245&amp;quot;:{&amp;quot;ind1&amp;quot;:&amp;quot; &amp;quot;,&amp;quot;ind2&amp;quot;:&amp;quot; &amp;quot;,&amp;quot;subfields&amp;quot;:[    {&amp;quot;a&amp;quot;:&amp;quot;Main title: &amp;quot;},    {&amp;quot;b&amp;quot;:&amp;quot;subtitle&amp;quot;},    {&amp;quot;c&amp;quot;:&amp;quot;author&amp;quot;}]}}]}Yes, we even write the MARC-HASH JSON serialization{&amp;quot;type&amp;quot;:&amp;quot;marc-hash&amp;quot;,&amp;quot;version&amp;quot;:[1,0],&amp;quot;leader&amp;quot;:&amp;quot;00099     2200049   4500&amp;quot;,  &amp;quot;fields&amp;quot;:[    [&amp;quot;100&amp;quot;,&amp;quot; &amp;quot;,&amp;quot; &amp;quot;,[[&amp;quot;a&amp;quot;,&amp;quot;Doe, John&amp;quot;]]],    [&amp;quot;245&amp;quot;,&amp;quot; &amp;quot;,&amp;quot; &amp;quot;,[[&amp;quot;a&amp;quot;,&amp;quot;Main title: &amp;quot;],[&amp;quot;b&amp;quot;,&amp;quot;subtitle&amp;quot;],[&amp;quot;c&amp;quot;,&amp;quot;author&amp;quot;]]]]}
&lt;/pre&gt;
&lt;p&gt;Hopefully this helps. Have at it!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 04 Mar 2011 03:05:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2011-03-04:/creating-a-marc-record-from-scratch-in-php-using-file_marc.html</guid><category>Libraries</category><category>Coding</category></item><item><title>Evergreen 2.0.0: What it has (and does not have)</title><link>https://coffeecode.net/evergreen-200-what-it-has-and-does-not-have.html</link><description>&lt;p&gt;Back in early 2010, I responded to the call for proposals for the OLA
SuperConference with the following
&lt;a class="reference external" href="http://www.accessola.com/superconference2011/showSession.php?lsession=620&amp;amp;usession=620"&gt;proposal&lt;/a&gt;
for a session called &lt;strong&gt;Evergreen 2.0: What doesn't it have?&lt;/strong&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;p&gt;The first release of the Evergreen library system in September 2006
brought circulation, cataloguing, reports, and a modern OPAC.
Evergreen 2.0, expected in early 2011, promises deep support for
acquisitions, serials, telephony, and more. The range of features
will be highlighted and weaknesses exposed.&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;Talk about great timing! My talk was accepted and scheduled for February
3rd, and of course Evergreen 2.0.0 was released exactly one week before
that! So not only was I able to accurately predict when Evergreen 2.0
would be available, I was actually able to deliver a presentation based
on reality. I believe I provided a balanced look at Evergreen's current
strengths and weaknesses, and as with my sessions in previous years at
the OLA SuperConference, all of the seats in the room (25 or so) were
filled. There were unfortunately a number of people who poked their
heads in the door and, seeing the lack of available seats, moved on to
some other presentation. So, interest in Evergreen remains strong
amongst the Ontario crowd - and maybe next year I can swing a larger
venue! I was also really fortunate to meet several people after the
session who expressed interest in contributing to the Evergreen project
in various ways; I'm always eager to welcome new members to the
community of Evergreen contributors, so here's hoping that works out
&lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;p&gt;If you were one of the people who couldn't get a seat, or you're just
interested in catching up with the state of Evergreen at the 2.0.0
release, the presentation itself is available in &lt;a class="reference external" href="http://bzr.coffeecode.net/ola_2011/ola_2011_slidy.html"&gt;HTML
form&lt;/a&gt; (ahh
Slidy). I have also made the &lt;a class="reference external" href="http://bzr.coffeecode.net/ola_2011/ola_2011_slidy.txt"&gt;ASCIIDOC
source&lt;/a&gt; and
&lt;a class="reference external" href="http://bzr.coffeecode.net/ola_2011/images"&gt;screenshots&lt;/a&gt; for the
presentation available in a &lt;a class="reference external" href="%3Ca%20href="&gt;Bazaar repository&lt;/a&gt;. The
presentation is licensed under the Creative
Commons-Attribution-ShareAlike license in the hope that others in the
Evergreen community may find the material useful for learning and
sharing with their own libraries, and may want to fill in some areas
where I may have left gaps (feel free to fork the repository and send
patches my way!). It would be great if we could collectively pull
together a kick-butt presentation for Evergreen advocacy, and I would be
delighted if my material served as a starting point for that effort.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sat, 05 Feb 2011 15:08:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2011-02-05:/evergreen-200-what-it-has-and-does-not-have.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Access Conference 2011 in beautiful British Columbia</title><link>https://coffeecode.net/access-conference-2011-in-beautiful-british-columbia.html</link><description>&lt;p&gt;The official announcement for the Canadian Library Association
(&lt;a class="reference external" href="http://www.cla.ca"&gt;CLA&lt;/a&gt;) Emerging Technology Interest Group
(ETIG)-sponsored &lt;a class="reference external" href="http://etig.wordpress.com/2010/11/25/access-2011-goes-west/"&gt;Access Conference for
2011&lt;/a&gt;
went out back in November, announcing Vancouver, British Columbia, as
the host. Note that the schedule has changed from its original dates to
October 19-22!&lt;/p&gt;
&lt;p&gt;I've told a number of people that the first time I attended an Access
Conference was in Ottawa in 2006, about six months after I rejoined the
library technology world, and it saved my sanity and my career. No joke.
Since then, I've been lucky enough to attend several more Access
conferences and was honoured to even be a speaker a few times. I
probably won't be able to make it this year, unfortunately, but if you
work in the intersections of libraries and technology and have never
been before, I strongly urge you to go!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 19 Jan 2011 14:07:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2011-01-19:/access-conference-2011-in-beautiful-british-columbia.html</guid><category>Libraries</category><category>Coding</category></item><item><title>Oh those kids</title><link>https://coffeecode.net/oh-those-kids.html</link><description>&lt;div class="serendipity_imageComment_center"
style="width: 100%; clear:both;"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/amber/orange_halloween.png"&gt;&lt;img alt="image0" class="serendipity-image-center" src="/uploads/pics/amber/orange_halloween.serendipityThumb.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;The orange hair gel didn't make my hair very orange, but it did a great
job on my face. Don't ask me what I'm supposed to have been; I was just
there for the yuks.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="serendipity_imageComment_center" style="width: 100%"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/amber/jackolantern_daddy.png"&gt;&lt;img alt="image1" class="serendipity-image-center" src="/uploads/pics/amber/jackolantern_daddy.serendipityThumb.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Daddy's side of the jack'o'lantern.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="serendipity_imageComment_center" style="width: 100%"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/amber/jackolantern_amber.png"&gt;&lt;img alt="image2" class="serendipity-image-center" src="/uploads/pics/amber/jackolantern_amber.serendipityThumb.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Amber's side of the jack'o'lantern, transferred from her conceptual
drawing into carved form by Daddy.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="serendipity_imageComment_center" style="width: 100%"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/amber/arrrrr_halloween.png"&gt;&lt;img alt="image3" class="serendipity-image-center" src="/uploads/pics/amber/arrrrr_halloween.serendipityThumb.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;ARRRRRR! Someone really enjoyed Peter Pan at Stratford! The dalmation is
(mostly) amused. Mommy got into the dress-up action too.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="serendipity_imageComment_center" style="width: 100%"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/amber/grubby_children.png"&gt;&lt;img alt="image4" class="serendipity-image-center" src="/uploads/pics/amber/grubby_children.serendipityThumb.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Art easels are a great source of entertainment.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="serendipity_imageComment_center" style="width: 1025px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/amber/santa_2010.png"&gt;&lt;img alt="image5" class="serendipity-image-center" src="/uploads/pics/amber/santa_2010.serendipityThumb.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Santa and Mrs. Claus made it to the Copper Cliff library, and so did we.
I'm not sure Santa has heard too many requests for &amp;quot;a refill of
rectangle tape&amp;quot; before.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 26 Nov 2010 14:58:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2010-11-26:/oh-those-kids.html</guid><category>Family</category><category>Amber</category><category>Arik</category></item><item><title>Troubleshooting Ariel send and receive functionality</title><link>https://coffeecode.net/troubleshooting-ariel-send-and-receive-functionality.html</link><description>&lt;p&gt;I'm posting the following instructions for testing the ports required by&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://www.infotrieve.com/ariel"&gt;Ariel interlibrary loan&lt;/a&gt; software.
I get requests for this information a few&lt;/p&gt;
&lt;p&gt;times a year, and at some point it will be easier to find on my blog
than to&lt;/p&gt;
&lt;p&gt;dig through my email archives from over 3 years ago - or perhaps the
power of Google will cut me out of the loop entirely. I should note that
I have no official relationship with the Ariel software, apart from
&lt;a class="reference external" href="/archives/141-Ariel-Go-back-to-your-room,-NOW!.html"&gt;setting it up once many years
ago&lt;/a&gt;
and hoping that I never have to do that again - the software has not
been updated since 2005, which should raise a red (nay, crimson!) flag
with any system administrator with his or her salt.&lt;/p&gt;
&lt;p&gt;I suggest you start with the &lt;a class="reference external" href="http://www4.infotrieve.com/ariel/ar4.0instal.html#firewall"&gt;official documentation for setting up
send/receive&lt;/a&gt;
behind a firewall (updated June 2005!), and if you need more help, the
following might be useful...&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;We were able to get the &lt;strong&gt;send&lt;/strong&gt; function for Ariel working today. Our
firewall administrator opened ports 419, 421,&lt;/p&gt;
&lt;p&gt;and 422 (TCP &amp;amp; UDP) and the 1024-5000 range in our university's external&lt;/p&gt;
&lt;p&gt;firewall for the &lt;em&gt;correct&lt;/em&gt; IP address and that, combined with my
previous&lt;/p&gt;
&lt;p&gt;action of dropping the Windows XP firewall, enabled us to successfully
start&lt;/p&gt;
&lt;p&gt;sending from Ariel 4.1.1.&lt;/p&gt;
&lt;p&gt;Things were complicated by the firewall administrator's initial claim
that the&lt;/p&gt;
&lt;p&gt;firewall had been opened for those ports, but I was able to prove that
that&lt;/p&gt;
&lt;p&gt;was not the case by trying to telnet to the offending machine / port
from my&lt;/p&gt;
&lt;p&gt;home computer (outside the firewall) and getting shut out. Apparently
there was a transposition error in the IP address that was originally
opened up; these things happen.&lt;/p&gt;
&lt;p&gt;The test command for a given port, if you're interested, is:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
telnet xxx.xxx.xxx.xxx 419
&lt;/pre&gt;
&lt;p&gt;(where &lt;tt class="docutils literal"&gt;xxx.xxx.xxx.xxx&lt;/tt&gt; is the IP address of your Ariel send station
and &lt;tt class="docutils literal"&gt;419&lt;/tt&gt; is the port you're testing; in the subsequent examples, I'll
use &lt;tt class="docutils literal"&gt;192.168.8.23&lt;/tt&gt;).&lt;/p&gt;
&lt;p&gt;If the port is truly open, and &lt;strong&gt;Receiving&lt;/strong&gt; is &lt;em&gt;enabled&lt;/em&gt; on your send
station,&lt;/p&gt;
&lt;p&gt;you will see something immediately like:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Trying 192.168.8.23...Connected to 192.168.8.23.Escape character is '^]'.220 welcome to ftp world
&lt;/pre&gt;
&lt;p&gt;If the port is truly open, and &lt;strong&gt;Receiving&lt;/strong&gt; is &lt;em&gt;disabled&lt;/em&gt; on your send
station,&lt;/p&gt;
&lt;p&gt;you will see something immediately like:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Trying 192.168.8.23...Connected to 192.168.8.23.Escape character is '^]'.421 Connection RefusedConnection closed by foreign host.
&lt;/pre&gt;
&lt;p&gt;If the port is completely closed or unreachable, however, either at your
institution's firewall or on your Windows workstation's built-in
firewall, you will see something like:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Trying 192.168.8.23...telnet: Unable to connect to remote host: Connection timed out
&lt;/pre&gt;
&lt;p&gt;I hope this helps you troubleshoot your problems!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 27 Oct 2010 13:06:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2010-10-27:/troubleshooting-ariel-send-and-receive-functionality.html</guid><category>Libraries</category><category>Coding</category></item><item><title>Chilifresh-using libraries: are you violating copyright?</title><link>https://coffeecode.net/chilifresh-using-libraries-are-you-violating-copyright.html</link><description>&lt;p&gt;When I was preparing my Access 2010 presentation about &lt;a class="reference external" href="/archives/237-Standard-Social-Sharing-and-Aggregation-on-the-Go-Access-2010-presentation.html"&gt;social sharing
and aggregation in library
software&lt;/a&gt;,
I came across &lt;a class="reference external" href="http://chilifresh.com"&gt;Chilifresh&lt;/a&gt;, a company that
aggregates reviews written by library patrons from across libraries that
subscribe to the company's review service. I was a bit disappointed to
see that the service almost completely disconnects the reviews from the
actual person behind the review; you can see the user's nickname and the
general location of the library they're connected to, but beyond that
it's a dead-end: there is no way to make a connection to the actual
person. They're just a fragment of a person, and it's clear that the
reviews are what are considered valuable (which is a validation of Jaron
Lanier's concerns in &lt;a class="reference external" href="http://www.amazon.com/gp/product/0307269647?ie=UTF8&amp;amp;tag=coffeecode-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0307269647"&gt;You Are Not a Gadget: A
Manifesto&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;But the quality of the social connections enabled by the service isn't
the concern of this post. I have a legal concern: FAQ number 11, &lt;a class="reference external" href="http://chilifresh.com/html/faq.php#FAQ11"&gt;Who
owns the reviews?&lt;/a&gt; on the
Chilifresh site says:&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;p&gt;Every review entered from your catalog is the property of both your
library system and ChiliFresh Enterprises, Inc. What this means is
that if you ever want to discontinue the use of the ChiliFresh
Review Engine, we will provide you with a copy of all the reviews
that were entered from your catalog. But because the ChiliFresh
Review Engine is a collaborative database of reviews, ChiliFresh
will retain a copy of your reviews in its database because other
library systems are relying on the reviews entered from your
catalog.&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;Umm - no, that's not how content &amp;quot;ownership&amp;quot; works, at least not in
North America. The person who wrote the review owns the review, unless
they have explicitly agreed to transfer their copyright to the library.&lt;/p&gt;
&lt;p&gt;Okay, I can hear the caution now: &amp;quot;But wait, Dan - maybe the user has to
agree to a click-through transfer of copyright before they can submit
the review!&amp;quot; True, true. As much as I dislike the idea of assigning
copyright, instead of a simple license agreement, that's what I assumed,
too. However, I've managed to track down a few libraries that uses
Chilifresh in the wild. Here's the first policy that I found, in use at
a large American public library system:&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;p&gt;The FOO library system reserves the right to edit or remove reviews.
Reviews may not include profanity, obscenities, spiteful remarks,
personal information, URLs or email addresses. Also, you may not
reveal crucial plot elements or spoil the ending for others.&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;A good policy for maintaining the quality of, but certainly not a legal
agreement to transfer copyright or even to license the content to be
used by Chilifresh Enterprises. I thought that perhaps this was a policy
written by the library itself. The second agreement that I found was
from a small Canadian public library system:&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;p&gt;FOO Public Library reserves the right to edit or remove reviews.
Reviews may not include profanity, obscenities, spiteful remarks,
personal information, URLs or email addresses. Also, you may not
reveal crucial plot elements or spoil the ending for others.&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;Remarkably consistent with the first, which makes me think that the
boilerplate policy actually comes from Chilifresh Enterprises.&lt;/p&gt;
&lt;p&gt;Now, there's one more step where users might agree to assign their
copyright - when they sign up for an account to write these reviews.
Alas, I must report that that avenue fails as well. You can register an
account and start writing reviews immediately, with no further license
required; you don't even have to be a member of the library to sign up,
as you're signing up with Chilifresh, not with the library. (That you're
signing up for a Chilifresh account isn't particularly clear either.)&lt;/p&gt;
&lt;p&gt;So - in the end, I suspect that any library using Chilifresh is
currently in violation of North American copyright. I'm not 100% sure; I
am not a lawyer and this does not constitute legal advice, and perhaps
there is something that I'm missing. But if not, I strongly recommend
that libraries at a minimum change the click-through policy to become a
clear transfer of copyright agreement; better still would be for
Chilifresh to change to simply having users agree to a Creative Commons
license, which would preserve the author's copyright over the review.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 22 Oct 2010 20:49:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2010-10-22:/chilifresh-using-libraries-are-you-violating-copyright.html</guid><category>Libraries</category><category>Coding</category></item><item><title>Standard Social Sharing and Aggregation on the Go: Access 2010 presentation</title><link>https://coffeecode.net/standard-social-sharing-and-aggregation-on-the-go-access-2010-presentation.html</link><description>&lt;p&gt;Earlier this week, I had the honour of speaking at the &lt;a class="reference external" href="http://access2010.lib.umanitoba.ca/"&gt;Access 2010
conference&lt;/a&gt; in Winnipeg,
Manitoba. The title of my talk was rather unwieldy, but what it boiled
down to was:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;An environmental scan of how libraries are currently offering users
of their services the ability to share their thoughts and to connect
with one another around library activities&lt;/li&gt;
&lt;li&gt;A brief overview of some relevant emerging standards for
socially-enabled applications (&lt;a class="reference external" href="http://activitystrea.ms"&gt;Activity
Streams&lt;/a&gt;, &lt;a class="reference external" href="http://gmpg.org/xfn/"&gt;XHTML Friends Network
(XFN)&lt;/a&gt;, and the HTML5 browser geolocation
API)&lt;/li&gt;
&lt;li&gt;Some of my thoughts about how library software could adopt these
standards to knit together experiences across library system
boundaries, and outside of library systems altogether&lt;/li&gt;
&lt;li&gt;Some findings from an &lt;a class="reference external" href="http://markmail.org/message/nb2w7fslmsi33x33"&gt;initial
implementation&lt;/a&gt; of
one of these standards (Activity Streams) in the &lt;a class="reference external" href="http://evergreen-ils.org"&gt;Evergreen library
system&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here are the slides
(&lt;a class="reference external" href="/uploads/talks/2010/social_sharing.odp"&gt;OpenDocument&lt;/a&gt;,
&lt;a class="reference external" href="/uploads/talks/2010/social_sharing.pdf"&gt;PDF&lt;/a&gt;)
and the accompanying recording (&lt;a class="reference external" href="/uploads/talks/2010/sharing_talk.ogg"&gt;OGG
Vorbis&lt;/a&gt;,
&lt;a class="reference external" href="/uploads/talks/2010/sharing_talk.mp3"&gt;MP3&lt;/a&gt;).
Thanks to Bill Denton for the use of his recorder for the audio!&lt;/p&gt;
&lt;p&gt;One quick reflection is that, in the interest of using a familiar
example, I think I focused too much on sharing and aggregating &lt;em&gt;objects&lt;/em&gt;
(such as reviews) between libraries and didn't make a good argument for
the value of enabling connections between &lt;em&gt;people&lt;/em&gt; based on their
activities.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sun, 17 Oct 2010 14:44:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2010-10-17:/standard-social-sharing-and-aggregation-on-the-go-access-2010-presentation.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>On avoiding accusations of forking a project</title><link>https://coffeecode.net/on-avoiding-accusations-of-forking-a-project.html</link><description>&lt;p&gt;Sometimes forking a project is necessary to reassert community control
over a project that has become overly dominated by a single corporate
rules: see &lt;a class="reference external" href="http://openindiana.org/"&gt;OpenIndiana&lt;/a&gt; and
&lt;a class="reference external" href="http://www.documentfoundation.org/download/"&gt;LibreOffice&lt;/a&gt; for recent
examples. And in the world of distributed version control systems,
forking is viewed positively; it's a form of evolution, where
experimental branches that lead to new features or a stabler system or
better performance get grafted back onto the accepted authoritative
branch.&lt;/p&gt;
&lt;p&gt;Yet a negative connotation can also be associated with forking a
project, particularly if the word is whispered behind closed doors as an
accusation of the behaviour of one or more parties in the community.
Particularly in a small community, where development resources for a
project built on the principles of software freedom from the ground up
are relatively scarce, the spectre of a development effort based on that
project that is not publicly visible can be troubling and opens the door
to the accusation: &lt;strong&gt;FORK&lt;/strong&gt;! Organizations that have staked their
customers' satisfaction, and their own reputation, on free software that
they expected to see flourish as others joined in the development
effort, fret and worry that they'll be left behind with just the base
for another organization's project and no easy way to reconcile the two.&lt;/p&gt;
&lt;p&gt;In the Evergreen community, we're fortunate that we're small enough that
we should be able to avoid these concerns. The Evergreen &amp;quot;trunk&amp;quot; code
repository has been hopping; just take a peek at the &lt;a class="reference external" href="http://svn.open-ils.org/trac/ILS/log/trunk"&gt;revision
log&lt;/a&gt; to see the rather
torrid pace of development. Some &lt;a class="reference external" href="http://evergreen-ils.org/dokuwiki/doku.php?id=faqs:evergreen_roadmap"&gt;major
features&lt;/a&gt;
are taking shape, such as acquisitions with EDI support, first-class
serials management, outbound telephony, and more - evident in the
&lt;a class="reference external" href="http://evergreen-ils.org/downloads.php"&gt;Evergreen 2.0 alpha 3
release&lt;/a&gt; that the development
team put together today. This is not a minor release!&lt;/p&gt;
&lt;p&gt;And yet, and yet... during the exciting KCLS migration live-blog, Lori
Ayre felt it necessary &lt;a class="reference external" href="http://rscel.evergreen-ils.org/node/1526"&gt;to
write&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;p&gt;The answer is that much of it is already in trunk, and if it isn't
there now, it will be very soon. None of this work is being held
back. There is no KCLS fork. This is all Evergreen and anyone who
knows how to download from trunk will be able to get at this code in
very short order.&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;Well, I know that everyone involved with the KCLS enhancements are good
people, and that that it is certainly their intention to make any of the
enhancements available, and there is no intention to fork Evergreen. I
know! Ironically enough, however, due to the prior actions of
proprietary companies such as Relais' &amp;quot;&lt;a class="reference external" href="http://www.relais-intl.com/relais/home/Relais%20Open%20Source%20Update%20Feb%208_2010.pdf"&gt;announce that we will open
source our ILL product in 2008; freeze the market; announce in 2010 that
maybe we'll have something by the end of
2010&lt;/a&gt;&amp;quot;
strategy, the broader library community has become more skeptical and
susceptible to disinformation and FUD. I can't imagine who would want to
sow discontent among the community of a rapidly maturing ILS project,
other than perhaps proprietary competitors who have forgotten how to
compete on the merits of their product rather than
&lt;a class="reference external" href="http://thebookpile.wordpress.com/2010/04/01/sirsidynix-opensource-paper-pdf/"&gt;negative&lt;/a&gt;
&lt;a class="reference external" href="http://www.galecia.com/sirsidynix-and-the-fud-factor/"&gt;marketing&lt;/a&gt;.
(Just a guess, mind you!)&lt;/p&gt;
&lt;p&gt;Still: until the code for any remaining enhancements is available under
an open source license, the possibility that those whispering,
Saruman-like voices could be right remains an actual possibility. My
suggested remedy for the easiest way to dispel those concerns, now and
in the future for any project (Evergreen or otherwise), is to simply
develop in the open:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Create a public repository - SVN (&lt;a class="reference external" href="http://svn.open-ils.org/trac/ILS-Contrib"&gt;Evergreen
contributions&lt;/a&gt;), or
Bazaar (&lt;a class="reference external" href="https://code.launchpad.net/evergreen"&gt;Evergreen
LaunchPad&lt;/a&gt;), or git
(&lt;a class="reference external" href="http://gitorious.org"&gt;Gitorious&lt;/a&gt;), or what have you. Put a
README in the top directory of the repository specifying that the
contents are licensed under the &amp;quot;GPL v2 or later&amp;quot; or GPL-compatible
license.&lt;/li&gt;
&lt;li&gt;Announce the repository on the Evergreen development mailing list. If
you tuck your repository in an obscure location and don't tell
anybody about it, it might technically be open, but that's not really
the spirit of openness. You're also depriving your effort of possible
collaborators, and possibly duplicating effort if somebody else is
working on the same feature.&lt;/li&gt;
&lt;li&gt;Watch the rumours disappear and the fame, glory, and accolades roll
in. (Oh, and don't forget to invite us to integrate the fruit of your
labour into the core of Evergreen!)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sure, there might be some material that you don't want to share:
trademarked institutional logos or the like. But the bulk of what we
collectively create should be able to be openly shared, not just when
things are perfectly baked, but all the way through the process. Release
early, release often, and keep the spooky whisperers at bay.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 29 Sep 2010 02:16:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2010-09-29:/on-avoiding-accusations-of-forking-a-project.html</guid><category>misc</category><category>Coding</category><category>Evergreen</category></item><item><title>Library hackers want you to throw down the gauntlet</title><link>https://coffeecode.net/library-hackers-want-you-to-throw-down-the-gauntlet.html</link><description>&lt;p&gt;On October 13th, a very special event is happening: the &lt;a class="reference external" href="http://access2010.lib.umanitoba.ca/node/3"&gt;Access
Hackfest&lt;/a&gt;. A tradition
since Access 2002, the Hackfest brings together library practitioners of
all kinds to tackle challenges and problems from the mundane to the
sublime to the ridiculous. If you can imagine a spectrum with three
axes, you might be just the person to pose those challenges to the
Hackfest participants!&lt;/p&gt;
&lt;p&gt;What we're saying here, folks, is that we need suggestions for Hackfest
projects. There are no limitations to these challenges: oh sure, you're
bringing together complete strangers and asking them to accomplish in
eight hours or less what the rest of the library ecosphere is incapable
of or uninterested in solving during the rest of the year - but that's
what makes the Hackfest MAGICAL. Example results of previous Access
Hackfests are available from the &lt;a class="reference external" href="http://library.acadiau.ca/access2004/hackfest.html"&gt;Access
2004&lt;/a&gt; web site,
and Dan Chudnov's
&lt;a class="reference external" href="http://geeks.onebiglibrary.net/Library%20Geeks%20006%20-%20Access%20Hackfest.mp3"&gt;podcast&lt;/a&gt;
that captures the spirit of the Hackfest from Access 2006 in Ottawa is
available from &lt;a class="reference external" href="http://onebiglibrary.net/geeks/episode/006-access-hackfest"&gt;Library
Geeks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We plan to keep the Hackfest suggestions secret until the moment of
their unveiling on the morning of October 13th - can you feel the
anticipation mounting? - so please submit your challenges in one clearly
written paragraph or less (okay, the abstract should be one paragraph or
less, but you can go into great lengths if you want to expound for those
who get interested by the teaser) via the &lt;a class="reference external" href="http://access2010.lib.umanitoba.ca/node/45"&gt;Hackfest submission
form&lt;/a&gt;, or if you prefer,
via &lt;a class="reference external" href="mailto:hackfest&amp;#64;coffeecode.net"&gt;email&lt;/a&gt;.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 27 Sep 2010 20:29:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2010-09-27:/library-hackers-want-you-to-throw-down-the-gauntlet.html</guid><category>Libraries</category><category>Coding</category></item><item><title>Responding to the Evergreen "research" article in Information Technology and Libraries</title><link>https://coffeecode.net/responding-to-the-evergreen-research-article-in-information-technology-and-libraries.html</link><description>&lt;p&gt;&lt;strong&gt;Update 2010-09-28&lt;/strong&gt;: Fixed link&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;The &lt;a class="reference external" href="http://www.ala.org/ala/mgrps/divs/lita/ital/italinformation.cfm"&gt;home page for ***Information Technology and
Libraries***&lt;/a&gt;
states:&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;p&gt;&lt;strong&gt;*Information Technology and Libraries*&lt;/strong&gt; ( &lt;em&gt;ITAL&lt;/em&gt;) (ISSN
0730-9295) is a refereed journal published quarterly by the Library
and Information Technology Association (LITA), a division of the
American Library Association.&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;The September 2010 issue of ITAL contained an article by Sharon Q. Yang
and Melissa A. Hofmann called &amp;quot;The Next Generation Library Catalog: A
Comparative Study of the OPACs of Koha, Evergreen, and Voyager&amp;quot;. As an
Evergreen developer, I wonder just how much refereeing happened before
this article was published. Certainly I am biased, but there are a
number of problems with the study from my perspective:&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p class="first"&gt;The article stated &amp;quot;The latest releases at the time of the study was
Koha 3.0, Evergreen 2.0, WebVoyage 7.1.&amp;quot; Grammatical problems with
that sentence aside, the first alpha release of Evergreen 2.0 was
created on August 23, 2010. For an article published in September
2010, I find it highly unlikely that the authors were able to find
any running instances of this version of Evergreen on which to base
their information. Which leads to a problem with the methodology:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;The stated methodology in the article was&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The OPACs used in this study included three examples from each
system. They may have been product demos and live catalogs
randomly chosen from the user list on the product websites. ...
In case of discrepancies between product descriptions and
reality, we gave precedence to reality over claims. In other
words, even if the product documentation lists and describes a
feature, this study does not include it if the feature is not in
action either in the demo or live catalogs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This sounds like a thorough, pragmatic approach. But the product
versions associated with each of the chosen examples are not listed.
So while the article mentions the latest releases of each product,
the actual reported experience might be based on an outdated version
of the product. In the case of Evergreen, one of the chosen examples
is two major versions behind the actual current stable release of
1.6.1.2, and another of the chosen examples is one major version
behind the current stable release. In addition, one of the desired
features of modern OPACs is customizability: not just the ability to
turn features on and off, but also the ability to change the user
experience significantly as a small matter of programming. Depending
on which example OPACs were chosen for each system, the features the
authors were looking for might not have been turned on or exposed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;On the &amp;quot;Single Point of Entry for All Library Information&amp;quot; feature,
the authors state:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;While WebVoyage and Evergreen only display journal-holdings
information in their OPACs, Koha links journal titles from its
catalog to ProQuest’s Serials Solutions, thus leading users to
full- text journals in the electronic databases.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As far as I can tell, however, this is not a special integration
feature of Koha; it appears to just be the use of an 856 with a URL
that points to a link resolver for a lookup of a given ISSN. While it
is a reasonable cataloguing practice, any other library system should
be capable of that; Evergreen certainly is. However, check out this
link for an example of how one can &lt;a class="reference external" href="http://ur1.ca/1oj6f"&gt;make an OPAC work harder by
bringing resolver results right into the OPAC
display&lt;/a&gt;. I built an Evergreen service,
called &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;open-ils.resolver&lt;/span&gt;&lt;/tt&gt;, for caching resolver requests for ISSNs
and used that service as the basis of &lt;a class="reference external" href="http://www.accessola.com/superconference2010/showSession.php?lsession=8&amp;amp;usession=8"&gt;a developer tutorial for
writing Evergreen
services&lt;/a&gt;.
The idea isn't new; &lt;a class="reference external" href="http://bibwild.wordpress.com/2007/03/04/online-coveragelink-info-in-your-opac-via-sfx/"&gt;Jonathan Rochkind wrote about doing
this&lt;/a&gt;
back in 2007. But having a caching server-side implementation freely
available for your library system is relatively novel. We've been
using it since the summer of 2009. If you use Evergreen, then you can
add this feature to your system too; it is written up in the
&lt;a class="reference external" href="http://evergreen-ils.org/~denials/workshop.html"&gt;developer
workshop&lt;/a&gt; and is
licensed under the GPL v2 or later, but if there's interest I can add
it to Evergreen's core.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;On &amp;quot;Enriched Content&amp;quot;, the authors found that Evergreen offered only
cover art. Of course, enriched content depends heavily on the content
supplier and the chosen item. Since launching in 2006, Evergreen has
provided enriched content such as cover art, abstracts, author notes,
reviews, and tables of contents from Syndetic (requiring a Syndetic
subscription, of course). In addition, Evergreen has offered Google
Books integration in the form of partial &amp;amp; full previews (if
available) inline in the detail page since Evergreen 1.6.0.0, thanks
to the initial efforts of Alexander O'Neill at the University of
Prince Edward Island. And as of Evergreen 2.0, the default content
provider for cover art and tables of content will be
&lt;a class="reference external" href="http://openlibrary.org/"&gt;OpenLibrary&lt;/a&gt;. Here's &lt;a class="reference external" href="http://ur1.ca/1ojdy"&gt;an
example&lt;/a&gt; from our catalogue that brings in
enriched content including cover art and a book review from Syndetic
and a Google Preview.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;On &amp;quot;RSS Feeds&amp;quot;, the authors make the bold statement: &amp;quot;Koha provides
RSS feeds, while Evergreen and WebVoyage do not&amp;quot;. In the case of
Evergreen, that's a laughable statement, because significant parts of
the OPAC are built on RSS feeds. For example, in any Evergreen
system, click on the &amp;quot;Basic catalogue&amp;quot; link and you'll find that it
is nothing more than an RSS feed with a simple search form. If you
are using Internet Explorer or Firefox on an Evergreen site, you
might notice the search source selector widget is highlighted; that's
because Evergreen is an OpenSearch provider, so you can easily add an
Evergreen site to your browser as a search source. The OpenSearch
results, of course, are built on RSS/Atom just like the examples in
the &lt;a class="reference external" href="http://www.opensearch.org/Specifications/OpenSearch/1.1#OpenSearch_response_elements"&gt;OpenSearch description
document&lt;/a&gt;.
The default format that a user's custom bookbags are exposed in is
also an RSS feed. I suppose the authors didn't find an RSS feed icon
lighting up in the search results in the dynamic Evergreen OPAC and
made the assumption that no RSS feeds were provided. To address this
gap, I have added the one line of JavaScript to the default OPAC skin
that adds the Atom feed link necessary to make the RSS feed icon
light up. Not that many humans actually use RSS feeds directly - but
it will help make it easier to find for future feature comparison
articles.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;On &amp;quot;Relevancy&amp;quot;, while Evergreen does not currently use circulation
data or &amp;quot;popularity&amp;quot; to affect relevancy rankings, I would happily
argue that the out-of-the-box relevancy ranking algorithm is good
enough to keep relevancy as the default sort option, while the
relevancy algorithm of our previous ILS was simply terrible. Combine
that with your ability to &lt;a class="reference external" href="/archives/218-Adjusting-relevancy-rankings-in-Evergreen-1.6,-some-explorations.html"&gt;customize the relevancy
algorithm&lt;/a&gt;,
and I think an argument could be made that, while &amp;quot;Relevancy has not
worked well in OPACs&amp;quot;, it works well in this one.&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As the article mentioned the latest release of Evergreen was 2.0, let me
show you a screenshot of the default OPAC in Evergreen 2.0 as of the
upcoming alpha2 release. Notice a few things:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Those facets on the left are much closer to what the world has come
to expect from a faceting interface. You get a narrowing effect on
your current search results, rather than firing off a brand new
search. There are pros and cons to this, but oh well.&lt;/li&gt;
&lt;li&gt;Notice that the RSS feed icon is lit up in the URL bar. Yes,
Virginia, Evergreen has RSS feeds for search results, amongst many
other things.&lt;/li&gt;
&lt;li&gt;The inline advanced search interface shows that Evergreen 2.0 offers
an &lt;strong&gt;OR&lt;/strong&gt; option, and clearly labels the relationships between the
search terms.&lt;/li&gt;
&lt;li&gt;The OpenSearch source has been added to the list of Firefox search
sources in the top right box, just by clicking on the icon and
selecting &amp;quot;Add Evergreen catalogue&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="serendipity_imageComment_left" style="width: 970px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;img alt="Evergreen 2.0 inline advanced search interface showing AND and OR options" class="serendipity-image-left" src="/uploads/files/Evergreen2_advanced.png" style="width: 970px; height: 709px;" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Evergreen 2.0 inline advanced search interface showing AND and OR
options&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 20 Sep 2010 02:25:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2010-09-20:/responding-to-the-evergreen-research-article-in-information-technology-and-libraries.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Evergreen on FLOSS Weekly: the aftermath!</title><link>https://coffeecode.net/evergreen-on-floss-weekly-the-aftermath.html</link><description>&lt;p&gt;&lt;strong&gt;Update 2010-09-28&lt;/strong&gt;: pedantic XHTML fix&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;The recorded version of the &lt;a class="reference external" href="http://twit.tv/floss132"&gt;Evergreen episode of the FLOSS
Weekly&lt;/a&gt; show was released over the weekend.
I'm happy to say that Lynn watched it without looking too pained at any
given point, and the Evergreen project has already had several responses
to our plea for assistance so far, particularly on the packaging front,
which is fantastic! Just having one more skilled helping hand makes all
the preparation for and stress about the show worth it.&lt;/p&gt;
&lt;p&gt;Several points that amused me about the show as I glanced over Lynn's
shoulder:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;In Randal's introduction, he said that I &amp;quot;worked for Coffee|Code&amp;quot;,
full-stop. Aside to Leila Wallenius, the University Librarian of
&lt;a class="reference external" href="http://laurentian.ca"&gt;Laurentian University&lt;/a&gt;: no, there's nothing
I need to tell you, I'm still a full-time employee at the University
and I'm not planning on going anywhere! (That said, &lt;strong&gt;Coffee|Code
Consulting&lt;/strong&gt; is a registered sole proprietorship that provides small
blocks of consulting services for Evergreen software in my spare
time).&lt;/li&gt;
&lt;li&gt;For the first half of the show, my affiliation was shown as the
(misspelled) &lt;a class="reference external" href="http://coffecode.net"&gt;http://coffecode.net&lt;/a&gt;. So of course I immediately ran out
and bought that domain.&lt;/li&gt;
&lt;li&gt;Co-host Dan Lynch expressed a wish that his own show, &lt;a class="reference external" href="http://linuxoutlaws.com/"&gt;Linux
Outlaws&lt;/a&gt;, had a guest list like FLOSS
Weekly. Oddly enough, some time ago when the subject of librarians
and their fanatical devotion to open access to information came up on
Linux Outlaws, I had submitted a feedback form on their site saying
(essentially) &amp;quot;hey, if you want to talk to a Linux-loving free
software-developing librarian some time, I'm around...&amp;quot; but I think
that comment went into the ether.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If I ever do a video interview like this again, I'm going to try to:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Prop my laptop up on a couple of LCSH books or attach a separate web
cam at a proper height so it doesn't appear that I'm looking down on
the viewer.&lt;/li&gt;
&lt;li&gt;Cut down on the &amp;quot;uhm&amp;quot;s and &amp;quot;ahh&amp;quot;s and stare a bit more robotically at
the camera instead of rolling my eyes as I rack my brains to come up
with an answer&lt;/li&gt;
&lt;li&gt;Stop rambling and trust the interviewers to take the show in the
direction that their audience will be interested in instead of trying
to jam in points that I think are important or interesting&lt;/li&gt;
&lt;li&gt;Ensure that my erstwhile partner in crime has a better Internet
connection&lt;/li&gt;
&lt;/ul&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 01 Sep 2010 02:50:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2010-09-01:/evergreen-on-floss-weekly-the-aftermath.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Non-stop Evergreen, or "What I'm doing on my summer vacation"</title><link>https://coffeecode.net/non-stop-evergreen-or-what-im-doing-on-my-summer-vacation.html</link><description>&lt;p&gt;Last week, I started my summer vacation with a weekend at a friend's
cottage. By Tuesday I was deeply engrossed in some Evergreen enhancement
work for the &lt;a class="reference external" href="http://www.iisg.nl/"&gt;International Institute of Social
History&lt;/a&gt;. I'm building an authorities management
user interface that properly exposes Evergreen's powerful authority
support in the 2.0 release: browsing authority lists, editing
authorities and having the updates ripple through to the bibliographic
records with controlled fields, merging and deleting authorities...
here's a screenshot of the interface in progress:
&lt;a class="reference external" href="/uploads/pics/Authority_record_list.png"&gt;|image0|&lt;/a&gt;.
The numbers represent the number of bibliographic records linked to each
authority record. These are still early days, but I think there are some
cataloguers that are going to be pretty excited about this functionality
when they get their hands on it.&lt;/p&gt;
&lt;p&gt;This week, I'm on location in the &lt;a class="reference external" href="http://library.upei.ca/"&gt;Robertson Library at the University
of Prince Edward Island&lt;/a&gt; doing some
Evergreen consulting work for them. The good people at UPEI have put my
family and I up in a nice cottage on the island, so I'm toiling away at
improving Evergreen during the day while my family explores the island.
Melissa Belvadi and Grant Johnson have put together a list of pain
points that they would like me to address that happen to mesh nicely
with general pain points that have come up over the years on the
Evergreen mailing lists. My first priority has been to make working with
spine labels a little less aggravating. I'm happy to say that after a
day and a half, I've been able to teach the spine label editor how to
(*gasp*) move up and down with the arrow keys and (*ooh-ahh*) insert
and delete new lines and (*w00t*) have the spine label defaults come
from library settings that only have to be set once instead of being
individually set by each cataloguer. Oh, and I've added font size, font
weight, and font family to those settings so that you can have 20 pt.
bold Helvetica spine labels if you want them.&lt;/p&gt;
&lt;p&gt;All of this code is being committed to Evergreen trunk as I hit
functionality milestones; much of the authority work has made its way
into the Evergreen 2.0 alpha release that was cut on Monday (although
not yet announced officially). On Monday I also cut the OpenSRF
1.6.0-alpha release and uploaded a virtual image built on Debian Squeeze
reflecting the OpenSRF/Evergreen alpha releases to
&lt;a class="reference external" href="http://evergreen-ils.org/~denials/Evergreen_trunk_2010_08_23.zip"&gt;http://evergreen-ils.org/~denials/Evergreen_trunk_2010_08_23.zip&lt;/a&gt; (note
that it's 500 MB, and does not come with X installed, so it's primarily
aimed at users that are already familiar with Evergreen and just want to
see the new stuff without having to go through the entire install
process).&lt;/p&gt;
&lt;p&gt;I did take some time off of Evergreen development this afternoon, as I
was honoured to be one of the two guests on the &lt;a class="reference external" href="http://twit.tv/floss"&gt;FLOSS Weekly
podcast&lt;/a&gt;. Mike Rylander and I were there to
discuss Evergreen with the hosts, &lt;a class="reference external" href="http://twitter.com/merlyn"&gt;Randal
Schwartz&lt;/a&gt; and &lt;a class="reference external" href="http://danlynch.org/"&gt;Dan
Lynch&lt;/a&gt;. Unfortunately for Mike, me, and the
audience, Mike's Skype connection kept dropping and I had to do the bulk
of the talking. Despite missing the contributions from Mike's massive
brain, I'm told that the show went well. So if you're interested in
hearing a bit about Evergreen and why I do what I do, keep an eye open
for the interview at &lt;a class="reference external" href="http://twit.tv/floss132"&gt;http://twit.tv/floss132&lt;/a&gt; - it should be edited and
online by Friday, August 27th at the latest. I tried not to swear too
often so they wouldn't have to do much editing work - heh.&lt;/p&gt;
&lt;p&gt;Finally, somewhere in there I celebrated another birthday. Oh yeah!
Older? Yes! Wiser? Probably not.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 26 Aug 2010 00:40:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2010-08-26:/non-stop-evergreen-or-what-im-doing-on-my-summer-vacation.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>File_MARC 0.6.0 - now offering two tasty flavours of MARC-as-JSON output</title><link>https://coffeecode.net/file_marc-060-now-offering-two-tasty-flavours-of-marc-as-json-output.html</link><description>&lt;p&gt;I've just released the PHP PEAR library
&lt;a class="reference external" href="http://pear.php.net/File_MARC"&gt;File_MARC&lt;/a&gt; 0.6.0. This release
brings two JSON serialization output methods for MARC to the table:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;toJSONHash() returns JSON that adheres to Bill Dueber's proposal for
the array-oriented MARC-HASH JSON format at &lt;a class="reference external" href="http://robotlibrarian.billdueber.com/new-interest-in-marc-hash-json/"&gt;New interest in
MARC-HASH
JSON&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;toJSON() returns JSON that adheres to Ross Singer's proposal for an
object-oriented JSON format (I could only find a sample at &lt;a class="reference external" href="http://gist.github.com/511752"&gt;this
paste&lt;/a&gt; - not sure if there's a
broader description anywhere, but really -- who needs it?)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The JSON formats should be useful for developers who don't want to have
to deal with the overhead and sluggishness of a MARC parsing library
(yes, File_MARC, I'm looking at you) just to deal with MARC data. Both
formats are round-trippable and compact, which is why I chose to support
them.&lt;/p&gt;
&lt;p&gt;The use of the &lt;a class="reference external" href="http://php.net/json_encode"&gt;json_encode()&lt;/a&gt; function
bumps the minimum PHP version requirement for File_MARC up to 5.2.x
from 5.1.x, which kind of sucks, but given that PHP 5.2.0 was &lt;a class="reference external" href="http://php.net/releases/"&gt;released
in 2006&lt;/a&gt;, I think it's worth it.&lt;/p&gt;
&lt;p&gt;You can install File_MARC using the 'pear' command on most environments
as follows:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;pear install &lt;span class="pre"&gt;File_MARC-beta&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sat, 14 Aug 2010 19:10:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2010-08-14:/file_marc-060-now-offering-two-tasty-flavours-of-marc-as-json-output.html</guid><category>Libraries</category><category>Coding</category><category>PHP</category></item><item><title>Classification scheme-aware call number sorting in Evergreen</title><link>https://coffeecode.net/classification-scheme-aware-call-number-sorting-in-evergreen.html</link><description>&lt;p&gt;As a librarian who works at a library that primarily uses the &lt;a class="reference external" href="http://www.loc.gov/catdir/cpso/lcco/"&gt;Library
of Congress classification
scheme&lt;/a&gt;, I have been interested
for &lt;a class="reference external" href="http://svn.open-ils.org/trac/ILS/ticket/51"&gt;a long time&lt;/a&gt; in
teaching Evergreen to be aware of call number schemes other than Dewey.
The problem, in a nutshell, is that Evergreen simply applies an
alphabetical sort against the the uppercased version of the call number
when generating call number browser displays - resulting in LC call
numbers that sort incorrectly, like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;K 215 .E53 W37 1997&lt;/li&gt;
&lt;li&gt;K 22 .U748 v.18&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When the subject recently came up on the &lt;a class="reference external" href="http://article.gmane.org/gmane.education.libraries.open-ils.general/2891"&gt;open-ils-general mailing
list&lt;/a&gt;,
I decided to follow up with some code. So, &lt;a class="reference external" href="http://svn.open-ils.org/trac/ILS/changeset/17130"&gt;as of this
weekend&lt;/a&gt;, Evergreen
trunk now has a generalized infrastructure for generating sort keys for
call numbers. The broad strokes of the current implementation are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The classification scheme is set the level of the call number.&lt;/li&gt;
&lt;li&gt;Classification schemes are defined in the
&lt;tt class="docutils literal"&gt;asset.call_number_classification&lt;/tt&gt; table with a pointer to a
database function to call to generate a normalized sort key for the
given call number.&lt;/li&gt;
&lt;li&gt;Three classification schemes are available out of the box:&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Generic&lt;/em&gt; (the default) - a simple normalization approach that
produces reasonable results in the absence of special rules for
Cutters, etc&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Dewey (DDC)&lt;/em&gt; - a normalization routine taken from the &lt;a class="reference external" href="http://git.koha-community.org/gitweb/?p=koha.git;a=blob;f=C4/ClassSortRoutine/Dewey.pm;h=b4ba92199e7d425e3c4cfdb5082a4f36b486e3c9;hb=HEAD"&gt;Koha
C4::ClassSortRoutine::Dewey&lt;/a&gt;
Perl module&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Library of Congress (LC)&lt;/em&gt; - a normalization routine that simply
wraps Bill Dueber's excellent
&lt;a class="reference external" href="http://code.google.com/p/library-callnumber-lc/"&gt;Library::CallNumber::LC&lt;/a&gt;
Perl module&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;and adding more classification schemes is just a matter of adding
another row to the &lt;tt class="docutils literal"&gt;asset.call_number_classification&lt;/tt&gt; table and the
appropriate sortkey-generating database function.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that this is the first time, to my knowledge, that Koha code has
been adopted directly by Evergreen. I included attribution for the
copyright holders in both the Generic and Dewey normalization functions.
I wrote the Generic implementation in Evergreen from scratch shortly
after taking a look at Koha's approach, so in some corners my work would
be considered a &amp;quot;derived work&amp;quot;. Koha's Dewey normalization function was
(somewhat surprisingly) the only open-source implementation that I could
find for Dewey, so it made perfect sense to me to adopt that for use in
Evergreen. Many thanks to Koha for their use of the GPL v2 or later
licence!&lt;/p&gt;
&lt;p&gt;There are still some limitations and low-hanging fruit that I hope to
address in the near future:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Right now you can only manipulate classification schemes via SQL. The
&lt;strong&gt;Holdings Maintenance&lt;/strong&gt; dialogue needs to give cataloguers the
ability to set the classification scheme for each call number,
because I'm sure they don't want to drop down to the command line.
This setting should probably be sticky during a given session, so
that if they're processing a cart of government docs, they won't have
to change the scheme from the default to CODOC for each item.&lt;/li&gt;
&lt;li&gt;Speaking of defaults, each library needs to be able to define a
default classification scheme - so your consortium can have a Dewey
library and an LC library and a SUDOC library, and their preferences
won't trample each other. This can just be a simple org-unit setting.&lt;/li&gt;
&lt;li&gt;Following on Mike Rylander's
&lt;a class="reference external" href="http://svn.open-ils.org/trac/ILS/ticket/51"&gt;advice&lt;/a&gt;, the
&lt;tt class="docutils literal"&gt;asset.call_number_classification&lt;/tt&gt; table should gain a new column
that lists the field/subfield combinations used to find the
appropriate call number (if any) for each scheme in a given
bibliographic record. Then the &lt;strong&gt;Holdings Maintenance&lt;/strong&gt; dialogue can
offer the appropriate call number based on the classification scheme.&lt;/li&gt;
&lt;/ul&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 09 Aug 2010 01:37:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2010-08-09:/classification-scheme-aware-call-number-sorting-in-evergreen.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Authorities in Evergreen: an Amsterdam trip report</title><link>https://coffeecode.net/authorities-in-evergreen-an-amsterdam-trip-report.html</link><description>&lt;p&gt;As part of the informal partnership between the &lt;a class="reference external" href="http://iisg.nl"&gt;International Institute
of Social History (IISH)&lt;/a&gt; and &lt;a class="reference external" href="http://projectconifer.ca"&gt;Project
Conifer&lt;/a&gt;, I was pleased to be able to spend
the last two weeks in Amsterdam, working side-by-side with one of the
Institute's developers, Ole Kerpel, on augmenting the support for MARC21
authorities in Evergreen. To prepare for the work session, I had posted
a
&lt;a class="reference external" href="https://blueprints.launchpad.net/evergreen/+spec/respect-my-authorities"&gt;blueprint&lt;/a&gt;
for the authorities work on the Evergreen Launchpad instance and
circulated &lt;a class="reference external" href="http://evergreen-ils.org/dokuwiki/doku.php?id=dev:proposal:authorities"&gt;the list of
requirements&lt;/a&gt;
we had been asked to address to the broader Evergreen development
community. We were fortunate to have the attention of Mike Rylander on
the proposal, who not only supplied suggestions for how to implement
some of the items, but also committed significant code contributions to
the effort that greatly assisted our efforts. Here is a summary of the
goals we accomplished in the current development branch of Evergreen
(targeted for the 2.0 release), followed by a list of the outstanding
items and my finger-in-the-air estimate of how much more time it would
take to accomplish each of the tasks:&lt;/p&gt;
&lt;div class="section" id="accomplishments"&gt;
&lt;h2&gt;Accomplishments&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;Controllable control numbers&lt;/p&gt;
&lt;p&gt;While not, strictly speaking, a requirement for authority control in
and of itself, the ability to ensure that the behaviour of the
001/003/035 fields all conformed to the MARC21 specifications was an
important requirement for IISH. They plan to provide external access
to their authority and bibliographic records, so making the official
identifier fields linkable based on the underlying record ID was an
important aspect of the work. We implemented this feature as an
optional database-level trigger to ensure that the control numbers
and control number identifiers are always perfectly in sync with the
internal identifier of the particular system on which the records are
stored.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Links&lt;/p&gt;
&lt;p&gt;Where having Mike Rylander participate in your review process pays
off, part one... Before I even arrived in Amsterdam, Mike implemented
a tricky database trigger that tracks the links between a given
bibliographic record and the authority records to which it links. The
links are tracked at the database level, as well as directly in one
or more &lt;tt class="docutils literal"&gt;0&lt;/tt&gt; subfields in each field that is controlled by an
authority record. Yes, a given field in a bibliographic record can be
controlled by two authority records and it all works. Nice, Mike!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Syncs&lt;/p&gt;
&lt;p&gt;Where having Mike Rylander participate in your review process pays
off, part two... Mike also implemented the bulk of the logic for
automatically updating bibliographic records that are linked to a
given authority record when that authority record is modified. Yes,
folks, when you add a death date to an authority record, it will
automatically appear in the corresponding bib records.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Control an uncontrolled set of bibliographic records&lt;/p&gt;
&lt;p&gt;You may have dealt with library systems in the past that use some
sort of string matching to implement authority support. As noted
above, Evergreen is not like that. However, this means that many of
us, when migrating to Evergreen, have bibliographic records lacking
the &lt;tt class="docutils literal"&gt;0&lt;/tt&gt; subfields that are required for full authority support.
Towards that end, I wrote &lt;a class="reference external" href="http://svn.open-ils.org/trac/ILS/browser/trunk/Open-ILS/src/support-scripts/authority_control_fields.pl"&gt;a
script&lt;/a&gt;
that will walk through a set of bibliographic records, search for
matching authority records for each controllable field in each
bibliographic record, and add the required &lt;tt class="docutils literal"&gt;0&lt;/tt&gt; subfields to the
bibliographic records. It certainly won't be a fast solution, but you
should only need to do it once, and it worked on the limited test
cases that we had ready at hand.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Teach the MARC editor about authority records&lt;/p&gt;
&lt;p&gt;The MARC editor knew all about fixed fields for bibliographic
records, and provided a handy grid for editing those fields. However,
it didn't even know how to recognize authority records, and presented
a fixed field grid that was absolutely meaningless. I spent a chunk
of time laboriously transcribing the fixed field rules from MARC
documentation into the MARC editor and now the MARC editor presents a
reasonable fixed field grid for your editing convenience.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Merge authority records&lt;/p&gt;
&lt;p&gt;Something that often happens in a library is that two authority
records are created that identify the same thing. Eventually somebody
notices the problem and wants to merge the authority records
together. Towards this end, I added a database-level stored procedure
that supports the merging of authority records, such that the linked
bibliographic records will automatically point to the winning
authority record.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Authority browse interfaces&lt;/p&gt;
&lt;p&gt;Where having Mike Rylander participate in your review process pays
off, part the third... Mike also implemented basic browse interfaces
that presents a series of authority records in MARCXML format
matching your requested authority type (author, title, subject,
topic) and the matching substring at the &lt;tt class="docutils literal"&gt;/opac/extras/browse&lt;/tt&gt; and
&lt;tt class="docutils literal"&gt;/opac/extras/startwith&lt;/tt&gt; URL entry points. While still raw at this
point, these can provide the basis for classic authority browse
interfaces for those who desperately desire them.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="remaining-to-do-items"&gt;
&lt;h2&gt;Remaining to-do items&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Note that any estimates are based on how long I think it would take me
to implement, based on my own familiarity with MARC and Evergreen and
all things Perl and JavaScript and PostgreSQL, and provided with the
granularity of no less than one day. Actual implementation times may
vary, of course; if related work items are worked on consecutively, then
it is likely to take less time to achieve than if the items are tackled
sporadically.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;Add an authority in the flow&lt;/p&gt;
&lt;p&gt;When you're working in the MARC Editor and you find that there is no
match for an entry that you really think should be controlled, IISH
wants to make it easy for a cataloguer to add an authority record for
that entry. We thought that there might be two options that we would
want to expose - a direct &amp;quot;create an authority record from this
field&amp;quot; option that takes no further input, and a &amp;quot;create an authority
record from this field and open it in another MARC editor to let me
tweak it&amp;quot; option. &lt;strong&gt;Estimate&lt;/strong&gt;: 2 person days&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Highlight controlled fields&lt;/p&gt;
&lt;p&gt;This is really a two-part problem. First, for uncontrolled fields, we
want to teach the &lt;strong&gt;Validate&lt;/strong&gt; button to offer the kind of automatic
matching that the script does and add the required &lt;tt class="docutils literal"&gt;0&lt;/tt&gt; subfield.
Second, we want to highlight fields that are explicitly controlled by
authority records with a &lt;tt class="docutils literal"&gt;subfield&lt;/tt&gt; differently from fields that
simply match an authority record, but which are not controlled by it.
&lt;strong&gt;Estimate:&lt;/strong&gt; 1 person day&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Simplify authority record selection&lt;/p&gt;
&lt;p&gt;This two-part requirement would mask many of the fields that are
currently offered as options when you right-click on an uncontrolled
subfield to display matching authority records. For example, it is a
little weird to offer a &amp;quot;See from&amp;quot; heading to a cataloguer; we're
trying to avoid adding new records with those headings, right? Heh.
Second, we want to introduce the ability to invoke the authority
browse list in this interface so that the cataloguer can see a given
set of headings in context and select the heading to apply from
there. &lt;strong&gt;Estimate:&lt;/strong&gt; 2 person days&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Delete authority record&lt;/p&gt;
&lt;p&gt;There is currently no cataloguer-friendly way to delete authority
records. We need to expose a list of authority records (probably
reusing that browse list again) and make it possible for cataloguers
to delete an authority record. When that record is deleted, all
bibliographic records that link to it need to have their links
removed - and ideally, the cataloguer would be able to tell how many
bibliographic records link to that authority before the delete takes
place. &lt;strong&gt;Estimate:&lt;/strong&gt; 1 person day&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Edit and merge authority records&lt;/p&gt;
&lt;p&gt;Although the database-level support now exists for merging authority
records, we need to expose a means for cataloguers to select the
authority records that they want to edit or merge. This could just be
a slightly evolved version of the &amp;quot;Delete&amp;quot; interface. &lt;strong&gt;Estimate:&lt;/strong&gt; 1
person day&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Expose authority records via SRU/Z39.50/crawlable interface&lt;/p&gt;
&lt;p&gt;One of the goals of the IISH is to be able to share their authority
records with other institutions. One of the standard methods is SRU +
Z39.50 server support; we should be able to build on the SRU/Z39.50
server support for bibliographic records in Evergreen to provide a
basic solution for authority records. Interest has also been
expressed in having a crawlable implementation that would give the
linked data crowd something to play with. &lt;strong&gt;Estimate:&lt;/strong&gt; 2 person days
for an SRU/Z39.50 server, 1 person day for a very basic crawlable
linked-data implementation&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In summary - hurray for Mike Rylander for helping us out to such an
extent, and many thanks, again, to IISH for giving me an opportunity to
focus on Evergreen development for an extended period of time, and to
Laurentian University for supporting my efforts. I hope that between Ole
and myself that it will be possible to finish the rest of these work
items prior to the Evergreen 2.0 release. It has been exhilarating to
see far Evergreen's authority support has come in less than a month, and
given a little more time I suspect that Evergreen's authority support
will be the envy of other library systems.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 19 Jul 2010 18:52:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2010-07-19:/authorities-in-evergreen-an-amsterdam-trip-report.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Got funds for enhancing Evergreen? Looking for places to spend it?</title><link>https://coffeecode.net/got-funds-for-enhancing-evergreen-looking-for-places-to-spend-it.html</link><description>&lt;p&gt;As an Evergreen developer, I believe our project has a few significant
gaps that projects like &lt;a class="reference external" href="http://rscel.org"&gt;RSCEL&lt;/a&gt; might be able to
help address for the overall good of the community by bringing in
outside resources to the project. Or perhaps there are skills within the
community that don't feel like they've been called on yet; when I say
that we lack skills, I'm basing that on the lack of patches and offers
of assistance that I've seen in these areas. I would be delighted to be
proven wrong! Either way, I submit this for the community's
consideration.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;strong&gt;3rd party security audit&lt;/strong&gt;: Before Conifer adopted Evergreen, I had
hoped that we would be able to fund a security audit of the code by a
trusted and competent 3rd party like
&lt;a class="reference external" href="http://omniti.com/does/web-application-security"&gt;OmniTI&lt;/a&gt; (from a
previous life, I believe that OmniTI employs some of the best people
in the business, thus the plug - but there are certainly other
options out there). As developers, we try our best to avoid
vulnerabilities, but as the &lt;a class="reference external" href="http://evergreen-ils.org/blog/?p=406"&gt;recently disclosed vulnerability in
open-ils.pcrud&lt;/a&gt; attests,
we're not experts in security. An audit of the public-facing
interfaces (the catalogue, feeds, etc) would be a great help to the
project. I would expect a prioritized list of areas that need to be
addressed, along with recommendations on how to address those
problems (whether they be cross-site scripting, session fixation
attacks, authentication encryption attacks, etc). Our community's
process (or lack thereof) for reporting and addressing security
vulnerabilities might be an appropriate subject for an audit as well.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Testing framework&lt;/strong&gt;: Our project is woefully short on tests, either
human-powered or automated, for determining the state of the code at
any given point in a release cycle. Thus, we have put out release
after release that either won't install cleanly, or won't upgrade
successfully from a previous release. The trunk version of the code
had a error that meant that Evergreen couldn't be compiled; that
problem existed for three weeks before somebody noticed and fixed it.
I'm not pointing fingers, here; if I did that, I wouldn't have enough
fingers to point back at myself for all of the problems I've
introduced that other people have had to fix. Johnathan Nightingale
in &lt;a class="reference external" href="http://blog.johnath.com/2008/07/02/the-most-important-thing/"&gt;The Most Important Thing … or How Mozilla Does Security and What
You Can
Steal&lt;/a&gt;
provides a great overview of Mozilla's philosophy about and approach
to testing. There is all kinds of goodness in this presentation, but
one of the most interesting points is that &amp;quot;money can be exchanged
for services&amp;quot; -- that is to say, if your existing development team
doesn't have the skills or time to implement a testing
infrastructure, there are companies that do have the ability to put
together a test infrastructure for a given project. Once that
infrastructure is in place, it tends to get extended and used by the
existing development team because it makes their lives easier; they
don't need to manually test a given code path every time in the
future, or deal with regressions that aren't noticed until months in
the future when the changes they were making are no longer fresh in
their minds. It sometimes requires a culture change, though.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Continuous integration&lt;/strong&gt;: Hand in hand with a testing framework is
a continuous integration server that provides testing feedback on
every commit to the Evergreen repository for a given set of branches.
Even without a testing framework, it is possible to have a continuous
integration server run through the process of installing all
prerequisites, configuring the code, building and installing the
code, and creating the database schema to at least determine whether
the basics can be accomplished successfully to confirm that a branch
is ready for release. This arguably also goes hand in hand with a
team's process for addressing a security vulnerability: if you have a
continuous integration server that can tell you if a given fix does
not introduce basic build and install errors, then you can get a new
release out with much more confidence that you're not going to be
encouraging your users to jump to a broken package. Note that Equinox
ran a continuous integration server for OpenSRF and Evergreen trunk
&lt;a class="reference external" href="http://markmail.org/message/j6hd6634oimpum6x"&gt;for a while&lt;/a&gt;, but
that was &lt;a class="reference external" href="http://markmail.org/message/evjm4rdsricwz5qh"&gt;killed&lt;/a&gt;
and replaced by a &lt;a class="reference external" href="http://markmail.org/message/zfqnec2b6n6wjcsk"&gt;call for volunteers to build a new continuous
integration service&lt;/a&gt;
(I can't find a more to-the-point call for volunteers, so perhaps it
just hasn't been advertised widely enough - or again, perhaps we lack
the skills in the community to get a standard CI service like
&lt;a class="reference external" href="http://hudson-ci.org/"&gt;Hudson&lt;/a&gt; running.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Packaging&lt;/strong&gt;: To decrease the difficulty of installing and
configuring Evergreen, we need more investment in packaging Evergreen
and all of its unpackaged dependencies. The idea is that a user
should be able to run &amp;quot;aptitude install evergreen&amp;quot; or &amp;quot;yum install
evergreen&amp;quot; and have the entire system installed and configured, and
then run &amp;quot;aptitude upgrade&amp;quot; or &amp;quot;yum upgrade&amp;quot; to have newer versions
installed. Right now the process is still rather onerous and requires
a great deal of manual effort, although it has improved significantly
since the early days of 2007. Again, this requires a particular set
of skills that the Evergreen community does not appear to possess in
depth: autoconf, automake, APT and RPM packaging - and perhaps some
redesign of elements like skins to make local customizations easier
to incorporate and keep up to date. This would be a natural
complement to a continuous integration service, but much of the
effort could also be done on its own.&lt;/li&gt;
&lt;/ul&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 02 Jul 2010 19:37:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2010-07-02:/got-funds-for-enhancing-evergreen-looking-for-places-to-spend-it.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Random useful Evergreen database queries</title><link>https://coffeecode.net/random-useful-evergreen-database-queries.html</link><description>&lt;p&gt;Occasionally I drop down to the database level to generate some
reporting information. You could probably get the same information
through the reporter but I like the precision of SQL. Here are a couple
of queries that I've put together recently.&lt;/p&gt;
&lt;div class="section" id="list-titles-for-periodicals-published-by-human-kinetics-with-subscriptions-owned-by-library-id-osul"&gt;
&lt;h2&gt;List titles for periodicals published by &amp;quot;Human Kinetics&amp;quot; with subscriptions owned by library ID &amp;quot;OSUL&amp;quot;&lt;/h2&gt;
&lt;pre class="literal-block"&gt;
SELECT rsr.id, rsr.title   FROM metabib.full_rec mfr    INNER JOIN metabib.rec_descriptor mrd ON mfr.record = mrd.record    INNER JOIN asset.call_number acn ON acn.record = mrd.record    INNER JOIN reporter.super_simple_record rsr ON rsr.id = mrd.record    INNER JOIN actor.org_unit aou ON aou.id = acn.owning_lib  WHERE mfr.tag = '260'     AND mfr.subfield = 'b'    AND mfr.value ilike 'Human Kinetics%'    AND mrd.bib_level = 's'    AND aou.shortname = 'OSUL';
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="strip-out-urls-for-an-online-resource-to-which-we-no-longer-subscribe"&gt;
&lt;h2&gt;Strip out URLs for an online resource to which we no longer subscribe&lt;/h2&gt;
&lt;p&gt;Occasionally we drop subscriptions to an online resource that we
happened to catalogue with an inline 856 field. Our new approach relies
on just-in-time results from our link resolver to display accurate
access to online resources (or at least consistent representations of
what we have access to!), but our legacy records placed all of that
information directly in the 856 field in the corresponding bibliographic
record. The PostgreSQL
&lt;a class="reference external" href="http://www.postgresql.org/docs/current/static/functions-string.html"&gt;regexp_replace()&lt;/a&gt;
function lets you use regular expressions to match subsets of the MARC
record and replace it with... well... nothing, in this case.&lt;/p&gt;
&lt;p&gt;As we want to subsequently reingest the MARC records, and we're not
running Evergreen trunk yet in which a reingest will automatically be
triggered by an update to the biblio.record_entry table, I first push
the list of affected IDs into a scratch table. This also lets me put
limits on the MARC records that I'm going to touch, so that I don't
inadvertently destroy content in another library's set of bibliographic
records.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
CREATE TABLE scratchpad.urls_to_delete (id BIGINT);INSERT INTO scratchpad.urls_to_delete   SELECT acn.record    FROM asset.uri au      INNER JOIN asset.uri_call_number_map aucnm ON au.id = aucnm.uri      INNER JOIN asset.call_number acn ON aucnm.call_number = acn.id      INNER JOIN actor.org_unit aou ON acn.owning_lib = aou.id    WHERE au.href ILIKE '%/search.ebscohost.com/direct.asp?db=rch%'      AND aou.shortname = 'OSUL';BEGIN; UPDATE biblio.record_entry  SET marc = regexp_replace(    marc,    E'&amp;lt;datafield tag=&amp;quot;856&amp;quot; ind1=&amp;quot;4&amp;quot; ind2=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;subfield code=&amp;quot;z&amp;quot;&amp;gt;Available online from Ebsco.*?search.ebscohost.com/direct.asp\\?db=rch.*?&amp;lt;/datafield&amp;gt;',    ''  )  WHERE id IN (SELECT id FROM scratchpad.urls_to_delete);
&lt;/pre&gt;
&lt;p&gt;Note that the UPDATE statement is preceded by a BEGIN statement so that
we can check our results and issue a ROLLBACK if we inadvertently
changed too much, or created mangled records. Once you check your work
with a SELECT statement or two, you can issue a COMMIT statement to make
the changes take effect.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 02 Jul 2010 16:20:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2010-07-02:/random-useful-evergreen-database-queries.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Thoughts on making Android more free-as-in-freedom</title><link>https://coffeecode.net/thoughts-on-making-android-more-free-as-in-freedom.html</link><description>&lt;p&gt;&lt;a class="reference external" href="http://identi.ca/conversation/38114077"&gt;This conversation&lt;/a&gt; on
identi.ca has prompted me to publish the rough notes I had prepared for
a proposed discussion on making the Android operating system experience
more free-as-in-freedom at the Google I/O 2010 Conference Bootcamp
&amp;quot;unconference&amp;quot;. Unfortunately, my proposal was not one of the top
vote-getters (it missed the cut by two votes), so we didn't get to have
the discussion there, even though I'm sure we would have had an
interesting discussion. But perhaps there's something worthwhile in the
roughly formed thoughts that follow...&lt;/p&gt;
&lt;div class="section" id="making-android-more-free-as-in-freedom"&gt;
&lt;h2&gt;Making Android more &amp;quot;Free as in Freedom&amp;quot;&lt;/h2&gt;
&lt;div class="section" id="what-do-i-mean"&gt;
&lt;h3&gt;What do I mean?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;Not &amp;quot;zero cost&amp;quot;, but:&lt;/p&gt;
&lt;/p&gt;&lt;ul class="simple"&gt;
&lt;li&gt;Free to run for any purpose&lt;/li&gt;
&lt;li&gt;Free to study the source (a critical means of learning how to
build better applications)&lt;/li&gt;
&lt;li&gt;Free to redistribute verbatim copies&lt;/li&gt;
&lt;li&gt;Free to modify the source and redistribute the modified version&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Android the operating system may be FaiF, but Android the
distribution is not&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We have opportunities to win interesting development investments on
Android over proprietary platforms; see the
&lt;a class="reference external" href="http://web.mit.edu/wockets/"&gt;Wockets&lt;/a&gt; - &lt;em&gt;open source effort to
create very low cost motion measurement devices for hobbyists,
researchers, and developers interesting in creating software and devices
that measure or respond to movement&lt;/em&gt; that is developing with &lt;a class="reference external" href="http://web.mit.edu/wockets/FAQ.htm#WhyWM"&gt;Windows
Mobile first&lt;/a&gt;, and &lt;a class="reference external" href="http://web.mit.edu/wockets/FAQ.htm#OtherPlatforms"&gt;Android
second&lt;/a&gt;. It's a
shame to see an &amp;quot;open&amp;quot; research project being built on a closed base,
but there might be some clues in these researchers' rationale that
suggest ways that the freedom of Android could be improved.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;Drivers (camera, GPS, etc) bundled as binary blobs are a problem for
auditing, bug fixing, innovating&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Current phones get applications delivered out of the box:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;that sometimes suck (GTalk - no way of changing the Google account
it uses)&lt;/li&gt;
&lt;li&gt;that you won't use and don't want (Facebook!)&lt;/li&gt;
&lt;li&gt;that you might not trust (this is your phone, +++)&lt;/li&gt;
&lt;li&gt;that you can't legally redistribute (Market?)&lt;/li&gt;
&lt;li&gt;that you can't remove (my precious space!) without installing a
new firmware image&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Can be hard to determine what apps are even free software; we might
need to combine these multiple, partially overlapping, sometimes
contradictory sources:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://trac.osuosl.org/trac/replicant/wiki/ListOfKnownFreeSoftwareApps"&gt;Replicant
wiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://wiki.koumbit.net/AndroidFreeSoftware"&gt;Koumbit wiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://www.appbrain.com/user/ssssch/free-software"&gt;AppBrain&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;and the Android Market and SlideMe Market don't enable filtering by
license&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Opportunities abound for new Free-as-in-Freedom applications to gain
a significant foothold:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;No Skype = space for LinPhone / SipDroid to move in (given a
quality contact mechanism)&lt;/li&gt;
&lt;li&gt;No good multi-protocol IM client (libpurple via NDK?)&lt;/li&gt;
&lt;li&gt;Boost the Replicant project&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;It's in our best interests as Android users and developers to have a
free platform - we developers can build on each others work to create
a better user experience, rather than starting from scratch every
time in our own jealously protected niches.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sun, 27 Jun 2010 21:15:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2010-06-27:/thoughts-on-making-android-more-free-as-in-freedom.html</guid><category>Software Freedom</category><category>Android</category><category>FSOSS</category></item><item><title>OpenSRF article in code4lib Journal has been published</title><link>https://coffeecode.net/opensrf-article-in-code4lib-journal-has-been-published.html</link><description>&lt;p&gt;Many of you have undoubtedly seen previous drafts of &lt;a class="reference external" href="http://journal.code4lib.org/articles/3284"&gt;this
article&lt;/a&gt; as I worked on it
over the past three or four months, but I'm pleased to say that the
&lt;em&gt;Easing Gently into OpenSRF&lt;/em&gt; article has now been officially published
by the &lt;a class="reference external" href="http://journal.code4lib.org"&gt;code4lib Journal&lt;/a&gt;. The goal of
the article is to introduce the OpenSRF infrastructure for building
applications on a scale-out architecture -- which is a high-faluting
mouthful -- using a 10-line Perl module that implements a standalone
OpenSRF service as the entry point. Along the way, the article covers a
little bit of the Evergreen-specific functionality that is built on top
of OpenSRF; hopefully enough to act as a teaser for follow-on articles
in the future. My naked desire is to get more development talent to join
us at the OpenSRF + Evergreen tables. The buffet is rich and the food
(and available tasks) are plentiful!&lt;/p&gt;
&lt;p&gt;I would be remiss if I did not profusely thank my editors, &lt;a class="reference external" href="http://bibwild.wordpress.com/"&gt;Jonathan
Rochkind&lt;/a&gt; and &lt;a class="reference external" href="http://rc98.net/"&gt;Gabriel
Farrell&lt;/a&gt;, for their probing questions, requests for
more content and examples, and suggestions. They helped shape a much
more comprehensive and useful article than I would have produced on my
own.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 22 Jun 2010 18:44:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2010-06-22:/opensrf-article-in-code4lib-journal-has-been-published.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Moving from Figaro's Password Manager (FPM) to KeePassX</title><link>https://coffeecode.net/moving-from-figaros-password-manager-fpm-to-keepassx.html</link><description>&lt;p&gt;&lt;em&gt;Update 2017-10-18: linked to gitlab instead of gitorious; thanks Petter Reinholdtsen!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I'm one of those people who actually keeps different passwords for every
site and service I use. So far I'm up to over 400 passwords, so I'm
dependent on a password manager. For a long, long time I have used
&lt;a class="reference external" href="http://fpm.sourceforge.net"&gt;Figaro's Password Manager (FPM)&lt;/a&gt; (and
&lt;a class="reference external" href="http://kedpm.sourceforge.net/"&gt;KedPM&lt;/a&gt; and most recently
&lt;a class="reference external" href="http://als.regnet.cz/fpm2/"&gt;FPM2&lt;/a&gt; as continuations of FPM), but now
that I have an Android smartphone on which I can browse without wanting
to die, I've been itching to get access to my passwords on that. I
noticed that &lt;a class="reference external" href="http://www.keepassdroid.com/"&gt;KeePassDroid&lt;/a&gt; was
available, and that &lt;a class="reference external" href="http://www.keepassx.org"&gt;KeePassX&lt;/a&gt; would work on
my desktop. I just had to get from FPM's password export format to one
of KeePass's import formats. It turns out that nobody had made that
particular leap before (or hadn't shared their conversion script).&lt;/p&gt;
&lt;p&gt;Thus... I bring you the &lt;a class="reference external" href="https://gitlab.com/fpm-to-keepass-converter/fpm-to-keepass-converter"&gt;FPM to KeePass
converter&lt;/a&gt;. A
straightfoward Python script licensed under the GPL v3 that does a
passable job of converting an FPM XML export to a KeePass 1.x or 2.x XML
import file. It worked for me, and that's all that I needed; but maybe
it will work for you, too.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 28 May 2010 19:14:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2010-05-28:/moving-from-figaros-password-manager-fpm-to-keepassx.html</guid><category>misc</category><category>Android</category><category>Python</category></item><item><title>Using Fedora's liveusb-creator on Ubuntu Lucid Lynx</title><link>https://coffeecode.net/using-fedoras-liveusb-creator-on-ubuntu-lucid-lynx.html</link><description>&lt;p&gt;I migrated from Ubuntu Karmic to Ubuntu Lucid a few weeks ago, but am
looking to make the jump either to Debian Squeeze or Fedora. I haven't
used Fedora for ages, so I thought I would give the latest release
(Fedora 13 &amp;quot;Goddard&amp;quot;) a try. I wanted to use a LiveUSB approach to avoid
wasting a CD, but Ubuntu's own &amp;quot;Startup Disk Creator&amp;quot; utility refused to
recognize the Fedora image. So instead, I decided to try Fedora's
&lt;a class="reference external" href="http://fedoraproject.org/wiki/FedoraLiveCD/USBHowTo"&gt;LiveUSB
creator&lt;/a&gt; tool.&lt;/p&gt;
&lt;p&gt;One problem: liveusb-creator isn't packaged on Ubuntu and the
dependencies aren't obvious. So I downloaded the source for
liveusb-creator and ran it as root. Here's what I needed to do to make
it work:&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p class="first"&gt;Install &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;python-qt4-dbus&lt;/span&gt;&lt;/tt&gt; to avoid the
&lt;tt class="docutils literal"&gt;RuntimeError: To make asynchronous calls, receive signals or export objects, &lt;span class="pre"&gt;D-Bus&lt;/span&gt; connections must be attached to a main loop by passing &lt;span class="pre"&gt;mainloop=...&lt;/span&gt; to the constructor or calling &lt;span class="pre"&gt;dbus.set_default_main_loop(...)&lt;/span&gt;&lt;/tt&gt;
error message. &lt;em&gt;Aside:&lt;/em&gt; It should be easy to throw an
easier-to-understand error message.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Edit &lt;tt class="docutils literal"&gt;liveusb/gui.py&lt;/tt&gt; to remove the MD5 checksum verification step.
I could find a &lt;a class="reference external" href="https://fedoraproject.org/static/checksums/"&gt;SHA1 checksum for the
images&lt;/a&gt;, but there
was no MD5 checksum. The comments indicate that the MD5 checksum is
contained inside the image - not sure what that's about. I simply
commented out the three lines around line 180 to disable the MD5
checksum:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
if not self.parent.opts.noverify:                # Verify the MD5 checksum inside of the ISO image                # if not self.live.verify_iso_md5():                #    return
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Install the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;python-parted&lt;/span&gt;&lt;/tt&gt; package to avoid an error once the
image has been written to the USB key.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now that I've passed those hurdles, I hope to actually be able to try
out the LiveUSB image &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 27 May 2010 14:21:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2010-05-27:/using-fedoras-liveusb-creator-on-ubuntu-lucid-lynx.html</guid><category>misc</category></item><item><title>List of free software for Android (wiki)</title><link>https://coffeecode.net/list-of-free-software-for-android-wiki.html</link><description>&lt;p&gt;For some reason, I keep having trouble finding this handy
&lt;a class="reference external" href="https://wiki.koumbit.net/AndroidFreeSoftware"&gt;free-as-in-freedom list of Android
applications&lt;/a&gt; when
searching Google. So if I blog it for myself, I know I'll be able to
track it down easily in the future. I'm sure there are more applications
to add to that wiki, by the way, so if you know of some, go ahead and
edit. &lt;a class="reference external" href="http://linphone.org"&gt;LinPhone&lt;/a&gt;, a nice VOIP application, was
my contribution to the list (where &amp;quot;contribution&amp;quot; means &amp;quot;added the
pertinent links to the wiki&amp;quot;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update: 2010-05-18&lt;/strong&gt; Of course the
&lt;a class="reference external" href="http://trac.osuosl.org/trac/replicant"&gt;Replicant&lt;/a&gt; effort to create a
100% free software stack to run on HTC mobile phones has &lt;a class="reference external" href="http://trac.osuosl.org/trac/replicant/wiki/ListOfKnownFreeSoftwareApps"&gt;another list
of free-as-in-freedom Android
apps&lt;/a&gt;.
The two lists have significant overlap but neither one appears to be a
superset of the other; they also appear to be tracking slightly
different metadata about each app. Seems like it would be a nice job for
someone to build a database-backed list of free software Android apps
that could generate whatever format was desired (e.g. A-Z list by app
name, limit by categories / license, etc) and just replicate that data
to the various sites of interest.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sun, 16 May 2010 01:32:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2010-05-16:/list-of-free-software-for-android-wiki.html</guid><category>Software Freedom</category><category>Android</category></item><item><title>Building more informative record displays in Evergreen with BibTemplate</title><link>https://coffeecode.net/building-more-informative-record-displays-in-evergreen-with-bibtemplate.html</link><description>&lt;p&gt;&lt;strong&gt;Update: 2011-04-24&lt;/strong&gt; Just noticed the link to the Laurentian detail
file was broken - that's what I get for posting early in the morning
under the influence of a cold, eh? All fixed up now, though.&lt;/p&gt;
&lt;p&gt;This is a quick link to the updated version of the presentation
&lt;a class="reference external" href="/uploads/talks/2010/BibTemplate_EG2010.odp"&gt;(OpenOffice.org)&lt;/a&gt;
&lt;a class="reference external" href="/uploads/talks/2010/BibTemplate_EG2010.pdf"&gt;(PDF)&lt;/a&gt;
I'll be giving in a few hours (no, for real this time!).&lt;/p&gt;
&lt;p&gt;Also of interest is the &lt;a class="reference external" href="http://svn.open-ils.org/trac/ILS-Contrib/browser/conifer/branches/rel_1_6_1/web/opac/skin/lul/xml/rdetail/rdetail_summary.xml"&gt;customized
rdetail_summary.xml&lt;/a&gt;
file used in the Laurentian University catalogue - which, with one minor
change to the ISSN display (you don't really want to be displaying
electronic holdings for Laurentian in your catalgoue, do you?) should be
a drop-in replacement for any Evergreen 1.6 site.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 23 Apr 2010 11:14:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2010-04-23:/building-more-informative-record-displays-in-evergreen-with-bibtemplate.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Evergreen self-serve password reset interface coming in 1.6.1.0</title><link>https://coffeecode.net/evergreen-self-serve-password-reset-interface-coming-in-1610.html</link><description>&lt;p&gt;&lt;strong&gt;Update: 2010-04-22 16:24:56&lt;/strong&gt;: Evidently, &amp;quot;in a few minutes&amp;quot; means
tomorrow morning... avid Coffee|Code readers get the early scoop.&lt;/p&gt;
&lt;p&gt;I'm going to give a lightning talk in a few minutes about the self-serve
password reset mechanism that I added to Evergreen last month, that
should see the light of day in the Evergreen 1.6.1.0 release in May
2010. Here's the presentation in &lt;a class="reference external" href="/uploads/talks/2010/PasswordResetLightningTalk.odp"&gt;OpenOffice.org Impress
format&lt;/a&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 22 Apr 2010 19:28:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2010-04-22:/evergreen-self-serve-password-reset-interface-coming-in-1610.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Setting up secure self-check connections using SIP tunneled through SSH</title><link>https://coffeecode.net/setting-up-secure-self-check-connections-using-sip-tunneled-through-ssh.html</link><description>&lt;p&gt;&lt;strong&gt;Updated 2010-04-27&lt;/strong&gt;: Fix corrupted characters introduced by copying
from my GroupWise client. Thanks to Joe Atzberger for pointing that out.&lt;/p&gt;
&lt;p&gt;I set up a secure SIP connection from our self-check machine to our
Evergreen server located about 450km away, and thought I would put
together a quick blog post on how things are working in production with
SIP in &lt;a class="reference external" href="http://projectconifer.ca"&gt;Conifer&lt;/a&gt;. It seems a lot of sites
run SIP without a secured connection, based on how our self-check sales
rep and technical support person talked to me on the phone as though
they were talking to someone with two heads when I mentioned my concerns
about security - and they had no advice to offer on setting up an
encrypted connection. So I guess the subject doesn't come up too often.&lt;/p&gt;
&lt;p&gt;That doesn't excuse us as proper systems librarians from protecting as
much patron information from exposure as possible. So here's how we do
things at &lt;a class="reference external" href="http://laurentian.ca"&gt;Laurentian University&lt;/a&gt; - some
hostnames / IP addresses changed to protect the innocent:&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p class="first"&gt;The SIP server runs on one of our Evergreen server boxes; let's call
it carbon.example.com. carbon itself has no direct access to or from
the Internet.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;carbon has been set up with an iptables rule allowing access via port
6001 from starburst.example.com. starburst lives out in the
demilitarized zone of our ISP.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;starburst has been set up to allow access via port 22 from two
specific addresses at our library - no VPN connection required. We're
keeping this as locked down as possible, hence the source IP address
restriction. We opted for no VPN connection because most VPN clients
require manual steps to authenticate, and we need the self-check to
make the connection automatically when it boots up. Don't worry,
we'll get to the encryption part.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;From the self-check machine, we set up port-forwarding of carbon:6001
to localhost:6001 via the sipuser user on starburst. I have set up a
hostname called &amp;quot;sip.example.com&amp;quot; that points at
starburst.example.com; our ISP sysadmin has added a local user on
starburst named &amp;quot;sipuser&amp;quot;. We have then set up the SSH
authorized_keys file so that SSH logins can't actually log in, and
in fact the only thing they can do is forward port 6001 on carbon.&lt;/p&gt;
&lt;/p&gt;&lt;p&gt;In /home/sipuser/.ssh/authorized_keys, each entry should therefore
begin with:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
command=&amp;quot;/bin/false&amp;quot;,no-port-forwarding,no-agent-forwarding,permitopen=&amp;quot;carbon:6001&amp;quot; &amp;lt;key-type&amp;gt; &amp;lt;key&amp;gt; &amp;lt;name&amp;gt;
&lt;/pre&gt;
&lt;/p&gt;
&lt;/p&gt;&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p class="first"&gt;On the self-check machine, I used ssh-keygen to generate an SSH
key and then appended the public key to
/home/sipuser/.ssh/authorized_keys on starburst to enable logins
without using the UNIX password.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;On the self-check machine, the SSH command looks like:&lt;/p&gt;
&lt;/p&gt;&lt;pre class="literal-block"&gt;
ssh -f -N -L 6001:carbon.example.com:6001 sipuser&amp;#64;sip.example.com
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Our self-check machine is running Windows Vista inside, so I've
actually implemented it using Cygwin's &amp;quot;run&amp;quot; command in a shortcut
and dropped it into the user's Start folder so that it
automatically sets up the connection at startup time. The shortcut
command is:&lt;/p&gt;
&lt;/p&gt;&lt;pre class="literal-block"&gt;
C:\cygwin\bin\run.exe -p /bin ssh -f -N -L 6001:carbon.example.com:6001 sipuser&amp;#64;sip.example.com
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;We're using SIP2 over raw sockets to communicate. We found that we
had to supply the SIP username and password in the 3M self-check
software. Apparently authentication is unnecessary for Unicorn's SIP
implementation, and also apparently no library has ever been
concerned about SIP2 being a clear-text protocol before!&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;And all of that has worked exactly once so far, starting from a cold
boot. I'm going to be giving it a bunch of tests tomorrow, but I'm
very excited to have an end-to-end encrypted connection working out
of the box.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Well - that was the substance of the email I wrote four months ago.
Since then, the self-check has been turned off every night and has
connected flawlessly every morning - with the exception of one weekend
when we brought down Evergreen for system maintenance and someone
*cough our vendor cough* forgot to start the SIP server again. I'm
happy with the results, and it's really not &lt;em&gt;that&lt;/em&gt; complicated. If your
library uses self-check machines and runs SIP over the network in
clear-text, isn't it time your library beefed up its security?&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 16 Apr 2010 19:17:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2010-04-16:/setting-up-secure-self-check-connections-using-sip-tunneled-through-ssh.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Adjusting relevancy rankings in Evergreen 1.6, some explorations</title><link>https://coffeecode.net/adjusting-relevancy-rankings-in-evergreen-16-some-explorations.html</link><description>&lt;p&gt;&lt;strong&gt;Update: 2010-03-18&lt;/strong&gt; - I just realized that now that I have a separate
keyword index for titles, I can assign a stronger boost in general to
keywords that appear in the title for a keyword search; see &lt;a class="reference external" href="#updated_index_weight"&gt;update:
index weight&lt;/a&gt; below.&lt;/p&gt;
&lt;p&gt;One of my colleagues just asked me:&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;p&gt;So, how does relevancy ranking work in Evergreen, anyway?&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;I've been poking around in the area recently, as one of our users
complained about the relevance of some results with a basic keyword
search, so I thought I would throw my thoughts out there. It might give
other people a good jumping off point, and it provides a bit more of an
answer to questions &lt;a class="reference external" href="http://markmail.org/message/t32c5zwkzp2sicgg"&gt;like
these&lt;/a&gt; on the Evergreen
mailing lists. There are a number of factors, but cover density plays a
significant role - how often the terms you're looking for appear within
the target index, where index = keyword, author, title, subject, or
series (at least, those are the indexes that Evergreen supplies you with
out of the box). Then there are a number of tweakable boosts that appear
in the &lt;tt class="docutils literal"&gt;search.relevance_ranking&lt;/tt&gt; table:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;full_match&lt;/tt&gt;: for an exact match of the terms you're looking for,
from beginning to end, in the target index&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;first_word&lt;/tt&gt;: for a match of the first search term with the first
term in the target index&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;word_order&lt;/tt&gt;: for a match between the order of the search terms and
the order of the terms in the target index&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The problem with searching the out of the box &amp;quot;keyword&amp;quot; index is that
there's no way of boosting the ranking for terms appearing in, say, the
title or subject, because out of the box there's just one
&lt;strong&gt;keyword|keyword&lt;/strong&gt; index. For a keyword search, you can't tell
Evergreen that terms that appear in the title should be more relevant
than terms that appear in something like the content notes. In
comparison, the &lt;strong&gt;title&lt;/strong&gt; index is actually composed of a number of
separate indexes: &lt;strong&gt;title|proper&lt;/strong&gt;, &lt;strong&gt;title|uniform&lt;/strong&gt;,
&lt;strong&gt;title|alternative&lt;/strong&gt;, &lt;strong&gt;title|translated&lt;/strong&gt;, etc, that collectively
form the title index. You can see this in the &lt;tt class="docutils literal"&gt;config.metabib_field&lt;/tt&gt;
table.&lt;/p&gt;
&lt;p&gt;Given some relatively horrible results for a keyword search like
&amp;quot;programming languages&amp;quot; that returns &lt;em&gt;Regular expression recipes for
Windows developers&lt;/em&gt; as the most relevant hit (are you &lt;em&gt;kidding&lt;/em&gt; me? No,
it's because &amp;quot;Programming languages&amp;quot; appears in the subjects about 10
times... sigh), on our test server I added a &lt;strong&gt;keyword|title&lt;/strong&gt; index
that is identical to the &lt;strong&gt;title|proper&lt;/strong&gt; index, and then added some
entries to the &lt;tt class="docutils literal"&gt;search.relevance_adjustment&lt;/tt&gt; table to modify the
relevancy ranking accordingly, as follows:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
-- Clone the title|proper index to create a keyword|title index-- 6 = the title|proper indexINSERT INTO config.metabib_field (field_class, name, xpath, weight, format, search_field, facet_field)  SELECT 'keyword', 'title', xpath, weight, format, search_field, facet_field    FROM config.metabib_field    WHERE id = 6;-- Populate the keyword|title index with a set of index entries cloned-- from the metabib.title_field_entry table;-- 6 = the title|proper indexINSERT INTO metabib.keyword_field_entry (source, field, value)  SELECT source, 17, value    FROM metabib.title_field_entry    WHERE field = 6;-- Bump the relevance when the first search term appears first in the title in a keyword search-- 17 = our new keyword|title indexINSERT INTO search.relevance_adjustment (active, field, bump_type, multiplier)   VALUES (true, 17, 'first_word', 5);
&lt;/pre&gt;
&lt;p&gt;It feels dirty, because we're creating such a massively duplicated set
of rows. But it works... at least the &lt;tt class="docutils literal"&gt;first_word&lt;/tt&gt; relevance
adjustment works. When I tried using a multiplier of 1000 for the
&lt;tt class="docutils literal"&gt;word_order&lt;/tt&gt; relevance adjustment, it did not affect the search
results in the least. Perhaps there's a bug there?&lt;/p&gt;
&lt;p&gt;In any case, by combining some of the findings of this post with my
previous post on &lt;a class="reference external" href="/archives/217-More-granular-identifier-indexes-for-your-Evergreen-SRU-Z39.50-servers.html"&gt;adding more granular
indexes&lt;/a&gt;,
perhaps this will help people get deeper into customizing the search
experience for their Evergreen installations.&lt;/p&gt;
&lt;p&gt;` &amp;lt;&amp;gt;`__&lt;strong&gt;Update: adjusting search weight of terms in title in
general&lt;/strong&gt;: So, now that we have the &lt;tt class="docutils literal"&gt;keyword|title&lt;/tt&gt; index, we can
boost the relevancy ranking for records in which the search terms appear
in the &lt;tt class="docutils literal"&gt;keyword|title&lt;/tt&gt; index rather than the general
&lt;tt class="docutils literal"&gt;keyword|keyword&lt;/tt&gt; index. Here's how to shake things up:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
-- Boost the relevance for search terms appearing in the title in general-- 17 = our new keyword|title indexUPDATE config.metabib_field  SET weight = 10  WHERE id = 17;
&lt;/pre&gt;
&lt;p&gt;Some quick testing suggests that a weight of 10 works reasonably well...
but that is obviously going to be subject to further testing and
tweaking. But hey: we have the ability to tweak now! Yay!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 17 Mar 2010 21:13:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2010-03-17:/adjusting-relevancy-rankings-in-evergreen-16-some-explorations.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>More granular identifier indexes for your Evergreen SRU / Z39.50 servers</title><link>https://coffeecode.net/more-granular-identifier-indexes-for-your-evergreen-sru-z3950-servers.html</link><description>&lt;p&gt;In June of 2009 I was
&lt;a class="reference external" href="/archives/194-SFX-target-parser-for-Evergreen-and-some-thoughts-about-searching-identifiers.html"&gt;moaning&lt;/a&gt;
about how “Evergreen, by default, has no identifier index for limiting
searches by ISBN / ISSN / LCCN / OCLCnum” and that “if [fixing this
problem] requires work from me, it will probably be 2010 before any of
it happens”. Due to some of the tools our consortium relies on, we
really needed a solution for identifier searches in Z39.50 that was
better than just a general keyword search: we were returning too many
false positives that cause extra work and frustration for everyone.&lt;/p&gt;
&lt;p&gt;Well, here it is, 2010, and as of today Conifer's Evergreen server now
has a very handy identifier index. Most of the required pieces were
already there, in one form or another, but they all needed to be brought
together. This blog post is going to try to do that (and serve as
documentation for my ever-decaying brain, too). At the time of this
post, we're running a 1.6.0.4-ish Evergreen system; you'll need to be
running 1.6.0.4 to get ISSN searching to work properly, too.&lt;/p&gt;
&lt;p&gt;First, we need to create the identifier index. Evergreen comes with the
following indexes out of the box:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;author&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;title&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;series&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;subject&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;keyword&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pretty standard. With the exception of &lt;tt class="docutils literal"&gt;keyword&lt;/tt&gt;, each of these
indexes is composed of more granular indexes; for example, the &lt;tt class="docutils literal"&gt;title&lt;/tt&gt;
index is composed of the following specific indexes, with the XML format
that the MARCXML is converted to and then the XPath expression that
extracts the text from the pertinent XML format:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;abbreviated&lt;/tt&gt; - MODS32 -
&lt;tt class="docutils literal"&gt;//mods32:mods/mods32:titleInfo[mods32:title and &lt;span class="pre"&gt;(&amp;#64;type='abbreviated')]&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;translated&lt;/tt&gt; - MODS32 -
&lt;tt class="docutils literal"&gt;//mods32:mods/mods32:titleInfo[mods32:title and &lt;span class="pre"&gt;(&amp;#64;type='translated')]&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;alternative&lt;/tt&gt; - MODS32 -
&lt;tt class="docutils literal"&gt;//mods32:mods/mods32:titleInfo[mods32:title and &lt;span class="pre"&gt;(&amp;#64;type='alternative')]&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;uniform&lt;/tt&gt; - MODS32 -
&lt;tt class="docutils literal"&gt;//mods32:mods/mods32:titleInfo[mods32:title and &lt;span class="pre"&gt;(&amp;#64;type='uniform')]&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;proper&lt;/tt&gt; - MODS32 -
&lt;tt class="docutils literal"&gt;//mods32:mods/mods32:titleInfo[mods32:title and &lt;span class="pre"&gt;(&amp;#64;type='proper')]&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Aside&lt;/strong&gt;: You can search against these more granular indexes in the
Evergreen OPAC, by the way, by appending the granular index name to the
index class name with a &lt;tt class="docutils literal"&gt;|&lt;/tt&gt; as a delimiter. For example, a search
query of &lt;tt class="docutils literal"&gt;title|uniform: canada&lt;/tt&gt; will search only the uniform titles
for the term &amp;quot;canada&amp;quot;. Okay, sorry for that detour, but I bet you
weren't aware of that - we haven't done a good job of exposing some of
the magic that has been there for a long time in Evergreen in the OPAC
interface.&lt;/p&gt;
&lt;p&gt;Back to understanding the configuration - as you can see above, the
conversion to &lt;a class="reference external" href="http://www.loc.gov/standards/mods/"&gt;MODS&lt;/a&gt; does the
heavy lifting in pulling out the fields of interest to us from the
MARCXML. The full set of indexed fields and their definitions is visible
in the database via the query:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
SELECT * FROM config.metabib_field;
&lt;/pre&gt;
&lt;p&gt;For our purposes, we're interested in pulling the raw 010 (LCCN), 020
(ISBN), and 022 (ISSN) &lt;tt class="docutils literal"&gt;a&lt;/tt&gt; subfields directly from the MARCXML source.
Our first step is to add an entry to the &lt;tt class="docutils literal"&gt;config.metabib_field&lt;/tt&gt; table
defining our new index. We'll create a new granular index under the
&amp;quot;keyword&amp;quot; index class and call it &amp;quot;identifier&amp;quot;, because that's what it
is, right? That's as easy as:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
INSERT INTO config.metabib_field (field_class, name, xpath, weight, format, search_field, facet_field)  VALUES ('keyword', 'identifier',     '//marcxml:datafield[&amp;#64;tag=&amp;quot;010&amp;quot; or &amp;#64;tag=&amp;quot;020&amp;quot; or &amp;#64;tag=&amp;quot;022&amp;quot;]/marcxml:subfield[&amp;#64;code=&amp;quot;a&amp;quot;]',     1, 'marcxml', true, false);
&lt;/pre&gt;
&lt;p&gt;Next, we need to restart the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;open-ils.storage&lt;/span&gt;&lt;/tt&gt; and
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;open-ils.ingest&lt;/span&gt;&lt;/tt&gt; services to make them aware of this new entry. Go
ahead, I'll wait while you run &lt;tt class="docutils literal"&gt;osrf_ctl.sh &lt;span class="pre"&gt;-a&lt;/span&gt; restart_perl&lt;/tt&gt; or use
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;opensrf-perl.pl&lt;/span&gt;&lt;/tt&gt; to restart the services individually. Done? Good.&lt;/p&gt;
&lt;p&gt;We have to make up for lost time, now, as all of the bibliographic
records in your system didn't have this definition in place when they
were first ingested. The easiest thing to do is to just pull the
pertinent data directly from the &lt;tt class="docutils literal"&gt;metabib.full_rec&lt;/tt&gt; view (which is a
shredded version of the source MARCXML from your bibliographic records,
with one tag/subfield value per row. Ergo:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
-- Get the ID from the row that you just inserted for the new index;-- we'll use this in the INSERT statementSELECT id   FROM config.metabib_field  WHERE field_class = 'keyword' AND name = 'identifier';-- Let's say the ID was 18; we'll use that to identify the index in the SELECT statementINSERT INTO metabib.keyword_field_entry (field, source, value)  SELECT 18, record, agg_text(value)   FROM metabib.full_rec  WHERE tag IN ('010', '020', '022')  AND subfield = 'a'  GROUP BY 1, 2;
&lt;/pre&gt;
&lt;p&gt;All right! Now you can run some test searches in the OPAC for ISSNs,
ISBNs, and LCCNs in your OPAC using the
&lt;tt class="docutils literal"&gt;keyword|identifier: some_identifier&lt;/tt&gt; prefix. Cool. So that's part
one, mostly lifted from the &lt;a class="reference external" href="http://evergreen-ils.org/dokuwiki/doku.php?id=scratchpad:random_magic_spells#how_to_include_a_specific_marc_field_with_a_specific_search_class"&gt;&amp;quot;magic
spell&amp;quot;&lt;/a&gt;
in the Evergreen wiki.&lt;/p&gt;
&lt;p&gt;Part two is configuring SRU to use the new identifier index. The bulk of
the Evergreen SRU implementation is contained in the Perl module
OpenILS::WWW::SuperCat.pm (located in your install directory in
&lt;tt class="docutils literal"&gt;/openils/lib/perl5/OpenILS/Application/SuperCat.pm&lt;/tt&gt;). Get out your
patch tool or open up the Perl module in a text editor, we're going to
make a few changes. The pertinent diff follows:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
--- old/OpenILS/WWW/SuperCat.pm        2010-03-09 17:26:20.000000000 -0500+++ new/OpenILS/WWW/SuperCat.pm     2010-03-10 00:11:58.000000000 -0500&amp;#64;&amp;#64; -1410,6 +1410,7 &amp;#64;&amp;#64;     'bib.titlealternative'  =&amp;gt; 'title',     'bib.titleseries'       =&amp;gt; 'series',     'eg.series'             =&amp;gt; 'title',+    'eg.identifier'             =&amp;gt; 'keyword|identifier',      # Author/Name class:     'eg.author'             =&amp;gt; 'author',&amp;#64;&amp;#64; -1438,7 +1439,7 &amp;#64;&amp;#64;     'srw.serverchoice'      =&amp;gt; 'keyword',      # Identifiers:-    'dc.identifier'         =&amp;gt; 'keyword',+    'dc.identifier'         =&amp;gt; 'keyword|identifier',      # Dates:     'bib.dateissued'        =&amp;gt; undef,&amp;#64;&amp;#64; -1497,6 +1498,7 &amp;#64;&amp;#64;                        subject         =&amp;gt; ['subject'],                        keyword         =&amp;gt; ['keyword'],                        series          =&amp;gt; ['series'],+                       identifier      =&amp;gt; ['keyword|identifier'],                },                dc =&amp;gt; {                        title           =&amp;gt; ['title'],&amp;#64;&amp;#64; -1504,7 +1506,7 &amp;#64;&amp;#64;                        contributor     =&amp;gt; ['author'],                        publisher       =&amp;gt; ['keyword'],                        subject         =&amp;gt; ['subject'],-                       identifier      =&amp;gt; ['keyword'],+                       identifier      =&amp;gt; ['keyword|identifier'],                        type            =&amp;gt; [undef],                        format          =&amp;gt; [undef],                        language        =&amp;gt; ['lang'],
&lt;/pre&gt;
&lt;p&gt;Essentially, we've defined a new qualifier (&lt;tt class="docutils literal"&gt;eg.identifier&lt;/tt&gt;) and
pointed it and the &lt;tt class="docutils literal"&gt;dc.identifier&lt;/tt&gt; indexes at the new, more specific
&lt;tt class="docutils literal"&gt;keyword|identifier&lt;/tt&gt; index. Once the updated file is in place, reload
your Apache configuration (&lt;tt class="docutils literal"&gt;/etc/init.d/apache reload&lt;/tt&gt;) and SRU
requests using those qualifiers will now point at the identifier index.
FABULOUS.&lt;/p&gt;
&lt;p&gt;Our last step is to teach our simple2zoom-based Z39.50 configuration
about the new index by mapping the corresponding BIB-1 attributes to the
new &lt;tt class="docutils literal"&gt;eg.identifier&lt;/tt&gt; qualifier, like so:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;lt;database name=&amp;quot;FOOBAR&amp;quot;&amp;gt;     &amp;lt;zurl&amp;gt;http://localhost/opac/extras/sru/FOOBAR/holdings&amp;lt;/zurl&amp;gt;     &amp;lt;option name=&amp;quot;sru&amp;quot;&amp;gt;get&amp;lt;/option&amp;gt;     &amp;lt;charset&amp;gt;marc-8&amp;lt;/charset&amp;gt;     &amp;lt;search&amp;gt;       &amp;lt;querytype&amp;gt;cql&amp;lt;/querytype&amp;gt;       &amp;lt;map use=&amp;quot;4&amp;quot;&amp;gt;&amp;lt;index&amp;gt;eg.title&amp;lt;/index&amp;gt;&amp;lt;/map&amp;gt;       &amp;lt;map use=&amp;quot;7&amp;quot;&amp;gt;&amp;lt;index&amp;gt;eg.identifier&amp;lt;/index&amp;gt;&amp;lt;/map&amp;gt;       &amp;lt;map use=&amp;quot;8&amp;quot;&amp;gt;&amp;lt;index&amp;gt;eg.identifier&amp;lt;/index&amp;gt;&amp;lt;/map&amp;gt;       &amp;lt;map use=&amp;quot;9&amp;quot;&amp;gt;&amp;lt;index&amp;gt;eg.identifier&amp;lt;/index&amp;gt;&amp;lt;/map&amp;gt;       &amp;lt;map use=&amp;quot;21&amp;quot;&amp;gt;&amp;lt;index&amp;gt;eg.subject&amp;lt;/index&amp;gt;&amp;lt;/map&amp;gt;       &amp;lt;map use=&amp;quot;1003&amp;quot;&amp;gt;&amp;lt;index&amp;gt;eg.creator&amp;lt;/index&amp;gt;&amp;lt;/map&amp;gt;       &amp;lt;map use=&amp;quot;1018&amp;quot;&amp;gt;&amp;lt;index&amp;gt;eg.publisher&amp;lt;/index&amp;gt;&amp;lt;/map&amp;gt;       &amp;lt;map use=&amp;quot;1035&amp;quot;&amp;gt;&amp;lt;index&amp;gt;eg.keyword&amp;lt;/index&amp;gt;&amp;lt;/map&amp;gt;       &amp;lt;map use=&amp;quot;1016&amp;quot;&amp;gt;&amp;lt;index&amp;gt;eg.keyword&amp;lt;/index&amp;gt;&amp;lt;/map&amp;gt;     &amp;lt;/search&amp;gt;   &amp;lt;/database&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Kill your simple2zoom processes and restart simple2zoom and you should
be in heaven - farewell, false positive matches! Oh, and about that &lt;a class="reference external" href="/archives/194-SFX-target-parser-for-Evergreen-and-some-thoughts-about-searching-identifiers.html"&gt;SFX
target parser for
Evergreen&lt;/a&gt;;
now you can remove all of the gimmickry around exact searches and
worrying about ISSNs that contain an 'X' and just point at the
identifier index. For example:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
if (defined($ISSN)) {    $searchString .= &amp;quot;keyword|identifier: $ISSN&amp;quot;;  }   elsif (defined($ISBN)) {    $ISBN =~ s/-//g; # Most of our ISBNs are normalized to no hyphens    $searchString .= &amp;quot;keyword|identifier: $ISBN&amp;quot;;  }
&lt;/pre&gt;
&lt;p&gt;Things still aren't perfect in Evergreen identifier-land: we still need
to do some work to normalize hyphenation of our ISBNs, for example, and
ensure we have 10-digit &amp;amp; 13-digit ISBN equivalents. But we're a lot
closer to perfection now - and with the work that Mike Rylander is doing
in trunk, normalization of that kind should be relatively
straightforward to implement on both the indexing and query-parsing
side.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 10 Mar 2010 04:27:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2010-03-10:/more-granular-identifier-indexes-for-your-evergreen-sru-z3950-servers.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Evergreen 1.6: Z39.50 target servers for academics</title><link>https://coffeecode.net/evergreen-16-z3950-target-servers-for-academics.html</link><description>&lt;p&gt;&lt;strong&gt;UPDATE 2010-03-05&lt;/strong&gt; I just backported Warren's patch for sorting
Z39.50 servers to rel_1_6_0 (it counts as a bug fix), so expect to
see it in the Evergreen 1.6.0.4 release. Yay!&lt;/p&gt;
&lt;p&gt;In Evergreen 1.6, Z39.50 target server configuration (for
copy-cataloguing targets) moves into the database. This makes it pretty
easy for sites to share their Z39.50 target servers with one another.&lt;/p&gt;
&lt;p&gt;I recently added a number of target servers to our configuration, and
thought that other academic Evergreen sites might be interested in our
set (because we're primarily pointing at other academic libraries) -
particularly if they haven't added many of their own yet. You can find a
PostgreSQL dump of our current configuration in the ILS-Contrib
repository at
&lt;a class="reference external" href="http://svn.open-ils.org/trac/ILS-Contrib/browser/conifer/branches/rel_1_6_0/tools/config/config_z3950.sql"&gt;conifer/branches/rel_1_6_0/tools/config/config_z3950.sql&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I generated this dump of the data using the following command:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
pg_dump --data-only --table config.z3950_source --table config.z3950_attr evergreen &amp;gt; config_z3950.sql
&lt;/pre&gt;
&lt;p&gt;(where &lt;em&gt;evergreen&lt;/em&gt; is the name of the Evergreen database, naturally!).
You should be able to load the data into a clean Evergreen database via
&lt;tt class="docutils literal"&gt;psql&lt;/tt&gt; inside a transaction as follows:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
BEGIN;\i config_z3950.sqlCOMMIT;
&lt;/pre&gt;
&lt;p&gt;If you already have other Z39.50 servers in your database configuration,
you might need to adjust the ID values in the &lt;tt class="docutils literal"&gt;config.z3950_attr&lt;/tt&gt;
rows. Just prepending a &lt;tt class="docutils literal"&gt;1&lt;/tt&gt; to them ought to do the trick, unless you
have masses of Z39.50 servers. In which case, you probably don't need
ours!&lt;/p&gt;
&lt;p&gt;Oh, one final tip: when you start adding a bunch of Z39.50 target
servers, you'll notice that the order in the &lt;strong&gt;Import from Z39.50&lt;/strong&gt;
screen is random; it will drive your cataloguers crazy. Quite some time
ago, &lt;a class="reference external" href="http://thebookpile.wordpress.com/"&gt;Warren Layton&lt;/a&gt; from Natural
Resources Canada submitted a patch for sorting the servers
alphabetically that has been committed to trunk and the 1.6 branch, but
which hasn't made its way into a 1.6.0 release yet. If, at the time
you're reading this, you're on a 1.6 release but your list isn't sorted,
get &lt;a class="reference external" href="http://svn.open-ils.org/trac/ILS/browser/branches/rel_1_6/Open-ILS/xul/staff_client/server/cat/z3950.js"&gt;the
file&lt;/a&gt;
and drop it into &lt;tt class="docutils literal"&gt;/openils/var/web/xul/server/cat/z3950.js&lt;/tt&gt; - your
cataloguers will thank you. You, in turn, can thank Warren.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 05 Mar 2010 02:21:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2010-03-05:/evergreen-16-z3950-target-servers-for-academics.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Fun with Evergreen and SQL: representative record samples</title><link>https://coffeecode.net/fun-with-evergreen-and-sql-representative-record-samples.html</link><description>&lt;p&gt;Let's pretend your national library asked you to submit a set of records
with holdings representing all of the various formats in your library
system. Let's also pretend that you're really lucky and you're running
Evergreen. Here's what you would do to get one example of each
combination of item type, item form, bibliographic level, literary form,
cataloguing form, and video recording format into a scratch table for a
given library (ID = 103) in your system:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
CREATE TABLE scratchpad.osul_export (record BIGINT); INSERT INTO scratchpad.osul_export   SELECT record FROM (    SELECT DISTINCT ON (mrd.item_type, mrd.item_form, mrd.bib_level, mrd.lit_form, mrd.cat_form, mrd.vr_format)         mrd.record, mrd.item_type, mrd.item_form, mrd.bib_level, mrd.lit_form, mrd.cat_form, mrd.vr_format     FROM biblio.record_entry bre       INNER JOIN asset.call_number acn ON acn.record = bre.id       INNER JOIN asset.copy ac ON ac.call_number = acn.id      INNER JOIN metabib.rec_descriptor mrd ON mrd.record = bre.id     WHERE bre.deleted IS FALSE AND acn.deleted IS FALSE AND ac.deleted IS FALSE AND acn.owning_lib = 103    ORDER BY mrd.item_type, mrd.item_form, mrd.bib_level, mrd.lit_form, mrd.cat_form, mrd.vr_format  ) AS formats  ORDER BY record;
&lt;/pre&gt;
&lt;p&gt;And then, because you were asked to provide a total of 2000 records for
this representative sample, you might fill up the remaining 1800 records
as follows:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
INSERT INTO scratchpad.osul_export  SELECT bre.id   FROM biblio.record_entry bre    INNER JOIN asset.call_number acn ON acn.record = bre.id    INNER JOIN asset.copy ac ON ac.call_number = acn.id    INNER JOIN reporter.super_simple_record rsr ON rsr.id = bre.id  WHERE bre.deleted IS FALSE AND acn.deleted IS FALSE AND ac.deleted IS FALSE AND acn.owning_lib = 103    AND bre.id NOT IN (      SELECT record        FROM scratchpad.osul_export    ) AND substring(bre.id::text from (length(bre.id::text)) for 1)::int = 8    AND bre.id % 17 = 0  ORDER BY rsr.author DESC  LIMIT 1800;
&lt;/pre&gt;
&lt;p&gt;... which, of course, gives you the records with a record ID ending in
'8' and (to whittle it down further) records where record ID &lt;em&gt;modulo&lt;/em&gt; 17
is 0 - and finally, just the first 1800 records ordered by author name
in descending order.&lt;/p&gt;
&lt;p&gt;All of this will give you 2000 record IDs in &lt;tt class="docutils literal"&gt;scratchpad.osul_export&lt;/tt&gt;
that you can then extract into a text file and feed into Evergreen's
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Open-ILS/src/support-scripts/marc_export&lt;/span&gt;&lt;/tt&gt; script to dump the MARC
records with holdings in the 852 field from your system. Beautiful, eh?&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 04 Mar 2010 04:35:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2010-03-04:/fun-with-evergreen-and-sql-representative-record-samples.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Wrap-up: Evergreen developer workshop at OLA SuperConference 2010</title><link>https://coffeecode.net/wrap-up-evergreen-developer-workshop-at-ola-superconference-2010.html</link><description>&lt;p&gt;To summarize the results of the Evergreen developer workshop at the OLA
SuperConference, I think things went pretty well. The primary focus this
time was on the nuts and bolts of building a minimal OpenSRF service and
I saw the lights go on in a number of faces as I broke it down. Things
got a little hand-wavy in the final half-hour when I leapt into the Dojo
JavaScript widgets that have been custom-built for Evergreen interfaces
such as the administration and acquisitions functionality. In
retrospect, the first half of the session deserves its own half-day, and
the second half of the session similarly deserves its own half-day, and
something had to give this time around.&lt;/p&gt;
&lt;p&gt;I focused on getting hands-on, and for the most part I think it was a
success - although even though I had packaged up a virtual image, we
still ran into some problems getting it running on some laptops. And due
to some communications problems, about half of the participants weren't
ready for a hands-on session (read: no laptop, or a netbook that
couldn't handle a virtual image). I have real hopes that we'll see some
contributions in the next few months from some of the participants,
which would be a &lt;strong&gt;huge&lt;/strong&gt; win for Evergreen.&lt;/p&gt;
&lt;p&gt;Without any further ado, here are the materials for the session (all of
which are made available to you under a &lt;a class="reference external" href="http://creativecommons.org/licenses/by-sa/2.5/ca/"&gt;Creative Commons By
Attribution-Share-Alike Canada 2.5
license&lt;/a&gt;):&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Slides: &lt;a class="reference external" href="/uploads/talks/2010/OLA_2010_slides.odp"&gt;(OpenOffice.org
Impress)&lt;/a&gt;
&lt;a class="reference external" href="/uploads/talks/2010/OLA_2010_slides.pdf"&gt;(PDF)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Workshop tutorial:
&lt;a class="reference external" href="http://evergreen-ils.org/~denials/workshop.html"&gt;(HTML)&lt;/a&gt;
&lt;a class="reference external" href="http://evergreen-ils.org/~denials/workshop.pdf"&gt;(PDF)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;JavaScript and Perl files:
&lt;a class="reference external" href="/uploads/talks/2010/OLA_2010_files.zip"&gt;OLA_2010_files.zip&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 01 Mar 2010 23:48:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2010-03-01:/wrap-up-evergreen-developer-workshop-at-ola-superconference-2010.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>OLA SuperConference 2010 - Evergreen developer workshop update</title><link>https://coffeecode.net/ola-superconference-2010-evergreen-developer-workshop-update.html</link><description>&lt;p&gt;Hey all - if you're coming to the &lt;a class="reference external" href="/archives/211-Evergreen-developer-workshop-at-OLA-SuperConference,-February-24,-2010.html"&gt;Evergreen developer workshop at the
OLA SuperConference
2010&lt;/a&gt;,
there's one thing you can do to prepare. As this is a hands-on workshop
(how else can you learn!), I'm hoping many or most of you will have
laptops. And ideally, your laptop will have a current version of
&lt;a class="reference external" href="http://www.virtualbox.org/wiki/Downloads"&gt;VirtualBox&lt;/a&gt; or VMWare
installed on it, as I plan to bring a virtual image for the attendees to
use.&lt;/p&gt;
&lt;p&gt;I'm hoping the virtual image will sidestep the configuration hassles
people seem to run into with installing OpenSRF / Evergreen natively and
enable us to just focus on the code and architecture during the limited
time we will have together. *sniff*&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 23 Feb 2010 03:31:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2010-02-23:/ola-superconference-2010-evergreen-developer-workshop-update.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Introduction to SQL for Evergreen administrators</title><link>https://coffeecode.net/introduction-to-sql-for-evergreen-administrators.html</link><description>&lt;p&gt;I've been a bit quiet for the last two weeks, ostensibly because I've
been on vacation. However, much of the time I was preparing to deliver a
two-day introduction to SQL for Evergreen to the good people at
&lt;a class="reference external" href="http://www.biblio.org/"&gt;Bibliomation&lt;/a&gt;. On Wednesday I flew down to
Middlebury, CT - Bibliomation central - and on Thursday and Friday of
this week, I led nine great people* through the ropes of SQL: from
understanding the basics of how SQL databases operate all the way
through inner and outer joins and set operations. I also walked though a
set of SQL queries I had developed to help Bibliomation with the
recurring reports they need to provide to their member libraries.&lt;/p&gt;
&lt;p&gt;Other than an episode of grievous illness on Thursday night that led to
zero food intake and very little sleep on my part, I think things went
well; it was gratifying to see lights go on in people's heads as we
worked through hands-on exercises and tackled the same problem with
different (but valid) approaches, and (with a few minor adjustments) the
canned SQL queries seemed to meet their requirements. The feedback I
received was positive, and by the time I left I had the sense that they
had significantly increased their confidence in their ability to
understand the queries I had written for them and to create their own
queries. The major remaining learning curve is understanding how all of
the pieces of the Evergreen database schema fit together, and through
the two days I had tried to bring together pieces like the user tables,
the library tables, the circulation and holds tables, and the record /
call number / copy tables to help them find the right tables to bring
together to meet their needs.&lt;/p&gt;
&lt;p&gt;I am happy to say that Bibliomation agreed to my condition that I be
allowed to release the materials for this workshop under a CC-BY-SA
license, so others can take these materials, adapt or enhance them, and
deliver similar training to other Evergreen libraries (as long as the
attribution remains and the materials are offered under the same
share-alike license). Many thanks to Bibliomation for this contribution
to the community! Without further ado, here are the materials:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Reference documentation (25-ish pages introducing SQL, ending with
the canned SQL queries Bibliomation required):
&lt;a class="reference external" href="http://bzr.coffeecode.net/intro_to_sql/introduction_to_sql.html"&gt;(HTML)&lt;/a&gt;
&lt;a class="reference external" href="/uploads/files/introduction_to_sql.pdf"&gt;(PDF)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Presentation: &lt;a class="reference external" href="/uploads/files/SQL_instruction.odp"&gt;(OpenOffice.org
Impress)&lt;/a&gt;
&lt;a class="reference external" href="/uploads/files/SQL_instruction.pdf"&gt;(PDF)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;* Including people like Kate Sheehan, Melissa Lefebvre, and Benjamin
Shum who I previously only knew from the Evergreen mailing lists and
other online presences&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sat, 20 Feb 2010 10:16:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2010-02-20:/introduction-to-sql-for-evergreen-administrators.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Evergreen developer workshop at OLA SuperConference, February 24, 2010</title><link>https://coffeecode.net/evergreen-developer-workshop-at-ola-superconference-february-24-2010.html</link><description>&lt;p&gt;Given the &lt;a class="reference external" href="/archives/210-Conifer-garners-two-awards-from-the-Ontario-Library-Association.html"&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 class="reference external" href="http://www.accessola.com/superconference2010/showSession.php?lsession=8&amp;amp;usession=8"&gt;Customizing and
Extending Evergreen: a guide for
geeks&lt;/a&gt;
workshop that I'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'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's a hefty agenda for a half-day workshop, but I promise to do my
best to deliver on that promise... &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 28 Jan 2010 20:45:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2010-01-28:/evergreen-developer-workshop-at-ola-superconference-february-24-2010.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Conifer garners two awards from the Ontario Library Association</title><link>https://coffeecode.net/conifer-garners-two-awards-from-the-ontario-library-association.html</link><description>&lt;p&gt;The Ontario Library Association (OLA) announced its &lt;a class="reference external" href="http://www.accessola3.com/index.php?app=blog&amp;amp;module=display&amp;amp;section=blog&amp;amp;blogid=9&amp;amp;showentry=681"&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 class="arabic simple"&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 class="reference external" href="http://evergreen-ils.org"&gt;Evergreen&lt;/a&gt; library system &lt;a class="reference external" href="/archives/191-Conifer-lives-Ontario-launches-a-consortial-academic-library-system-built-on-Evergreen.html"&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'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'm delighted that they're
being recognized for their efforts.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 28 Jan 2010 20:28:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2010-01-28:/conifer-garners-two-awards-from-the-ontario-library-association.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>In which I perceive that gossip is not science</title><link>https://coffeecode.net/in-which-i-perceive-that-gossip-is-not-science.html</link><description>&lt;p&gt;Marshall Breeding published the results of his 2009 &lt;a class="reference external" href="http://www.librarytechnology.org/perceptions2009.pl"&gt;International
Survey of Library
Automation&lt;/a&gt; a
few days ago. Juicy stuff, with averages, medians, and modes for the
negative/positive responses on a variety of ILS and vendor-related
questions, and some written comments from the respondents. One would
expect the library geek blog niche to light up with reaction to the
revelations contained in the data.&lt;/p&gt;
&lt;p&gt;Except: there were 2,098 total responses to the survey, with 1,633 from
the United States &lt;a class="reference external" href="#cite1"&gt;[1]&lt;/a&gt;. Responses were limited to a single
response per library. The ALA estimates there are 122,356 libraries in
the United States &lt;a class="reference external" href="#cite2"&gt;[2]&lt;/a&gt;. So, slightly more than 1% of the
libraries in the United States are represented in this survey. Which, if
it was a truly random sampling, might be enough to derive some validity
from the results. But these survey responders? They're self-selected,
therefore more likely to either have an axe to grind or a selection
decision to defend. And the perspective of the responder on which these
perceptions have been based, and in turn on which Breeding has drawn his
observations, may over-represent one aspect of the system. If a
circulation clerk responds, they may base their responses primarily on
the speed and ease with which they can handle typical circulation tasks,
while ignoring the experience of the patron using search and self-serve
account interfaces; or a cataloguer may focus on the ease of copy
cataloguing but gloss over the system's integration with authentication
and financial systems, etc.&lt;/p&gt;
&lt;p&gt;In my opinion, the survey's methodology makes its results more akin to
gossip than science, and Breeding himself recognizes the lack of
validity of his effort. After summarizing all of the findings, making
some observations about open source and companies, and providing an
overview of his methodology, he issues a caveat at the very end of all
of this that effectively admits that the survey is worthless: &amp;quot;one
should not read too much into the survey results.&amp;quot;&lt;/p&gt;
&lt;p&gt;If that's the case, then why even bother issuing this flawed,
unscientific survey and publishing its results? A rigorous comparison of
library systems that employs both quantitative and qualitative aspects
in the assessments would be a useful contribution to the library world.
This survey, however, deserves a swift trip to the round file.&lt;/p&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;` &amp;lt;&amp;gt;`__&lt;a class="reference external" href="http://www.librarytechnology.org/perceptions2009.pl"&gt;Perceptions 2009: An International Survey of Library
Automation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;` &amp;lt;&amp;gt;`__&lt;a class="reference external" href="http://www.ala.org/ala/aboutala/offices/library/libraryfactsheet/alalibraryfactsheet1.cfm"&gt;ALA Library Fact Sheet
1&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sun, 24 Jan 2010 21:48:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2010-01-24:/in-which-i-perceive-that-gossip-is-not-science.html</guid><category>misc</category><category>Coding</category></item><item><title>PKG_CHECK_MODULES syntax error near unexpected token 'DEPS,'</title><link>https://coffeecode.net/pkg_check_modules-syntax-error-near-unexpected-token-deps.html</link><description>&lt;p&gt;The next time you bash your brains against autotools for a while
wondering why your perfectly good &lt;tt class="docutils literal"&gt;PKG_CHECK_MODULES()&lt;/tt&gt; macro, as cut
and paste directly from the recommended &lt;tt class="docutils literal"&gt;configure.ac&lt;/tt&gt; entry for the
package you're trying to integrate (in this case
&lt;a class="reference external" href="http://docs.tangent.org/libmemcached/memcached.html"&gt;libmemcached&lt;/a&gt;),
and you get the error message
&lt;tt class="docutils literal"&gt;PKG_CHECK_MODULES syntax error near unexpected token 'DEPS,'&lt;/tt&gt; on one
system and not on another, it's probably because you're missing the
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;pkg-config&lt;/span&gt;&lt;/tt&gt; package on the failing system.&lt;/p&gt;
&lt;p&gt;It would be nice if the error message gave you a clue, but it doesn't
and probably can't, because the macro simply doesn't exist until the
package is installed. So I'm telling you. Go forth and code now that
that irritation is gone.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 09 Dec 2009 22:35:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2009-12-09:/pkg_check_modules-syntax-error-near-unexpected-token-deps.html</guid><category>misc</category><category>Coding</category></item><item><title>MARC library for C# coders</title><link>https://coffeecode.net/marc-library-for-c-coders.html</link><description>&lt;p&gt;C# isn't in my go-to list of programming languages, but I can understand
why others would be interested in developing applications in C#. So it's
good news to the C# community of library developers (it would be
interesting to find out how many of you are out there) that there is now
a library available for parsing and manipulating MARC records for the C#
language. From the &lt;a class="reference external" href="http://sourceforge.net/projects/csharpmarc/"&gt;CSharp
MARC&lt;/a&gt; homepage:&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;p&gt;C# class structures for reading and manipulating Library of Congress
MARC records using the MARC21 standard. Based upon the PHP Pear
package File_MARC (&lt;a class="reference external" href="http://pear.php.net/package/File_MARC"&gt;http://pear.php.net/package/File_MARC&lt;/a&gt;) by Dan
Scott&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;Congratulations to Matt Schraeder on the release and good luck with
MARC! And thanks for the shout-out, that was very kind of you.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 09 Dec 2009 19:30:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2009-12-09:/marc-library-for-c-coders.html</guid><category>Libraries</category><category>Coding</category></item><item><title>Doing useful things with periodical holdings, part 2: comparing with print holdings in Evergreen</title><link>https://coffeecode.net/doing-useful-things-with-periodical-holdings-part-2-comparing-with-print-holdings-in-evergreen.html</link><description>&lt;div class="section" id="doing-interesting-things-with-evergreen-serials-data"&gt;
&lt;h2&gt;Doing interesting things with Evergreen serials data&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Update: 2010-05-31&lt;/strong&gt; Running through the process again, I found a few
typos in the &lt;tt class="docutils literal"&gt;pg_dump&lt;/tt&gt; commands, so I fixed those up.&lt;/p&gt;
&lt;p&gt;I'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 class="reference external" href="/archives/205-Doing-useful-things-with-the-TXT-dump-of-SFX-holdings,-part-1-database.html"&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'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'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't like mixing these more experimental
projects with our production system - so we'll work with the a database
named &lt;strong&gt;periodicals&lt;/strong&gt; instead.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
pg_dump --no-owner --schema-only --table biblio.record_entry \    --table serial.record_entry evergreen &amp;gt; bre_sre_schema.dump
&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't exist in this limited subset of data. Then
create the schema in our periodicals holdings database:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
psql -f bre_sre_schema.ddl -d periodicals
&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 class="literal-block"&gt;
pg_dump --no-owner --data-only --table biblio.record_entry \    --table serial.record_entry evergreen \    &amp;gt; bre_sre_data.ddl
&lt;/pre&gt;
&lt;p&gt;Okay, now you can load the data into your serials holdings database:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
psql -f bre_sre_data.dump -d periodicals
&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're doing.&lt;/p&gt;
&lt;p&gt;For some reason, I opted to play with PostgreSQL'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 class="literal-block"&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 class="docutils literal"&gt;holdings.conifer&lt;/tt&gt; table. We
use the &lt;tt class="docutils literal"&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 class="docutils literal"&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;/p&gt;
&lt;pre class="literal-block"&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('//*[local-name()=&amp;quot;datafield&amp;quot;][&amp;#64;tag=&amp;quot;022&amp;quot;]' ||            '/*[local-name()=&amp;quot;subfield&amp;quot;][&amp;#64;code=&amp;quot;a&amp;quot;]/text()', 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'll populate the call number based on the 852 field in the serial
record. We could pull this from the &lt;tt class="docutils literal"&gt;asset.call_number&lt;/tt&gt; table, but
this will be good enough for the first pass.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
UPDATE holdings.conifer     SET call_number = UNNEST(      XPATH(        '//*[local-name()=&amp;quot;datafield&amp;quot;][&amp;#64;tag=&amp;quot;852&amp;quot;]/' ||            '*[local-name()=&amp;quot;subfield&amp;quot;][&amp;#64;code=&amp;quot;h&amp;quot;]/text()',         (            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 class="docutils literal"&gt;&lt;span class="pre"&gt;Open-ILS/src/perlmods/OpenILS/Utils/MFHD/*&lt;/span&gt;&lt;/tt&gt; to
&lt;tt class="docutils literal"&gt;/usr/local/share/perl/5.10.0&lt;/tt&gt; and edit the occurrences of
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;OpenILS::Utils::MFHD::*&lt;/span&gt;&lt;/tt&gt; to *.&lt;/p&gt;
&lt;pre class="literal-block"&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-&amp;gt;new_from_xml( $xml );    my $mfhd = MFHD-&amp;gt;new($marc);    foreach my $field ($marc-&amp;gt;field('866')) {        my $holdings = $field-&amp;gt;subfield('a');        if ($holdings) {            my $public_note = $field-&amp;gt;subfield('z');            if ($public_note) {                $text .= &amp;quot;$holdings - $public_note&amp;quot;;            } else {                $text .= &amp;quot;$holdings&amp;quot;;            }        }    }    foreach my $cap_id ($mfhd-&amp;gt;captions('853')) {        my &amp;#64;curr_holdings = $mfhd-&amp;gt;holdings('863', $cap_id);        next unless scalar &amp;#64;curr_holdings;        foreach (&amp;#64;curr_holdings) {            if ($captions) {                $captions .= ', ';            }            $captions .= $_-&amp;gt;format();        }    }    if ($text and $captions) {        $text = &amp;quot;$text / $captions&amp;quot;;    } else {        $text = &amp;quot;$text$captions&amp;quot;;    }    return $text;$_$ LANGUAGE PLPERLU;
&lt;/pre&gt;
&lt;p&gt;And update the table:&lt;/p&gt;
&lt;pre class="literal-block"&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'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 class="literal-block"&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 := '';        -- RAISE NOTICE 'marc_record = %', 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 'r.marc = %', r.marc;        END LOOP;        -- RAISE NOTICE 'coverage = %', coverage;        RETURN coverage;    END$$ LANGUAGE 'plpgsql';
&lt;/pre&gt;
&lt;p&gt;And we'll use this fancy new function to update the print holdings
statements again with the more complete coverage:&lt;/p&gt;
&lt;pre class="literal-block"&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 class="literal-block"&gt;
-- Set the display to expanded format for easy reading\x-- Basic report for perusalSELECT hsfx.issn AS &amp;quot;ISSN&amp;quot;, hsfx.title AS &amp;quot;Title&amp;quot;,        hsfx.collection AS &amp;quot;SFX Collection&amp;quot;,        hsfx.coverage AS &amp;quot;Electronic Coverage&amp;quot;,        hc.coverage AS &amp;quot;Print Coverage&amp;quot;, hc.call_number AS &amp;quot;Call Number&amp;quot;    FROM holdings.sfx hsfx        INNER JOIN holdings.conifer hc ON hsfx.issn = hc.issn    WHERE (hsfx.collection ILIKE '%JStor%' OR hsfx.collection LIKE '%Scholars%')        AND hc.coverage &amp;gt; ''    LIMIT 5;
&lt;/pre&gt;
&lt;p&gt;That results in:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
-[ RECORD 1 ]-------+--------------------------------------------------------------------------ISSN                | 0142-2774Title               | Journal of Occupational BehaviorSFX Collection      | JSTOR Arts and Sciences 4Electronic 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-6261Title               | The Rand Journal of EconomicsSFX Collection      | JSTOR Arts and Sciences 2Electronic Coverage | Available from 1984 until 2006. Print Coverage      | V.17 (1986) - v.23 (1992)Call Number         | DESM-PER-[ RECORD 3 ]-------+--------------------------------------------------------------------------ISSN                | 0002-8614Title               | Journal of the American Geriatrics SocietySFX Collection      | Scholars PortalElectronic 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-7639Title               | Land EconomicsSFX Collection      | JSTOR Arts and Sciences 7Electronic Coverage | Available from 1948 until 2005. Print Coverage      | v.62 (1986) - v.68 (1992)Call Number         | DESM-PER-[ RECORD 5 ]-------+--------------------------------------------------------------------------ISSN                | 0090-2616Title               | Organizational dynamicsSFX Collection      | Scholars PortalElectronic 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'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 class="literal-block"&gt;
-- Set delimiter to TAB (CTRL-V )\f '^V'-- Set the output to being unaligned\a-- Dump the output to a file\o /tmp/periodicals.tsv-- Generate URLs for quick catalogue lookupsSELECT 'http://laurentian.concat.ca/opac/en-CA/skin/lul/xml/rdetail.xml?r='             || hc.record || '&amp;amp;l=105&amp;amp;d=1' AS &amp;quot;URL&amp;quot;,        hsfx.issn AS &amp;quot;ISSN&amp;quot;, hsfx.title AS &amp;quot;Title&amp;quot;,        hsfx.collection AS &amp;quot;SFX Collection&amp;quot;,        hsfx.coverage AS &amp;quot;Electronic Coverage&amp;quot;, hc.coverage AS &amp;quot;Print Coverage&amp;quot;,        hc.call_number AS &amp;quot;Call Number&amp;quot;    FROM holdings.sfx_complete hsfx        INNER JOIN holdings.conifer hc ON hsfx.issn = hc.issn    WHERE (hsfx.collection ILIKE '%JStor%' OR hsfx.collection LIKE '%Scholars%')        AND hc.coverage &amp;gt; '';
&lt;/pre&gt;
&lt;p&gt;And that's it. It might seem complex, but I'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 class="docutils literal"&gt;serial.bib_summary&lt;/tt&gt; tables using an INSERT/UPDATE/DELETE trigger on
&lt;tt class="docutils literal"&gt;serial.record_entry&lt;/tt&gt; so that we don't have to generate the summaries
for every item details request in the catalogue.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 17 Nov 2009 17:05:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2009-11-17:/doing-useful-things-with-periodical-holdings-part-2-comparing-with-print-holdings-in-evergreen.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Doing useful things with the TXT dump of SFX holdings, part 1: database</title><link>https://coffeecode.net/doing-useful-things-with-the-txt-dump-of-sfx-holdings-part-1-database.html</link><description>&lt;p&gt;There must be other people who have much more intelligent things than me
with the TXT dump of SFX holdings that you can generate via the Web
administration interface, but as I've gone through this process at least
twice and rediscovered it each time, perhaps I'll save myself an hour or
two by writing this down. Maybe it will save you a bit of time, too. Or
give you an idea of a day in the life of a systems librarian. In part 1,
I turn the TXT dump into something that I can load back into a local
database. Maybe I want to massage the data, write arbitrary SQL queries,
join it against data that I load into other tables in the database...
I'll talk about that in a subsequent post. For now, let's get munging!&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p class="first"&gt;First, I load the raw TXT file into a text editor (gvim, of course)
and munge all of the lines so that they are ready to bulk load into
my local database. That local database is PostgreSQL, so these
commands will be vim-and-PostgreSQL specific, but you should be able
to adapt this to whatever your target may be. Note the duplication of
the first command is intentional!&lt;/p&gt;
&lt;/p&gt;&lt;pre class="literal-block"&gt;
:%s/^I^I/^I\\N^I/g:%s/^I^I/^I\\N^I/g:%s/^I$/^I\\N/
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Then I prepend the DDL required to create the holdings table and copy
the data into the newly created holdings table to the top of the TXT
file:&lt;/p&gt;
&lt;/p&gt;&lt;pre class="literal-block"&gt;
-- I don't want a huge scrolling list of errors if there's something wrong in the dataSET ON_ERROR_STOP = 1;-- I typically get something wrong the first time, so this avoids having to manually-- drop and re-rcreate the schema the second and subsequent timesDROP SCHEMA IF EXISTS holdings CASCADE;-- This is PostgreSQL, so we can use schemas. Yay!CREATE SCHEMA holdings;-- Note that I have no idea what many of these fields are, and frankly don't careCREATE TABLE holdings.sfx (title_key TEXT, title TEXT, misc1 TEXT, issn TEXT,     ejournal_id TEXT, collection TEXT, coverage TEXT, eissn TEXT, complete_title TEXT,     target TEXT, misc2 TEXT, misc3 TEXT, misc4 TEXT, misc5 TEXT, misc6 TEXT,     misc7 TEXT, misc8 TEXT, target_parser TEXT, target_id BIGINT, service_id BIGINT,     misc_id BIGINT, category TEXT, misc9 TEXT, misc10 TEXT, misc11 TEXT,     publisher TEXT, pub_place TEXT, pub_date TEXT, item_type TEXT, active TEXT,     misc12 TEXT, misc13 TEXT, misc14 TEXT, language TEXT, title2 TEXT, misc15 TEXT);-- The COPY command bulk-loads the data from the subsequent lines into the tableCOPY holdings.sfx (title_key, title, misc1, issn, ejournal_id, collection, coverage, eissn,     complete_title, target, misc2, misc3, misc4, misc5, misc6, misc7, misc8, target_parser,     target_id, service_id, misc_id, category, misc9, misc10, misc11, publisher, pub_place,     pub_date, item_type, active, misc12, misc13, misc14, language, title2, misc15) FROM STDIN;-- All of the TXT data follows
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Now I can load this into my database, where &amp;quot;datafile.txt&amp;quot; is the
munged TXT dump, and &amp;quot;holdings&amp;quot; is the name of the database:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
psql -f datafile.txt -d holdings
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Assuming that all went well, I can connect to the database and create
a few indexes that will probably be useful while doing queries.&lt;/p&gt;
&lt;/p&gt;&lt;pre class="literal-block"&gt;
-- Create indexes on the ISSN and E-ISSNCREATE INDEX holdings_sfx_issn_idx ON holdings.sfx(issn);CREATE INDEX holdings_sfx_eissn_idx ON holdings.sfx(eissn);-- Create index on the collection, because we'll limit some queries on this basisCREATE INDEX holdings_sfx_collection_idx ON holdings.sfx(collection);-- Update the statistics on the tableANALYZE;
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now I'm ready to load data from another source - say, from my ILS that
includes print holdings - so that I can start matching on ISSN and
identify candidates for pruning our print collection based on criteria
such as the electronic collection. Perhaps I'll talk about that in part
2...&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 10 Nov 2009 16:17:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2009-11-10:/doing-useful-things-with-the-txt-dump-of-sfx-holdings-part-1-database.html</guid><category>Libraries</category><category>Coding</category></item><item><title>FSOSS 2009: Project Conifer update</title><link>https://coffeecode.net/fsoss-2009-project-conifer-update.html</link><description>&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 class="reference external" href="http://www.archive.org/details/DanScottpresentationEvergreeninOntarioMigratingAcademicLibraries"&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 class="reference external" href="http://fsoss.ca"&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 class="reference external" href="/archives/170-Evergreen-deOSSification-of-library-software.html"&gt;last year'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 class="reference external" href="/archives/201-Presentation-at-the-Lyrasis-Open-Source-in-Your-Library-conference.html"&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 class="reference external" href="/uploads/talks/2009/FSOSS_Conifer_update.odp"&gt;(ODP)&lt;/a&gt;
and
&lt;a class="reference external" href="/uploads/talks/2009/FSOSS_Conifer_update.pdf"&gt;(PDF)&lt;/a&gt;
format. The speaker notes on the slides will give you the meat of the
content.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 10 Nov 2009 04:00:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2009-11-10:/fsoss-2009-project-conifer-update.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Changing the default run level in Ubuntu 9.10 Karmic Koala</title><link>https://coffeecode.net/changing-the-default-run-level-in-ubuntu-910-karmic-koala.html</link><description>&lt;p&gt;Dear Dan:&lt;/p&gt;
&lt;p&gt;You felt pretty pleased with yourself for jumping on the latest
&lt;a class="reference external" href="http://ubuntu.com"&gt;Ubuntu&lt;/a&gt; release back in the alpha stages on your
virtual machine, then having it running on your laptop and Lynn's Asus
EEE 701 the day after the final release came out.&lt;/p&gt;
&lt;p&gt;But did you ever have to change the default runlevel? NO, you didn't.
You didn't anticipate that you would want to convert that alpha-6 server
into a workstation. Nice thinking, hero. And now that you've figured it
out, you're going to remind yourself that the place to change it is in
&lt;strong&gt;/etc/init/rc-sysinit.conf&lt;/strong&gt;. You might want to look at the &lt;strong&gt;env
DEFAULT_RUNLEVEL&lt;/strong&gt; setting. Oh sure, you could manually create an
old-school &lt;strong&gt;/etc/inittab&lt;/strong&gt; file, and it would get picked up from there.
But, you know, throwing away a grand old tradition like that really
feels liberating, doesn't it?&lt;/p&gt;
&lt;p&gt;So now you know. Don't forget, okay? But if you do, you might just find
yourself coming back here.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 06 Nov 2009 19:06:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2009-11-06:/changing-the-default-run-level-in-ubuntu-910-karmic-koala.html</guid><category>misc</category><category>FSOSS</category></item><item><title>Evergreen development workshop at FSOSS 2009</title><link>https://coffeecode.net/evergreen-development-workshop-at-fsoss-2009.html</link><description>&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 class="reference external" href="http://www.archive.org/details/EvergreenDeveloperSeries-Fsoss2009%20"&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 class="reference external" href="http://markmail.org/message/4ntfbshzhhmjn2tw"&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 class="reference external" href="http://fsoss.ca"&gt;Free Software Open Source Symposium&lt;/a&gt;. I had
promised Nick Ruest from McMaster that it wouldn'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't suprised to see them
leave once we hit more library-centric content &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&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 class="reference external" href="http://evergreen-ils.org/dokuwiki/doku.php?id=server:1.6.0:install"&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 class="reference external" href="http://evergreen-ils.org/~denials/workshop.html"&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 class="reference external" href="http://evergreen-ils.org/~denials/workshop.tar.gz"&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'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'm
betting that my fellow Evergreen developers will suggest improvements to
the materials. Note that I'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'll
incorporate the feedback that I'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 &lt;a class="reference external" href="mailto:dan&amp;#64;coffeecode.net"&gt;dan&amp;#64;coffeecode.net&lt;/a&gt;). It would be great to
see other people take these materials and improve and deliver them as
well - they're under a CC-BY-SA license - so if there's interest, I'll
be happy to check them into a public source repository (hmm, maybe a bzr
branch at the &lt;a class="reference external" href="http://code.launchpad.net/evergreen"&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;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 30 Oct 2009 17:24:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2009-10-30:/evergreen-development-workshop-at-fsoss-2009.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Presentation at the Lyrasis "Open Source in Your Library" conference</title><link>https://coffeecode.net/presentation-at-the-lyrasis-open-source-in-your-library-conference.html</link><description>&lt;p&gt;On Friday, October, 9th, I had the pleasure of (along with Joe Lucia and
Karen Coombs) speaking at the Lyrasis &amp;quot;Open Source in Your Library&amp;quot;
conference at the Olin College of Engineering in Needham, MA. First, a
note about Olin College - it is a very modern campus that makes an
excellent venue for a single-track conference (New England
#code4libber's take note!). Second, this had originally been a NELINET
conference, but as of last week NELINET had merged with Lyrasis to
create a regional library non-profit organization that spans most of the
East Coast of the United States.&lt;/p&gt;
&lt;p&gt;My presentation slides (with copious speaker notes) are available in
&lt;a class="reference external" href="/uploads/talks/2009/NELINET_2009_Developing.odp"&gt;OpenOffice.org
Impress&lt;/a&gt;,
&lt;a class="reference external" href="/uploads/talks/2009/NELINET_2009_Developing.pdf"&gt;PDF&lt;/a&gt;,
and &lt;a class="reference external" href="/uploads/talks/2009/NELINET_2009_Developing.ppt"&gt;PowerPoint
format&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I had been asked to talk about Conifer's experiences implementing
Evergreen, as there is certainly some interest on the part of Lyrasis
member organizations in open source library systems. I chose to tell the
unvarnished story of Conifer: how we decided to build a consortial
academic library system on Evergreen, what steps we have taken in the
past two years, and probably more importantly what missteps we have
taken over the past two years. I told some cautionary tales that were
hopefully useful to others considering the same path, and then discussed
the state of the Evergreen community.&lt;/p&gt;
&lt;p&gt;As a quick recap, the biggest challenges we hit on the road to adopting
Evergreen were:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Finding skilled developer resources that could commit time to help us
develop solutions for some of our requirements was challenging, even
when we did have financial resources.&lt;/li&gt;
&lt;li&gt;Our largest founding partner withdrew from the project months before
we were set to go live.&lt;/li&gt;
&lt;li&gt;Due to the effects of the recession on provincial and therefore
university finances, and the increased burden on the remaining
Conifer partners for the shared costs that weren't reduced after the
partner's withdrawal, our collective budget was slashed and we ended
up having to pay opportunity costs by focusing on migrating our own
data rather than outsourcing that role and focusing several months of
effort on development.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I noted that our efforts to build a reserves system
(&lt;a class="reference external" href="http://svn.open-ils.org/trac/ILS-Contrib/wiki/SyrupReserves"&gt;Syrup&lt;/a&gt;)
have thus far resulted in a loosely coupled reserves system that none of
us have been able to use - but that for the time being Evergreen's
bookbags have served as a reasonable replacement for lists of
monographic reserve items, and that the discussion about how to more
tightly couple Syrup with Evergreen has resumed (and is currently
waiting on me for a response)... so there's hope that we might be able
to deploy the all-singing, all-dancing reserves system next term.&lt;/p&gt;
&lt;p&gt;I confessed that we're using spreadsheets to track acquisitions while
Evergreen's native acquisitions system solidifies (although, given the
current state of our budget, spreadsheets are all that we need for the
time being - sigh). Joe Lucia had remarked during his own presentation
that an acquisitions system that can handle the rather complex
requirements of academic institutions was a showstopper for his library.
In the Evergreen 1.6 release, you can see that the acquisitions system
is almost ready; we loaded six years of historical acquisitions data
into a test server and were able to do most of what we need, subject to
some refinements. I think it has been an extremely challenging balancing
act for Bill Erickson to juggle the requirements of academic libraries
with those of large consortial public library systems to come up with
something that can make everyone happy (as happy as you can possibly be
with acquisitions), but the progress over the summer has been
encouraging.&lt;/p&gt;
&lt;p&gt;On a more positive note, one of the great advantages of adopting a
consortial library system is that I was able to take two months of
parental leave and not worry about the state of the system at all. We
have shared responsibilities across the consortial partners, such that I
can actually turn off my cell phone when it's not my turn to respond to
problem reports. And during my absence, my colleagues (Art Rhyno, Robin
Isard, Kevin Beswick) all gained a lot of confidence in their own
understanding of the system. This shared responsibility should also pay
dividends when we put together processes for reporting records to our
various consortial catalogues (such as AMICUS): rather than each of us
having to rediscover the process on our own, we can collaborate and
improve upon each other's work. It's a lot less lonelier being a systems
librarian in a consortial library system, let me tell you!&lt;/p&gt;
&lt;p&gt;I also shared our positive experiences with Evergreen's uptime and with
&lt;a class="reference external" href="http://esilibrary.com"&gt;Equinox&lt;/a&gt; as a support provider. The few times
that we have had outages, they have been relatively brief and when we
have opened a problem ticket with Equinox, they have responded quickly.
Robin measured our uptime over the last two months at 99.5% - which
isn't five nines, but is still far better than the 75% (maximum) that we
had with our previous system due to the six hours it was down every
night for backups. We also chalk up some of the downtime so far to
learning experiences; we're refining the configuration of the system and
improving our own knowledge of how to maintain the system without
incurring an outage. So, I expect that we'll eke our way back up over
the next few months to an even better uptime percentage.&lt;/p&gt;
&lt;p&gt;On the topic of the Evergreen community, I compared several
commonly-used objective measures of the health of a given open source
community, such as mailing list volume, number of contributors and
contributing organizations, and release frequency with Evergreen's track
record. We're doing reasonably well on the mailing list front, and we've
seen a small increase in the number of patch contributors, but I think
we need to make the on-ramp to Evergreen development slightly easier to
ascend. This is why I'm trying to create a set of tutorials for new
developers, starting with basic OpenSRF, extending through database
access methods such as open-ils.cstore and open-ils.pcrud, rounding off
with the IDL-aware custom Dojo widgets that Bill Erickson has put
together, and perhaps giving people enough XUL to know how to add a new
menu entry to the staff client. (I really can't tackle XUL, too, in just
one half-day workshop!) If our community has a broader set of developers
capable of contributing to the project, then we can expect to see more
customization and extensions available - and possibly more committers.&lt;/p&gt;
&lt;p&gt;On the release front, I got a rueful laugh from the audience when I said
that the Evergreen 1.6 release was expected within a few days - &amp;quot;just
like we [the developers] said at the Evergreen International
Conference&amp;quot;. I acknowledged that we've had trouble getting high quality
releases out the door - that it took months, and five point releases,
before the 1.4 release was really usable out of the box, and that it had
taken even longer to get 1.6 out for a release. But I also promised that
we (the core committers) had been discussing ways that we can improve
the release process; for example, Mike Rylander had committed resources
from Equinox to help build a suite of regression tests so that we could
have automated nightly builds with known pass/fail rates, and on the
mailing list we had been discussing different approaches to bug-tracking
and development (including the possibility of using distributed version
control systems to do feature development in branches instead of trunk).&lt;/p&gt;
&lt;p&gt;On the state of the community, I applauded the Evergreen Documentation
Interest Group (DIG) for leading the charge in taking a team-based
approach to tackling a problem. I pointed to this as a sign the
community was maturing beyond its origins of a core set of contributors
who did everything from maintaining servers to creating Web site content
to development, to a set of more focused teams that would be able to
achieve more through close collaboration on their objectives. We're
seeing that in discussions about a Quality Assurance (QA) team, as well,
that would be responsible for tracking and verifying bugs in a public
repository and (probably) enhancing the tests that let us measure the
quality of the project code at any given time. I can imagine other
possible teams charged with Web site design and content maintenance,
perhaps as a more focused spin-off of the DIG; an internationalization
team, focused on enabling translations and managing contributed
translations; and an infrastructure team responsible for maintaining the
health of the project servers.&lt;/p&gt;
&lt;p&gt;Speaking of the community, this is probably a good time to suggest &lt;a class="reference external" href="http://www.artofcommunityonline.org/2009/09/18/the-art-of-community-now-available-for-free-download/"&gt;The
Art of
Community&lt;/a&gt;
by Jono Bacon (Ubuntu Community Manager) as an excellent read - at least
based on the first half of the book that I've managed to get through
during my travels.&lt;/p&gt;
&lt;p&gt;So, with that, I head back home (thanks &lt;a class="reference external" href="http://bpl.org"&gt;Boston Public
Library&lt;/a&gt; for the free wifi). We have challenges to
tackle in both Project Conifer and in the growth of the Evergreen
community, but knowing the people involved in both of these efforts, I'm
confident that we're going to make a huge amount of progress over the
next few months.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sat, 10 Oct 2009 17:34:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2009-10-10:/presentation-at-the-lyrasis-open-source-in-your-library-conference.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Using nginx to serve static content with Evergreen</title><link>https://coffeecode.net/using-nginx-to-serve-static-content-with-evergreen.html</link><description>&lt;p&gt;&lt;strong&gt;Update 2009-10-04&lt;/strong&gt; Added a title to the post; oops!&lt;/p&gt;
&lt;p&gt;A long time ago, when I discovered that Evergreen was chewing up and
spitting out Apache backends at a furious pace because Apache was being
used to serve up static content like CSS, JavaScript, and image files, I
&lt;a class="reference external" href="http://markmail.org/message/ndzjweq4luenjvzj"&gt;suggested&lt;/a&gt; that using
&lt;a class="reference external" href="http://nginx.org/"&gt;nginx&lt;/a&gt; to serve up the static content and
proxying the dynamic requests to Apache would be a good solution to a
number of problems we were facing. Here we are, five months later, and
I've managed to put in a few hours tonight (amidst stomach-wrenching
laughter at SNL's &amp;quot;Threw it on the ground&amp;quot; tune) to get a proof of
concept configuration working on the Ubuntu 9.10 beta release.&lt;/p&gt;
&lt;p&gt;The following nginx configuration hasn't been tested in a production
environment yet, and isn't tuned beyond the defaults that ship with
Ubuntu Karmic, but it works on my laptop in a virtual image for both
regular HTTP and SSL requests - so what could possibly go wrong?&lt;/p&gt;
&lt;p&gt;Steps to get this working on Ubuntu Karmic, assuming that nginx and
Apache are running on the same server:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Install nginx: &lt;tt class="docutils literal"&gt;sudo aptitude install nginx&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;Copy the &lt;a class="reference external" href="http://evergreen-ils.org/dokuwiki/doku.php?id=server_installation:nginx_proxy"&gt;configuration
file&lt;/a&gt;,
changing &amp;quot;192.168.69.107&amp;quot; to match your server's IP address or host
name, into a file called &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;/etc/nginx/sites-available/evergreen&lt;/span&gt;&lt;/tt&gt; and
create a symbolic link to the file at
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;/etc/nginx/sites-enabled/evergreen&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;Modify &lt;tt class="docutils literal"&gt;/etc/apache2/ports.conf&lt;/tt&gt; to change port 80 to 9080 and port
443 to 9443.&lt;/li&gt;
&lt;li&gt;Modify &lt;tt class="docutils literal"&gt;/etc/apache2/eg_vhost.conf&lt;/tt&gt; to change the &amp;quot;Listen 443&amp;quot;
directive to &amp;quot;Listen 9443&amp;quot;&lt;/li&gt;
&lt;li&gt;Restart nginx and Apache to put the new configuration in place&lt;/li&gt;
&lt;li&gt;Enjoy!&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As I said, there's probably plenty of room for improvement; I have only
a few hours of experimentation with nginx under my belt at this point.
But assuming no showstoppers turn up after further testing, I would
expect to see this going into production in Conifer sooner rather than
later, and potentially becoming a standard part of any production
Evergreen system.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sun, 04 Oct 2009 04:51:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2009-10-04:/using-nginx-to-serve-static-content-with-evergreen.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Evergreen Developer Basics Workshop at FSOSS 2009</title><link>https://coffeecode.net/evergreen-developer-basics-workshop-at-fsoss-2009.html</link><description>&lt;p&gt;If you're working on or interested in working on the
&lt;a class="reference external" href="http://evergreen-ils.org"&gt;Evergreen&lt;/a&gt; open source library system, and
you can be in the Toronto area on October 29th, 2009, you might want to
spend $75 and register for the &lt;a class="reference external" href="http://fsoss.senecac.on.ca/2009/"&gt;Free Software Open Source Symposium
(FSOSS)&lt;/a&gt; to be held at the
&lt;a class="reference external" href="mailto:Seneca&amp;#64;York"&gt;Seneca&amp;#64;York&lt;/a&gt; campus. You'll get a three hour workshop introducing you to
Evergreen development out of the deal, plus your choice of another
workshop on the 29th and the ability to attend all of the FSOSS
presentations on the 30th. I attended FSOSS last year for the first time
and was stunned at the high quality of the conference.&lt;/p&gt;
&lt;p&gt;I apologize for the late notice that means that you missed out on the
$30 early registration special; I did not hear until this morning that
my workshop proposal had been accepted. This seems in keeping with this
year's edition of FSOSS, as the conference Web site also seems to be a
bit behind where one would expect with only four weeks to go (heh). The
late notice will also mean that most of my spare minutes will be soaked
up for the rest of the month preparing the workshop materials, but
building a collection of Evergreen development tutorials for the
community is high on my personal list of goals, so it will definitely be
worth it. Expect a high-energy presentation!&lt;/p&gt;
&lt;p&gt;Here are the particulars for the workshop:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Workshop title&lt;/strong&gt;: Evergreen Library System Development Basics&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Workshop description&lt;/strong&gt; Over the past year, Evergreen has been&lt;/p&gt;
&lt;p&gt;adopted by a number of libraries in Ontario. While it is built on a&lt;/p&gt;
&lt;p&gt;flexible, scalable architecture and offers an impressive set of&lt;/p&gt;
&lt;p&gt;features, the Evergreen community needs a broader base of developers&lt;/p&gt;
&lt;p&gt;who are able to contribute to the base functionality and create&lt;/p&gt;
&lt;p&gt;customized Evergreen instances. This workshop will provide developers&lt;/p&gt;
&lt;p&gt;with the tools they need to contribute to the Evergreen project and&lt;/p&gt;
&lt;p&gt;better serve their libraries, tackling subjects such as creating a new&lt;/p&gt;
&lt;p&gt;OpenSRF service, accessing data with permission-based methods,&lt;/p&gt;
&lt;p&gt;customizing the database schema and IDL, and building AJAX interfaces&lt;/p&gt;
&lt;p&gt;with the OpenILS Dojo widgets.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sat, 03 Oct 2009 01:04:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2009-10-03:/evergreen-developer-basics-workshop-at-fsoss-2009.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Two podcasts of potential interest to Evergreen fans</title><link>https://coffeecode.net/two-podcasts-of-potential-interest-to-evergreen-fans.html</link><description>&lt;p&gt;Most recently, the latest &lt;a class="reference external" href="http://www.softwarefreedom.org/podcast/"&gt;Software Freedom Law
Show&lt;/a&gt; focuses on the subject
of how to choose a license for your software project's documentation.
The episode was a direct response to a
&lt;a class="reference external" href="http://identi.ca/notice/8976792"&gt;dent&lt;/a&gt; I had sent to one of the
hosts, Bradley Kuhn, suggesting the subject. I thought the &lt;a class="reference external" href="http://www.evergreen-ils.org/dokuwiki/doku.php?id=evergreen-docs:dig"&gt;Evergreen
Documentation Interest
Group&lt;/a&gt;
might find it a useful treatment from two of the most knowledgeable
folks in the free software licensing world. As a bonus, when I started
listening to the episode today, I was pleased to hear Bradley lead in
with a very positive mention of Evergreen. Many thanks, Bradley, both
for the show and for the shout-out to Evergreen!&lt;/p&gt;
&lt;p&gt;Also, back in July, I had the opportunity to travel to &lt;a class="reference external" href="http://algomau.ca"&gt;Algoma
University&lt;/a&gt; in Sault Ste. Marie to spend a few
days locked in a room with my fellow Conifer propeller-heads (Art,
Kevin, and Robin) to dump the Evergreen-related content of my brain out
onto the table in preparation for my parental leave. As part of the
visit, we joined in the &lt;a class="reference external" href="http://tangentialconvergence.blogspot.com"&gt;Tangential
Convergence&lt;/a&gt; crew to put
together a &lt;a class="reference external" href="http://tangentialconvergence.blogspot.com/2009/08/episode-17-searching-for-evergreens.html"&gt;podcast about Conifer and
Evergreen&lt;/a&gt;
in the standard Tangential Convergence style: having a few beer while
sitting around a table in Dave Brodbeck's backyard. We ended up veering
off onto other subjects rather quickly, but such is the nature of the
show!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Addendum &amp;#64; 20:44&lt;/strong&gt;&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;In the SFLC podcast, Bradley was riffing about my role in Evergreen
based on his memory of my FSOSS presentation from almost a year ago,
so to set the record straight - I'm a relative newcomer to Evergreen,
having joined the project in 2007 after Mike Rylander, Bill Erickson,
and Jason Etheridge had already accomplished the miracle of
delivering the first release of Evergreen to the public libraries of
the state of Georgia.&lt;/li&gt;
&lt;li&gt;Also, in the opening moments of the SFLC podcast, there's a mention
of how Evergreen filled a gap in the free software universe (library
systems); one should note that &lt;a class="reference external" href="http://koha.org"&gt;Koha&lt;/a&gt; tackled
that gap a lot earlier (starting in 1999) and is also a thriving
project today.
&amp;lt;p&amp;gt;
&amp;lt;/ol&amp;gt;
&amp;lt;/p&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 15 Sep 2009 20:59:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2009-09-15:/two-podcasts-of-potential-interest-to-evergreen-fans.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Long overdue pictures of Arik</title><link>https://coffeecode.net/long-overdue-pictures-of-arik.html</link><description>&lt;img alt="Arik lying on his back" src="/uploads/pics/arik/img_2807.jpg" /&gt;
&lt;p&gt;On the comfy handmade quilt that cousin Janet made for him&lt;/p&gt;
&lt;img alt="Arik lying beside a laughing Amber" src="/uploads/pics/arik/img_2811.jpg" /&gt;
&lt;p&gt;With the ever-hamming big sister&lt;/p&gt;
&lt;img alt="Arik wearing a bib" src="/uploads/pics/arik/img_2817.jpg" /&gt;
&lt;p&gt;The ability to eat solid food is not necessarily a prerequisite for
entry to university&lt;/p&gt;
&lt;img alt="Naked Arik crawling on his belly" src="/uploads/pics/arik/img_2823.jpg" /&gt;
&lt;p&gt;Risque! Look for a similar pose from him in a centerfold in about 20
years.&lt;/p&gt;
&lt;img alt="Arik and Amber strapped in a bike trailer" src="/uploads/pics/arik/img_2831.jpg" /&gt;
&lt;p&gt;The MEC double bike trailer / stroller (2009 edition) is a hit with the
kids (and us)&lt;/p&gt;
&lt;img alt="Arik sitting with Grandma on the floor" src="/uploads/pics/arik/img_2858.jpg" /&gt;
&lt;p&gt;Sitting up with Grandma at eight months&lt;/p&gt;
&lt;img alt="Arik in a Jolly Jumper" src="/uploads/pics/arik/img_2861.jpg" /&gt;
&lt;p&gt;A jovial jumper, he is&lt;/p&gt;
&lt;img alt="Arik playing with the toys in a Jolly Jumper" src="/uploads/pics/arik/img_2872.jpg" /&gt;
&lt;p&gt;Activity centres are also a great source of entertainment&lt;/p&gt;
&lt;img alt="Arik smiling, lying on the grass" src="/uploads/pics/arik/img_2888.jpg" /&gt;
&lt;p&gt;Here's looking at you, kid (from the Hicks reunion)&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 14 Sep 2009 01:46:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2009-09-14:/long-overdue-pictures-of-arik.html</guid><category>Family</category><category>Arik</category></item><item><title>Linux on the desktop, ten years later</title><link>https://coffeecode.net/linux-on-the-desktop-ten-years-later.html</link><description>&lt;p&gt;It's a running joke at the &lt;a class="reference external" href="http://lwn.net"&gt;Linux Weekly News&lt;/a&gt; at the
start of each year to predict that &amp;quot;this will be the year of Linux on
the desktop&amp;quot;. In our household, it's been Linux on the desktop for over
ten years now.&lt;/p&gt;
&lt;p&gt;A week or so ago, I received an email from the &lt;a class="reference external" href="http://counter.li.org/"&gt;Linux
Counter&lt;/a&gt; asking me to update the status of my
account. I was a bit surprised to see that I had registered an account
stating that I had a machine running Linux back in May 1999 - more than
ten years ago! Then yesterday, while pawing through a box of
miscellaneous computer crap (doesn't every geek have a few boxes of
those?), I came across the receipt from
&lt;a class="reference external" href="http://www.cheapbytes.com/"&gt;CheapBytes&lt;/a&gt; for two CDs: Red Hat Linux
5.2, and Linux Mandrake 5.3 (Venus) dated February 23, 1999. It was a
direct result of having run into Linux in 1998 at IBM when I was testing
a port of DB2 to this previously relatively obscure (to me) operating
system. Having cut my UNIX teeth earlier that year on AIX, Solaris,
HP-UX, and SCO OpenServer, I was surprised at how capable it was on our
relatively cheap testing hardware, and something in my brain clicked and
sent me over the edge to learn more, more, more about this Linux thing.
Shortly thereafter, I was submitting an order to CheapBytes from my work
address.&lt;/p&gt;
&lt;p&gt;I distinctly remember trying to get Red Hat 5.2 running on my IBM Aptiva
at home, with no success, but the slightly more bleeding-edge Linux
Mandrake handled my hardware without too much pain and actually produced
a working XWindows interface. Glorious! I even managed to get Lilo to
support dual-booting of Windows and Linux, so that I could geek out and
then later Lynn could reboot and get some real work done. Or, I could
play some serious games. Let's not get our priorities too screwed up.
Somehow I managed not to fry our computer, despite rapidly entering the
land of custom-compiled kernels and experimenting with different
packages and RPMs from different distributions.&lt;/p&gt;
&lt;p&gt;I ran Linux at work, as well, dealing with horrible things like Token
Ring drivers in the early days (lots of custom kernels compiled there).
I wrote manuals in gvim and built a documentation management system on a
LADP (Linux, Apache, DB2, and PHP/Perl) platform. Figuring out solutions
built on Linux often opened up much faster, cleaner ways of getting work
done, and I never had a complaint about my productivity. A few days ago,
I was listening to a &lt;a class="reference external" href="http://hackerpublicradio.org/eps/hpr0434.mp3"&gt;Hacker Public
Radio&lt;/a&gt; podcast in which
many of the round table contributors mentioned that they couldn't run
Linux or BSD at work because their machines were locked down, and I
thought &amp;quot;How sad!&amp;quot;; these are clearly smart people and they should be
able to select their own tools to get their jobs done. Imagine the fun
that would follow if you hired a crew to renovate your house and then
required them to use the set of tools that you had purchased at a
discount store!&lt;/p&gt;
&lt;p&gt;By 2001, whatever the current version of Linux Mandrake was was just
running all the time on our home machine (I was a silver member of the
Mandrake Club, oh yeah!). I wasn't playing many games anymore, although
I did buy and play the Linux versions of Heroes of Might and Magic III
and Soldier of Fortune and Alpha Centauri. I was even deeper into
geekdom, doing some editing and writing for &lt;a class="reference external" href="http://tldp.org"&gt;The Linux Documentation
Project&lt;/a&gt; and minor hacking on projects like Wine
(necessary for running Lotus Notes for work at IBM, you see) and PHP
here and there. And when I wasn't monopolizing the machine, Lynn got
tired of waiting for the system to reboot and she just jumped into Linux
(using either Gnome or KDE, and cursing me only slightly when I switched
the default desktop or upgraded and things moved around). So, we've been
a primarily Linux-based family since 2001 I guess.&lt;/p&gt;
&lt;p&gt;In 2004 or thereabouts we switched to Gentoo to try and avoid the
upgrade &amp;quot;who moved my cheese?&amp;quot; hassles. The desktop layout stayed more
stable, but the pain of having to recover after major configuration
changes or blocking dependencies got tiresome and in 2007 we switched to
Ubuntu and have been pretty happy with that ever since. Lynn had to jump
back to Windows every once in a while when she started writing her
thesis (curse those MS Office 2007 .docx files and layout changes
between OpenOffice.org and MS Office) but otherwise, for us, Linux on
the desktop has been part of our reality in some capacity for over ten
years now - and almost a full-time reality for 8 years.&lt;/p&gt;
&lt;p&gt;If you want to give it a shot, I would recommend
&lt;a class="reference external" href="http://ubuntu.com"&gt;Ubuntu&lt;/a&gt; as a good starting point for a general
introduction to Linux. If you're one of my friends working in the film
or audio industry (hello Ian!), &lt;a class="reference external" href="http://ubuntustudio.org/"&gt;Ubuntu
Studio&lt;/a&gt; is a version of Ubuntu specialized
for your needs.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 09 Sep 2009 19:33:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2009-09-09:/linux-on-the-desktop-ten-years-later.html</guid><category>misc</category><category>Personal</category></item><item><title>Rewards of northern living</title><link>https://coffeecode.net/rewards-of-northern-living.html</link><description>&lt;p&gt;When we moved to Sudbury, one of the draws was the wealth of trails
available to us for hiking, biking, and cross country skiing. Between
work and school and the arrival of Arik and Amber, however, it's
somewhat rare for us to take advantage of those trails that are
literally at our back door. This summer we got in a few good hikes, and
picked some blueberries, but I had brought my mountain bike ride out for
only one brief off-road spin. Well, until last week...&lt;/p&gt;
&lt;p&gt;One fine sunny day, I headed out for what I thought was going to be
another quick ride. Then I took a turn that I hadn't before, and started
on a (for me) epic ride around Laurentian Lake. My neighbour / friend
Markus had told me about this trail, but I didn't think I had the
stamina or skills to pull it off. Our terrain is an incredible mix of
glacier-hewn exposed granite, deep woods singletrack, and lakeside
rides. This ride put all of those elements together; the following
picture captures a rest break I took at the top of a rock outcropping
about one-third of the way into the ride; it overlooks Lake Laurentian,
a star-shaped lake about one kilometre behind our house:&lt;/p&gt;
&lt;div&gt;&lt;p&gt;&lt;a class="reference external" href="/uploads/pics/ride_begins.jpg"&gt;|image0|&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;/div&gt;&lt;p&gt;After the intense rock climbing &amp;amp; descents (yes, at points I threw the
bike over my shoulder and clambered up and down), the ride settled into
a marshy trail, then smoothed into classic singletrack through a pine
forest that provided welcome shade for this pale torso on an intensely
sunny day for early September. After dipping close to the lake several
times, a waterfront trail emerged and I managed to capture this rather
spectacular shot from the other side of Lake Laurentian:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/uploads/pics/lakelaurentian.jpg"&gt;|image1|&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;At this point, I was getting pretty fatigued (I had skipped lunch before
the ride and had no food or drink with me - yeah, duh, it was going to
be a short ride, remember?), so the Lake Laurentian Nature Chalet was a
welcome sign that civilization (and crisp, cold, clean drinking water)
wasn't that far off:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/uploads/pics/naturechalet.jpg"&gt;|image2|&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;My bike looks pretty good resting up against the chalet's waterfront
railing, doesn't it?&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/uploads/pics/trustysteed.jpg"&gt;|image3|&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;One more long climb brought me to the lookout:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/uploads/pics/lookout.jpg"&gt;|image4|&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Such beauty does come at a cost, unfortunately, at least for those who
don't ride often enough. Luckily, I was able to pay the price in scrapes
and bruises this time around! Following is a picture of my lightly
scraped knee; my elbow took more damage (but I'll leave that to your
imagination).&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/uploads/pics/myknee.JPG"&gt;|image5|&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;From the outlook, it was only another twenty minutes or so of familiar
trails to get back home. All told, a great ride, and one that I hope to
repeat--albeit with appropriate provisions, or a bottle of water at
least--before the summer is out. Also, if you come to visit, you would
be well-advised to bring your mountain bike. I'll be happy to show you
around a few of our backyard trails!&lt;/p&gt;
&lt;p&gt;(My apologies for the (lack of) picture quality; as was previously
noted, I hadn't been planning on a long ride so I ended up putting my
cell phone to work)&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 08 Sep 2009 03:39:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2009-09-08:/rewards-of-northern-living.html</guid><category>Family</category><category>Personal</category></item><item><title>SFX target parser for Evergreen and some thoughts about searching identifiers</title><link>https://coffeecode.net/sfx-target-parser-for-evergreen-and-some-thoughts-about-searching-identifiers.html</link><description>&lt;p&gt;&lt;strong&gt;UPDATE 2010-03-10&lt;/strong&gt; See &lt;a class="reference external" href="/archives/217-More-granular-identifier-indexes-for-your-Evergreen-SRU-Z39.50-servers.html"&gt;More granular identifier indexes for your
Evergreen SRU / Z39.50
servers&lt;/a&gt;
for some recommended enhancements to the target parser and Evergreen's
identifier index capabilities&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://laurentian.ca"&gt;Laurentian University&lt;/a&gt; is part of the &lt;a class="reference external" href="http://www.ocul.on.ca/"&gt;Ontario
Council of University Libraries (OCUL)&lt;/a&gt;, and
a user of the centrally hosted &lt;a class="reference external" href="http://scholarsportal.info"&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'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;div class="section" id="the-code"&gt;
&lt;h2&gt;The code&lt;/h2&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 class="literal-block"&gt;
package Parsers::TargetParser::Evergreen::Conifer;use Parsers::TargetParser;use base qw(Parsers::TargetParser);use strict;sub getHolding {  my ($this,$genRequestObj) = &amp;#64;_;    my $objectType = $genRequestObj-&amp;gt;{'objectType'};  my $ISBN = $genRequestObj-&amp;gt;{'ISBN'};  my $eISBN = $genRequestObj-&amp;gt;{'eISBN'};  my $ISSN = $genRequestObj-&amp;gt;{'ISSN'};  my $eISSN = $genRequestObj-&amp;gt;{'eISSN'};  my $CODEN = $genRequestObj-&amp;gt;{'CODEN'};  my $bookTitle = $genRequestObj-&amp;gt;{'bookTitle'};  my $journalTitle = $genRequestObj-&amp;gt;{'journalTitle'};  # Canonical search results URL for simple searches:  # http://laurentian.concat.ca/opac/en-CA/skin/lul/xml/rresult.xml?rt=keyword&amp;amp;tp=keyword&amp;amp;t=0895-2779&amp;amp;l=105&amp;amp;d=2&amp;amp;f=&amp;amp;av=  my $svc = $this-&amp;gt;{svc};  my $egHost = $svc-&amp;gt;parse_param('eg_host');  my $egLocale = $svc-&amp;gt;parse_param('eg_locale');  my $egSkin = $svc-&amp;gt;parse_param('eg_skin');  my $egOrgUnit = $svc-&amp;gt;parse_param('eg_org_unit');  my $egDepth = $svc-&amp;gt;parse_param('eg_depth');  my $path = &amp;quot;http://${egHost}/opac/${egLocale}/skin/${egSkin}/xml/rresult.xml?l=${egOrgUnit}&amp;amp;d=${egDepth}&amp;quot;;  my $searchString = '&amp;amp;rt=keyword&amp;amp;tp=keyword&amp;amp;t=';  if (defined($ISSN)) {    if ($ISSN =~ m/x/i) {      # Current indexer doesn'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 .= &amp;quot;\&amp;quot;$ISSN\&amp;quot;&amp;quot;;      # format 9999-9999 for MARC    }  }   elsif (defined($ISBN)) {    # Evergreen doesn't force ISBNs to be stripped of hyphens, so take whatever    $searchString .= &amp;quot;\&amp;quot;$ISBN\&amp;quot;&amp;quot;;  }  elsif (defined($journalTitle)) {    # Restrict searches to title index, with bibliographic level = s    $searchString .= &amp;quot;ti:${journalTitle}&amp;amp;bl=s&amp;quot;;  }  elsif (defined($bookTitle)) {    # Restrict searches to title index, with bibliographic level = m    $searchString .= &amp;quot;ti:${bookTitle}&amp;amp;bl=m&amp;quot;;  }  return ($path . $searchString);}1;
&lt;/pre&gt;
&lt;p&gt;And here's the help that I added to the corresponding &lt;strong&gt;Conifer.hlp&lt;/strong&gt;
file:&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;strong&gt;General Information&lt;/strong&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Target - LOCAL_CATALOGUE_EVERGREEN_CONIFER&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Service - getHolding&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Parser - Evergreen::Conifer&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;strong&gt;Information needed in the Target Service:&lt;/strong&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;In the PARSE_PARAM field, replace the following information:&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;eg_host = $$LOCAL_CATALOGUE_SERVER&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;eg_locale = Locale (en-US, en-CA, fr-CA, etc)&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;eg_skin = algoma, default, lul, nohin, uwin&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;eg_org_unit = 103, 1, etc&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;eg_depth = 0, 1, 2, 3, etc&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="findings-and-wishlists"&gt;
&lt;h2&gt;Findings and wishlists&lt;/h2&gt;
&lt;p&gt;While it'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 &amp;quot;x&amp;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'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 class="reference external" href="http://www.worldcat.org/affiliate/webservices/xisbn/app.jsp"&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'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;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 29 Jun 2009 17:00:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2009-06-29:/sfx-target-parser-for-evergreen-and-some-thoughts-about-searching-identifiers.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Globalization presentation at Evergreen International Conference 2009</title><link>https://coffeecode.net/globalization-presentation-at-evergreen-international-conference-2009.html</link><description>&lt;p&gt;I was fortunate to be invited to give a talk (&lt;a class="reference external" href="/uploads/talks/2009/Globalization1.odp"&gt;OpenOffice.org
Impress&lt;/a&gt;
/ &lt;a class="reference external" href="/uploads/talks/2009/Globalization1.pdf"&gt;PDF&lt;/a&gt;
) on Evergreen's progress on the&lt;/p&gt;
&lt;p&gt;globalization front at the first ever &lt;a class="reference external" href="http://evergreen-ils.org/dokuwiki/doku.php?id=eg09:main"&gt;Evergreen International
Conference&lt;/a&gt;.
My friend&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://www.eifl.org/cps/sections/services/eifl-foss/foss-blog/2009_05_29_first-evergreen"&gt;Tigran
Zargaryan&lt;/a&gt;
from the &lt;a class="reference external" href="http://www.flib.sci.am"&gt;Fundamental Science Library of the National Academy of
Sciences of the Republic of Armenia&lt;/a&gt; gave a&lt;/p&gt;
&lt;p&gt;talk at almost the same time about his library's progress in adopting&lt;/p&gt;
&lt;p&gt;Evergreen. Tigran himself was responsible for the translation of the&lt;/p&gt;
&lt;p&gt;Evergreen catalogue and staff client into Armenian, and he confided that
he&lt;/p&gt;
&lt;p&gt;also expected to make significant progress towards a Russian translation&lt;/p&gt;
&lt;p&gt;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&lt;/p&gt;
&lt;p&gt;taking Evergreen from its American English roots and enabling it to
support&lt;/p&gt;
&lt;p&gt;not just translated interfaces, but properly localized content display -
and&lt;/p&gt;
&lt;p&gt;to provide some pointers towards where we need to go next. We have been&lt;/p&gt;
&lt;p&gt;making progress towards a more formalized translation process, so keep
an&lt;/p&gt;
&lt;p&gt;eye out for a call for translations in the next week or two when the
Evergreen&lt;/p&gt;
&lt;p&gt;1.6 release candidate is made available for testing. We currently sport&lt;/p&gt;
&lt;p&gt;Armenian, Canadian English, Canadian French, and Czech translations, and&lt;/p&gt;
&lt;p&gt;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;/p&gt;
&lt;p&gt;&lt;a class="reference external" href=":8080"&gt;Pootle translation server&lt;/a&gt; from a&lt;/p&gt;
&lt;p&gt;beta service running on my poor little VPS to a real server. We have
some&lt;/p&gt;
&lt;p&gt;technical challenges to overcome - providing translation support for the&lt;/p&gt;
&lt;p&gt;Template::Toolkit framework, for example. And we have some basic grunt
work&lt;/p&gt;
&lt;p&gt;to do to replace the hard-coded display of numbers, currencies, dates,
and times&lt;/p&gt;
&lt;p&gt;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&lt;/p&gt;
&lt;p&gt;hadn't expected such an interest in the topic, despite it nominally
being an international&lt;/p&gt;
&lt;p&gt;conference. My only regret was that I rushed off the stage without
taking&lt;/p&gt;
&lt;p&gt;questions in the mistaken belief that I had used up all of my time and
was&lt;/p&gt;
&lt;p&gt;eating into my successor's presentation timeslot; as it turned out,
there&lt;/p&gt;
&lt;p&gt;was a built-in 15 minute buffer that I had overlooked. Ah well. Thanks
to&lt;/p&gt;
&lt;p&gt;everyone who came out, and for everyone else who wasn't able to make it
to&lt;/p&gt;
&lt;p&gt;the session, I hope you'll find the slides a good introduction to the&lt;/p&gt;
&lt;p&gt;state of globalization in Evergreen. And if you have the skills to
contribute, please&lt;/p&gt;
&lt;p&gt;consider pitching into the globalization enablement effort!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 05 Jun 2009 02:12:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2009-06-05:/globalization-presentation-at-evergreen-international-conference-2009.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Evergreen International Conference hackfest results: Evergreen serials support</title><link>https://coffeecode.net/evergreen-international-conference-hackfest-results-evergreen-serials-support.html</link><description>&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 class="reference external" href="http://lisletters.fiander.info/"&gt;David Fiander's&lt;/a&gt;
&lt;a class="reference external" href="http://svn.open-ils.org/trac/ILS/browser/trunk/Open-ILS/src/perlmods/OpenILS/Utils/MFHD.pm"&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 class="simple"&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's the rudimentary serials holdings display: &lt;a class="reference external image-reference" href="/uploads/talks/2009/serials_display.png"&gt;&lt;img alt="image0" class="serendipity-image-left" src="/uploads/talks/2009/serials_display.serendipityThumb.png" style="width: 110px; height: 89px;" /&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 class="reference external" href="http://dojotoolkit.org"&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's the MARC editor in action: &lt;a class="reference external image-reference" href="/uploads/talks/2009/MFHD_editor.png"&gt;&lt;img alt="image1" class="serendipity-image-left" src="/uploads/talks/2009/MFHD_editor.serendipityThumb.png" style="width: 110px; height: 89px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Since then, I'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 class="simple"&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'll only
see holdings for the part of the library hierarchy that you'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="reference external" href="/uploads/talks/2009/Hackfest_results.pdf"&gt;|image2|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 class="reference external" href="http://www.tadl.org/"&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;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 27 May 2009 18:23:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2009-05-27:/evergreen-international-conference-hackfest-results-evergreen-serials-support.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Conifer lives: Ontario launches a consortial academic library system built on Evergreen</title><link>https://coffeecode.net/conifer-lives-ontario-launches-a-consortial-academic-library-system-built-on-evergreen.html</link><description>&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 Evergreen open-source library system, 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 class="reference external" href="http://laurentian.concat.ca"&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 class="reference external" href="http://laurentian.ca"&gt;Laurentian University&lt;/a&gt;, &lt;a class="reference external" href="http://mcmaster.ca"&gt;McMaster University&lt;/a&gt;, and the &lt;a class="reference external" href="http://uwindsor.ca"&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 class="reference external" href="http://www.uoguelph.ca/ccs/"&gt;University of Guelph&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Things change, and along the way &lt;a class="reference external" href="http://algomau.ca"&gt;Algoma University&lt;/a&gt; and the &lt;a class="reference external" href="http://nosm.ca"&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;div class="section" id="number-of-staff-and-user-accounts-per-library-in-conifer"&gt;
&lt;h2&gt;Number of staff and user accounts per library in Conifer&lt;/h2&gt;
&lt;pre class="literal-block"&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;/div&gt;
&lt;div class="section" id="number-of-copies-held-per-library-in-conifer"&gt;
&lt;h2&gt;Number of copies held per library in Conifer&lt;/h2&gt;
&lt;pre class="literal-block"&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;/div&gt;
&lt;div class="section" id="what-about-acquisitions-serials-and-reserves"&gt;
&lt;h2&gt;What about acquisitions, serials, and reserves?&lt;/h2&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're migrating all of the old financial data twice: first, and foremost, into the most sophisticated set of spreadsheets you'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.&lt;/p&gt;
&lt;p&gt;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. We have migrated all of our serials data from the legacy system, I just haven'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 &amp;quot;check in&amp;quot; a new issue by adding a new 863 field, it won't associate barcodes with individual issues. Most of the database schema exists to support that, but there'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 alt=":-)" class="emoticon" src="/images/smile.png" /&gt; I'm confident that that'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 class="reference external" href="http://svn.open-ils.org/trac/ILS-Contrib/wiki/SyrupReserves"&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;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 11 May 2009 21:21:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2009-05-11:/conifer-lives-ontario-launches-a-consortial-academic-library-system-built-on-evergreen.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>All in a day's work: defending book reviews in our catalogue</title><link>https://coffeecode.net/all-in-a-days-work-defending-book-reviews-in-our-catalogue.html</link><description>&lt;p&gt;The following was written in response to a faculty member'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'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;
&lt;p&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 class="reference external" href="http://www.bowker.com/syndetics/options/book_reviews.htm"&gt;number of sources&lt;/a&gt;.&lt;/p&gt;
&lt;p&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;/p&gt;
&lt;p&gt;It is regrettable that the one review available for your book from
our added content supplier should include one negative statement;
however, I'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;/p&gt;
&lt;p&gt;As to your concerns about catalogue browsers confusing the providence of
the review, I believe most readers would find the byline &amp;quot;CHOICE
Copyright © American Library Association, used with permission.&amp;quot; a
reasonably clear indication of the source of the review. I agree,
however, that the reviewer's name should be included, and will request
that our added content supplier make this amendment to their service.&lt;/p&gt;
&lt;p&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;/p&gt;
&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's easy to see that
enriched content that helps library users select material might not
please everyone. However... just as we wouldn'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'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;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 07 May 2009 20:26:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2009-05-07:/all-in-a-days-work-defending-book-reviews-in-our-catalogue.html</guid><category>Libraries</category><category>Libraries</category></item><item><title>Evergreen iPhone application? Unnecessary!</title><link>https://coffeecode.net/evergreen-iphone-application-unnecessary.html</link><description>&lt;p&gt;This Easter weekend I had the opportunity to play with someone'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'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't fare quite as well with Microsoft's rather decrepit
&lt;em&gt;PocketExplorer&lt;/em&gt; browser on my HTC Touch smartphone (it's a Windows
Mobile monstrosity, sigh), but it does work well with the &lt;a class="reference external" href="http://www.opera.com/mobile/"&gt;Opera
Mobile&lt;/a&gt; 9.5 beta browser. I eagerly
anticipate the first good release of
&lt;a class="reference external" href="https://wiki.mozilla.org/mobile"&gt;Fennec&lt;/a&gt; for Windows Mobile (&lt;a class="reference external" href="http://starkravingfinkle.org/blog/2009/03/fennec-windows-mobile-update/"&gt;coming
soon!&lt;/a&gt;),
as I'm confident that'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'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'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'm looking at you,
&lt;a class="reference external" href="http://ptonthenet.com"&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'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' 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 class="reference external" href="http://www.go-mono.com/moonlight/"&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 class="reference external" href="http://www.ptonthenet.com/techhelp.aspx"&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'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;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 13 Apr 2009 04:29:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2009-04-13:/evergreen-iphone-application-unnecessary.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Transparent acquisitions budgets and expenditures for academic libraries</title><link>https://coffeecode.net/transparent-acquisitions-budgets-and-expenditures-for-academic-libraries.html</link><description>&lt;p&gt;In my &lt;a class="reference external" href="http://www.academicmatters.ca/bloggers.bookends.gk?catalog_item_id=2386&amp;amp;category=/blogger/bookends"&gt;most recent
post&lt;/a&gt;
over at the Academic Matters site, after a general discussion about &amp;quot;new
books lists&amp;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'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 class="reference external" href="http://www.academicmatters.ca/bloggers.bookends.gk?catalog_item_id=2386&amp;amp;category=/blogger/bookends"&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 alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 19 Mar 2009 17:30:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2009-03-19:/transparent-acquisitions-budgets-and-expenditures-for-academic-libraries.html</guid><category>Libraries</category><category>Coding</category></item><item><title>One big library, one little device: Evergreen staff client on Nokia N810</title><link>https://coffeecode.net/one-big-library-one-little-device-evergreen-staff-client-on-nokia-n810.html</link><description>&lt;div class="serendipity_imageComment_left" style="width: 480px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;img alt="image0" class="serendipity-image-left" src="/uploads/pics/n810.jpg" style="width: 480px; height: 379px;" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;It's hard to take good photos of these devices&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;p&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 class="reference external" href="http://www.nseries.com/products/n810/#l=products,n810"&gt;Nokia
N810&lt;/a&gt; Internet
tablet device. It's a nifty little handheld computer that packs 128 MB
of memory, a touch screen, and a beautiful 800x480 screen, and I'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's what happened: when I was
attending &lt;a class="reference external" href="http://fsoss.senecac.on.ca/2008/"&gt;FSOSS 2008&lt;/a&gt; at Seneca
College, I ran into &lt;a class="reference external" href="http://madhava.com/egotism/"&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 class="reference external" href="https://wiki.mozilla.org/Mobile/Fennec"&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's team made some great
innovative decisions for Fennec'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'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'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 class="reference external" href="http://svn.open-ils.org/trac/ILS/changeset/12275"&gt;recent
commits&lt;/a&gt; was “we're
kicking xulrunner 1.8 to the curb with trunk”. I had a spare hour or two
on my hands today, so I copied a staff client build from Conifer'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'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;strong&gt;*Updated 2009-03-02 10:35 am&lt;/strong&gt;: Correcting Madhava's name; I shouldn't
write past midnight without proof-reading! Sorry Madhava.*&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 02 Mar 2009 05:23:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2009-03-02:/one-big-library-one-little-device-evergreen-staff-client-on-nokia-n810.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Arik and Amber update</title><link>https://coffeecode.net/arik-and-amber-update.html</link><description>&lt;p&gt;Arik is just over eight weeks old now (and over fifteen pounds!), so I'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="serendipity_imageComment_center" style="width: 110px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/arik/img_2461.jpg"&gt;&lt;img alt="image0" class="serendipity-image-center" src="/uploads/pics/arik/img_2461.serendipityThumb.jpg" style="width: 110px; height: 83px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Three most important people&lt;/p&gt;
&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'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="serendipity_imageComment_center" style="width: 110px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/arik/img_2506.jpg"&gt;&lt;img alt="image1" class="serendipity-image-center" src="/uploads/pics/arik/img_2506.serendipityThumb.jpg" style="width: 110px; height: 83px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;A study in contrasts (quilt courtesy Janet)&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="serendipity_imageComment_center" style="width: 110px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/arik/img_2512.jpg"&gt;&lt;img alt="image2" class="serendipity-image-center" src="/uploads/pics/arik/img_2512.serendipityThumb.jpg" style="width: 110px; height: 83px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Spook loves Arik (and the quilt, and sunshine) too&lt;/p&gt;
&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 alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;div class="serendipity_imageComment_center" style="width: 110px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/arik/img_2520.jpg"&gt;&lt;img alt="image4" class="serendipity-image-center" src="/uploads/pics/arik/img_2520.serendipityThumb.jpg" style="width: 110px; height: 83px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Big sister doesn't look _that_ big next to Arik&lt;/p&gt;
&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't worry)&lt;/p&gt;
&lt;div class="serendipity_imageComment_center" style="width: 110px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/amber/img_2521.jpg"&gt;&lt;img alt="image5" class="serendipity-image-center" src="/uploads/pics/amber/img_2521.serendipityThumb.jpg" style="width: 110px; height: 83px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Mugging&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Arik apparently likes the camera too.&lt;/p&gt;
&lt;div class="serendipity_imageComment_center" style="width: 110px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/arik/img_2524.jpg"&gt;&lt;img alt="image6" class="serendipity-image-center" src="/uploads/pics/arik/img_2524.serendipityThumb.jpg" style="width: 110px; height: 83px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Mugging, part two&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;*Updated: 2009-03-01&lt;/strong&gt; Thumbnails were all linked to the same image...
fixed!*&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sun, 01 Mar 2009 13:38:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2009-03-01:/arik-and-amber-update.html</guid><category>Family</category><category>Personal</category></item><item><title>Seven things</title><link>https://coffeecode.net/seven-things.html</link><description>&lt;p&gt;I was tagged by &lt;a class="reference external" href="http://pooteeweet.org/blog/1402"&gt;Lukas&lt;/a&gt; for the &amp;quot;7
things&amp;quot; meme, and meant to do something about it, but I'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's &amp;quot;25 things&amp;quot; meme, so I'm going to take a few minutes to try
to play along.&lt;/p&gt;
&lt;ol class="arabic simple"&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'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 not a waste of time; I can't count the number of
experiences that I'm thankful for having had during that time.&lt;/li&gt;
&lt;li&gt;Although I roast and grind my own coffee, I'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'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've run a couple of 5K races and and
a &lt;a class="reference external" href="http://www.coffeecode.net/archives/79-Im-not-as-sore-as-I-thought-I-would-be.html"&gt;sprint
duathlon&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;I'm pretty sure I was destined to become a systems librarian. When I
was 10, I used to hang out at the local college'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 &amp;quot;computer page&amp;quot;
at the Barrie Public Library Children'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't impressed with faux-ska and couldn't stand
the lead singer's voice. Six months later No Doubt's &amp;quot;SpiderWebs&amp;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'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't so stupid--come on, sound
it out buddy--I wouldn'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'm a
crappy friend. Most of my close friends found out that we were
expecting a second child only through Lynn's Facebook account. I
called one couple shortly after Arik was born and his quasi-namesake
(one of the Eric's in our life who bring honour to the noble name)
asked me after a few minutes: &amp;quot;So, uhh... did we &lt;em&gt;know&lt;/em&gt; that you were
expecting a baby?&amp;quot;. No, no you didn't, and that's not your fault. Man
I suck.&lt;/li&gt;
&lt;li&gt;I'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 class="simple"&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'm going to break the rules and just tag
two people: &lt;a class="reference external" href="http://blog.evermeet.cx"&gt;Helmut&lt;/a&gt;, because he'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 class="reference external" href="http://rc98.net"&gt;Gabriel&lt;/a&gt; because I like his style.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 09 Feb 2009 05:56:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2009-02-09:/seven-things.html</guid><category>misc</category><category>Personal</category><category>PHP</category></item><item><title>Unicorn to Evergreen migration: rough notes</title><link>https://coffeecode.net/unicorn-to-evergreen-migration-rough-notes.html</link><description>&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 class="reference external" href="http://bzr.coffeecode.net/unicorn2evergreen"&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 class="reference external" href="http://library.upei.ca/"&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're posted
to this bzr repository called
&lt;a class="reference external" href="http://bzr.coffeecode.net/unicorn2evergreen"&gt;unicorn2evergreen&lt;/a&gt;&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p class="first"&gt;Export bibliographic records from Unicorn using Unicorn'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 &amp;quot;flexkey&amp;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;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;For each item, export call number / barcode / owning library /
current location / home location / item type using the catalog key as
the identifier.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Set up the organization unit hierarchy on your Evergreen system. You
can dump it from an existing Evergreen system into a file named
&amp;quot;orgunits.dump&amp;quot; like so:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
pg_dump -U evergreen --data-only --table actor.org_unit_type \    --table actor.org_unit &amp;gt; orgunits.sql
&lt;/pre&gt;
&lt;p&gt;Then drop all of the existing org_units and org_unit_types and
load your custom data in a psql session:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
BEGIN;SET CONSTRAINTS ALL DEFERRED;DELETE FROM actor.org_unit;DELETE FROM actor.org_unit_type;\i orgunits.sqlCOMMIT
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Import bibliographic records using the &lt;a class="reference external" href="http://open-ils.org/dokuwiki/doku.php?id=evergreen-admin:importing:bibrecords"&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;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&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;/p&gt;
&lt;pre class="literal-block"&gt;
SELECT setval('biblio.autogen_tcn_value_seq',     (select max(id) from biblio.record_entry) + 100);SELECT setval('biblio.record_entry_id_seq',     (select max(id) from biblio.record_entry) + 100);
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Process holdings records.&lt;/p&gt;
&lt;/p&gt;&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p class="first"&gt;Call numbers might have MARC8 encoded characters, so process'em
and convert to UTF8. Theoretically &amp;quot;yaz-iconv -f MARC-8 -t UTF-8 &amp;lt;
holdings.lst &amp;gt; holdings_utf8.lst&amp;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's packaged
version (0.6c3). So:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
wget http://pypi.python.org/packages/2.4/s/setuptools/setuptools-0.6c9-py2.4.eggsudo sh setuptools-0.6c9-py2.4.eggsudo easy_install pymarc
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Now actually generate the 'holdings_utf8.lst' file.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
cat holdings.lst | python marc8_to_utf8.py
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&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;/p&gt;
&lt;pre class="literal-block"&gt;
python parse_unicorn.py
&lt;/pre&gt;
&lt;/p&gt;&lt;p&gt;Note that the holdings data for the item with barcode
30007007751786 didn't process cleanly and won't load. Weird -
possibly a corrupt character in the item data? Augh, no - there
are flexkeys and callnumbers that contain '|' characters (16
occurrences for &amp;quot;|z&amp;quot;, 37 for &amp;quot;|b&amp;quot;), which is of course also what
we are using as our delimiters. ARGH. I deleted it for now with:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
grep -v '|z' holdings_utf8.lst &amp;gt; holdings_clean.lstgrep -v '|z' holdings_clean.lst &amp;gt; holdings_clean.lst2mv holdings_clean.lst2 holdings_clean.lst
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;&lt;p&gt;Adjust parse_unicorn.py to match the new input name and generate
a new holdings_eg.sql.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Create the import staging table:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
psql -f Open-ILS/src/extras/import/import_staging_table.sql
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Load the items into the import staging table:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
psql -f holdings_eg_clean.sql
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;&lt;p&gt;We discover that some more of our data sucks - for example, one item
(&amp;quot;Research in autism spectrum disorders&amp;quot;, HIRC PER-WEB) has a create
date of '0' which is not a valid date format because the barcode is
&amp;quot;1750-9467|21&amp;quot;. For now, grep it out as above and reload.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Investigate possibilities of collapsing unnecessary duplicate item
types:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
SELECT item_type, COUNT(item_type)FROM staging_itemsGROUP BY item_typeORDER 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;
&lt;/p&gt;&lt;p&gt;How about locations?&lt;/p&gt;
&lt;pre class="literal-block"&gt;
SELECT location, COUNT(location)FROM staging_itemsGROUP BY locationORDER BY location;  location  | count  ------------+-------- ALGO-ACH   |     13 ALGO-ATLAS |    148 ALGO-AV    |   1837...(212 rows)
&lt;/pre&gt;
&lt;/p&gt;&lt;p&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;/p&gt;
&lt;pre class="literal-block"&gt;
UPDATE staging_itemsSET item_type = 'BOOK'WHERE item_type IN ('BOOKS', 'BOOK_ART', 'BOOK_RARE', 'BOOK_SHWK', 'BOOK_WEB', 'REF-BOOK');
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Update legacy library names to new Evergreen library short names
(we'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're splitting the DESMARAIS
collection into multiple org-units (Music Resource Centre, Hearst
locations, hospital locations, etc).&lt;/p&gt;
&lt;pre class="literal-block"&gt;
-- Laurentian Music Resource CentreUPDATE staging_itemsSET owning_lib = 'LUMUSIC'WHERE location = 'DESM-MRC';-- Hearst - Kapuskasing locationUPDATE staging_itemsSET owning_lib = 'KAP'WHERE location LIKE 'HRSTK%';-- Hearst - Timmins locationUPDATE staging_itemsSET owning_lib = 'TIMMINS'WHERE location LIKE 'HRSTT%';
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Generate the copies in the system:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
psql -f generate_copies.sql
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Make the metarecords:&lt;/p&gt;
&lt;pre class="literal-block"&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't have associated
copies) won't appear. Check for 856 40 and change the bre source to a
transcendent one mayhaps?&lt;/p&gt;
&lt;pre class="literal-block"&gt;
-- Create a new transcendant resource; -- this autogenerates an ID of 4 in a default, untouched systemINSERT INTO config.bib_source (quality, source, transcendant)VALUES (10, 'Electronic resource', 't');-- Make the electronic full text resources (856 40) transcendant-- by setting their bib record source to the new bib_source value of 4UPDATE biblio.record_entry SET source = 4 WHERE id IN (    SELECT DISTINCT(record)     FROM metabib.full_rec     WHERE tag = '856' AND ind1 = '4' AND ind2 = '0');
&lt;/pre&gt;
&lt;p&gt;And no transcendence. Hmm. Oh well, worry about that later.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sun, 08 Feb 2009 21:32:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2009-02-08:/unicorn-to-evergreen-migration-rough-notes.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Evergreen Exposed: introduction to Evergreen development (OLA 2009)</title><link>https://coffeecode.net/evergreen-exposed-introduction-to-evergreen-development-ola-2009.html</link><description>&lt;p&gt;&lt;strong&gt;Update 2009-02-19&lt;/strong&gt;: uploaded diffs from Evergreen 1.4.0.2
(&lt;a class="reference external" href="/uploads/files/EG_exposed.tar.gz"&gt;EG_exposed.tar.gz&lt;/a&gt;)
for adding details to record summary; and Bill Erickson's slides and
code examples are &lt;a class="reference external" href="http://acq.open-ils.org/~erickson/berick_ola.zip"&gt;also available for
download&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The slides: &lt;a class="reference external" href="/uploads/talks/2009/Evergreenexposed.odp"&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 “take
attendees on a tour of the architecture and source code of the
&lt;a class="reference external" href="http://evergreen-ils.org"&gt;Evergreen library system&lt;/a&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 class="reference external" href="http://evergreen-ils.org/listserv.php"&gt;Evergreen mailing
lists&lt;/a&gt; to ensure that we would
satisfy our target audience's interests.&lt;/p&gt;
&lt;div class="section" id="dan-starts-with-the-basics"&gt;
&lt;h2&gt;Dan starts with the basics&lt;/h2&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'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 class="reference external" href="/archives/181-Adding-a-new-metadata-format-to-Evergreen-in-a-dozen-lines-of-code.html"&gt;adding a new metadata export
format&lt;/a&gt;
that brought the Federal Geographic Data Committee's Content Standard
for Geospatial Data Metadata (&lt;a class="reference external" href="http://www.fgdc.gov/metadata/csdgm/"&gt;FGDC
CSGDM&lt;/a&gt;) format to Evergreen's
existing list of supported formats. On the one hand: big deal, another
metadata format. Hold that thought in that one hand; we'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'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's a lot of
&lt;a class="reference external" href="http://www.loc.gov/standards/mods"&gt;MODS&lt;/a&gt;, a little bit of
JavaScript, a smidgin of XPath, a dollop of Evergreen'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's part of the show...&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="bill-leads-us-into-the-promised-land"&gt;
&lt;h2&gt;Bill leads us into the promised land&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; I'll update this with a link to Bill's slides when he manages
to post them!&lt;/p&gt;
&lt;p&gt;Bill gave a quick &amp;quot;big picture&amp;quot; view of how OpenSRF operates, including
a much clearer overview of Evergreen'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'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'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 class="reference external" href="http://dojotoolkit.org"&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 alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sun, 01 Feb 2009 20:21:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2009-02-01:/evergreen-exposed-introduction-to-evergreen-development-ola-2009.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Project Conifer update session at OLA SuperConference 2009</title><link>https://coffeecode.net/project-conifer-update-session-at-ola-superconference-2009.html</link><description>&lt;p&gt;&lt;strong&gt;*Updated&lt;/strong&gt; 2009-02-02 to add PDF formatted slides because the &lt;a class="reference external" href="http://go-oo.org"&gt;free
and libre formats&lt;/a&gt; just isn't good enough for some
people - heh*&lt;/p&gt;
&lt;p&gt;The slides, up front and center:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="/uploads/talks/2009/OLA2009Coniferupdate.odp"&gt;OpenOffice Impress format
(ODP)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="/uploads/talks/2009/OLA2009Coniferupdate.pdf"&gt;Portable Document Format
(PDF)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Last year I &lt;a class="reference external" href="/archives/149-The-State-of-Evergreen-OLA-Presentation.html"&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 class="reference external" href="http://libgrunt.blogspot.com"&gt;John Fink&lt;/a&gt; and I gave an update on the
state of &lt;a class="reference external" href="http://conifer.mcmaster.ca"&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'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 alt=":-)" class="emoticon" src="/images/smile.png" /&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 &amp;quot;interesting times&amp;quot; for academic libraries -
this week an announcement has been rippling through the Ontario library
community that the &lt;a class="reference external" href="http://bibliocentre.ca"&gt;BiblioCentre&lt;/a&gt; consortial
library system that has served many Ontario college libraries since 2003
is being shut down. If Evergreen'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'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's capabilities (&amp;quot;our&amp;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 class="reference external" href="http://esilibrary.com"&gt;Equinox Software
Incorporated&lt;/a&gt; gave Project Conifer
participants a demo of the current state of acquisitions on Wednesday
night, and it'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's contractors is working on adding EDI support. So we'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 class="reference external" href="http://www.innisfil.library.on.ca/tsuga/"&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'm happy to do as good a
job as I can to represent an objective look at the project - for one
thing, it's my job as project manager - and I hope that in some small
way I've been able to help others prepare for similar projects.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 30 Jan 2009 16:28:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2009-01-30:/project-conifer-update-session-at-ola-superconference-2009.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Adding a new metadata format to Evergreen in a dozen lines of code</title><link>https://coffeecode.net/adding-a-new-metadata-format-to-evergreen-in-a-dozen-lines-of-code.html</link><description>&lt;p&gt;Just like my &lt;a class="reference external" href="/archives/180-Fetching-item-availability-from-Evergreen-using-the-OpenSRF-HTTP-gateway.html"&gt;last
entry&lt;/a&gt;,
this is a preview of one part of my upcoming session at the OLA
SuperConference, &lt;a class="reference external" href="http://www.accessola.com/superconference2009/showSession.php?lsession=1017&amp;amp;usession=1017"&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're going to be
looking at adding support for an entirely new metadata format to
Evergreen.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://article.gmane.org/gmane.education.libraries.open-ils.devel/2366/match=fgdc"&gt;Back in November,
2008&lt;/a&gt;,
George Duimovich requested &amp;quot;I would like to hear from anyone on the
process for adding an additional supported format&amp;quot; in the specific
context of the &lt;a class="reference external" href="http://www.fgdc.gov/"&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 class="reference external" href="http://ir.library.oregonstate.edu/dspace/handle/1957/16"&gt;XSLT
stylesheet&lt;/a&gt;
that the inestimable &lt;a class="reference external" href="http://oregonstate.edu/~reeset/"&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;
&lt;/p&gt;&lt;p&gt;Assuming that we can get over the licensing hump, it should be a&lt;/p&gt;
&lt;p&gt;relatively straightforward matter of dropping the transform into&lt;/p&gt;
&lt;p&gt;Open-ILS/src/perlmods/OpenILS/Application/SuperCat.pm and&lt;/p&gt;
&lt;p&gt;Open-ILS/src/perlmods/OpenILS/WWW/SuperCat/Feed.pm (using something&lt;/p&gt;
&lt;p&gt;like MODS32 as a template).&lt;/p&gt;
&lt;p&gt;&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;
&lt;p&gt;Without further ado, following are the diffs required to roughly support
FGDC as a SuperCat format:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
dbs&amp;#64;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)&amp;#64;&amp;#64; -143,6 +143,18 &amp;#64;&amp;#64;    # and stash a transformer    $record_xslt{rss2}{xslt} = $_xslt-&amp;gt;parse_stylesheet( $rss_xslt ); +   # parse the FGDC xslt ...+   my $fgdc_xslt = $_parser-&amp;gt;parse_file(+       OpenSRF::Utils::SettingsClient+          -&amp;gt;new+           -&amp;gt;config_value( dirs =&amp;gt; 'xsl' ).+        &amp;quot;/MARC21slim2FGDC.xsl&amp;quot;+  );+  # and stash a transformer+   $record_xslt{fgdc}{xslt} = $_xslt-&amp;gt;parse_stylesheet( $fgdc_xslt );+  $record_xslt{fgdc}{docs} = 'http://www.fgdc.gov/metadata/csdgm/index_html';+ $record_xslt{fgdc}{schema_location} = 'http://www.fgdc.gov/metadata/fgdc-std-001-1998.xsd';+  register_record_transforms();     return 1;
&lt;/pre&gt;
&lt;p&gt;If you're still with me after that whack of code, and you're counting,
that's about 12 lines of code. Okay, I'm cheating - the diff doesn't
include the MARC21 to FGDC stylesheet - for one thing, I'm still waiting
to see a version of the stylesheet with a license attached to it. For
another, do you _really_ 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'll be able to take advantage of the new functionality.
That's it!&lt;/p&gt;
&lt;p&gt;What'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 class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://localhost/opac/extras/supercat/formats/record"&gt;http://localhost/opac/extras/supercat/formats/record&lt;/a&gt; - list of
supported record formats&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://localhost/opac/extras/supercat/retrieve/fgdc/record/1"&gt;http://localhost/opac/extras/supercat/retrieve/fgdc/record/1&lt;/a&gt; -
display record #1 in FGDC format&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://localhost/opac/extras/unapi?id=tag:localhost,2009:biblio-record_entry/1"&gt;http://localhost/opac/extras/unapi?id=tag:localhost,2009:biblio-record_entry/1&lt;/a&gt;
- display the record formats that unAPI can return&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://localhost/opac/extras/unapi?id=tag:localhost,2009:biblio-record_entry/1&amp;amp;format=fgdc"&gt;http://localhost/opac/extras/unapi?id=tag:localhost,2009:biblio-record_entry/1&amp;amp;format=fgdc&lt;/a&gt;
- 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'm guessing wildly
here), perhaps it'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 class="reference external" href="http://www.postgis.org"&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'm sure the same approach could be used for other specialized metadata
formats. This is just one example of why I'm sold on Evergreen's
capability as a platform for the future of our library.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 26 Jan 2009 05:29:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2009-01-26:/adding-a-new-metadata-format-to-evergreen-in-a-dozen-lines-of-code.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Fetching item availability from Evergreen using the OpenSRF HTTP gateway</title><link>https://coffeecode.net/fetching-item-availability-from-evergreen-using-the-opensrf-http-gateway.html</link><description>&lt;p&gt;This is a preview of one part of my upcoming session at the OLA
SuperConference, &lt;a class="reference external" href="http://www.accessola.com/superconference2009/showSession.php?lsession=1017&amp;amp;usession=1017"&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 &amp;quot;How do I retrieve the
availability of copies for a given work at my institution?&amp;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;div class="section" id="learning-from-the-old-masters-how-the-evergreen-opac-does-it"&gt;
&lt;h2&gt;Learning from the old masters: how the Evergreen OPAC does it&lt;/h2&gt;
&lt;p&gt;The Evergreen OPAC itself relies heavily on JavaScript to dynamically
flesh out item details and retrieve item status, so it's actually pretty
easy to work out how to do this without even delving too deeply into
OpenSRF. First, let's use the &lt;a class="reference external" href="http://www.getfirebug.com/"&gt;Firebug&lt;/a&gt;
Mozilla extension to follow network requests for a given &amp;quot;title details&amp;quot;
page in the OPAC search results for the title: &lt;a class="reference external" href="http://dev.gapines.org/opac/en-US/skin/default/xml/rdetail.xml?r=8526&amp;amp;t=beer&amp;amp;tp=keyword&amp;amp;d=0&amp;amp;hc=33&amp;amp;rt=keyword"&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
&lt;a class="reference external" href="http://dev.gapines.org/osrf-gateway-v1"&gt;http://dev.gapines.org/osrf-gateway-v1&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;POST request #1 parameters&lt;/strong&gt;&lt;/p&gt;
&lt;ul class="simple"&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;
&lt;/p&gt;
&lt;p&gt;&lt;p&gt;This is how we retrieve the title / author / ISBN and other
bibliographic details of interest for display; as we're talking about
a decoupled discovery layer, we won't need to worry about this piece
of the puzzle.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;POST request #2 parameters&lt;/strong&gt;&lt;/p&gt;
&lt;ul class="simple"&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;
&lt;/p&gt;&lt;p&gt;This is how we retrieve the list of all possible copy statuses that
have been configured for this Evergreen system; here's the response
(truncated for legibility):&lt;/p&gt;
&lt;pre class="literal-block"&gt;
{   &amp;quot;status&amp;quot; : 200,   &amp;quot;payload&amp;quot; : [      [         {            &amp;quot;__c&amp;quot; : &amp;quot;ccs&amp;quot;,            &amp;quot;__p&amp;quot; : [               null, null, null, &amp;quot;f&amp;quot;, 3, &amp;quot;Lost&amp;quot;, &amp;quot;f&amp;quot;            ]         },         {            &amp;quot;__c&amp;quot; : &amp;quot;ccs&amp;quot;,            &amp;quot;__p&amp;quot; : [               null, null, null, &amp;quot;t&amp;quot;, 0, &amp;quot;Available&amp;quot;, &amp;quot;t&amp;quot;            ]         },         {            &amp;quot;__c&amp;quot; : &amp;quot;ccs&amp;quot;,            &amp;quot;__p&amp;quot; : [               null, null, null, &amp;quot;t&amp;quot;, 1, &amp;quot;Checked out&amp;quot;, &amp;quot;t&amp;quot;            ]         },         {            &amp;quot;__c&amp;quot; : &amp;quot;ccs&amp;quot;,            &amp;quot;__p&amp;quot; : [               null, null, null, &amp;quot;f&amp;quot;, 2, &amp;quot;Bindery&amp;quot;, &amp;quot;t&amp;quot;            ]         }      ]   ]}
&lt;/pre&gt;
&lt;p&gt;We're getting a response in JavaScript Object Notation
(&lt;a class="reference external" href="http://www.json.org"&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;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;POST request #3 parameters&lt;/strong&gt;&lt;/p&gt;
&lt;ul class="simple"&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;
&lt;/p&gt;&lt;p&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 (&amp;quot;8526&amp;quot;), the
numeric ID of the organization being searched (&amp;quot;1&amp;quot; = &amp;quot;every branch&amp;quot;),
and the depth of the organization (&amp;quot;0&amp;quot; = top of the hierarchy). The
response for this request is:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
{   &amp;quot;status&amp;quot; : 200,   &amp;quot;payload&amp;quot; : [      [         [            &amp;quot;127&amp;quot;,            &amp;quot;663.42 JACKSON, MICHAEL&amp;quot;,            {               &amp;quot;0&amp;quot; : 1            }         ],         [            &amp;quot;130&amp;quot;,            &amp;quot;663.42 JACKSON, MICHAEL&amp;quot;,            {               &amp;quot;0&amp;quot; : 1            }         ],         [            &amp;quot;125&amp;quot;,            &amp;quot;663.42 JACKSON, MICHAEL&amp;quot;,            {               &amp;quot;0&amp;quot; : 1            }         ],         [            &amp;quot;34&amp;quot;,            &amp;quot;R 641.23 JACKSON, MICHAEL&amp;quot;,            {               &amp;quot;0&amp;quot; : 1            }         ]      ]   ]}
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="interpreting-the-http-requests-and-responses"&gt;
&lt;h2&gt;Interpreting the HTTP requests and responses&lt;/h2&gt;
&lt;p&gt;Okay, so we'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 &amp;quot;ccs&amp;quot;) in Evergreen's intermediate definition
language file &lt;strong&gt;/openils/conf/fm_IDL.xml&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;lt;class id=&amp;quot;ccs&amp;quot; controller=&amp;quot;open-ils.cstore&amp;quot;   oils_obj:fieldmapper=&amp;quot;config::copy_status&amp;quot; oils_persist:tablename=&amp;quot;config.copy_status&amp;quot;&amp;gt;  &amp;lt;fields oils_persist:primary=&amp;quot;id&amp;quot; oils_persist:sequence=&amp;quot;config.copy_status_id_seq&amp;quot;&amp;gt;    &amp;lt;field name=&amp;quot;isnew&amp;quot; oils_obj:array_position=&amp;quot;0&amp;quot; oils_persist:virtual=&amp;quot;true&amp;quot; /&amp;gt;    &amp;lt;field name=&amp;quot;ischanged&amp;quot; oils_obj:array_position=&amp;quot;1&amp;quot; oils_persist:virtual=&amp;quot;true&amp;quot; /&amp;gt;    &amp;lt;field name=&amp;quot;isdeleted&amp;quot; oils_obj:array_position=&amp;quot;2&amp;quot; oils_persist:virtual=&amp;quot;true&amp;quot; /&amp;gt;    &amp;lt;field name=&amp;quot;holdable&amp;quot; oils_obj:array_position=&amp;quot;3&amp;quot;       oils_persist:virtual=&amp;quot;false&amp;quot; reporter:datatype=&amp;quot;bool&amp;quot;/&amp;gt;    &amp;lt;field name=&amp;quot;id&amp;quot; oils_obj:array_position=&amp;quot;4&amp;quot;       oils_persist:virtual=&amp;quot;false&amp;quot; reporter:selector=&amp;quot;name&amp;quot; reporter:datatype=&amp;quot;id&amp;quot;/&amp;gt;    &amp;lt;field name=&amp;quot;name&amp;quot; oils_obj:array_position=&amp;quot;5&amp;quot;       oils_persist:virtual=&amp;quot;false&amp;quot;  reporter:datatype=&amp;quot;text&amp;quot; oils_persist:i18n=&amp;quot;true&amp;quot;/&amp;gt;    &amp;lt;field name=&amp;quot;opac_visible&amp;quot; oils_obj:array_position=&amp;quot;6&amp;quot;       oils_persist:virtual=&amp;quot;false&amp;quot; reporter:datatype=&amp;quot;bool&amp;quot;/&amp;gt;  &amp;lt;/fields&amp;gt;
&lt;/pre&gt;
&lt;p&gt;So now, by taking our first steps into Evergreen'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 &amp;quot;isnew&amp;quot;, &amp;quot;ischanged&amp;quot;, &amp;quot;isdeleted&amp;quot;, &amp;quot;holdable&amp;quot;,
&amp;quot;id&amp;quot;, &amp;quot;name&amp;quot;, and &amp;quot;opac_visible&amp;quot;. As for the response from the
copy_counts.summary call, well, these are not Evergreen objects (they
don't have a &lt;strong&gt;__c&lt;/strong&gt; class hint) - but you can use the OpenSRF shell
&amp;quot;srfsh&amp;quot; introspect command to view the documentation for the applicable
method:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
bash$ srfshsrfsh# introspect open-ils.search... (truncated for legibility) ...Received Data: {  &amp;quot;__c&amp;quot;:&amp;quot;OpenILS_Application&amp;quot;,  &amp;quot;__p&amp;quot;:{    &amp;quot;api_level&amp;quot;:1,    &amp;quot;stream&amp;quot;:0,    &amp;quot;object_hint&amp;quot;:&amp;quot;OpenILS_Application_Search_Biblio&amp;quot;,    &amp;quot;package&amp;quot;:&amp;quot;OpenILS::Application::Search::Biblio&amp;quot;,    &amp;quot;remote&amp;quot;:0,    &amp;quot;api_name&amp;quot;:&amp;quot;open-ils.search.biblio.copy_counts.summary.retrieve&amp;quot;,    &amp;quot;signature&amp;quot;:{      &amp;quot;params&amp;quot;:[              ],      &amp;quot;desc&amp;quot;:&amp;quot;returns an array of these: [         org_id,         callnumber_label,         ,         ,        ...      ]       where statusx is a copy status name.  the statuses are sorted by id.&amp;quot;,      &amp;quot;return&amp;quot;:{        &amp;quot;desc&amp;quot;:null,        &amp;quot;type&amp;quot;:null,        &amp;quot;class&amp;quot;:null      }          },    &amp;quot;server_class&amp;quot;:&amp;quot;open-ils.search&amp;quot;,    &amp;quot;notes&amp;quot;:&amp;quot;\treturns an array of these:\n\t\t[       org_id,       callnumber_label,       ,       ,      ...    ]    \n\t\twhere statusx is a copy status name.  the statuses are sorted\n\t\tby id.\n&amp;quot;,    &amp;quot;method&amp;quot;:&amp;quot;copy_count_summary&amp;quot;,    &amp;quot;argc&amp;quot;:0  }
&lt;/pre&gt;
&lt;p&gt;The introspect output is a bit rough - it's really intended for the
&lt;a class="reference external" href="http://dev.gapines.org/opac/extras/docgen.xsl?service=open-ils.search&amp;amp;param=%22copy_counts.summary.retrieve%22"&gt;doxygen API help
interface&lt;/a&gt;
- but it's good enough for our purposes. If we want to dig into what's
going on under the covers, we can follow the package_name value
&amp;quot;OpenILS::Application::Search::Biblio&amp;quot; to read the source code for the
&lt;a class="reference external" href="http://svn.open-ils.org/trac/ILS/browser/branches/rel_1_4/Open-ILS/src/perlmods/OpenILS/Application/Search/Biblio.pm"&gt;OpenILS::Application::Search::Biblio&lt;/a&gt;
Perl module, and look up the method &amp;quot;copy_count_summary&amp;quot; as indicated
by the &amp;quot;method&amp;quot; value in the introspect output. That reveals that the
input arguments are &amp;quot;($self, $client, $rid, $org, $depth)&amp;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;/div&gt;
&lt;div class="section" id="zeroing-in-on-the-copies-for-a-particular-library-or-library-system"&gt;
&lt;h2&gt;Zeroing in on the copies for a particular library or library system&lt;/h2&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 class="reference external" href="http://dev.gapines.org/osrf-gateway-v1?service=open-ils.search&amp;amp;method=open-ils.search.biblio.copy_counts.summary.retrieve&amp;amp;locale=en-US&amp;amp;param=8526&amp;amp;param=125&amp;amp;param=2"&gt;just org_unit ID
&amp;quot;125&amp;quot; at depth
&amp;quot;2&amp;quot;&lt;/a&gt;,
we narrow down our results to a single hit:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
{   &amp;quot;status&amp;quot; : 200,   &amp;quot;payload&amp;quot; : [      [         [            &amp;quot;125&amp;quot;,            &amp;quot;663.42 JACKSON, MICHAEL&amp;quot;,            {               &amp;quot;0&amp;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;/div&gt;
&lt;div class="section" id="frequently-used-tools-and-methods-for-evergreen-opensrf-hacking"&gt;
&lt;h2&gt;Frequently used tools and methods for Evergreen / OpenSRF hacking&lt;/h2&gt;
&lt;p&gt;Note, the first: you can easily play with different parameter values for
the HTTP POST requests using the
&lt;a class="reference external" href="http://curl.haxx.se/%3Ecurl%3C/a%3E%20command.%20If%20you%20have%20a%20recent%20version%20of%20the%20Perl%20JSON::XS%20module%20installed,%20you%20can%20pipe%20the%20output%20from%20curl%20to%20%3Ca%20href="&gt;json_xs&lt;/a&gt;
command to pretty print the JSON response:&lt;/p&gt;
&lt;pre class="literal-block"&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 class="reference external" href="http://dev.gapines.org/osrf-gateway-v1?service=open-ils.search&amp;amp;method=open-ils.search.biblio.copy_counts.summary.retrieve&amp;amp;locale=en-US&amp;amp;param=8526"&gt;a single URL like
this&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 20 Jan 2009 15:57:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2009-01-20:/fetching-item-availability-from-evergreen-using-the-opensrf-http-gateway.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Making Skype work in a Windows XP VirtualBox guest instance</title><link>https://coffeecode.net/making-skype-work-in-a-windows-xp-virtualbox-guest-instance.html</link><description>&lt;p&gt;If you, like me, install Skype in a Windows XP VirtualBox guest instance
running on an Ubuntu host on a ThinkPad T60 with an Intel 2300 dual-core
32-bit processor, it might throw Windows exceptions and generate error
reports as reported in &lt;a class="reference external" href="http://www.virtualbox.org/ticket/1710"&gt;VirtualBox ticket
#1710&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you then go into your ThinkPad BIOS and enable the virtualization
extensions (under the Config-&amp;gt;CPU menu) and reboot your Ubuntu host, you
might get the same problem again. I'll tell you right now that the
problem is that you need to power off your system after changing the
BIOS option, rather than deciding to just &lt;strong&gt;Save and Exit&lt;/strong&gt; with an
immediate reboot.&lt;/p&gt;
&lt;p&gt;You might then try loading the KVM module with the Intel extensions to
test whether your system actually does have the Intel virtualization
extensions enabled - and you might get a FATAL: Error inserting
kvm_intel
(/lib/modules/2.6.27-9-generic/kernel/drivers/kvm/kvm-intel.ko):
Operation not supported error message. Perhaps you'll end up consulting
a page like the &lt;a class="reference external" href="https://wiki.ubuntu.com/kvm"&gt;Ubuntu KVM wiki entry&lt;/a&gt;
and think &amp;quot;Man, I'm doing everything right... what's going on?&amp;quot;; you
then re-read the VirtualBox ticket #1710 and decide to try updating the
BIOS on your laptop just in case it has some problem enabling the
virtualization extensions.&lt;/p&gt;
&lt;p&gt;Huzzah! After updating the BIOS, you can then load the kvm and kvm-intel
modules. (Aside: this has nothing to do with the updated BIOS, and
everything to do with the enforced power-off cycle that comes with the
update process.) You triumphantly fire up your Windows XP VirtualBox
guest instance, ready to get Skype going, and... the image won't even
boot, dying with the horrible error: VirtualBox can't operate in VMX
root mode. VBox status code: -4011 (VERR_VMX_IN_VMX_ROOT_MODE).
What the...? You do a bit more searching of the forums, and all of the
solutions (like &lt;a class="reference external" href="https://bugs.launchpad.net/ubuntu/+source/virtualbox-ose/+bug/292588"&gt;Ubuntu bug
292588&lt;/a&gt;)
tell you to disable KVM. By this time, you're thoroughly confused and
have convinced yourself that KVM is necessary for the virtualization
extension that will satisfy Skype.&lt;/p&gt;
&lt;p&gt;Eventually, you rmmod kvm-intel and try VirtualBox again - and much to
your surprise, the image loads and Skype is stable. Huzzah! (Aside: this
is because VirtualBox uses its own kernel module, vboxdrv.ko, for
virtualization support, and the kvm / kvm-intel kernel modules won't
co-exist with that... so your little test to see if the virtualization
extensions were working ended up preventing your virtualization
application from working.)&lt;/p&gt;
&lt;p&gt;I'm sure you're wondering why I was going to all of this effort to get
Skype running on a virtual machine in the first place, when there's a
native package for Ubuntu available that works. The punch line to all of
this is that I convinced my mom to start using Skype as a backup for
when her phone line goes dead (which it does, all too often), but for
some really weird reason I haven't been able to find her as a contact in
the Linux Skype client, even though I know her exact user ID. On a
hunch, I wanted to try searching for her in a Windows Skype client. And
you know what?&lt;/p&gt;
&lt;p&gt;I was able to get exactly one hit, the right result, under the Windows
Skype client. That is both baffling and frustrating. Skype is both a
proprietary application and service and there's nothing I can do to fix
the search problem. It seems that Skype's APIs are messed up enough that
they can't even support a simple search reliably on a cross-platform
basis. Hopefully that doesn't carry over to, say, being unable to
maintain an accurate count of your credit balance.&lt;/p&gt;
&lt;p&gt;Ah well. I don't think that the open source alternatives like
&lt;a class="reference external" href="http://ekiga.org"&gt;Ekiga&lt;/a&gt; or &lt;a class="reference external" href="http://qutecom.org"&gt;QuteCom&lt;/a&gt; are
solutions yet for my Mom's needs; we need the service to match the
application. Maybe in a parallel universe Skype's services would support
any SIP client, and their contact search API would be open. But in this
universe, I have both learned how to properly enable virtualization
extension support in VirtualBox on Ubuntu and I have finally added my
Mom as a contact in a proprietary application / service. That's good
enough for today.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update a few minutes later:&lt;/strong&gt; Hmm, looks like
&lt;a class="reference external" href="http://tpad.com"&gt;Tpad&lt;/a&gt; might be close to the service that I'm
looking for... Perhaps I'll follow up later with a report.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 06 Jan 2009 04:23:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2009-01-06:/making-skype-work-in-a-windows-xp-virtualbox-guest-instance.html</guid><category>misc</category><category>Coding</category></item><item><title>Just in time delivery - Arik Nathan</title><link>https://coffeecode.net/just-in-time-delivery-arik-nathan.html</link><description>&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/arik/arik_solo.jpg"&gt;&lt;img alt="image0" class="serendipity-image-left" src="/uploads/pics/arik/arik_solo.serendipityThumb.jpg" style="width: 110px; height: 83px;" /&gt;&lt;/a&gt;49 minutes before Christmas, Arik Nathan Kabaroff-Scott was
born - much to the delight of his mother. Well, and father too, but some
of us are pickier about avoiding holidays as birth dates than others...
Arik weighed in at 8 pounds 11 ounces, and was 23 inches long, although
his bulk belied the long slender toes and fingers that he came equipped
with. Perhaps we have a future bass player in our midst?&lt;/p&gt;
&lt;p&gt;There was much relief on the Kabaroff side of the family as it was
revealed that Arik did not inherit his father's webbed toes. He
definitely has his mother's ears, at least as far as attached vs.
detached goes.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/arik/fam_damily.jpg"&gt;&lt;img alt="image1" class="serendipity-image-left" src="/uploads/pics/arik/fam_damily.serendipityThumb.jpg" style="width: 110px; height: 83px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So far, Arik has been exceedingly kind to his parents, sleeping for two
and three hours at a time, eating well, and generally being everything
we could hope for. He's healthy and seems happy.&lt;/p&gt;
&lt;p&gt;Big sister Amber has adjusted quite well to her new brother. On her
first visit to see Arik in the hospital, she commented on his tiny toes
and ears, and sang him a lullaby that she had been practicing for months
in advance. Although her Mommy, Daddy, and new brother spent Christmas
Day in the hospital, Santa conveniently waited until a few days later to
arrive at home. And luckily Grandma was on hand to help Amber cope at
home for a few days.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/arik/arik_daddy.jpg"&gt;&lt;img alt="image2" class="serendipity-image-left" src="/uploads/pics/arik/arik_daddy.serendipityThumb.jpg" style="width: 110px; height: 83px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Daddy and Arik are getting along rather well, although Daddy has already
been taught the hard way one of the major differences between changing a
little girl's diaper and a little boy's diaper. Although Daddy's first
instinct was to duck and cover, apparently the opposite order of
operations is advised...&lt;/p&gt;
&lt;p&gt;Mommy is doing quite well recovering at home and bonding with Arik. It's
certainly a big adjustment from working on the thesis!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt; Daddy apologizes for the delayed announcement and pictures and
thanks everyone for their kind wishes. It's been a little bit busy
around here... &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 29 Dec 2008 18:54:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2008-12-29:/just-in-time-delivery-arik-nathan.html</guid><category>Family</category><category>Arik</category></item><item><title>In which my words also appear elsewhere</title><link>https://coffeecode.net/in-which-my-words-also-appear-elsewhere.html</link><description>&lt;p&gt;I'm excited to announce the availability of my &lt;a class="reference external" href="http://www.academicmatters.ca/bloggers.bookends.gk?catalog_item_id=1213"&gt;first
post&lt;/a&gt;
as an invited contributor to the &lt;strong&gt;More than Bookends&lt;/strong&gt; blog over at the
revamped &lt;a class="reference external" href="http://www.academicmatters.ca"&gt;Academic Matters&lt;/a&gt; web site.
My fellow contributors are Anne Fullerton and Amy Greenberg, and I'm
delighted to be included with them in our appointed task of writing
about the position of the librarian in the academy. My focus at Academic
Matters is going to be less &amp;quot;hardcore geek&amp;quot; and more approachable to a
general audience of &amp;quot;understanding systems librarians in the university:
what we do for you&amp;quot;. You can always get your hardcore geek fix here at
Coffee|Code. Here's a snippet from my first post to give you a feel for
what I'm talking about:&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;p&gt;... Stefano Mazzochi has some interesting ideas about &lt;a class="reference external" href="http://www.betaversion.org/~stefano/linotype/news/146/"&gt;the impact of
interruption on
creativity&lt;/a&gt;
with which I concur. I'm in demand for services both great and
small, and it often feels like I'm making no significant progress in
any area. This leads directly to &lt;em&gt;tenure deficit disorder&lt;/em&gt;, a new
condition of anxiety about one's potential for future employment
within one's institution...&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;If you want to read more, come on over to the &lt;a class="reference external" href="http://www.academicmatters.ca/bloggers.bookends.gk?category=/blogger/bookends"&gt;More than
Bookends&lt;/a&gt;
blog and check out what Anne has to say about &lt;a class="reference external" href="http://www.academicmatters.ca/bloggers.bookends.gk?catalog_item_id=1225&amp;amp;category=/blogger/bookends"&gt;open
access&lt;/a&gt;
and what Amy has to say about the everything-old-is-new-again theme of
&lt;a class="reference external" href="http://www.academicmatters.ca/bloggers.bookends.gk?catalog_item_id=1224&amp;amp;category=/blogger/bookends"&gt;connecting with library
users&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Aside:&lt;/em&gt; Apologies for the lack of RSS feeds for the site; the blog
software that we are using still appears to be under construction. With
any luck that will be rectified soon!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 02 Dec 2008 17:50:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2008-12-02:/in-which-my-words-also-appear-elsewhere.html</guid><category>misc</category><category>Coding</category></item><item><title>Presentation: LibX and Zotero</title><link>https://coffeecode.net/presentation-libx-and-zotero.html</link><description>&lt;p&gt;Direct link to the instructional presentation on &lt;strong&gt;LibX and Zotero at
Laurentian University&lt;/strong&gt;
(&lt;a class="reference external" href="/uploads/talks/2008/Enhancingyourresearchexperience.odt"&gt;ODT&lt;/a&gt;)
(&lt;a class="reference external" href="/uploads/talks/2008/Enhancingyourresearchexperience.pdf"&gt;PDF&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;I had the pleasure of giving an instructional session to a class of
graduate students on Monday, November 24th. The topic I had been asked
to present was an extended version of the &lt;a class="reference external" href="/archives/166-Software-Freedom-Day-2008-Sudbury.html"&gt;Artificially Enhanced
Research&lt;/a&gt;
session that I gave at Software Freedom Day earlier in the year.
Apparently one faculty member was so impressed by seeing
&lt;a class="reference external" href="http://libx.org"&gt;LibX&lt;/a&gt; and &lt;a class="reference external" href="http://zotero.org"&gt;Zotero&lt;/a&gt; in action
that he pushed to make this a mandatory session for all of the graduate
students in his department. Cool! And a bit scary, too; it's one thing
to present to people who are interested in what you have to say, but
another thing when your audience is captive and have other demands on
their time.&lt;/p&gt;
&lt;p&gt;So of course it all started as poorly as possible - while plugging the
VGA cable into the projector, my laptop suddenly died. Kaput. No power,
and pressing the power button resulted in no response at all. Normally I
wouldn't sweat too much, because I usually send the presentation in
advance via email and copy it to a USB key. But this was, of course,
&lt;strong&gt;the one time&lt;/strong&gt; that I didn't take defensive measures. On top of that,
I intended to run the presentation with lots of live demos and knew that
my laptop was happily configured. Finally, I had come down with a killer
head cold the day before, and the only reason I even showed up at work
was to give this presentation - so my mind was already fuzzy (that's
what I attribute my lack of file copying precautions to).&lt;/p&gt;
&lt;p&gt;So, I went ahead with the session doing a live demo of everything on a
machine that I had never used before with an operating system (Windows
XP) that I rarely use and a keyboard layout (fr-CA) that I also rarely
use... in the throes of a virus. With my wife (she's a grad student in
the program) in attendance. Pressure much?&lt;/p&gt;
&lt;p&gt;As it turned out, things went quite well. LibX and Zotero installed
happily on the semi-locked down workstation and the only piece I
couldn't demonstrate was Zotero's integration with Word - but I was able
to vouch that it did work as one would expect and hope. In fact, doing
everything from download and install to actual use live without a net
was probably the best instructional session that the students could get
- it made all of the steps nice and concrete, and reassured them that
this wasn't something that only propeller-heads would be able to use.&lt;/p&gt;
&lt;p&gt;Most pertinent question that I wasn't able to answer at the time: &lt;em&gt;Does
Zotero offer duplicate detection and elimination?&lt;/em&gt; The right answer is
&amp;quot;it's been &lt;a class="reference external" href="https://www.zotero.org/trac/ticket/1146"&gt;on the roadmap for a
while&lt;/a&gt;, but there are no
guarantees (and I can't sign up to add that feature, sorry)&amp;quot;.&lt;/p&gt;
&lt;p&gt;Oh, and the whole laptop dying thing? Apparently your laptop battery can
act as a sort of circuit breaker - so if the laptop gets zapped by a
jolt of static electricity, the battery can disable power to the system
and protect it. After making the walk of shame to the local computer
store for support, it turned out that I simply had to remove and
reinsert the battery to enable the laptop to start drawing power again.
A good lesson to learn, I suppose, and hopefully one that I'll remember
the next time I find myself without any backups on hand in front of an
expectant class &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 25 Nov 2008 22:51:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2008-11-25:/presentation-libx-and-zotero.html</guid><category>Libraries</category><category>Coding</category></item><item><title>Evergreen 1.4.0.0 RC2 and OpenSRF 1.0.1 are out</title><link>https://coffeecode.net/evergreen-1400-rc2-and-opensrf-101-are-out.html</link><description>&lt;p&gt;As I announced on the Evergreen mailing lists last night:&lt;/p&gt;
&lt;div style="margin-left: 3em;"&gt;&lt;p&gt;One month after the first release candidate of Evergreen 1.4.0.0, the&lt;/p&gt;
&lt;p&gt;Evergreen development team is pleased to announce the availability of&lt;/p&gt;
&lt;p&gt;Evergreen 1.4.0.0, release candidate 2, from&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://open-ils.org/downloads.php"&gt;http://open-ils.org/downloads.php&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A partial overview of the changes since 1.4.0.0 RC1:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;MARC importer / exporter enhancements&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Improved support for marking long overdue items&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Z39.50 client enhancements&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;An interface for switching locales in the staff client&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Localization in every interface - although we have undoubtedly&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;p&gt;missed a few strings&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Bundled Armenian and French (Canadian) translations&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Performance improvements for new and changed item feeds&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Various staff client, build, and source tree fixes&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The complete change log between 1.4.0.0 RC1 and 1.4.0.0 RC2 can be&lt;/p&gt;
&lt;p&gt;found here:
&lt;a class="reference external" href="http://open-ils.org/downloads/ChangeLog-1.4.0.0rc1-1.4.0.0rc2"&gt;http://open-ils.org/downloads/ChangeLog-1.4.0.0rc1-1.4.0.0rc2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Please help us reach a solid 1.4.0.0 final release by testing out&lt;/p&gt;
&lt;p&gt;1.4.0.0 RC2 with the freshly released OpenSRF 1.0.1 and reporting&lt;/p&gt;
&lt;p&gt;problems, sending patches for improvements or fixes, or sending new or&lt;/p&gt;
&lt;p&gt;updated translations to the Evergreen Development mailing list.&lt;/p&gt;
&lt;p&gt;Coming soon for the 1.4.0.0 RC2 release:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;Windows staff client&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Updated install instructions at&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;p&gt;&lt;a class="reference external" href="http://open-ils.org/dokuwiki/doku.php?id=server:1.4.0.0:ubuntu804:install"&gt;http://open-ils.org/dokuwiki/doku.php?id=server:1.4.0.0:ubuntu804:install&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;VMWare image
&amp;lt;p&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;p&gt;This release has been a long time in the making, and we'd love to have
your help in testing it and flushing out bugs. Also, if you would like
to contribute a translation, this is your chance to step up! We already
have Brazilian Portugese (pt_BR), Georgian (ka), and Canadian English
(en_CA) translations in the works, along with a commitment to update
the Canadian French (fr_CA) translation. As this is the first real
round of translations for Evergreen, I fully expect that there will be
some work ahead of us to smooth out the translation process - but we
have to take the plunge some time. Many thanks to Tigran Zargaryan and
Natural Resources Canada for their respective contributions of the
Armenian (hy_AM) and Canadian French (fr_CA) translations this summer;
their willingness to be early guinea pigs for the translation process
helped immensely.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I noticed that the speedy Warren Layton &lt;a class="reference external" href="http://thebookpile.wordpress.com/2008/11/20/evergreen-14-rc2/"&gt;beat me to the
punch&lt;/a&gt;
on the blog announcement of the releases. Warren's been very helpful
with testing and suggestions for improvements to the documentation, so I
don't mind being scooped at all &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 21 Nov 2008 03:41:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2008-11-21:/evergreen-1400-rc2-and-opensrf-101-are-out.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Archive of OCLC WorldCat Policy as posted 2008-11-02</title><link>https://coffeecode.net/archive-of-oclc-worldcat-policy-as-posted-2008-11-02.html</link><description>&lt;p&gt;I noticed last night (Sunday, November 2nd, 2008) that the new and
much-anticipated / feared OCLC WorldCat Policy had been posted. As far
as the clarified terms went, I was willing to give them the benefit of
the doubt until they were actually posted. I was first alerted to the
freshly released policy by Terry Reese's &lt;a class="reference external" href="http://oregonstate.edu/~reeset/blog/archives/574"&gt;initial
analysis&lt;/a&gt; and was
fascinated by the discussion in the comments.&lt;/p&gt;
&lt;p&gt;Then I noticed this morning on the AUTOCAT mailing list (&amp;quot;&lt;a class="reference external" href="http://article.gmane.org/gmane.education.libraries.autocat/17112"&gt;OCLC New
Policy down after one
day?&lt;/a&gt;&amp;quot;)
that the new policy had been pulled and replaced by&lt;/p&gt;
&lt;blockquote&gt;
We are reconsidering some aspects of the policy. More information
will be available in the near future.&lt;/blockquote&gt;
&lt;p&gt;Very interesting. That's not even enough time for most interested
parties to read the policy and provide feedback.&lt;/p&gt;
&lt;p&gt;Luckily, I made use of Zotero last night to capture a snapshot of the
freshly released policy. So here, for your pleasure, is the &lt;a class="reference external" href="http://marc.coffeecode.net/oclc_2008_11_02/"&gt;archived
version&lt;/a&gt; (retrieved Sun
02 Nov 2008 10:24:15 PM EST according to Zotero - and how sad a
statement is that about my life that I'm cruising the library 'nets on
Sunday evenings?) of the OCLC policy that had been posted and then was
immediately yanked. I'm hoping that this helps informed discussion lead
towards a reconsidered policy that reflects direct input from OCLC
contributors.&lt;/p&gt;
&lt;p&gt;Full disclosure: my library is not an OCLC Member library, not from any
ideological stance but because I haven't had time to contribute records
yet. Kind of busy with the Evergreen thing, you know? But we pay for
WorldCat and some other OCLC services and intend to become members. On a
personal note, I think we would best be served by a plurality of
services developed using the metadata to which all of the OCLC Member
institutions contribute.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 03 Nov 2008 14:47:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2008-11-03:/archive-of-oclc-worldcat-policy-as-posted-2008-11-02.html</guid><category>Libraries</category><category>Coding</category></item><item><title>Dear Dan: why is using Flash for navigation a bad idea?</title><link>https://coffeecode.net/dear-dan-why-is-using-flash-for-navigation-a-bad-idea.html</link><description>&lt;p&gt;I received the following email late last week, and took the time to
reply to it tonight. I had originally been asked by a friend to help
diagnose why his organization's site navigation wasn't working in some
of his browsers. I noticed that the navigation bar was implemented in
Flash, and suggested that the Flash be replaced with plain old HTML,
CSS, and perhaps some JavaScript as Flash for navigation is generally a
bad idea. My friend's response last week was:&lt;/p&gt;
&lt;blockquote&gt;
Dan, I would be interested to know why the flash is a bad idea.
...Our [website] designer seems to think otherwise.&lt;/blockquote&gt;
&lt;p&gt;Uh-oh: getting into it with the designer via proxy can't be good. But
here's what I wrote in response - feel free to set me straight if I've
gone off-track:&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Jakob Neilsen said it best back in 2000 - and all of his concerns still
hold up: &lt;a class="reference external" href="http://www.useit.com/alertbox/20001029.html"&gt;http://www.useit.com/alertbox/20001029.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To which I would add several more reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;Flash is not a native part of the Web, it's a third party browser
plug-in; HTML + CSS and arguably JavaScript are the core parts of the
Web. Anything as basic as navigation should not have to rely on a&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;p&gt;third-party plug-in to function.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;How do you expect a person using a screen reader (due to visual
impairment) to navigate through the site? With HTML/CSS/JavaScript,
they can tab through the links on the page; with Flash, they hit
something that forces them to use the mouse.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Until very recently, Google could not navigate through Flash to crawl
pages - and even now it's capabilities are subject to some
limitations
(&lt;a class="reference external" href="http://googlewebmastercentral.blogspot.com/2008/06/improved-flash-indexing.html"&gt;http://googlewebmastercentral.blogspot.com/2008/06/improved-flash-indexing.html&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;On breaking the Web experience - if you try to right-click on the
Flash navigation, you don't get the option to open the link in a new
tab or window, or add a bookmark to the page that link represents.
And I bet the links would work for you everywhere &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;a class="reference external" href="/archives/172-For-the-paranoid-deleting-Flash-local-storage-objects.html"&gt;For the
paranoid&lt;/a&gt;,
Flash is a proprietary format and therefore requires you to trust
that the content that is being served up isn't doing something
nefarious while appearing innocuous. A small percentage&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;p&gt;of people use plug-ins like &lt;a class="reference external" href="http://noscript.net"&gt;NoScript&lt;/a&gt; to
block Flash content and only enable Flash for specific pages when
necessary. Having to enable it for navigation is annoying.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If your designer really, really wants to keep the Flash experience, the&lt;/p&gt;
&lt;p&gt;least they could do would be to put a plain HTML navigation menu inside&lt;/p&gt;
&lt;p&gt;the &amp;lt;noscript&amp;gt;...&amp;lt;/noscript&amp;gt; section rather than the &amp;quot;Get Flash!&amp;quot; thing&lt;/p&gt;
&lt;p&gt;that currently appears.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 03 Nov 2008 02:03:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2008-11-03:/dear-dan-why-is-using-flash-for-navigation-a-bad-idea.html</guid><category>misc</category><category>Coding</category></item><item><title>For the paranoid: deleting Flash local storage objects</title><link>https://coffeecode.net/for-the-paranoid-deleting-flash-local-storage-objects.html</link><description>&lt;p&gt;I'm reasonably careful about the cookies I accept from Web sites - I
don't want companies to be able to track every site I visit, for
example, so that they can build a nice little profile about me. It's for
the protection of the companies more than anything else: someone there
might die of extreme boredom following the trail of &amp;quot;Evergreen&amp;quot;, &amp;quot;Linux
Weekly News&amp;quot;, &amp;quot;Python docs&amp;quot;...&lt;/p&gt;
&lt;p&gt;However, I &lt;a class="reference external" href="http://lwn.net/Articles/304362/"&gt;recently&lt;/a&gt; learned about
&lt;a class="reference external" href="http://www.adobe.com/products/flashplayer/articles/lso/"&gt;Flash &amp;quot;local storage objects&amp;quot;
(LSO)&lt;/a&gt;,
which are similar to browser cookies but capable of storing much richer
information and also completely inscrutable in terms of the
effectiveness of Adobe's security model. Is Flash really capable of
preventing a Flash application running on microsoft.com from accessing
an LSO from mail.google.com? I certainly don't know, and as Flash is a
closed-source application it's hard for anyone except for the developers
at Adobe to know--but I bet there are people extremely motivated to find
out. (Insert obligatory &amp;quot;See? Closed source sucks!&amp;quot; comment here.)&lt;/p&gt;
&lt;p&gt;So, in my crude attempt to prevent too much garbage accumulating due to
the occasional YouTube video or NBC Saturday Night Live skit that I
might watch, I've added the following rules to my cron entries to delete
my entire set of LSOs every four hours:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
5 ∗/4 ∗ ∗ ∗ rm -fr /home/dan/.macromedia/Flash_Player/#SharedObjects 5 ∗/4 ∗ ∗ ∗ rm -fr /home/dan/.macromedia/Flash_Player/macromedia.com/support/flashplayer/sys/
&lt;/pre&gt;
&lt;p&gt;You Windows users can probably do something similar, but I haven't
bothered to track that down yet. Sorry.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 30 Oct 2008 11:24:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2008-10-30:/for-the-paranoid-deleting-flash-local-storage-objects.html</guid><category>misc</category><category>Personal</category></item><item><title>An Evergreen track at the OLA SuperConference 2009?</title><link>https://coffeecode.net/an-evergreen-track-at-the-ola-superconference-2009.html</link><description>&lt;p&gt;Just poked at the &lt;a class="reference external" href="http://www.accessola.com/superconference2009/"&gt;OLA SuperConference
2009&lt;/a&gt; schedule
(January 28 - 31, 2009) and found four sessions listed that are all
about Evergreen. Wow! Check this out:&lt;/p&gt;
&lt;table style="border: solid black; border-width: 0px 0px 1px 1px; border-collapse: collapse;"&gt;
&lt;th style="border: solid black; border-width: 1px 1px 0px 0px; margin: 0px; padding: 4px;" ead&gt;
&lt;tr&gt;
&lt;th style="border: solid black; border-width: 1px 1px 0px 0px; margin: 0px; padding: 4px;"&gt;&lt;p&gt;Date&lt;/p&gt;
&lt;/th&gt;
&lt;th style="border: solid black; border-width: 1px 1px 0px 0px; margin: 0px; padding: 4px;"&gt;&lt;p&gt;Time&lt;/p&gt;
&lt;/th&gt;
&lt;th style="border: solid black; border-width: 1px 1px 0px 0px; margin: 0px; padding: 4px;"&gt;&lt;p&gt;Title&lt;/p&gt;
&lt;/th&gt;
&lt;th style="border: solid black; border-width: 1px 1px 0px 0px; margin: 0px; padding: 4px;"&gt;&lt;p&gt;Description (may be abridged)&lt;/p&gt;
&lt;/th&gt;
&lt;th style="border: solid black; border-width: 1px 1px 0px 0px; margin: 0px; padding: 4px;"&gt;&lt;p&gt;Presenters&lt;/p&gt;
&lt;/th&gt;
&lt;/tr&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/thead&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;tbody&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;tr&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;td style="border: solid black; border-width: 1px 1px 0px 0px; margin: 0px; padding: 4px;"&gt;&lt;p&gt;Thursday, January 29&lt;/p&gt;
&lt;/td&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;td style="border: solid black; border-width: 1px 1px 0px 0px; margin: 0px; padding: 4px;"&gt;&lt;p&gt;9:05 am&lt;/p&gt;
&lt;/td&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;td style="border: solid black; border-width: 1px 1px 0px 0px; margin: 0px; padding: 4px;"&gt;&lt;p&gt;&lt;a class="reference external" href="http://www.accessola.com/superconference2009/showSession.php?lsession=410&amp;amp;usession=410"&gt;It.s Just a Little Bit of Programming Isn.t
It?&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;td style="border: solid black; border-width: 1px 1px 0px 0px; margin: 0px; padding: 4px;"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;p&gt;“Follow the progress of the Library &amp;#64; Mohawk.s development of the open
source ILS Evergreen. Hear the trials and tribulations and learn from
the mistakes and successes that have occurred along the way . we are
truly a learning organization on this project. We went live in summer
2008 . come and hear about where we.ve been, where we are and where we
hope to be soon.”&lt;/p&gt;
&lt;/td&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;td style="border: solid black; border-width: 1px 1px 0px 0px; margin: 0px; padding: 4px;"&gt;&lt;p&gt;Robert Soulliere, Systems Librarian; Cynthia Williamson, Collection &amp;amp;
Access Librarian, Mohawk College of Applied Arts and Technology&lt;/p&gt;
&lt;/td&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/tr&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;tr&gt;
&lt;td style="border: solid black; border-width: 1px 1px 0px 0px; margin: 0px; padding: 4px;"&gt;&lt;p&gt;Thursday, January 29&lt;/p&gt;
&lt;/td&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;td style="border: solid black; border-width: 1px 1px 0px 0px; margin: 0px; padding: 4px;"&gt;&lt;p&gt;3:45 pm&lt;/p&gt;
&lt;/td&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;td style="border: solid black; border-width: 1px 1px 0px 0px; margin: 0px; padding: 4px;"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;p&gt;&lt;a class="reference external" href="http://www.accessola.com/superconference2009/showSession.php?lsession=614&amp;amp;usession=614"&gt;Project Conifer: Evergreen library system for Ontario
Universities&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;td style="border: solid black; border-width: 1px 1px 0px 0px; margin: 0px; padding: 4px;"&gt;&lt;p&gt;“Find out how the Evergreen open source library system, originally
developed for a public library consortium, is being adapted for academic
libraries by three Ontario universities. Discussion will focus on the
challenges, successes and mistakes (err, .learning opportunities.) of
the project.”&lt;/p&gt;
&lt;/td&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;td style="border: solid black; border-width: 1px 1px 0px 0px; margin: 0px; padding: 4px;"&gt;&lt;p&gt;John Fink, Digital Technologies Development Librarian, McMaster
University; Dan Scott, Systems Librarian, Laurentian University&lt;/p&gt;
&lt;/td&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/tr&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;tr&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;td style="border: solid black; border-width: 1px 1px 0px 0px; margin: 0px; padding: 4px;"&gt;&lt;p&gt;Friday, January 30&lt;/p&gt;
&lt;/td&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;td style="border: solid black; border-width: 1px 1px 0px 0px; margin: 0px; padding: 4px;"&gt;&lt;p&gt;9:05 am&lt;/p&gt;
&lt;/td&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;td style="border: solid black; border-width: 1px 1px 0px 0px; margin: 0px; padding: 4px;"&gt;&lt;p&gt;&lt;a class="reference external" href="http://www.accessola.com/superconference2009/showSession.php?lsession=1017&amp;amp;usession=1017"&gt;Evergreen exposed: hacking the open source library
system&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;td style="border: solid black; border-width: 1px 1px 0px 0px; margin: 0px; padding: 4px;"&gt;&lt;p&gt;“Join an Evergreen developer on a tour of the architecture and source
code of the Evergreen library system [...] Get ready to get your hands
dirty with Evergreen . this will be a session filled with code!”&lt;/p&gt;
&lt;/td&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;td style="border: solid black; border-width: 1px 1px 0px 0px; margin: 0px; padding: 4px;"&gt;&lt;p&gt;William Erickson, Vice President, Software Development &amp;amp; Integration,
Equinox Software Inc; Dan Scott, Systems Librarian, Laurentian
University&lt;/p&gt;
&lt;/td&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/tr&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;tr&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;td style="border: solid black; border-width: 1px 1px 0px 0px; margin: 0px; padding: 4px;"&gt;&lt;p&gt;Saturday, January 31&lt;/p&gt;
&lt;/td&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;td style="border: solid black; border-width: 1px 1px 0px 0px; margin: 0px; padding: 4px;"&gt;&lt;p&gt;10:40 am&lt;/p&gt;
&lt;/td&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;td style="border: solid black; border-width: 1px 1px 0px 0px; margin: 0px; padding: 4px;"&gt;&lt;p&gt;&lt;a class="reference external" href="http://www.accessola.com/superconference2009/showSession.php?lsession=1808&amp;amp;usession=1808"&gt;Multilingual Language Issues of Open Source
ILS&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;td style="border: solid black; border-width: 1px 1px 0px 0px; margin: 0px; padding: 4px;"&gt;&lt;p&gt;“Discover the Chinese version of Evergreen along with various
multilingual issues related MARC standards, encoding, indexing,
searching, and sorting especially associated with Chinese language.”&lt;/p&gt;
&lt;/td&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;td style="border: solid black; border-width: 1px 1px 0px 0px; margin: 0px; padding: 4px;"&gt;&lt;p&gt;Jason Zou, Systems Librarian, Lakehead University; Guoying (Grace) Liu,
Systems Librarian, Leddy Library, University of Windsor&lt;/p&gt;
&lt;/td&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/tr&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/tbody&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/table&gt;
&lt;/p&gt;&lt;p&gt;I was responsible for the sole Evergreen presentation at OLA
SuperConference 2008 - it's awesome to see a lot more people jumping in
this year! I'm keenly anticipating this conference - we'll have to set
up at least one Evergreen &amp;quot;Birds of a Feather&amp;quot; session.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 28 Oct 2008 20:10:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2008-10-28:/an-evergreen-track-at-the-ola-superconference-2009.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Evergreen: deOSSification of library software</title><link>https://coffeecode.net/evergreen-deossification-of-library-software.html</link><description>&lt;p&gt;In a few minutes I'll be giving a talk with John Fink at the &lt;a class="reference external" href="http://www.fsoss.ca"&gt;Free
Software Open Source Symposium&lt;/a&gt; at Seneca
College on &lt;a class="reference external" href="http://fsoss.senecac.on.ca/2008/?q=node/32"&gt;Evergreen: an enterprise-strength OSS solution for library
ossification&lt;/a&gt;. I'm
jazzed!&lt;/p&gt;
&lt;p&gt;Here are the slides: (&lt;a class="reference external" href="/uploads/talks/2008/Evergreen_OSSification.odp"&gt;ODP
format&lt;/a&gt;)
(&lt;a class="reference external" href="/uploads/talks/2008/Evergreen_OSSification.pdf"&gt;PDF
format&lt;/a&gt;).&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 23 Oct 2008 17:45:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2008-10-23:/evergreen-deossification-of-library-software.html</guid><category>Libraries</category><category>Evergreen</category><category>FSOSS</category></item><item><title>Boss me around, s'il vous plait</title><link>https://coffeecode.net/boss-me-around-sil-vous-plait.html</link><description>&lt;p&gt;My place of work, Laurentian University, is looking for a new Director
of the J.N. Desmarais Library. The call for applications closes October
30th. I think our library has done some impressive work (participating
in the &lt;a class="reference external" href="http://www.acdi-cida.gc.ca/CIDAWEB/acdicida.nsf/En/JER-327155022-SFL"&gt;food security project for the Democratic Republic of
Congo&lt;/a&gt;,
building the &lt;a class="reference external" href="http://biblio.laurentian.ca/medb"&gt;Mining Environment
Database&lt;/a&gt;), are doing some pretty
interesting things (&lt;a class="reference external" href="http://conifer.mcmaster.ca"&gt;Project Conifer&lt;/a&gt;),
and have the potential to do a lot more. Our outgoing director has laid
the groundwork for his successor to take Laurentian University's
libraries to even more exciting destinations.&lt;/p&gt;
&lt;p&gt;On the chance that you haven't heard about this opening, and would be
interested - or perhaps you know someone who might be interested and
would be a good candidate - I'm going to attach the full job posting
below. One heads-up: Laurentian is a bilingual (French / English)
institution, and candidates would be expected to be bilingual.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Laurentian University – Director of the Library and Archives – effective
July 1, 2009&lt;/p&gt;
&lt;p&gt;Laurentian University is committed to serving the needs of Northern
Ontario and its English-language, French-language and First Nations
communities, and to extending its student recruitment into other areas
of Canada. Laurentian’s recent major accomplishments include the
establishment, with Lakehead University, of the first new medical school
in more than 30 years in Canada, the introduction of 6 new PhD programs,
the construction of new residences and a building custom-designed to
house the B.Ed. program, establishment of a new Faculty of Management,
and increasing success attracting research funding, all within a vibrant
bilingual milieu that appreciates the past and is building toward the
future. Please consult &lt;a class="reference external" href="http://www.laurentian.ca"&gt;www.laurentian.ca&lt;/a&gt;
for more information.&lt;/p&gt;
&lt;p&gt;The Director of the Library and Archives will be an innovative leader
who will build on the momentum of the Libraries’ information technology
services, operational systems and capabilities, and provide strategic
direction in accordance with the Strategic Plan approved by the
Laurentian University Board of Governors.&lt;/p&gt;
&lt;p&gt;The ideal candidate will be a respected academic who will bring dynamic
vision and academic administrative experience, and who will be able to
function in both English and French. The candidate will have a Masters’
of Library Science from an ALA accredited library school or equivalent
institution plus at least five years experience in library
administration, including planning, personnel, budget, policy
development and services. The candidate will have the ability to view
issues from an organization-wide perspective and to contribute
effectively to collaborative projects within and outside the
institution. The candidate will have knowledge of trends in higher
education and information technology that affect acquisition,
management, storage and dissemination of print, multi-media and
electronic resources. Experience in writing grant proposals and
effectively administering such grants would be a strong asset.&lt;/p&gt;
&lt;p&gt;Laurentian University is committed to employment equity, welcomes
diversity in the workplace and encourages applications from all
qualified individuals including women, members of visible minorities,
aboriginal persons and persons with disabilities. All qualified
candidates are encouraged to apply; however, Canadians and permanent
residents will be given priority.&lt;/p&gt;
&lt;p&gt;Should you want to learn more about this unique leadership opportunity,&lt;/p&gt;
&lt;p&gt;e-mail Susan Silverton, Vice-President, Academic (Anglophone Affairs) at
&lt;a class="reference external" href="mailto:ssilverton&amp;#64;laurentian.ca"&gt;ssilverton&amp;#64;laurentian.ca&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;or forward your CV, a letter of introduction and the names of three
referees&lt;/p&gt;
&lt;p&gt;in confidence, to Linda Mainville, Assistant to the Vice-Presidents,
Academic, Laurentian University, Ramsey Lake Road, Sudbury, Ontario P3E
2C6&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 09 Oct 2008 16:10:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2008-10-09:/boss-me-around-sil-vous-plait.html</guid><category>Libraries</category><category>Coding</category></item><item><title>Access 2008 hackfest report: Zotero vs Evergreen</title><link>https://coffeecode.net/access-2008-hackfest-report-zotero-vs-evergreen.html</link><description>&lt;p&gt;&lt;strong&gt;Update: 2008-10-07&lt;/strong&gt; As of &lt;a class="reference external" href="http://svn.open-ils.org/trac/ILS/changeset/10774"&gt;changeset
10774&lt;/a&gt;, the
detailed record view in Evergreen's dynamic catalog is now recognized by
Zotero.&lt;/p&gt;
&lt;p&gt;I really like Zotero. And it works really well with Evergreen's current
&amp;quot;basic search&amp;quot;&lt;/p&gt;
&lt;p&gt;because it embeds &lt;a class="reference external" href="http://unapi.info"&gt;unAPI&lt;/a&gt; links that enable Zotero
to&lt;/p&gt;
&lt;p&gt;consume &lt;a class="reference external" href="http://loc.gov/mods"&gt;MODS&lt;/a&gt; representations of the underlying&lt;/p&gt;
&lt;p&gt;bibliographic records and generate a complete citation based on that.&lt;/p&gt;
&lt;p&gt;However, Zotero doesn't work with Evergreen's current &amp;quot;dynamic search&amp;quot;
interface - which&lt;/p&gt;
&lt;p&gt;is a problem, because it is the default search interface. Evergreen
embeds a link to the&lt;/p&gt;
&lt;p&gt;unAPI server, and fills in the unAPI link via an AJAX call after the
underlying XHTML&lt;/p&gt;
&lt;p&gt;has been loaded - but it seems that
&lt;a class="reference external" href="http://forums.zotero.org/discussion/4069/detecting-unapi-in-dynamic-content/"&gt;Zotero&lt;/a&gt;
doesn't&lt;/p&gt;
&lt;p&gt;recognize that the DOM has been changed by the AJAX event and never
discovers the unAPI&lt;/p&gt;
&lt;p&gt;link. So... I had submitted a challenge to Hackfest to fix this, because
I really want to&lt;/p&gt;
&lt;p&gt;be able to use Zotero with Evergreen when Project Conifer launches.&lt;/p&gt;
&lt;p&gt;And, as with every other Hackfest I have attended, I end up working on
my own challenge.&lt;/p&gt;
&lt;p&gt;In discussing the problem with William from
&lt;a class="reference external" href="http://canadiana.org"&gt;canadiana.org&lt;/a&gt; and Walter Lewis from&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://www.knowledgeontario.ca"&gt;Knowledge Ontario&lt;/a&gt;, I described how
the dynamic interface doesn't use any templating (apart&lt;/p&gt;
&lt;p&gt;from entity substitution for localization support), that there wasn't
really any way to&lt;/p&gt;
&lt;p&gt;inject content server side into the underlying XHTML, and that I really
didn't want to have&lt;/p&gt;
&lt;p&gt;to dig into the guts of Zotero to enable it to parse the DOM after
events had completed.&lt;/p&gt;
&lt;p&gt;William asked &amp;quot;so you can't even do a server side include?&amp;quot;, which ended
up breaking the&lt;/p&gt;
&lt;p&gt;problem wide open - because yes, we already use server side includes to
identify which DTD&lt;/p&gt;
&lt;p&gt;to load for localization purposes.&lt;/p&gt;
&lt;p&gt;Step 1 was to modify the detailed record display to put the unAPI link
template in place,&lt;/p&gt;
&lt;p&gt;and to modify the Apache configuration to pass in hardcoded values for
each of the SSI&lt;/p&gt;
&lt;p&gt;variables. A quick test and - it didn't work. Uh oh.&lt;/p&gt;
&lt;p&gt;That led to much scratching of the head. Was Zotero getting tripped up
by the masses of&lt;/p&gt;
&lt;p&gt;XHTML elements in the dynamic template that are simply hidden? Did it
give up after trying to&lt;/p&gt;
&lt;p&gt;parse 100K or so of content? Were there differences in the content types
being served up by&lt;/p&gt;
&lt;p&gt;Apache? The next step was to compare the content of the &amp;quot;basic search&amp;quot;
output against the&lt;/p&gt;
&lt;p&gt;&amp;quot;dynamic search&amp;quot; output - and that led to one seemingly innocent
difference.&lt;/p&gt;
&lt;p&gt;The unAPI server link in the &amp;quot;basic search&amp;quot; output included an absolute
link to the server,&lt;/p&gt;
&lt;p&gt;while the corresponding link in the &amp;quot;dynamic search&amp;quot; output used a
relative link to point&lt;/p&gt;
&lt;p&gt;to the root of the server. I didn't think that would be a problem, but
eliminating variables&lt;/p&gt;
&lt;p&gt;is always good - and when I tested with a hardcoded server link, the
Zotero hint icon lit&lt;/p&gt;
&lt;p&gt;up and the mystery was solved. Between enabling the record unAPI link to
appear in the&lt;/p&gt;
&lt;p&gt;static XHTML via SSI and changing the unAPI server link to use an
absolute value, Zotero and&lt;/p&gt;
&lt;p&gt;Evergreen could work together in harmony.&lt;/p&gt;
&lt;p&gt;I haven't committed the fix for this yet to the repository, as I haven't
finalized the exact&lt;/p&gt;
&lt;p&gt;SSI incantations that will be needed to embed the record ID in the unAPI
link. But now you&lt;/p&gt;
&lt;p&gt;know the solution, and could tackle the problem yourself if you get
tired of waiting for me&lt;/p&gt;
&lt;p&gt;and feel inspired. And once the problem is fixed, I'll update the post
to let you know what&lt;/p&gt;
&lt;p&gt;version of Evergreen carries the fix.&lt;/p&gt;
&lt;p&gt;Oh, and my hackfest report slides &lt;a class="reference external" href="/uploads/talks/2008/Cite_me_bite_me.pdf"&gt;are
attached&lt;/a&gt;,
in case anyone cares.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 07 Oct 2008 04:36:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2008-10-07:/access-2008-hackfest-report-zotero-vs-evergreen.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Access 2008 presentation: Project Conifer report</title><link>https://coffeecode.net/access-2008-presentation-project-conifer-report.html</link><description>&lt;p&gt;On Friday, October 3rd, I had the honour of presenting the progress of
Project Conifer with my colleague &lt;a class="reference external" href="http://libgrunt.blogspot.com"&gt;John
Fink&lt;/a&gt; to my peers at Access 2008.
Project Conifer is the effort to bring the
&lt;a class="reference external" href="http://evergreen-ils.org"&gt;Evergreen&lt;/a&gt; open source library system to a
consortium of academic libraries in Ontario (Algoma, Laurentian,
McMaster, Northern Ontario School of Medicine, and Windsor).&lt;/p&gt;
&lt;p&gt;I'm just going to link quickly to the slides for now, as I'm a little
bit brain-dead after the conference. John led off the talk with an
overview of what Conifer is all about and why we were motivated to
tackle such a large project - he has &lt;a class="reference external" href="http://www.slideshare.net/adr/access2008-presentation-v3-presentation"&gt;posted his
slides&lt;/a&gt;
via the SlideShare thingy. Editorial comment: I really enjoy John's
presentation style and content. He's a hard act to follow!&lt;/p&gt;
&lt;p&gt;And then I rambled on with an overview of the ups and downs of the
project so far, the resources we have invested in the project, our
progress towards our target go-live date (May 2009), and some sneak
previews of the goodies that are included in the
any-day-now-if-I-would-just-stop-going-to-conferences-and-apply-myself-for-a-few-days-dangit
Evergreen 1.4 release. Well - they're not really sneak previews, because
of course you could check the code out of the repository and built it
yourself - but it's so much easier when somebody else already has it
running, right?&lt;/p&gt;
&lt;p&gt;Anyway, my slides are available in both &lt;a class="reference external" href="/uploads/talks/2008/Access2008Conifer.odp"&gt;OpenOffice.org Impress
format&lt;/a&gt;
and
&lt;a class="reference external" href="/uploads/talks/2008/Access2008Conifer.pdf"&gt;PDF&lt;/a&gt;.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sat, 04 Oct 2008 23:13:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2008-10-04:/access-2008-presentation-project-conifer-report.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Software Freedom Day 2008 - Sudbury</title><link>https://coffeecode.net/software-freedom-day-2008-sudbury.html</link><description>&lt;p&gt;I opted to do something out of the unusual (for me) this year when I
learned about &lt;a class="reference external" href="http://softwarefreedomday.org"&gt;Software Freedom Day&lt;/a&gt;;
I signed up to organize an event in Sudbury. Given everything that was
already on my plate, it was pure foolishness to do so - but it was also
important to me to try and pull together people in Sudbury with an
interest in open source and free software. I'm hoping that this is just
the first of many such events.&lt;/p&gt;
&lt;p&gt;Did I mention that trying to organize an event in an academic
environment during August and early September is madness? I was
incredibly fortunate to land three excellent guest speakers on very
short notice.&lt;/p&gt;
&lt;div class="section" id="keynote-open-source-and-open-learning"&gt;
&lt;h2&gt;Keynote: Open Source and Open Learning&lt;/h2&gt;
&lt;p&gt;Dr. Rachel Ellaway, Assistant Dean of Education Informatics at the
Northern Ontario School of Medicine, kicked off the event and instantly
repaid all of the effort of putting together the whole event. In just
one hour, she:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;eloquently introduced the &lt;a class="reference external" href="http://www.fsf.org/licensing/essays/free-sw.html"&gt;four freedoms of free
software&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;mapped the continuum of free software from public domain to closed
source,&lt;/li&gt;
&lt;li&gt;situated the academy and publicly funded institutions in the same
philosophical category as open source,&lt;/li&gt;
&lt;li&gt;posited that in education the process of learning was more important
than the product,&lt;/li&gt;
&lt;li&gt;introduced &lt;a class="reference external" href="http://ocw.mit.edu"&gt;MIT's OpenCourseWare&lt;/a&gt; effort to
make most of their course materials (syllabus, readings, lecture
notes, assignments, and projects) freely available online,&lt;/li&gt;
&lt;li&gt;discussed the problems of learning objects from the 80's and 90's
that are now locked away in binary files that simply won't run on
today's computers - and an effort named &lt;em&gt;BoneYard&lt;/em&gt; that she is
involved in to convince the rights holders to donate the source code
(be it COBOL or BASIC or anything) behind these learning objects to a
repository so that others can reuse the underlying algorithms and
breathe new life into the objects,&lt;/li&gt;
&lt;li&gt;questioned the continuing faith in &amp;quot;contact hours&amp;quot; as the gold
standard for academic service when one hour spent developing a
scenario for a virtual learning environment could engage students in
multiple hours of active learning&lt;/li&gt;
&lt;li&gt;wondered whether our institutions could move towards open
administration and governance models&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;... all in an entertaining and engaging style. Sudbury and the Northern
Ontario School of Medicine are lucky to have Dr. Ellaway in our midst.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="moodle-course-management-software"&gt;
&lt;h2&gt;Moodle course management software&lt;/h2&gt;
&lt;p&gt;We were also fortunate to have Dr. Rick Danielson, Full Professor in the
School of Human Kinetics, on hand to discuss the history of course
management software at Laurentian University and his own experiences
with Ilias and Moodle. While on sabbatical in 1998, Dr. Danielson
piloted the use of WebCT at Laurentian for course management and lead
the creation of a purchasing consortium to license WebCT for more than
40 institutions across Ontario. A few years later, Dr. Danielson
switched his personal WebCT server to the open source alternative
&lt;a class="reference external" href="http://www.ilias.de/index.html"&gt;Ilias&lt;/a&gt; coure management system; and,
shortly after that, to &lt;a class="reference external" href="http://moodle.org"&gt;Moodle&lt;/a&gt;. At the time,
Ilias did not offer a module that supported online quizzes, and Dr.
Danielson was also won over by Moodle's more refined interface. For Dr.
Danielson, the choice between using the university's WebCT instance and
Moodle running on his own server is all about control, saving money, and
being lazy:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;He craves control over his teaching environment and independence from
central IT, and running his own Moodle server gives him that.&lt;/li&gt;
&lt;li&gt;He watched the license fees for WebCT rise as it was acquired first
by ULT and then by Blackboard, and doesn't mind that he has to spend
some money on his own server because Moodle itself is freely
redistributable&lt;/li&gt;
&lt;li&gt;He was happy to work hard to learn how to install and administer Red
Hat Linux, Apache, MySQL, and PHP in order to run Moodle - now he can
be lazy because it simply works.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dr. Danielson's talk was full of tangents and insider stories about the
history of the university and Northern Ontario - quite entertaining and
quite irreverent. He did a good job conveying the spirit of the early
adopter of new technology to the audience, and in answer to the question
of whether Laurentian's next course management system should be WebCT,
he said &lt;em&gt;Tuum est&lt;/em&gt; (&amp;quot;It's in your hands!&amp;quot;).&lt;/p&gt;
&lt;p&gt;Given that &lt;a class="reference external" href="http://www.moodle.uqam.ca/moodleinfo/"&gt;UQAM successfully automated the conversion of over 90% of
their WebCT courses to Moodle&lt;/a&gt;
(laziness is a virtue, remember), and given that we are facing a
migration from WebCT to something else (the product name does not even
appear on Blackboard's Web site), I hope that Laurentian will seriously
consider Moodle. I have asked to be part of the evaluation committee for
the next course management system here, as I want to ensure that we can
provide much better integration between our library systems and our
learning systems than we have today. I know that Evergreen will give us
the flexibility we require on the library side; we need to ensure that
we have a course management product with the flexibility that we need on
the other side - and finally, we need the people willing to make the
integration between the systems work and to demonstrate to faculty how
they can easily take advantage of that integration.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="paraviewgeo-open-source-visualization-from-mirarco"&gt;
&lt;h2&gt;ParaViewGeo - open source visualization from MIRARCO&lt;/h2&gt;
&lt;p&gt;The third guest speaker was Robert Maynard, lead developer for
&lt;a class="reference external" href="http://paraviewgeo.mirarco.org"&gt;ParaViewGeo&lt;/a&gt; at E2VO, a subsidiary
of MIRARCO. ParaViewGeo is a customized version of
&lt;a class="reference external" href="http://www.kitware.com/"&gt;ParaView&lt;/a&gt; by KitWare. The BSD license used
by ParaView gives E2VO the right to modify the software and redistribute
binary versions of it without redistributing the source code; however,
E2VO does plan to make most of their additions and customizations
available, and has been pushing patches back to the upstream product.&lt;/p&gt;
&lt;p&gt;Robert showed a number of screenshots that demonstrated how ParaViewGeo
could transform basic two-dimensional diagrams into much richer
three-dimensional visualizations. For example, ParaViewGeo can read
AutoCAD files and do a far better job of displaying three-dimensional
figures. Also, a CD of data produced for the &lt;a class="reference external" href="http://www.discoverabitibi.com/"&gt;Discover Abitibi
initiative&lt;/a&gt; included a proprietary
application with a license that timed out after one year, but
ParaViewGeo was able to read and display the data in more detail than
the original application was capable of.&lt;/p&gt;
&lt;p&gt;Perhaps as interesting as the product was the insight that Robert
provided on their software development process. Robert described how,
due to a lack of students with software development skills in the
Sudbury region, he opted to lead a three-week software development boot
camp for their student developers starting from extremely basic
principles ('let's open a file and write to it'), motivating them to
achieve via competitive gaming techniques and tangible rewards
('whichever team successfully completes this problem first gets free
lunch today'), group learning techniques (all seven team members worked
in one large room; when a programmer hit a road block, Robert would
demonstrate the solution on a projector so that all the team members
could learn at once), and leading by example (Robert was always the
first person in the room and the last person to leave).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="project-conifer-open-source-academic-library-system"&gt;
&lt;h2&gt;Project Conifer: Open Source Academic Library System&lt;/h2&gt;
&lt;p&gt;I gave a presentation on &lt;a class="reference external" href="http://conifer.mcmaster.ca"&gt;Conifer&lt;/a&gt;, of
course. Project Conifer is the effort to bring Evergreen to the Ontario
academic libraries for Algoma University, Laurentian University and
partners, McMaster University, Northern Ontario Health Integration
Network, and the University of Windsor. I'm the project manager for
Conifer and one of the core developers for Evergreen, so I can't
possibly &lt;em&gt;not&lt;/em&gt; talk about it on Software Freedom Day. As regular readers
of this blog already know plenty about Conifer, I won't recap much here.
The audience was quite impressed with the upgraded user experience that
Evergreen offers out of the box over our current system, and sensed the
potential for a system like this to offer integration with course
management systems, integration with our inter-library loan system, and
even the simple pleasures of direct physical borrowing between
participating institutions.&lt;/p&gt;
&lt;p&gt;I was also given the perfect excuse to purchase an iTouch with library
or Conifer funds. One of the audience members asked if the dynamic
interface supported the iPhone or iTouch, as they would like the ability
to search for books or journals while in the stacks. I had to answer
that I did not know, not being in possession of such a device, but was
able to assert that Opera Mobile on my Windows Mobile cellphone worked
extremely well. The audience member then tried out their own iTouch and
determined that the interface was at least able to support search - but
clearly I need to do a deeper investigation &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="artificially-enhanced-research-free-software-and-fantastic-research"&gt;
&lt;h2&gt;Artificially enhanced research : free software and fantastic research&lt;/h2&gt;
&lt;p&gt;This was my mostly-demo session, which probably would have been better
delivered earlier in the day while both audience members and myself were
fresher, but somebody had to have the last slot in the session. I
presented a few free software tools that I thought would be of interest
to researchers:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://libx.org/editions/3A/4D/3A4D0B6F/libx.html"&gt;LibX browser toolbar for Laurentian
University&lt;/a&gt;: I
showed that while the LibX toolbar is handy as a quick way of
searching our catalogue, it's much more about embedding quick access
to our library resources within your browser. I quickly got off on a
tangent, however, as I was showing the Google Scholar &amp;quot;magic button&amp;quot;
and had to explain what Google Scholar was, how it differed from
regular Google, and answer the faculty member's question about
whether he should send students to our subject databases page or to
Google Scholar (my answer: &amp;quot;Well, both!&amp;quot;).&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://zotero.org"&gt;Zotero&lt;/a&gt; research plug-in for Firefox: while
LibX got their attention, Zotero got the audience buzzing. Just a
quick demonstration of capturing a set of citations from a Wikipedia
page, adding a note, taking a snapshot of the Wikipedia page,
organizing research into folders, adding tags, and searching in
full-text through your captured materials (optionally filtering by
tag) was enough to get most of the people in the room interested.
Zotero makes research &lt;strong&gt;fun&lt;/strong&gt; - students will want to do research
just so they can play with Zotero!&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://zone.biblio.laurentian.ca"&gt;LU|ZONE|UL institutional
repository&lt;/a&gt; : by this point, I
was running out of time, so I tried to quickly link back to Dr.
Ellaway's discussion of open access and funding agencies' new
requirements to deposit articles and datasets in institutional
repositories. However, after pointing out that Laurentian has
actually had an institutional repository in production for over a
year, one faculty member asked why we should care about depositing
articles if we have access to the article through our electronic
journal subscriptions? I'm not as good at answering this question as
I probably should be; my answer was that it's a means of making that
content available to researchers at those institutions that don't
have a subscription to that journal; and that it's a means for our
institution to have direct access to our own researchers' output
without necessarily having to continue to pay annual licensing fees
to access that ouput. I also pointed out some of the opportunities
that alternate publishing formats like institutional repositories
make possible; Guy Gaudreau's book &lt;em&gt;`Les hauts et les bas de la vie
des mineurs de Kirkland
Lake &amp;lt;https://zone.biblio.laurentian.ca/dspace/handle/10219/34&amp;gt;`__&lt;/em&gt;
would not have been published with the striking colour charts he was
able to include in the fully-digital version he contributed to
LU|ZONE|UL - nor would he have had the ability to publish each
chapter as it was finished and use the feedback to improve the rest
of the book or to reissue corrections to that chapter.&lt;/li&gt;
&lt;li&gt;Finally, I mentioned our &lt;a class="reference external" href="http://journal.code4lib.org/articles/49"&gt;library's quick lookup
laptops&lt;/a&gt; which now run on
Linux LiveCDs for stability, robustness, environmental friendliness,
and budget purposes. They're an open source experience that our
library members use on a daily basis without any apparent problems;
they &amp;quot;just work&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So... to sum up, I believe the event was well worth the effort. We had
approximately twenty participants with a mix of undergraduate and
graduate students, faculty, librarians, and members of the public
(including one fellow who drove all the way from North Bay to attend!).
Now that I know what I'm doing, and now that we have a better idea of
the interested parties on campus, I believe that we will be able to
build a bigger event next year. I don't think I would hold it on a
Saturday again, even if that's when Software Freedom Day is officially
scheduled, because students and faculty really value their weekends. And
I hope that we have more events - perhaps smaller, perhaps less formal,
and perhaps more frequent - throughout the year.&lt;/p&gt;
&lt;p&gt;Finally, I want to thank the team of people at the J.N. Desmarais
Library that helped me to make this event possible, in no particular
order: Leïla Saadaouai, Dorothy Robb, Christine Guerra, Noella Cliche,
Ashley Thomson, and Joscelyne Meilleur. Your efforts were certainly
appreciated by our participants today.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sun, 21 Sep 2008 02:24:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2008-09-21:/software-freedom-day-2008-sudbury.html</guid><category>Software Freedom</category><category>Coding</category></item><item><title>Heating up Evergreen search</title><link>https://coffeecode.net/heating-up-evergreen-search.html</link><description>&lt;p&gt;So, after loading 3.7 million records into the Project Conifer test
server, we have found that search can be slow. Not really a big
surprise, because I've spent very little time tuning the database beyond
running a VACUUM FULL and tweaking just a few parameters. But one of the
extremely useful hints that Mike Rylander gave me about PostgreSQL a
long time back is that it relies primarily on file system caching to
cache access to data, from the reasonable perspective that your file
system already knows which files are being accessed most often.
PostgreSQL's data is stored in files that map back to individual tables
and indexes; unlike some other database systems that I've worked with,
you don't dedicate system memory specifically to caching those database
files (hello, DB2 buffers!); instead, you just trust the file system to
know what's best.&lt;/p&gt;
&lt;p&gt;That caching approach works great on a system that's in production and
getting a steady stream of queries reflecting what users actually search
for on a day to day basis. However, if you've just loaded a test system,
then it doesn't have much opportunity to cache and the first dozen (or
hundreds, or thousands!) of queries will be slow as your database goes
out and loads up files from disk. Even worse, if you have a system like
ours where backups have temporarily been set up as &amp;quot;tar czf
/backups/backup.tar.gz /&amp;quot;, then on a nightly basis your file system
cache is going to be filled with all kinds of irrelevant data.&lt;/p&gt;
&lt;p&gt;So what are we to do? Well, actually, another extremely useful hint that
Mike Rylander gave me was to just run the pertinent data files through
/dev/null to load up the file system cache. On the surface, it seems
like a dirty hack, but it's a smart one, and we can even make it
elegant. Let's walk through the process:&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p class="first"&gt;You need to know where your data files are. You (or your system
installer) will have created a PostgreSQL cluster. In my case (on
Debian Etch), I can find it at /var/lib/postgresql/main/base. Then,
by running &amp;quot;du -hs /var/lib/postgresql/main/base&amp;quot; I can see that one
of our databases (represented by a directory name that's just an
integer - &amp;quot;16385&amp;quot;) weighs in at 60GB. That's our 3.7 million record
baby. If you run an &amp;quot;ls&amp;quot; command on that directory, you'll see that
it's filled with hundreds of files of differing sizes, most of them
with just plain integers for their names. This is where the data is
stored.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;You need to know the base filenames that you want to use to warm up
the file system cache. For my first stab at this, I decided to warm
up the cache with the full-text search indexes, as I know those are
frequently used by Evergreen's search. To figure out the base
filenames for these indexes, we can query PostgreSQL's catalog of its
own objects:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
evergreen=# SELECT relfilenode, relname, relpagesevergreen-# FROM pg_class WHERE relname LIKE '%vector%'; relfilenode |                   relname                    | relpages -------------+----------------------------------------------+----------      648864 | authority_full_rec_index_vector_idx          |    59282      649137 | metabib_title_field_entry_index_vector_idx   |    29766      649149 | metabib_author_field_entry_index_vector_idx  |    20125      649161 | metabib_subject_field_entry_index_vector_idx |    23481      649173 | metabib_keyword_field_entry_index_vector_idx |    90709      649185 | metabib_series_field_entry_index_vector_idx  |     8682      649210 | metabib_full_rec_index_vector_idx            |   452980(7 rows)
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;&lt;p&gt;&lt;strong&gt;relfilenode&lt;/strong&gt; is the basename of the files that we want to load
into the file system cache.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;The maximum size of your file system cache cannot be more than the
physical RAM installed on your system, so you'll want to tally up the
size of the index data files to ensure that their total is less than
the total amount of your physical RAM. Note that in the example from
our system, below, I'm using &amp;quot;*&amp;quot; because database objects with lots
of data will be split between multiple files with extensions like
&amp;quot;.1&amp;quot; and &amp;quot;.2&amp;quot; in sequential order:&lt;/p&gt;
&lt;/p&gt;&lt;pre class="literal-block"&gt;
# cd /var/lib/postgresql/main/base/16385# du -hs 649185* 649210* 1065608*68M 6491851.1G   6492101.1G   649210.11.1G 649210.21.1G 10656081.1G  1065608.11.1G    1065608.2842M    1065608.3# du -hs 649207*1.1G 6492071.1G   649207.11.1G 649207.2467M 649207.3
&lt;/pre&gt;
&lt;/p&gt;&lt;p&gt;Adding all of this up, we're getting close to the 16GB of RAM
installed on our database server. If we add any more data, we will
want to add more RAM to the system.&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Now we warm up the cache by outputting the contents of each file into
/dev/null.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
# cd /var/lib/postgresql/main/base/16385# cat 648864* &amp;gt; /dev/null# cat 649137* &amp;gt; /dev/null# cat 649149* &amp;gt; /dev/null# cat 649161* &amp;gt; /dev/null# cat 649173* &amp;gt; /dev/null# cat 649185* &amp;gt; /dev/null# cat 649210* &amp;gt; /dev/null
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After running through this relatively simple exercise, searches were
definitely much snappier on our test system. I plan to automate the
process so it runs after every one of those cache-killing backups. If
there is interest, I could package it into a simple Perl script that
other sites could use to assist with their testing - or to help warm up
the file system cache after a large data load, for example.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 25 Aug 2008 16:23:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2008-08-25:/heating-up-evergreen-search.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Academic reserves for Evergreen: request for comments</title><link>https://coffeecode.net/academic-reserves-for-evergreen-request-for-comments.html</link><description>&lt;p&gt;I've posted a second revision of the &lt;a class="reference external" href="http://open-ils.org/dokuwiki/doku.php?id=feature:academic_reserves"&gt;&amp;quot;academic reserves&amp;quot; requirements
RFC&lt;/a&gt;.
I'm not looking to boil the ocean with the first iteration of academic
reserves for Evergreen (that's what third-party systems like
&lt;a class="reference external" href="http://reservesdirect.org"&gt;ReservesDirect&lt;/a&gt; and Ares are for), but I
am hoping that by engaging the community in a discussion we can ensure
that we build something that satisfies the core set of requirements for
academic institutions in the area of reserves. My lack of familiarity
with what other institutions with more capable systems, or with local
workarounds or third-party reserves systems installed, makes me nervous
that I'm missing something obvious. So if you feel like weighing in on
the discussion, please address your comments to the &lt;a class="reference external" href="http://open-ils.org/listserv.php"&gt;Evergreen General
mailing list&lt;/a&gt;, add a comment here,
or send me email if you prefer to keep your comments private.&lt;/p&gt;
&lt;p&gt;The biggest change in the second revision of the RFC is the inclusion of
a base set of requirements for electronic reserves. For physical items
alone, the requirements expressed in the RFC go far beyond the
capabilities of the ILS we currently use at Laurentian; getting even
basic support for electronic reserves in Evergreen would be a huge win
for us when we migrate.&lt;/p&gt;
&lt;p&gt;That said, I'll probably start working on implementing a subset of the
requirements real soon now; it should be easy enough to make a course
correction should something significant turn up during the second round
of comments.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sat, 12 Jul 2008 20:02:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2008-07-12:/academic-reserves-for-evergreen-request-for-comments.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>(unofficial) bzr repositories for Evergreen branches</title><link>https://coffeecode.net/unofficial-bzr-repositories-for-evergreen-branches.html</link><description>&lt;p&gt;I wrote a long blog post about the distributed version control workflow
that the two Laurentian students working on
&lt;a class="reference external" href="http://open-ils.org"&gt;Evergreen&lt;/a&gt; (Kevin Beswick and Craig Ricciuto)
are using successfully this summer, only to lose the post to a session
timeout and my own lack of caution (note to self: if writing directly in
the browser text field, CTRL-A CTRL-C before hitting preview!). So the
gist of the blog post was:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://bazaar-vcs.org"&gt;bzr&lt;/a&gt;, with the &lt;a class="reference external" href="http://bazaar-vcs.org/BzrSvn"&gt;bzr-svn
plugin&lt;/a&gt;, works quite well for
cloning and updating from a centralized Subversion repository like
Evergreen's; just watch out for memory consumption issues due to
memory leaks in the Python bindings for Subversion
(&lt;a class="reference external" href="http://jelmer.vernstok.nl/blog/archives/218-bzr-svn-now-with-its-own-Subversion-Python-bindings.html"&gt;fixed&lt;/a&gt;
in the development version of bzr-svn)&lt;/li&gt;
&lt;li&gt;there's no compelling reason for Evergreen to move to a different
version control system; it's easy to use a distributed version
control workflow with the Evergreen Subversion repository as-is&lt;/li&gt;
&lt;li&gt;you can tar up a bzr branch and untar it where ever you like and &amp;quot;bzr
up&amp;quot; will immediately happily work (which is how I worked around the
severe memory constraints on this server that ended up repeatedly
running into the Linux out of memory killer when I was trying to
create a bzr-svn checkout from scratch)&lt;/li&gt;
&lt;li&gt;it's a hell of a lot faster to check out or branch from a bzr
repository than it is from a Subversion repository, so if you're
going to take this approach set up one clean bzr repository using
bzr-svn and check out or branch from that using bzr, rather than
repeatedly using bzr-svn to create new branches&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To enable you to get a bzr repo of Evergreen quickly, I've set up
(unofficial, of course, but updated hourly) bzr repositories of the most
useful Evergreen branches as follows:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE 2009-10-14:&lt;/strong&gt; I've stopped updating these repositories because
the version of bzr-svn on my server is too old and decrepit to be able
to handle the updates. Sorry &lt;img alt=":-(" class="emoticon" src="/images/sad.png" /&gt;&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://bzr.coffeecode.net/ILS/trunk"&gt;Evergreen trunk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://bzr.coffeecode.net/ILS/acq-experiment"&gt;Evergreen
acq-experiment&lt;/a&gt;
(acquisitions and serials branch)&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://bzr.coffeecode.net/OpenSRF/trunk"&gt;OpenSRF trunk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sat, 12 Jul 2008 19:46:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2008-07-12:/unofficial-bzr-repositories-for-evergreen-branches.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>eIFL-FOSS ILS workshop on Evergreen, day one</title><link>https://coffeecode.net/eifl-foss-ils-workshop-on-evergreen-day-one.html</link><description>&lt;p&gt;The following summary is taken almost directly from an email I wrote to
one of the would-be participants who was, sadly, prevented from making
it to Yerevan due to travel complications. I meant to clean this up
earlier and post it, but have not yet found the time - so I might as
well just post it as is with most names obfuscated and possibly some
additional editorial comments. Those who are new to installing and
configuring Evergreen might find this useful; and reading through it, I
remembered a few challenges I planned to tackle &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Shortly after I arrived on Monday, I was able to try out the&lt;/p&gt;
&lt;p&gt;install of Evergreen 1.2.1.4 that A. and G. from the Fundamental&lt;/p&gt;
&lt;p&gt;Science Library (FSL) had completed with only two email exchanges with
me.&lt;/p&gt;
&lt;p&gt;I was very happy to see that they had successfully completed the
install!&lt;/p&gt;
&lt;p&gt;There was only one minor problem with the structure of the
&amp;quot;organizational&lt;/p&gt;
&lt;p&gt;unit&amp;quot; hierarchy that I had to fix. After that, we confirmed that we were&lt;/p&gt;
&lt;p&gt;able to import bibliographic records from Z39.50 and attached call
numbers and&lt;/p&gt;
&lt;p&gt;copies to those records. Finally, we tried searching for the records in&lt;/p&gt;
&lt;p&gt;the catalogue and were delighted to see that everything was working as&lt;/p&gt;
&lt;p&gt;we had hoped. That allowed me to sleep well on Monday, in preparation
for the&lt;/p&gt;
&lt;p&gt;first day of the workshop on Tuesday.&lt;/p&gt;
&lt;p&gt;After the introductions of the workshop participants on Tuesday, I gave
the&lt;/p&gt;
&lt;p&gt;introduction to Evergreen presentation and Henri Damien Laurent of
BibLibre&lt;/p&gt;
&lt;p&gt;demonstrated Koha. Both Henri Damien Laurent and I showed our respective&lt;/p&gt;
&lt;p&gt;library systems running with an Armenian interface, thanks to the
translation&lt;/p&gt;
&lt;p&gt;efforts of Tigran! Then we broke into separate Koha and Evergreen groups
to&lt;/p&gt;
&lt;p&gt;work together on our respective library systems. Of the attendees of the&lt;/p&gt;
&lt;p&gt;workshop, E. was the most&lt;/p&gt;
&lt;p&gt;interested in migrating his library (with 40,000 volumes) to Evergreen.
A.,&lt;/p&gt;
&lt;p&gt;from one of the 29 branches of the American University of Armenia (AUA),
also&lt;/p&gt;
&lt;p&gt;attended most of the Evergreen session. Even though his institution is
mostly&lt;/p&gt;
&lt;p&gt;interested in Koha, he wanted to be able to compare the two systems.
Albert's&lt;/p&gt;
&lt;p&gt;colleague S. attended the Koha training session so they would be able to&lt;/p&gt;
&lt;p&gt;compare their experiences later. Our group also had R. from the
Netherlands&lt;/p&gt;
&lt;p&gt;and A., G., and A. from FSL -- apparently Tigran is considering&lt;/p&gt;
&lt;p&gt;running Evergreen as a union catalogue, so his IT people are very
interested&lt;/p&gt;
&lt;p&gt;in learning more.&lt;/p&gt;
&lt;p&gt;Our first exercise was to model the organizational unit hierarchy using
the&lt;/p&gt;
&lt;p&gt;configuration bootstrap interfaces in the /cgi-bin/config.cgi. We began
by&lt;/p&gt;
&lt;p&gt;drawing the hierarchy on a whiteboard. The &amp;quot;Yerevan Consortium&amp;quot;&lt;/p&gt;
&lt;p&gt;represented the Evergreen system as a whole; we added the FSL, MSU, and
AUA&lt;/p&gt;
&lt;p&gt;systems as children of the Yerevan Consortium, and then added specific
branches&lt;/p&gt;
&lt;p&gt;as children of each of these systems. While we were creating this
hierarchy, I&lt;/p&gt;
&lt;p&gt;showed the participants how the organization unit type defines the
labels used&lt;/p&gt;
&lt;p&gt;in the catalogue as well as the respective depth in the hierarchy for
each type.&lt;/p&gt;
&lt;p&gt;We then ensured that the systems and branches in the hierarchy had the
right&lt;/p&gt;
&lt;p&gt;types, and that the types were defined with valid parent-child
relationships. We&lt;/p&gt;
&lt;p&gt;found a few types that were children of themselves, which causes a
problem in&lt;/p&gt;
&lt;p&gt;searching. There was also some confusion about the role of types to&lt;/p&gt;
&lt;p&gt;organization units, resulting in the creation of types with labels like
&amp;quot;FSL&amp;quot;&lt;/p&gt;
&lt;p&gt;rather than &amp;quot;Library System&amp;quot;. After a few minutes of explanation and
working&lt;/p&gt;
&lt;p&gt;through correcting the exercises, I think the participants were better
able to&lt;/p&gt;
&lt;p&gt;understand the relationship between types and organization units.&lt;/p&gt;
&lt;p&gt;After we were satisfied with the structure of the organization unit
hierarchy, I&lt;/p&gt;
&lt;p&gt;ran the autogen.sh script to update the catalogue and staff client&lt;/p&gt;
&lt;p&gt;representations of the hierarchy. Well, first I demonstrated how search
in the&lt;/p&gt;
&lt;p&gt;catalogue will quickly be broken if you do not run the autogen.sh script
&lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;p&gt;Our next step was to register new users with the Evergreen staff client.
This&lt;/p&gt;
&lt;p&gt;helped introduce the participants to the staff client, as well as giving
them&lt;/p&gt;
&lt;p&gt;a quick introduction to some parts of Evergreen that still need to be
localized&lt;/p&gt;
&lt;p&gt;to allow regional variations on postal code formats, telephone numbers,
and&lt;/p&gt;
&lt;p&gt;forms of identification. The default Evergreen staff client still
enforces&lt;/p&gt;
&lt;p&gt;American conventions, but fortunately I have had to create patches for
Evergreen&lt;/p&gt;
&lt;p&gt;to support my own country's standards so I can assure you that it is
relatively&lt;/p&gt;
&lt;p&gt;easy to change or remove these format checks. In the future, it would be&lt;/p&gt;
&lt;p&gt;wonderful to include a localization pack for each locale interested in
using&lt;/p&gt;
&lt;p&gt;Evergreen that supports regional variations on date formats, phone
number&lt;/p&gt;
&lt;p&gt;patterns, etc. The participants were pleased with the feedback mechanism
in&lt;/p&gt;
&lt;p&gt;the staff client that summarized all of the remaining problems with the
current&lt;/p&gt;
&lt;p&gt;patron record (missing address, invalid phone number, etc) and made it
easy to&lt;/p&gt;
&lt;p&gt;switch between screens without losing any of the data they had already
entered.&lt;/p&gt;
&lt;p&gt;Once we had registered new users for each of our branches, we went to
work&lt;/p&gt;
&lt;p&gt;importing new bibliographic records and attaching call numbers and
copies to&lt;/p&gt;
&lt;p&gt;those records. This gave us a good opportunity to see how changing the
scope&lt;/p&gt;
&lt;p&gt;of a search in Evergreen from &amp;quot;Everywhere&amp;quot; down to a specific branch
changes&lt;/p&gt;
&lt;p&gt;the search results, and demonstrated how the organization type labels
are&lt;/p&gt;
&lt;p&gt;displayed in the catalogue. As an aside, I should point out that in
Evergreen&lt;/p&gt;
&lt;p&gt;1.4 (due by the end of this summer), the labels are internationalized so
that&lt;/p&gt;
&lt;p&gt;different labels can be displayed depending on the locale in which you
are&lt;/p&gt;
&lt;p&gt;using the catalogue or staff client. Good news for those of us who work
in&lt;/p&gt;
&lt;p&gt;bilingual or multilingual libraries!&lt;/p&gt;
&lt;p&gt;Now that we had records with copies attached and patrons registered in
our&lt;/p&gt;
&lt;p&gt;Evergreen instance, we were able to use the catalogue's &amp;quot;My Account&amp;quot;
features&lt;/p&gt;
&lt;p&gt;to try out features like sharable bookbags, account preferences, and the&lt;/p&gt;
&lt;p&gt;account summary. Users also have the ability to specify their&lt;/p&gt;
&lt;p&gt;own user names and to log in with those instead (which means that they
can&lt;/p&gt;
&lt;p&gt;simply remember their unique nickname rather than, say, a 14-digit
barcode).&lt;/p&gt;
&lt;p&gt;The first feature that the participants discovered, of course, was the&lt;/p&gt;
&lt;p&gt;strong password enforcement feature. When a patron is registered, the
system&lt;/p&gt;
&lt;p&gt;automatically generates a random 4-digit password; however, this is not&lt;/p&gt;
&lt;p&gt;considered to be a safe password, so when they log in they are forced to&lt;/p&gt;
&lt;p&gt;change it to a longer password containing both numbers and letters.&lt;/p&gt;
&lt;p&gt;At this point, we also discovered a data validation bug: in the staff
client,&lt;/p&gt;
&lt;p&gt;it is possible to enter a user barcode that consists of letters and
numbers.&lt;/p&gt;
&lt;p&gt;However, in the catalogue, user barcodes containing letters are
considered&lt;/p&gt;
&lt;p&gt;invalid and the system will not even attempt to log that user in; it
simply&lt;/p&gt;
&lt;p&gt;rejects the barcode. I plan to ask E. to report this bug to the
Evergreen&lt;/p&gt;
&lt;p&gt;mailing list; it would be an excellent outcome of the workshop if
participants&lt;/p&gt;
&lt;p&gt;felt comfortable reporting problems to the mailing list, and reporting
this&lt;/p&gt;
&lt;p&gt;problem in particular would help improve the quality of Evergreen.&lt;/p&gt;
&lt;p&gt;Things were going reasonably well, but we noticed that the system was&lt;/p&gt;
&lt;p&gt;running into a problem if you tried to edit a bibliographic record after&lt;/p&gt;
&lt;p&gt;you had already created or imported the record. I had rather fortunately&lt;/p&gt;
&lt;p&gt;already experienced this problem (it is a result of different behaviour&lt;/p&gt;
&lt;p&gt;regarding XML namespaces between different versions of LibXML2) and knew&lt;/p&gt;
&lt;p&gt;that it had been fixed in 1.2.2.1. So rather than trying to fix the
problem&lt;/p&gt;
&lt;p&gt;with the installed version of 1.2.1.4, I decided to try upgrading our&lt;/p&gt;
&lt;p&gt;Evergreen system to the recently released 1.2.2.1 to demonstrate to the&lt;/p&gt;
&lt;p&gt;participants that the upgrade process was fast, reasonably well
documented,&lt;/p&gt;
&lt;p&gt;and not nearly as complicated as the install process. This was, by the
way,&lt;/p&gt;
&lt;p&gt;something Randy had urged me to do, so I blame him for the subsequent
problems&lt;/p&gt;
&lt;p&gt;we experienced (hah!).&lt;/p&gt;
&lt;p&gt;The first problem is that the change from 1.2.1.x to 1.2.2.x requires
the&lt;/p&gt;
&lt;p&gt;installation of a new Perl module from CPAN (JSON::XS). This is not much
of a&lt;/p&gt;
&lt;p&gt;problem in itself, as the module is very easy to install and compile;
however,&lt;/p&gt;
&lt;p&gt;given our internet connection I had to wait a long time for the CPAN&lt;/p&gt;
&lt;p&gt;repository metadata to be downloaded. The participants were still able
to use&lt;/p&gt;
&lt;p&gt;the system while this was happening, but we ended up hitting the coffee
break&lt;/p&gt;
&lt;p&gt;still waiting for CPAN to finish. (As an aside, Irakli and I were
discussing&lt;/p&gt;
&lt;p&gt;the possibility of having the eIFL-FOSS coordinators investigate setting
up&lt;/p&gt;
&lt;p&gt;local mirrors of FOSS resources like CPAN to speed up access to
frequently&lt;/p&gt;
&lt;p&gt;used resources).&lt;/p&gt;
&lt;p&gt;When we returned from the coffee break, the JSON::XS install had
finished but&lt;/p&gt;
&lt;p&gt;the participants were having problems searching and using the staff
client. I&lt;/p&gt;
&lt;p&gt;checked the logs (using the &amp;quot;grep ERR /openils/var/log/*&amp;quot; command to
start&lt;/p&gt;
&lt;p&gt;with) and saw that our database connections were dying for some reason.
On a&lt;/p&gt;
&lt;p&gt;hunch, I checked the system logs (&amp;quot;dmesg&amp;quot;) and discovered that the Linux
&amp;quot;out&lt;/p&gt;
&lt;p&gt;of memory (OOM) killer&amp;quot; had started killing random processes to try to
free up&lt;/p&gt;
&lt;p&gt;memory. It was killing the PostgreSQL processes, the Evergreen processes
-&lt;/p&gt;
&lt;p&gt;anything! I was lucky, because I had been reading about the OOM on Linux&lt;/p&gt;
&lt;p&gt;after hearing about a Linux user that had run into a similar&lt;/p&gt;
&lt;p&gt;problem, and knew that the way to disable the OOM was to prevent Linux
from&lt;/p&gt;
&lt;p&gt;overcommitting memory to processes in the first place. Wondering why our&lt;/p&gt;
&lt;p&gt;system had started running out of memory in the first place, I ran
&amp;quot;free&amp;quot; and&lt;/p&gt;
&lt;p&gt;saw that it had been set up with no swap space; I confirmed this by
running&lt;/p&gt;
&lt;p&gt;fdisk to see that there were no swap partitions. Here, however, I made a&lt;/p&gt;
&lt;p&gt;mistake. I ran &amp;quot;echo '2' &amp;gt; /proc/sys/vm/overcommit_memory&amp;quot; to prevent
Linux&lt;/p&gt;
&lt;p&gt;from overcommitting memory to new processes and to prevent the OOM
killer from&lt;/p&gt;
&lt;p&gt;killing any more random processes. But this also meant that I was
immediately&lt;/p&gt;
&lt;p&gt;unable to launch any new programs - so I could not safely shut down
PostgreSQL&lt;/p&gt;
&lt;p&gt;and Evergreen, and we had to turn the power off to the system.&lt;/p&gt;
&lt;p&gt;Fortunately, the system started up cleanly again (hurray for journalled&lt;/p&gt;
&lt;p&gt;filesystems) and I was able to complete the upgrade before the rest of
our&lt;/p&gt;
&lt;p&gt;hands on session for the day was finished. A few things that are missing
in the&lt;/p&gt;
&lt;p&gt;current upgrade instructions:&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p class="first"&gt;You have to compile the new version of Evergreen. The easiest way to
do&lt;/p&gt;
&lt;/p&gt;&lt;p&gt;this is to copy install.conf over from your previous version of
Evergreen and&lt;/p&gt;
&lt;p&gt;run &amp;quot;make config&amp;quot; to ensure that all of the settings are still
correct, then&lt;/p&gt;
&lt;p&gt;run &amp;quot;make&amp;quot; to build the new version of Evergreen.&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;Very important&lt;/strong&gt;: Before installing the new version of Evergreen,
you must&lt;/p&gt;
&lt;/p&gt;&lt;p&gt;prevent the database schema from being completely recreated or it
will destroy&lt;/p&gt;
&lt;p&gt;any data that is already in your system. One way of doing this is,
during the&lt;/p&gt;
&lt;p&gt;&amp;quot;make config&amp;quot; step, to list all of the Evergreen targets _except
for_&lt;/p&gt;
&lt;p&gt;openils_db. I am simply incapable of remembering all of those
targets, so my&lt;/p&gt;
&lt;p&gt;dirty workaround is to open Open-ILS/src/Makefile in an editor and
modify the&lt;/p&gt;
&lt;p&gt;&amp;quot;install: &amp;quot; make target by removing the &amp;quot;storage-bootstrap&amp;quot; make
target. What&lt;/p&gt;
&lt;p&gt;we really need is an &amp;quot;upgrade&amp;quot; target for &amp;quot;make config&amp;quot; that simply
installs&lt;/p&gt;
&lt;p&gt;everything except for the database schema.&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Confirm that the new version of Evergreen has been installed by
running&lt;/p&gt;
&lt;/p&gt;&lt;p&gt;the srfsh command &amp;quot;request open-ils.storage open-ils.system.version&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For tomorrow (today, by the time you receive this), A. and G. are going
to&lt;/p&gt;
&lt;p&gt;create a swap file to enable the system to swap memory to disk if need
be; the&lt;/p&gt;
&lt;p&gt;system has 1 GB of RAM, which is enough for a small Evergreen system but
when&lt;/p&gt;
&lt;p&gt;one is compiling programs at the same time as running Evergreen swap
space&lt;/p&gt;
&lt;p&gt;really is necessary. This was a very good lesson learned for all of us!&lt;/p&gt;
&lt;ol class="upperalpha simple" start="5"&gt;
&lt;li&gt;also interested in learning more about basic Linux&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;administration. His institution currently runs on an entirely Windows&lt;/p&gt;
&lt;p&gt;infrastructure, so the requirement to learn Linux is a fairly high
hurdle.&lt;/p&gt;
&lt;p&gt;I'm hoping that the eIFL-FOSS list will be a good resource for him to
start&lt;/p&gt;
&lt;p&gt;that journey. He has also asked to go over the step-by-step instructions
for&lt;/p&gt;
&lt;p&gt;installing Evergreen, so I'm considering starting that in a VMWare
session so&lt;/p&gt;
&lt;p&gt;that we can run through the steps. Our major goal for tomorrow is to
migrate&lt;/p&gt;
&lt;p&gt;some data from FSL's legacy system into Evergreen. Wish us luck!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Editorial comment:&lt;/em&gt; The combination of Armenian and Russian MARC
records refused to load into the Evergreen 1.2.2.1 system, but on the
flight home I confirmed that they loaded perfectly and were searchable
on my Evergreen development system. As the development version will
become this summer's 1.4 &amp;quot;internationalization&amp;quot; release, we are in good
shape.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Editorial comment 2:&lt;/em&gt;On the second day, while running in circles
trying to figure out why the records were refusing to load into the
1.2.2.1 system, I decided to try the
&lt;a class="reference external" href="irc://chat.freenode.net/#openils-evergreen"&gt;#openils-evergreen&lt;/a&gt; IRC
channel. Yerevan is 9 hours ahead of the Toronto/Atlanta time zone, so
at noon Yerevan time I was hardly expecting any of the current core
Evergreen developers to be online - yet, to our amazement, Mike Rylander
responded. This was a pretty convincing demonstration to the attendees
that the core developers really aren't far away or hard to contact at
all.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 24 Jun 2008 00:34:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2008-06-24:/eifl-foss-ils-workshop-on-evergreen-day-one.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Get out of jail, go free, part I</title><link>https://coffeecode.net/get-out-of-jail-go-free-part-i.html</link><description>&lt;p&gt;As Mark Leggott mentioned in &lt;a class="reference external" href="http://loomware.typepad.com/loomware/2008/05/vendor-to-open.html"&gt;Vendor to Open Source ILS in 1 Month
#1&lt;/a&gt;,
I had the pleasure of assisting the migration of the University of
Prince Edward Island library system from Unicorn to Evergreen. &lt;a class="reference external" href="/archives/123-Evergreen-and-the-business-case-for-choosing-an-open-source-ILS.html"&gt;A little
over a year
ago&lt;/a&gt;,
in discussing the business case for open source library systems, I
stated that one of the problems we faced with migrations is that the
license for a proprietary system often inhibits openly sharing of
information about how to export data from those systems in
machine-usable formats. Thus, the open source library community needs to
encourage the development of &amp;quot;migration ninjas&amp;quot;. Little did I know that
I would soon join the guild of ninjas and become &lt;em&gt;deadly and silent, and
unspeakably violent&lt;/em&gt;(1)(2).&lt;/p&gt;
&lt;p&gt;As a result, I have created a utility script that should be of
assistance to SirsiDynix Unicorn or Symphony sites who are interested in
exploring the possibilities offered by other library systems. The rather
dryly named &amp;quot;export_unicorn.pl&amp;quot; script was added to the &lt;a class="reference external" href="http://sirsiapi.org"&gt;Unicorn API
repository&lt;/a&gt; as entry # 228 today under a GPL v2
license(3). As the script uses the Unicorn/Symphony API, however, I am
sadly (to the best of my knowledge) not free to simply share the script
with anyone. Therefore, to gain access to the script you must be an
API-certified Unicorn or Symphony customer. Still, by making an export
script available to SirsiDynix customers that provides the raw data in a
relatively standard output format, it should ease the effort required by
the migration ninjas for open source systems to massage the data into
the needed input formats, and to avoid the
&lt;a class="reference external" href="http://www.google.ca/search?q=define%3Atetsubishi"&gt;tetsu-bishi&lt;/a&gt;
scattered by the proprietary systems in defence of &amp;quot;their&amp;quot; data(4)(5).&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://www.bnlmusic.com"&gt;Barenaked Ladies&lt;/a&gt;, &amp;quot;The Ninjas&amp;quot;. &lt;em&gt;Their
website is horrible Flash and JavaScript overkill but damnit Jim,
they're musicians, not webmasters; the &amp;quot;Snacktime&amp;quot; album is
especially recommended if you have kids.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Although I have to say I'm nowhere near as violent as Mike Rylander,
who with his PostgreSQL-fu can carve seemingly any piece of data into
the shape needed for import into Evergreen.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Thanks to Mark Leggott for insisting that I retain copyright over
the scripts created during the UPEI migration and for allowing me to
share those scripts in the appropriate avenues. It's another weapon
(shuriken? ninja-to?) in the migration ninja arsenal.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;This data does, after all, belong to the libraries who license a
library system, but at least one company reportedly has a pattern of
repeatedly removing interfaces that enable easy machine-readable
access to library data...&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;I find myself being thankful that Unicorn does provide an API for
generating machine-readable data exports; all that it cost our
library was a week of my life and the associated training fees and
travel expenses&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 16 Jun 2008 20:38:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2008-06-16:/get-out-of-jail-go-free-part-i.html</guid><category>misc</category><category>Evergreen</category></item><item><title>Introduction to Evergreen at eIFL-FOSS ILS workshop</title><link>https://coffeecode.net/introduction-to-evergreen-at-eifl-foss-ils-workshop.html</link><description>&lt;p&gt;I was in Armenia last week, leading a &lt;a class="reference external" href="http://www.eifl.net/cps/sections/services/eifl-foss/ils/ils-project-workshop"&gt;workshop on open source library
systems&lt;/a&gt;
along with Henri Damien Laurent from &lt;a class="reference external" href="http://biblibre.com"&gt;BibLibre&lt;/a&gt;.
My charge was to introduce Evergreen and lead participants in two days
of hands-on experience with the system; Henri took on the same task for
Koha. I cannot say enough good things about our host for the workshop,
the &lt;a class="reference external" href="http://www.sci.am"&gt;Fundamental Library of the National Academy of Sciences of
Armenia&lt;/a&gt; headed up by Tigran Zargaryan; nor can I
offer enough compliments to Randy Metcalfe on his skills in ensuring
that everything ran smoothly; nor can I express how rewarding it was to
meet representatives of so many different countries and how much I
enjoyed their company! I look forward to helping the pilot sites succeed
with their implementations.&lt;/p&gt;
&lt;p&gt;So, for the short term, I'll simply link to the &amp;quot;Introduction to
Evergreen&amp;quot; presentation that I gave at the start of the workshop in&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/uploads/talks/2008/Evergreen-eIFL-FOSS.odp"&gt;OpenOffice&lt;/a&gt;
and
&lt;a class="reference external" href="/uploads/talks/2008/Evergreen-eIFL-FOSS.ppt"&gt;PowerPoint&lt;/a&gt;
formats (as I promised to the participants). In the next day or two I
plan to post a summary of the workshop activities; some of the lessons
learned; and where I think I'll focus my attention next.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 16 Jun 2008 20:04:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2008-06-16:/introduction-to-evergreen-at-eifl-foss-ils-workshop.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>In which digital manifestations of myself plague the Internets</title><link>https://coffeecode.net/in-which-digital-manifestations-of-myself-plague-the-internets.html</link><description>&lt;p&gt;Over the past few months, I've been fortunate enough to participate in a
few events that have been recorded and made available on the 'net for
your perpetual amusement. Well - amusing if you're a special sort of
person. Following are the three latest such adventures, in chronological
order:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://www.archive.org/details/code4lib.conf.2008.pres.CouchDBsacrilege"&gt;CouchDB: delicious
sacrilege&lt;/a&gt;
(presentation at the Code4Lib 2008 conference from February 2008).
You can find my slides for the presentation
&lt;a class="reference external" href="/archives/151-CouchDB-delicious-sacrilege.html"&gt;here&lt;/a&gt;,
but Noel Peden did such a good job of recording the video that you
probably don't need them. Watching this wasn't as painful as I
thought it was going to be. Oh, and what is this? It's a fairly
technical introduction to
&lt;a class="reference external" href="http://incubator.apache.org/couchdb/"&gt;CouchDB&lt;/a&gt;, a RESTful,
replicating, high-performance document database. It's only 20 minutes
long, and it may be amusing to watch my presentation &amp;quot;style&amp;quot; even if
you don't care about the technical bits at all. Oh, and my monitor
was blank for the entire thing, so I had to look over my shoulder to
see what my audience was seeing. video_out_problems--&lt;/li&gt;
&lt;li&gt;I gave a presentation on the state of acquisitions in Evergreen as of
March 12, 2008 at the &lt;a class="reference external" href="http://www.valenj.org/newvale/ols/symposium2008/program-schedule.shtml"&gt;VALE Next Generation Academic Library
Symposium&lt;/a&gt;.
VALE made &lt;a class="reference external" href="mms://video.wpunj.edu/FMG1/locally_produced/wmv_300kbit/LD-4-10-08_OLS-Symposium-D_WMV_300Kbit.wmv"&gt;video (streaming
WMV)&lt;/a&gt;
available, as well as &lt;a class="reference external" href="http://www.valenj.org/newvale/ols/symposium2008/media/dscott.mp3"&gt;audio
(MP3)&lt;/a&gt;,
and my slides are available
&lt;a class="reference external" href="/archives/152-Evergreen-Acquisitions-at-VALEs-Next-Generation-Academic-Library-System-Symposium.html"&gt;here&lt;/a&gt;.
I haven't watched this one yet: for one thing, the state of Evergreen
acquisitions has come a &lt;em&gt;long&lt;/em&gt; way in the past two months. For
another, during the question-and-answer session that follows my talk,
I recall giving a rather garbled answer to what should have been a
straightforward question about the GPL license. Of course, nothing is
straightforward about licensing...&lt;/li&gt;
&lt;li&gt;Last week I was at the University of Windsor collaborating with the
likes of Mike Rylander, Bill Erickson, &lt;a class="reference external" href="http://lisletters.fiander.info/"&gt;David
Fiander&lt;/a&gt;, &lt;a class="reference external" href="http://www.google.ca/search?q=art+rhyno"&gt;Art
Rhyno&lt;/a&gt;, &lt;a class="reference external" href="http://libgrunt.blogspot.com/"&gt;John
Fink&lt;/a&gt;, &lt;a class="reference external" href="http://lackoftalent.org/michael/blog/"&gt;Michael
Giarlo&lt;/a&gt;, and &lt;a class="reference external" href="http://fawcett.blogspot.com/"&gt;Graham
Fawcett&lt;/a&gt; on Evergreen's acquisitions
system... David snapped &lt;a class="reference external" href="http://www.flickr.com/photos/bookgeek/2515771427/"&gt;this
photo&lt;/a&gt; of John
and I working in the ancient &amp;quot;Technical Services&amp;quot; room (hah!) and it
was picked up by a &lt;a class="reference external" href="http://www.blogwindsor.com/2008/05/28/library-geeks/#more-273"&gt;local Windsor
blog&lt;/a&gt;
with the comment &amp;quot;librarians are the new geek&amp;quot;. Thanks, I think...&lt;/li&gt;
&lt;/ul&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 28 May 2008 12:46:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2008-05-28:/in-which-digital-manifestations-of-myself-plague-the-internets.html</guid><category>misc</category><category>Coding</category></item><item><title>Weeding 2.0</title><link>https://coffeecode.net/weeding-20.html</link><description>&lt;p&gt;Okay, this is definitely a lame thing to be thinking about at midnight
on a Saturday, but I was just playing with the shelf browser in the
&lt;a class="reference external" href="http://open-ils.org"&gt;Evergreen&lt;/a&gt; representation of our 780,000
bibliographic records (okay, that is definitely the wrong thing to be
&lt;em&gt;doing&lt;/em&gt; at midnight on a Saturday). For some reason, I was wandering
through the subject collection pertinent to librarians (pray for my
soul), noticed a book that probably should have been discarded years
ago, and thought &amp;quot;Gee, i don't want to deal with this right now, but
wouldn't it be nice if I could just mark this &lt;strong&gt;Weed me&lt;/strong&gt; and forget
about it until Monday?&amp;quot;&lt;/p&gt;
&lt;p&gt;Then I realized that that wouldn't be a stretch at all. In Evergreen,
users have &amp;quot;bookbags&amp;quot; to which they can add items. These bookbags can be
shared as RSS feeds and otherwise easily exported into other formats. If
we were running Evergreen for real, I could create a &amp;quot;Weed me!&amp;quot; bookbag,
add in the suspect along with a bunch of other festering tomes, and send
the RSS feed to a student to perform the manual labour. Or perhaps the
RSS feed gets aggregated with other weeders' feeds and a weeding list
gets generated on a monthly basis for efficient labour practices. You
get the idea.&lt;/p&gt;
&lt;p&gt;Of course, you would really want to have more information than just the
stock shelf browsing interface at hand when making weeding decisions.
For example, you would need a tally of recorded uses displayed beside
the item, with the ability to drill down for totals by year. If you
participate in a consortial &amp;quot;last copy standing&amp;quot; program, you would want
a quick check to see if any other institutions still hold a copy of the
resource. So, an enhanced interface would be needed to provide an
experience that combines the traditional weeding approach of roaming the
stacks and generating reports of items matching some minimum age and
minimum usage criteria.&lt;/p&gt;
&lt;p&gt;Think about it a little further though (I'm sure you're thinking a lot
faster than me at this point; you're probably having the luxury of
reading this at the beginning of the day, coffee in hand, invigorated
after an early morning run in the lingering late spring chill... or
not), and there are points in our institutional workflows where we could
naturally introduce weeding activities. How do we get to the point of
having three editions of a given text on the shelf? If I have the 1995,
2003, and 2007 editions of a text, I can assure you that when I ordered
the 2007 edition I had already checked our ILS to see if we had a copy
of that edition already, and would have noticed the previous editions.
At that point, I should have the ability to say &amp;quot;Oh - get rid of the
1995 edition &lt;strong&gt;now&lt;/strong&gt; and once the 2007 edition is processed and on the
shelf, cull the 2003 edition to boot.&amp;quot; If I was designing an
acquisitions module today, that's certainly something I would consider
as a nice-to-have. Ahem.&lt;/p&gt;
&lt;p&gt;Weeding 2.0 may not be a sexy subject.
&lt;a class="reference external" href="http://www.google.ca/search?q=%22weeding+2.0%22"&gt;Google&lt;/a&gt; and
&lt;a class="reference external" href="http://search.yahoo.com/search?p=%22weeding+2.0%22"&gt;Yahoo&lt;/a&gt; each turn
up exactly four hits, none of them related to libraries, which is
remarkable in this overly-hyped everything 2.0 world. But it's something
we should consider in the design and tailoring of our library systems;
and while it's not going to rank in my top level of priorities for
Evergreen, it will work its way in there somewhere, sometime. Hopefully
before the stacks in my subject areas buckle under the weight of unused,
out-of-date books.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sun, 11 May 2008 04:07:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2008-05-11:/weeding-20.html</guid><category>misc</category><category>Evergreen</category></item><item><title>Two! 2! Too! Tu! Tout!</title><link>https://coffeecode.net/two-2-too-tu-tout.html</link><description>&lt;div class="serendipity_imageComment_left" style="width: 110px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external" href="/uploads/pics/amber/amber_bday_2008_1.jpg"&gt;|image0|&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Ramping up&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;p&gt;This year, we hosted a small party focusing on the little ones in
Amber's life: a few of her friends from day care, and a friend from up
the street.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="serendipity_imageComment_left" style="width: 110px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external" href="/uploads/pics/amber/amber_bday_2008_2.jpg"&gt;|image1|&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;The amazing cat cake&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Lynn used the same carrot cake recipe as last year (nice and tasty!),
but this year it came in the appearance of Amber's favourite animal.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="serendipity_imageComment_left" style="width: 110px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external" href="/uploads/pics/amber/amber_bday_2008_3.jpg"&gt;|image2|&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;She blew out the candle herself. Self! SELF!&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Blowing out the candle was a huge success.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="serendipity_imageComment_left" style="width: 110px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external" href="/uploads/pics/amber/amber_bday_2008_4.jpg"&gt;|image3|&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Cake distribution went smoothly&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Very little cake was wasted in the making of this birthday. Most of the
cake was consumed rather than applied to faces or clothes.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="serendipity_imageComment_left" style="width: 110px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external" href="/uploads/pics/amber/amber_bday_2008_5.jpg"&gt;|image4|&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Daddy and Amber wound down with a book in the window on a rainy day&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Thanks to everyone for their cards and calls and emails celebrating
Amber's birthday!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sat, 10 May 2008 13:32:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2008-05-10:/two-2-too-tu-tout.html</guid><category>misc</category><category>Amber</category></item><item><title>Tuning PostgreSQL for Evergreen on a test server</title><link>https://coffeecode.net/tuning-postgresql-for-evergreen-on-a-test-server.html</link><description>&lt;p&gt;&lt;strong&gt;Update 2008-05-01&lt;/strong&gt;: Fixed a typo for sysctl: -a parameter simply
shows all settings; -w parameter is needed to write the setting. Duh.&lt;/p&gt;
&lt;p&gt;Once you have decided on and acquired your &lt;a class="reference external" href="http://www.coffeecode.net/archives/155-Test-server-strategies.html"&gt;test hardware for
Evergreen&lt;/a&gt;,
you need to think about tuning your PostgreSQL database server. Once you
start loading bibliographic records, you might notice that after 100,000
records or so that your search response times aren't too snappy. Don't
snarl at Evergreen. By default, PostgreSQL ships with very conservative
settings (something like machines with 256 MB of RAM!) so if you don't
tune those settings you're getting a false representation of your
system's capabilities.&lt;/p&gt;
&lt;p&gt;The &amp;quot;right&amp;quot; settings for PostgreSQL depend significantly on your
hardware and deployment context, but in almost any circumstance you will
want to bump up the settings from the delivered defaults. To give you an
idea of what you need to consider, I thought I would share the settings
that we're currently using on our Evergreen test server at Laurentian
University. You might be able to use these as a starting point and
adjust them accordingly once you've run some representative load tests
against your configuration. And it's useful documentation for me to fall
back on in a few months, when all of this has escaped my grasp &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;div class="section" id="the-defaults-as-shipped-in-debian-etch"&gt;
&lt;h2&gt;The defaults (as shipped in Debian Etch)&lt;/h2&gt;
&lt;p&gt;The defaults in Debian Etch are quite conservative. Consider that our
test server has 12GB of RAM. The default only allocates 1MB of RAM to
work memory (which is critical for sorting performance) and only 8MB of
RAM to shared buffers. Following are the defaults set in
/etc/postgresql/8.1/main/postgresql.conf:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
# - Memory -#shared_buffers = 1000                  # min 16 or max_connections*2, 8KB each#temp_buffers = 1000                    # min 100, 8KB each#max_prepared_transactions = 5          # can be 0 or more# note: increasing max_prepared_transactions costs ~600 bytes of shared memory# per transaction slot, plus lock space (see max_locks_per_transaction).#work_mem = 1024                        # min 64, size in KB#maintenance_work_mem = 16384           # min 1024, size in KB#max_stack_depth = 2048                 # min 100, size in KB# - Free Space Map -#max_fsm_pages = 20000                  # min max_fsm_relations*16, 6 bytes each#max_fsm_relations = 1000               # min 100, ~70 bytes each
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="our-test-server-settings"&gt;
&lt;h2&gt;Our test server settings&lt;/h2&gt;
&lt;p&gt;Our test server has 12 GB of RAM. Assuming that the PostgreSQL defaults
were set for a system with 1 GB of RAM, we should be able to multiply
the memory-based settings by at least a factor of 12. We're a little bit
more aggressive than that in our settings. Note, however, that this is a
single-server install of Evergreen, so we're also running memcached,
ejabberd, Apache, and all of the Evergreen services as well as the
database - oh, and a test instance of an institutional repository, among
other apps - so we're not nearly as aggressive as we would be in a
dedicated PostgreSQL server configuration. Please note that I'm making
no claims that this is the optimal set of configuration values for
PostgreSQL even on our own hardware!&lt;/p&gt;
&lt;pre class="literal-block"&gt;
# shared_buffers: much of our performance depends on sorting, so we'll set it 100X the default# some tuning guides suggest cranking this up to as much 30% of your available RAMshared_buffers = 100000 # 8K * 100000 = ~ 0.8 GB# work_mem: how much RAM each concurrent process is allowed to claim before swapping to disk# your workload will probably have a large number of concurrent processeswork_mem=524288 # 512 MB# max_fsm_pages: increased because PostgreSQL demanded itmax_fsm_pages = 200000
&lt;/pre&gt;
&lt;p&gt;After you change these settings, you will need to restart PostgreSQL to
make the settings take effect.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="kernel-tuning"&gt;
&lt;h2&gt;Kernel tuning&lt;/h2&gt;
&lt;p&gt;In addition to PostgreSQL complaining about max_fsm_pages not being
high enough, your operating system kernel defaults for SysV shared
memory might not be high enough to support the amount of RAM PostgreSQL
demands as a result of your modifications. In one of our test
configurations, we had cranked up work_mem to 8GB; Debian complained
about an insufficient SHMMAX setting, so we were able to adjust that by
running the following command as root to set the kernel SHMMAX to 8GB
(8*1024^2):&lt;/p&gt;
&lt;pre class="literal-block"&gt;
sysctl -w kernel.shmmax=8589934592
&lt;/pre&gt;
&lt;p&gt;To make this setting sticky through reboots, you can simply modify
/etc/sysctl.conf to include the following line:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
# Set SHMMAX to 8GB for PostgreSQL#kernel.shmmax=8589934592
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="other-measures"&gt;
&lt;h2&gt;Other measures&lt;/h2&gt;
&lt;p&gt;Debian Etch comes with PostgreSQL 8.1. The first version of PostgreSQL
8.1 was released in November 2005. That's a long time in computer years.
Version 8.2, which was released less than a year later, &amp;quot;adds many
functionality and performance improvements&amp;quot; (according to the &lt;a class="reference external" href="http://www.postgresql.org/docs/8.2/static/release-8-2.html"&gt;release
notes&lt;/a&gt;).
If you're not getting the performance you expect from your hardware with
Debian Etch, perhaps a &lt;a class="reference external" href="%20http://packages.debian.org/etch-backports/postgresql-8.2"&gt;backport of PostgreSQL
8.2&lt;/a&gt;
would help out.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="further-resources"&gt;
&lt;h2&gt;Further resources&lt;/h2&gt;
&lt;p&gt;This is just a shallow dip into PostgreSQL tuning for Evergreen -
hopefully enough to alert you to some of the factors you need to
consider if you're putting Evergreen into a serious testing environment
or production environment. Here are a few places to dig deeper into the
art of PostgreSQL tuning:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;PostgreSQL manual, resource consumption section of server
configuration: &lt;a class="reference external" href="http://www.postgresql.org/docs/8.1/static/runtime-config-resource.html#RUNTIME-CONFIG-RESOURCE-MEMORY"&gt;version
8.1&lt;/a&gt;
and &lt;a class="reference external" href="http://www.postgresql.org/docs/8.2/static/runtime-config-resource.html#RUNTIME-CONFIG-RESOURCE-MEMORY"&gt;version
8.2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;An annotated version of the 8.0 parameters with more explicit advice
is available at
` &amp;lt;&lt;a class="reference external" href="http://www.powerpostgresql.com/Downloads/annotated_conf_80.html"&gt;http://www.powerpostgresql.com/Downloads/annotated_conf_80.html&lt;/a&gt;&amp;gt;`__&lt;/li&gt;
&lt;li&gt;Some good advice is buried about halfway down &lt;a class="reference external" href="http://cbbrowne.com/info/postgresql.html"&gt;Christopher Browne's
page&lt;/a&gt; under the heading
&amp;quot;Tuning PostgreSQL&amp;quot;, along with links to further resources&lt;/li&gt;
&lt;li&gt;The &amp;quot;Performance Whack-A-Mole&amp;quot; presentation at
&lt;a class="reference external" href="http://www.powerpostgresql.com/Docs"&gt;PowerPostgreSQL&lt;/a&gt; is a great
tutorial for holistic system tuning&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 14 Apr 2008 18:48:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2008-04-14:/tuning-postgresql-for-evergreen-on-a-test-server.html</guid><category>Libraries</category><category>Evergreen</category><category>PostgreSQL</category></item><item><title>Test server strategies</title><link>https://coffeecode.net/test-server-strategies.html</link><description>&lt;p&gt;Occasionally on the &lt;a class="reference external" href="http://open-ils.org/irc.php"&gt;#OpenILS-Evergreen IRC
channel&lt;/a&gt;, a question comes up what kind
of hardware a site should buy if they're getting serious about trying
out Evergreen. I had exactly the same chat with Mike Rylander back in
December, so I thought it might be useful to share the strategy we
developed in case other organizations are interested in piggy-backing on
our research. We came up with three different scenarios, depending on
the funding available to the organization and how serious the
organization is about testing, developing, and deploying Evergreen.&lt;/p&gt;
&lt;p&gt;You can also look at the scenarios as stages, as the scenarios enable&lt;/p&gt;
&lt;p&gt;progressively more realistic testing. An organization can always&lt;/p&gt;
&lt;p&gt;start with a single server and add more servers over time; if you can&lt;/p&gt;
&lt;p&gt;swing a significant discount for buying in bulk, however, it might&lt;/p&gt;
&lt;p&gt;make sense to bite the bullet early.&lt;/p&gt;
&lt;p&gt;Some pertinent facts about our requirements: we will eventually be
loading around 5 million bibliographic records onto the system. We're an
academic organization, so concurrent searching and circulation loads
will be low relative to public libraries.&lt;/p&gt;
&lt;div class="section" id="scenario-1-a-single-bargain-basement-testing-server"&gt;
&lt;h2&gt;Scenario 1: A single bargain-basement testing server&lt;/h2&gt;
&lt;p&gt;In this scenario, the organization purchases a single server for the
short&lt;/p&gt;
&lt;p&gt;term, and configures it to run the entire Evergreen + OpenSRF stack:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;database&lt;/li&gt;
&lt;li&gt;Web server&lt;/li&gt;
&lt;li&gt;Jabber messaging&lt;/li&gt;
&lt;li&gt;memcached&lt;/li&gt;
&lt;li&gt;OpenSRF applications
&amp;lt;/p&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This server needs to have powerful CPUs, large amounts of RAM, and many
fast (10K RPM or higher) hard drives in a&lt;/p&gt;
&lt;p&gt;striped RAID configuration (the latter because database performance&lt;/p&gt;
&lt;p&gt;typically gets knee-capped by disk access). A &amp;quot;higher education&amp;quot; quote
online from a reputable big-name vendor for a rack-mounted 2U database
server with 2x4-core&lt;/p&gt;
&lt;p&gt;CPU, 16GB RAM, 6x73GB RAID 5 drives comes in at approximately $7000.&lt;/p&gt;
&lt;p&gt;This scenario is fine for development and testing with a limited&lt;/p&gt;
&lt;p&gt;number of users, but if you intend to do any sort of stress testing&lt;/p&gt;
&lt;p&gt;with this server or throw it open to the public, performance will&lt;/p&gt;
&lt;p&gt;likely grind to a halt. &lt;strong&gt;Note:&lt;/strong&gt; This is close to the system that we're
currently running at &lt;a class="reference external" href="http://biblio-dev.laurentian.ca"&gt;http://biblio-dev.laurentian.ca&lt;/a&gt; - 12 GB of RAM, 2
dual-core CPUs - with 800K bibliographic records and pretty snappy
search performance. It's certainly nothing to sneeze at.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="scenario-2-one-database-server-one-network-server"&gt;
&lt;h2&gt;Scenario 2: one database server, one network server&lt;/h2&gt;
&lt;p&gt;In this scenario, you purchase a database server and a network server.&lt;/p&gt;
&lt;p&gt;We'll use the same specs from scenario 1 for the database server, and&lt;/p&gt;
&lt;p&gt;a CPU + RAM-oriented server for the network server (disk access isn't&lt;/p&gt;
&lt;p&gt;a factor for the network apps, so you just buy two small mirrored&lt;/p&gt;
&lt;p&gt;drives). The stock higher education quote for a rack-mounted 1U&lt;/p&gt;
&lt;p&gt;network server with 2x4-core CPU, 16GB RAM, 2x73GB RAID 1 drives is&lt;/p&gt;
&lt;p&gt;approximately $5250.&lt;/p&gt;
&lt;p&gt;This scenario will support development and testing, as well as enable&lt;/p&gt;
&lt;p&gt;you perform relatively representative stress testing runs with a&lt;/p&gt;
&lt;p&gt;significant number of simultaneous users.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="scenario-3-two-database-servers-two-or-three-network-servers"&gt;
&lt;h2&gt;Scenario 3: two database servers, two or three network servers&lt;/h2&gt;
&lt;p&gt;In this scenario, you purchase two database servers so that you can test&lt;/p&gt;
&lt;p&gt;database replication, split database loads between search and reporting,
and two or three network servers to test&lt;/p&gt;
&lt;p&gt;different distributions of the caching and network apps across the
servers to&lt;/p&gt;
&lt;p&gt;determine the configuration that best meets your expected demands. The
cost of the five servers adds up to less than $30,000 - less than a
single traditional proprietary UNIX server - and would be less if you
can negotiate a bulk discount.&lt;/p&gt;
&lt;p&gt;The third scenario supports development and testing, and will give you&lt;/p&gt;
&lt;p&gt;practical experience with a configuration that would approximate your&lt;/p&gt;
&lt;p&gt;production deployment of servers. When you go live, you could move one
of the database servers&lt;/p&gt;
&lt;p&gt;and all but one of the network servers over to the production cluster,
and revert back to scenario one for your ongoing test and development
environment.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="the-conifer-approach"&gt;
&lt;h2&gt;The Conifer approach&lt;/h2&gt;
&lt;p&gt;We opted to go with the third scenario to build a serious test cluster
for our consortium. However, the &amp;quot;scenarios as stages&amp;quot; approach ended up
being our strategy as our original choice of Dell servers came with RAID
controllers that do not work well under Debian. After returning the
servers to Dell, we were forced to press one of our backup servers into
service as a scenario-one style server while waiting for our new order
from HP to arrive.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 10 Apr 2008 00:39:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2008-04-10:/test-server-strategies.html</guid><category>misc</category><category>Coding</category><category>Evergreen</category></item><item><title>Inspiring confidence that my problem will be solved</title><link>https://coffeecode.net/inspiring-confidence-that-my-problem-will-be-solved.html</link><description>&lt;p&gt;Hmm. I think I'm in trouble if the support site itself is incapable of
displaying accented characters properly.&lt;/p&gt;
&lt;div class="serendipity_imageComment_center"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;img alt="Corrupted characters in a problem report about corrupted characters. Oh dear." class="serendipity-image-center" src="/uploads/pics/inspiring_confidence.png" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Corrupted characters in a problem report about corrupted characters. Oh
dear.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;p&gt;My analysis of the problem is that the content in the middle is
contained within a frame, and is actually encoded in ISO-8859-1 - but
doesn't have an encoding declaration. And the containing HTML page, of
course, declares that it is UTF-8. So poor Mozilla gets very confused.
And our poor users continue to get corrupted characters in their
reminder and overdues notices.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note&lt;/em&gt;: Some information removed from the screencap to protect the
innocent - the client care people are actually excellent folk, and I'm
sure they're just as frustrated by the problem reporting system as we
are.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 28 Mar 2008 01:39:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2008-03-28:/inspiring-confidence-that-my-problem-will-be-solved.html</guid><category>misc</category><category>Coding</category></item><item><title>Progress with Project Conifer</title><link>https://coffeecode.net/progress-with-project-conifer.html</link><description>&lt;p&gt;Project Conifer is the effort by McMaster University, University of
Windsor, and Laurentian University to put together a consortial instance
of Evergreen. &lt;a class="reference external" href="http://conifer.mcmaster.ca/node/15"&gt;A few weeks back&lt;/a&gt;,
we agreed that May 2009 would be our go-live date. So the clock is
ticking quite loudly in my ears.&lt;/p&gt;
&lt;p&gt;Today I got an &lt;a class="reference external" href="http://biblio-dev.laurentian.ca"&gt;Evergreen test
server&lt;/a&gt; up and running, loaded with
the records from the consortium of Laurentian partners. I hit a few
bumps on the road, but eventually successfully loaded about 800,000
bibliographic records and about 500,000 items. I also turned on the
Syndetics enrichment data, so some items offer cover images, tables of
contents, reviews, and author information. The response time is pretty
snappy (it's running on a 4-core server with 12GB of RAM).&lt;/p&gt;
&lt;p&gt;Things that made my task harder than it probably should have been:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;yaz-marcdump generated invalid XML when I converted our MARC records
from MARC21 to MARC21XML format. Maybe this problem is fixed in later
versions of yaz-marcdump (I was using the stable Debian Etch version,
2.1.56, which is &lt;em&gt;crazy&lt;/em&gt; old), or I could have tried
&lt;a class="reference external" href="http://marc4j.tigris.org/"&gt;marc4j&lt;/a&gt; or
&lt;a class="reference external" href="http://oregonstate.edu/~reeset/marcedit/html/index.html"&gt;MarcEdit&lt;/a&gt;
instead to try for better results, but I didn't, and it cascaded into
problems with...&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Dumping all of the holdings as part of the bibliographic records
threw things off when some of the records had so many holdings
attached (think a weekly periodical that a library circulates and
therefore each issue has its own barcode) that they spilled over
MARC's record length limit, resulting in multiple MARC records just
to hold the holdings - which causes some problems for the basic
import process. I eventually punted on trying to parse the MARC21XML
for holdings and just dumped the data I needed directly from Unicorn
in pipe-delimited format.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Not tuning PostgreSQL &lt;em&gt;before&lt;/em&gt; starting to load data into the
database was just plain stupid. The defaults for PostgreSQL are
incredibly conservative, and must be modified to handle large
transactions and to perform. Here are the tweaks I made for our 12GB
machine, starting with the Linux kernel memory settings:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
# -- in /etc/sysctl.conf --# Set SHMMAX to 8GB for PostgreSQLkernel.shmmax=8589934592
&lt;/pre&gt;
&lt;/p&gt;&lt;pre class="literal-block"&gt;
# -- in /etc/postgresql/8.1/main/postgresql.conf --# Crank up shared_buffers and work_memshared_buffers = 10000work_mem=8388608 # 8 GB, equal to our kernel.shmmaxmax_fsm_pages = 200000
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Evergreen depends on accurate fixed fields to determine the format of
an item. Unfortunately, many of our electronic resources appear not
to have been coded as such... so we have some data clean-up to do.&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ah well: as Jerry Pournelle used to say in his Chaos Manor column, &amp;quot;I do
these things so that you don't have to.&amp;quot; Hopefully it makes a smoother
path for others to get to Evergreen.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 27 Mar 2008 02:15:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2008-03-27:/progress-with-project-conifer.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Evergreen Acquisitions at VALE's Next Generation Academic Library System Symposium</title><link>https://coffeecode.net/evergreen-acquisitions-at-vales-next-generation-academic-library-system-symposium.html</link><description>&lt;p&gt;On Wednesday, I was fortunate enough to join a distinguished panel&lt;/p&gt;
&lt;p&gt;of speakers and a crowded music hall at &lt;a class="reference external" href="http://www.valenj.org/newvale/ols/symposium2008/"&gt;VALE's Next Generation Academic
Library System
Symposium&lt;/a&gt; at &lt;a class="reference external" href="http://www.tcnj.edu"&gt;The
College of New Jersey&lt;/a&gt;. I had been invited to&lt;/p&gt;
&lt;p&gt;present an update on the state of acquisitions support in Evergreen, as
well&lt;/p&gt;
&lt;p&gt;as to provide a brief overview of Project Conifer (the collaboration&lt;/p&gt;
&lt;p&gt;between Laurentian University, McMaster University, and the University
of&lt;/p&gt;
&lt;p&gt;Windsor to create a consortial implementation of Evergreen).&lt;/p&gt;
&lt;p&gt;To summarize what I intended to be the main points of my&lt;/p&gt;
&lt;p&gt;presentation (which may or may not have come through in real life):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;Project Conifer is an existing effort to create a shared consortial
implementation of Evergreen for academic institutions; we would be
delighted to have others join forces with us&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;If acquisitions isn't as far along as we would have hoped by now,
it's because&lt;/p&gt;
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;We (the Project Conifer institutions) haven't contributed enough&lt;/p&gt;
&lt;/p&gt;&lt;p&gt;development resource to the effort thus far - although we are
planning to&lt;/p&gt;
&lt;p&gt;correct this problem in the near term by hiring one or more
developers to&lt;/p&gt;
&lt;p&gt;work on the requirements that we, as academic institutions, need
for a&lt;/p&gt;
&lt;p&gt;successful Evergreen experience. If you're interested in a
position as an&lt;/p&gt;
&lt;p&gt;Evergreen developer for Project Conifer,&lt;/p&gt;
&lt;p&gt;&lt;p&gt;&lt;a class="reference external" href="mailto:dan&amp;#64;coffeecode.net"&gt;let's talk&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Creating an enterprise-grade acquisitions system demands much more&lt;/p&gt;
&lt;/p&gt;&lt;p&gt;effort and attention to detail than creating a simplistic
acquisitions&lt;/p&gt;
&lt;p&gt;system that would be acceptable for a small library. If it took
two years&lt;/p&gt;
&lt;p&gt;to build Evergreen's circulation, cataloging, reporting, and OPAC
functionality&lt;/p&gt;
&lt;p&gt;from scratch, it's not unreasonable that it should take a year or
more to&lt;/p&gt;
&lt;p&gt;&lt;p&gt;build an acquisitions system to the same standards as the rest of
Evergreen&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Evergreen acquisitions has made significant progress since December
2007,&lt;/p&gt;
&lt;/p&gt;&lt;p&gt;and at this pace we expect a complete set of basic functionality to
be in&lt;/p&gt;
&lt;p&gt;place by the end of April. By &amp;quot;basic functionality&amp;quot; I mean that the
manual&lt;/p&gt;
&lt;p&gt;acquisitions mode should be supported with a minimalist user
interface. MARC&lt;/p&gt;
&lt;p&gt;order record batch loading, EDI send/receive support, and a more
polished&lt;/p&gt;
&lt;p&gt;&lt;p&gt;user interface will take some more time - probably September-ish
2008. You can see the in-development, regularly updated bare-bones
interface at &lt;a class="reference external" href="http://acq.open-ils.org/oils/acq/base/index"&gt;http://acq.open-ils.org/oils/acq/base/index&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I have to say that Equinox is making incredible progress considering
that&lt;/p&gt;
&lt;p&gt;they're still doing the bulk of the work with the same amount of
development&lt;/p&gt;
&lt;p&gt;resource that they had before Georgia PINES went live on Evergreen, and&lt;/p&gt;
&lt;p&gt;they started their own company, and they started bringing BC PINES on
line,&lt;/p&gt;
&lt;p&gt;and they began receiving an onslaught of requests for visits and
presentations&lt;/p&gt;
&lt;p&gt;and conference calls... imagine what we could do with Evergreen,
together,&lt;/p&gt;
&lt;p&gt;if a few more sites or consortiums were able to devote human or&lt;/p&gt;
&lt;p&gt;financial resources to enhancing Evergreen.&lt;/p&gt;
&lt;p&gt;Here are my slides in
&lt;a class="reference external" href="/uploads/talks/2008/Evergreen_acquisitions_VALE.odp"&gt;OpenOffice&lt;/a&gt;
and
&lt;a class="reference external" href="/uploads/talks/2008/Evergreen_acquisitions_VALE.ppt"&gt;PowerPoint&lt;/a&gt;
format. If you're going to&lt;/p&gt;
&lt;p&gt;look at my slides, I highly recommend reading the presenter notes that I
wrote;&lt;/p&gt;
&lt;p&gt;I've recently realized that presenter notes are as much for the benefit
of a&lt;/p&gt;
&lt;p&gt;disconnected audience as they are useful preparation material for the
presenter. In the absence of a full paper on the subject matter at hand,
presenter notes should help flesh out the brevity forced by slideware.&lt;/p&gt;
&lt;p&gt;A huge thanks to Ed Corrado, Anne Hoang, and Kurt Wagner for making the
overall experience&lt;/p&gt;
&lt;p&gt;so enjoyable. I was honoured to be part of such a high-quality panel of&lt;/p&gt;
&lt;p&gt;speakers.&lt;/p&gt;
&lt;p&gt;Oh, and as an aside - the entire symposium was videotaped, and the&lt;/p&gt;
&lt;p&gt;presentations and question and answer sessions will be made available&lt;/p&gt;
&lt;p&gt;from the VALE Web site. I will update this post when those become
available. I&lt;/p&gt;
&lt;p&gt;wonder if Ed got this idea from code4lib... in any case, I certainly
applaud&lt;/p&gt;
&lt;p&gt;the initiative.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Umm, more polished acquisitions will likely be available in
Sept. 2008, not 2007... thanks to Brad Lajeunesse for pointing out that
time travel would be required to make that happen&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sat, 15 Mar 2008 16:34:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2008-03-15:/evergreen-acquisitions-at-vales-next-generation-academic-library-system-symposium.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>CouchDB: delicious sacrilege</title><link>https://coffeecode.net/couchdb-delicious-sacrilege.html</link><description>&lt;p&gt;Well, the talk about CouchDB (an open-source document database similar
in concept to Lotus Notes, but with a RESTful API and JSON as an
interchange format) wasn't as much of a train wreck as it could have
been. I learned a lot putting it together, and had some fun with the
content - and even though it was a marked departure from the style of
many of the other presentations, I think it was generally positively
received (at least, from what I could glean from the backscroll in
#code4lib and from comments).&lt;/p&gt;
&lt;p&gt;I veer towards the &amp;quot;here's how you do stuff&amp;quot; technical angle because
that tends to be what I'm interested in hearing from other people. And
even though a 20 minute slot is probably the wrong venue for technical
information, CouchDB is so simple in some respects that it's actually
enough to get the core message across.&lt;/p&gt;
&lt;p&gt;Here are the slides for your amusement and enlightenment. At some point
I'm going to write down the OpenOffice.org secret that lets you change
the colour of hypertext links - I've learned and forgotten that a number
of times already.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;CouchDB: Delicious Sacrilege (OpenOffice Impress)&lt;/li&gt;
&lt;li&gt;CouchDB: Delicious Sacrilege (PDF)&lt;/li&gt;
&lt;/ul&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 28 Feb 2008 22:23:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2008-02-28:/couchdb-delicious-sacrilege.html</guid><category>Databases</category><category>Coding</category></item><item><title>Evergreen workshop at code4lib 2008</title><link>https://coffeecode.net/evergreen-workshop-at-code4lib-2008.html</link><description>&lt;p&gt;Yesterday morning we (Bill Erickson, Sally Murphy &lt;em&gt;aka&lt;/em&gt; &amp;quot;Murph&amp;quot;, and I
ran an &lt;a class="reference external" href="http://open-ils.org/dokuwiki/doku.php?id=advocacy:evergreen_workshop"&gt;Evergreen
workshop&lt;/a&gt;
(rough agenda, presentation, and links to associated resources from that
page) for the code4lib 2008 preconference session. My personal goals
were:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Walk people through a simple Evergreen install&lt;/li&gt;
&lt;li&gt;Get a small set of bib records and holdings imported&lt;/li&gt;
&lt;li&gt;Attract some more developers to the project by demonstrating how
seductively simple it is to add a new service to Evergreen at the
OpenSRF layer and then expose it in the catalogue or staff client&lt;/li&gt;
&lt;li&gt;Show off some of the great features of Evergreen that haven't had
nearly enough exposure (reports, &amp;quot;fresh meat&amp;quot; feeds, exporter
interface)&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="section" id="problems"&gt;
&lt;h2&gt;Problems&lt;/h2&gt;
&lt;p id="problem1"&gt;Problem #1: I started organizing the pre-conference too late. To
save time on the install section, I asked attendees to prepare by
setting up a VMWare image or bootable Debian or Ubuntu partition and get
a bunch of the prerequisite packages installed ahead of time. But by the
time I sent my request out, the attendees only had a few days to prepare
- and many of them probably hadn't worked with VMWare before, so they
suddenly had another learning barrier to overcome. I wasn't too
surprised when only about 25% of the room had been able to &amp;quot;do their
homework&amp;quot;.&lt;/p&gt;
&lt;p&gt;Problem #2: I lost at least six hours of preparation time when, due to
my own stupidity, I left my passport in a hotel in Atlanta and ended up
having to drive across the border from Vancouver to Portland, Oregon.
Six hours, man... that's almost a full day thrown away, which is
critical when you've left things too late (see &lt;a class="reference internal" href="#problem1"&gt;problem1&lt;/a&gt;).
Continuing on the negative side, all I could listen to during the drive
was completely formulaic rock stations and political rhetoric worthy of
10-year-olds as I drove through Washington. If radio is a dying medium,
I have a very good idea why...&lt;/p&gt;
&lt;p&gt;Problem #3: We ran into bizarre projector problems that, for some
reason, prevented us from being able to see our laptop screens at the
same time as the projected screen. This laptop worked fine with the
projector at the OLA Superconference just a few weeks ago, and Bill was
afflicted by the same problem - so it really put a crimp in my ability
to switch from the presentation to the live install image. My neck was
wrecked from constantly twisting around to peer up at the screen while
trying to do some minor mousing around.&lt;/p&gt;
&lt;p id="problem4"&gt;Problem #4: I severely underestimated how long the install
process would take when trying to support a whole group of people at
once; you're guaranteed to have a question on almost every step. When we
were preparing for the workshop, we had this idea that we would take a
hard line and spend no more than one or two minutes on each step - which
certainly would have saved a lot of time. But when you've made a
connection with the audience, and people have made it through the first
dozen steps, it suddenly becomes a lot, lot harder to simply abandon
them with the promise that you'll help them later. So we ended up
spending something like 2 hours on the install (including a break)
rather than the 45 minutes we had been aiming for.&lt;/p&gt;
&lt;p&gt;Problem #5: We were overly optimistic about how much we could get done
in 2.5 hours. Even without the severe compounding of our time crunch by
&lt;a class="reference internal" href="#problem4"&gt;problem4&lt;/a&gt;, in retrospect it's clear we would still have been rushing through
all of the other pieces. I think we knew that anyways, but we were just so
excited about showing off Evergreen that we wanted to show off as much as
possible.&lt;/p&gt;
&lt;p&gt;It's not really all that bleak though. There were successes, too.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="successes"&gt;
&lt;h2&gt;Successes&lt;/h2&gt;
&lt;p&gt;Success #1: We have at least one person who successfully made it through
the install phase and who successfully imported the bib records and
holdings, and several others who feel they are &lt;em&gt;very&lt;/em&gt; close to
finishing. I'm hoping that we can spend a few minutes over the course of
the conference to help them reach that finish line.&lt;/p&gt;
&lt;p&gt;Success #2: We have a real example of &lt;a class="reference external" href="http://open-ils.org/dokuwiki/doku.php?id=importing:holdings:import_via_staging_table"&gt;how to import
holdings&lt;/a&gt;
into Evergreen now. This is something that people have been asking for
on the list, and I'm really happy to have been able to package up what
Mike Rylander provided with a set of sample records and a sample &amp;quot;parse
holdings&amp;quot; script that hopefully others will be able to adopt to their
own needs.&lt;/p&gt;
&lt;p&gt;Success #3: I had feedback from a number of people who, even though they
weren't trying to go through the install, still felt it was worthwhile
getting an explanation of all the pieces that OpenSRF and Evergreen
depend on and how they fit together. I think it was clear that the
complexity involved in installing Evergreen isn't so much OpenSRF or
Evergreen themselves as it is a few finicky details involving networking
- largely ejabberd and Net::Domain's insistence on specific and
sometimes conflicting definitions of hostnames.&lt;/p&gt;
&lt;p&gt;Success #4: Bill did get to quickly demonstrate &lt;a class="reference external" href="http://open-ils.org/dokuwiki/doku.php?id=advocacy:evergreen_workshop#customizing_evergreennew_service"&gt;how to add a new
OpenSRF
service&lt;/a&gt;
(&amp;quot;reset my password and email it to me&amp;quot;) and how to integrate that into
the catalogue. It was rough and dirty code, but at approximately one
page of Perl code and about 10 lines of JavaScript I think it was a
convincing demonstration of how easy it is to extend Evergreen.&lt;/p&gt;
&lt;p&gt;Success #5: We have laid the groundwork for an Evergreen workshop now,
and having gone through the experience once we'll be able to refine the
concept for future events. One idea that we've already kicked around is
to split it into several tracks so that attendees can self-select what
they're interested in and so that we can give enough time to each
section. Say, two (or three) hours for an installfest; two hours for
&amp;quot;exploring the dark corners of Evergreen&amp;quot;; and two hours on developing
and extending Evergreen (OpenSRF, catalogue, staff client). Or we could
have spent the entire pre-conference day on Evergreen.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="reflection"&gt;
&lt;h2&gt;Reflection&lt;/h2&gt;
&lt;p&gt;I think it might have been really cool if we had worked with LibraryFind
and Zotero to set up an ongoing theme throughout the three
pre-conference sessions. We could have collaborated on pre-requisites,
so that the LibraryFind install could go on top of the same image as the
Evergreen install, and then the newly installed Evergreen image could
have been added as a LibraryFind source during the LibraryFind
administration section. Then, during the Zotero session, Evergreen and
LibraryFind could have been added as new sources for capturing citation
information (by making Evergreen and LibraryFind generate COInS objects
that Zotero understands or giving Zotero the ability to understand the
various formats that Evergreen offers via unAPI).&lt;/p&gt;
&lt;p&gt;Of course, it also would have required a heck of a lot of pre-conference
planning. A suggestion I would make for next year's pre-conference
organizers would be to communicate as much as possible ahead of time to
set expectations and help your attendees determine what your agenda
should be. We could have just thrown out the entire Evergreen install
section, had people get comfortable with a pre-installed VMWare ahead of
time, and focused most of the session on developing and exposing OpenSRF
services, for example, if that's what our attendees wanted.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 26 Feb 2008 13:44:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2008-02-26:/evergreen-workshop-at-code4lib-2008.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>The State of Evergreen: OLA Presentation</title><link>https://coffeecode.net/the-state-of-evergreen-ola-presentation.html</link><description>&lt;p&gt;Well, despite getting less than four hours of broken sleep before my
9:00 am presentation, I think I successfully delivered an update on
&lt;strong&gt;Evergreen:State of the Open ILS&lt;/strong&gt; to approximately 45 people at the
&lt;a class="reference external" href="http://www.accessola.com/superconference2008"&gt;OLA Super Conference&lt;/a&gt;
today. There were some great questions from the audience that kept me on
my toes. Thank heavens David Fiander was there to provide colour
commentary and solid advice. Overall, the talk seemed to be well
received.&lt;/p&gt;
&lt;p&gt;Perhaps the most pleasant surprise of the session was when I discovered
that one of the libraries close to my old home town has been working for
the last six months on migrating to Evergreen. Marvelous!&lt;/p&gt;
&lt;p&gt;If you want the slides from my presentation, I've licensed them under a
Creative Commons 2.5 By Attribution license. Presentations available
below in two different formats:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="/uploads/talks/2008/TheStateofEvergreen.odp"&gt;Evergreen:State of the Open ILS (OpenOffice
Impress)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="/uploads/talks/2008/TheStateofEvergreen.ppt"&gt;Evergreen:State of the Open ILS (Microsoft
PowerPoint)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sat, 02 Feb 2008 03:56:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2008-02-02:/the-state-of-evergreen-ola-presentation.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Oooh... looks like I've got (even more) work cut out for me</title><link>https://coffeecode.net/oooh-looks-like-ive-got-even-more-work-cut-out-for-me.html</link><description>&lt;p&gt;PHP is getting a &lt;a class="reference external" href="http://www.colder.ch/news/01-16-2008/30/new-datastructures-in-spl.html"&gt;native doubly-linked list
structure&lt;/a&gt;.
This is fabulous news; when I wrote the
&lt;a class="reference external" href="http://pear.php.net/File_MARC"&gt;File_MARC&lt;/a&gt; PEAR package, I ended up
having to implement a &lt;a class="reference external" href="http://pear.php.net/Structures_LinkedList"&gt;linked list
class&lt;/a&gt; in PEAR to support
it. File_MARC does its job today (even though I haven't taken it out of
alpha yet), but due to its reliance on userspace data structures it's an
order of magnitude slower than packages like
&lt;a class="reference external" href="http://marc4j.tigris.org"&gt;marc4j&lt;/a&gt; so it's not the best choice for
processing hundreds of thousands of MARC records... today. It hurts a
little that the &lt;a class="reference external" href="http://vufind.org"&gt;VuFind&lt;/a&gt; project has to use a
non-PHP solution for populating its Solr indices - although I'm
delighted that they have started using File_MARC for some on-demand
processing.&lt;/p&gt;
&lt;p&gt;Now, when I get a chance (insert raucous mocking laughter here), I hope
to be able to make File_MARC use splDoublyLinkedList and see how it
fares with 500K records. Should be good fun! After that, it just needs
to be taught how to convert MARC8 to UTF-8, and we'll have ourselves a
fully featured standard MARC package for PHP.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 17 Jan 2008 03:30:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2008-01-17:/oooh-looks-like-ive-got-even-more-work-cut-out-for-me.html</guid><category>misc</category><category>Coding</category><category>PHP</category></item><item><title>Like taking cotton balls out of my ears</title><link>https://coffeecode.net/like-taking-cotton-balls-out-of-my-ears.html</link><description>&lt;p&gt;We don't watch a lot of TV; maybe four hours a week. But we noticed in
the past year or two that a few of the shows we enjoy have muddy
soundtracks due to speech being mixed over top of background music and
various sound effects that makes the words almost indistinguishable. My
hunch was that it was due to the increasing popularity of surround sound
mixing, so much so that the producers had chosen to disrupt the viewing
experience of plain jane viewers relying only on their television's
built-in speakers. But for various reasons (largely - having better
things to do), I never bothered to confirm this hunch.&lt;/p&gt;
&lt;p&gt;I took advantage of a Boxing Day sale to pick up a set of surround sound
speakers and a Dolby-enabled amplifier; nothing fancy. After many hours
of threading wires behind drywall and through the basement (reminding me
that I really do have better things to do), we sat down to watch an
episode of one of the offending shows (&lt;em&gt;Torchwood&lt;/em&gt;). And the difference
in clarity (largely due to the separation of the sound into front left,
center, and front right channels; the back left and right channels have
much less impact) was immediately evident; Lynn mentioned it within five
seconds of the beginning of the show.&lt;/p&gt;
&lt;p&gt;Our household has entered a new age of audio-visual enjoyment. I know
I've been manipulated into buying more electronics, but at the same time
- wow, what a difference. It makes me want to watch all of season one of
&lt;em&gt;Battlestar Galactica&lt;/em&gt; again.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 09 Jan 2008 03:15:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2008-01-09:/like-taking-cotton-balls-out-of-my-ears.html</guid><category>misc</category><category>Personal</category></item><item><title>As if you didn't see it coming...</title><link>https://coffeecode.net/as-if-you-didnt-see-it-coming.html</link><description>&lt;p&gt;My employer, Laurentian University, &lt;a class="reference external" href="http://laurentian.ca/Laurentian/Home/News/Evergreen+library+system+08jan08.htm"&gt;issued a press
release&lt;/a&gt;
today announcing that we have selected
&lt;a class="reference external" href="http://open-ils.org"&gt;Evergreen&lt;/a&gt; as our future library system. I
wrote more about this on the &lt;a class="reference external" href="http://open-ils.org/blog/?p=111"&gt;Evergreen
blog&lt;/a&gt;, but what I didn't say was ...
yay!&lt;/p&gt;
&lt;p&gt;We still have a long road ahead of us, but knowing that we'll be
migrating to a system that I can poke with a sharp stick and make it do
my bidding goes a long way towards making me feel warm and fuzzy inside.&lt;/p&gt;
&lt;p&gt;I predict that we'll see a few more announcements from universities and
colleges in North America joining the Evergreen development effort /
adoption process in 2008. Outside of Ontario, I know about the
&lt;a class="reference external" href="http://blog.benostrowsky.com/2007/10/04/my-new-job-horizon-vs-evergreen-cage-match/"&gt;University of
Utah&lt;/a&gt;'
s interest and interest from a &lt;a class="reference external" href="http://valenews.wordpress.com/2007/12/03/conference-agenda/"&gt;New Jersey consortium of academic
institutions&lt;/a&gt;
(see session h. &amp;quot;Open Library Systems and NJ: From Vision to
Transformation&amp;quot;)... are there other academics who have made public
statements of interest in Evergreen that I'm missing out on?&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 08 Jan 2008 18:58:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2008-01-08:/as-if-you-didnt-see-it-coming.html</guid><category>misc</category><category>Evergreen</category></item><item><title>Geek triumph</title><link>https://coffeecode.net/geek-triumph.html</link><description>&lt;p&gt;What a night. I upgraded &lt;a class="reference external" href="http://www.s9y.org"&gt;Serendipity&lt;/a&gt;,
&lt;a class="reference external" href="http://www.splitbrain.org/projects/dokuwiki"&gt;DokuWiki&lt;/a&gt;,
&lt;a class="reference external" href="http://drupal.org"&gt;Drupal&lt;/a&gt;, involving four different servers and
three different Linux distros, and shifted one application from one
server to another (with seamless redirects from the old server to the
new) with close to no downtime. I think this is the first time I've
completed a single upgrade without having to manually patch at least one
file.&lt;/p&gt;
&lt;p&gt;Either I'm getting smarter, or the software is getting more robust.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 21 Nov 2007 13:54:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2007-11-21:/geek-triumph.html</guid><category>misc</category><category>Coding</category></item><item><title>Ain't no way to treat your CODI</title><link>https://coffeecode.net/aint-no-way-to-treat-your-codi.html</link><description>&lt;p&gt;Wow. Eileen R. Kontrovitz, a board member of CODI (Customers of Dynix,
Inc.) wrote, as part of &lt;a class="reference external" href="http://letterman.oplib.org/blog/?p=26"&gt;her summary of the recent CODI
conference&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
Many very nice things happened at the conference but the buzz, the
thing everyone who was not there wants to hear about is the
unannounced, invitation only meeting with Martin Taylor from Vista
Equity Partners about open source. Mr. Taylor began the meeting in a
very cordial way and with a charm about him that belied the basic
message he proceeded to give. That message was, we know more than
you do and if you don't like it you can go to some other &amp;quot;happy
place&amp;quot;. He actually said that on more than one occasion.&lt;/blockquote&gt;
&lt;p&gt;I guess Vista feels quite threatened by open source library systems,
even though they currently account for &lt;a class="reference external" href="http://lisnews.org/node/22251"&gt;only 1% of the US public library
market&lt;/a&gt; today, if they're willing to
have their top brass lay on the fear, uncertainty, and doubt campaign to
their top customers behind closed doors. It also seems that Mr. Taylor's
tactics have backfired, at least in this case; after praising the common
SirsiDynix employees, Eileen goes on to say that Vista's attitude has
almost ensured that her library (Ouachita Parish Public Library) will
not move to Symphony. This, even though Eileen says:&lt;/p&gt;
&lt;blockquote&gt;
...I happen to agree with his assessment of open source for a
library ILS at this point in time and the many problems with the
very nature of the beast without some kind of regulating body...&lt;/blockquote&gt;
&lt;p&gt;Perhaps this should be the subject of another blog post, but I believe
there are actually a number ways Evergreen is regulated. First is that
an open source project is not an &amp;quot;anything goes&amp;quot; project: the committers
for the project act as a level of quality control for Evergreen. If code
doesn't further &lt;a class="reference external" href="http://open-ils.org/mission.php"&gt;the Evergreen
mission&lt;/a&gt; by contributing towards
stability, robustness, flexibility, security, or user-friendliness, then
it's simply not going to go into the project proper. Second is that at
least one company (&lt;a class="reference external" href="http://esilibrary.com"&gt;Equinox&lt;/a&gt;) is staking its
success on Evergreen, and others are starting to build up business
around Evergreen. They're not going to sit back and rest easy; they know
that they have to enhance Evergreen beyond its current core strengths if
they want to build inroads into markets like academic libraries. Third
is that Evergreen's open source license also acts as a regulator - the
code that comprises Evergreen can never be pulled from the market, so
the future of Evergreen is always in the hands of the community.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 16 Nov 2007 01:01:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2007-11-16:/aint-no-way-to-treat-your-codi.html</guid><category>misc</category><category>Evergreen</category></item><item><title>A chance to work at Laurentian University library</title><link>https://coffeecode.net/a-chance-to-work-at-laurentian-university-library.html</link><description>&lt;p&gt;Hey folks, if you're interested in working at Laurentian University,
we've got a couple of tenure-track positions looking for qualified
people who can stand the thought of working with me... (nothing like
narrowing the field dramatically, ah well). The following position
descriptions are straight out of the &lt;a class="reference external" href="http://laurentian.ca/Laurentian/Home/Departments/Human+Resources/Employment+Vacancies.htm"&gt;Employment
Vacancies&lt;/a&gt;
page at LU - check the document titled &amp;quot;Multiple Faculty Positions
(.pdf)&amp;quot; for the complete details, including deadlines and application
procedures. The starting date for these positions would be July 1, 2008.&lt;/p&gt;
&lt;div class="section" id="e-learning-librarian"&gt;
&lt;h2&gt;E-learning Librarian&lt;/h2&gt;
&lt;p&gt;The J.N. Desmarais Library invites applications from an innovative and
creative individual&lt;/p&gt;
&lt;p&gt;for a for a tenure-track faculty position which will focus on
E-Learning. The E-Learning&lt;/p&gt;
&lt;p&gt;Librarian is responsible for technology-enhanced instruction through the
development of&lt;/p&gt;
&lt;p&gt;learning objects, streaming audio-video, web-based modules, and
e-learning within course&lt;/p&gt;
&lt;p&gt;management systems such as WebCT. The incumbent will lead projects
relating to the&lt;/p&gt;
&lt;p&gt;assessment of the impact of technologies in information literacy
instruction. The E-&lt;/p&gt;
&lt;p&gt;Learning Librarian will also collaborate with liaison librarians to
create discipline-specific&lt;/p&gt;
&lt;p&gt;modules, web-based exercises, simulations, and other applications. The
incumbent will also&lt;/p&gt;
&lt;p&gt;bear overall responsibility for the development of the library's
website. Reporting to the&lt;/p&gt;
&lt;p&gt;Director of the library, the incumbent will work collaboratively as a
member of a dynamic&lt;/p&gt;
&lt;p&gt;team of librarians, participate in collection and liaison activities for
several academic&lt;/p&gt;
&lt;p&gt;departments, including live instruction upon request. The incumbent will
also provide&lt;/p&gt;
&lt;p&gt;reference assistance in both official languages and may serve on library
and university&lt;/p&gt;
&lt;p&gt;committees. Evening rotations at the Reference Desk may be required. As
faculty members,&lt;/p&gt;
&lt;p&gt;librarians are expected to perform scholarly work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Qualifications:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Required&lt;/strong&gt;: ALA-accredited MLS degree, or recognized foreign
equivalent.&lt;/p&gt;
&lt;p&gt;Ability to work in both English and French. Experience in an academic
library. Knowledge&lt;/p&gt;
&lt;p&gt;of information literacy concepts and issues and their connections
with teaching and learning&lt;/p&gt;
&lt;p&gt;issues in higher education. Demonstrated knowledge of instructional
design, reflected in&lt;/p&gt;
&lt;p&gt;instructional products and materials. Demonstrated experience with
project management.&lt;/p&gt;
&lt;p&gt;Knowledge of, and experience with, web development tools such as
Dreamweaver and other&lt;/p&gt;
&lt;p&gt;instructional technologies such as Macromedia Captivate; familiarity
with streaming audio-&lt;/p&gt;
&lt;p&gt;video technologies, learning objects, simulations, and course
management systems.&lt;/p&gt;
&lt;p&gt;Demonstrated ability to develop interactive learning environments.
Evidence of energy,&lt;/p&gt;
&lt;p&gt;&lt;p&gt;initiative, and commitment to professional growth.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;Preferred&lt;/strong&gt;: Advanced degree in&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;p&gt;instructional technology, instructional design, education or other
appropriate field.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="university-archivist"&gt;
&lt;h2&gt;University Archivist.&lt;/h2&gt;
&lt;p&gt;Reporting to the Director of the Library, the incumbent will be part of
a professional team&lt;/p&gt;
&lt;p&gt;providing management, promotion, reference and diffusion of the
Laurentian University&lt;/p&gt;
&lt;p&gt;Archives.&lt;/p&gt;
&lt;p&gt;The incumbent will be responsible for the management of institutional
archives. In this&lt;/p&gt;
&lt;p&gt;capacity, he or she will evaluate the program and make recommendations,
and write policies&lt;/p&gt;
&lt;p&gt;and procedures concerning the management and the development of this
activity of the&lt;/p&gt;
&lt;p&gt;Archives. The incumbent will coordinate the acquisition, processing, and
production of&lt;/p&gt;
&lt;p&gt;finding aids for institutional archives, as well as for &amp;quot;associate
fonds&amp;quot;, such as the fonds of the&lt;/p&gt;
&lt;p&gt;faculty, student associations, and other organizations of the university
community.&lt;/p&gt;
&lt;p&gt;The incumbent will work closely with a team of librarians coordinating
the development of&lt;/p&gt;
&lt;p&gt;the University's institutional repository. He or she will develop the
archives component of&lt;/p&gt;
&lt;p&gt;the repository, and will initiate and implement projects of digitization
of archives. He or she&lt;/p&gt;
&lt;p&gt;may also be asked to participate in the formulation of procedures and
policies for archiving&lt;/p&gt;
&lt;p&gt;and preserving electronic and digital records.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Qualifications&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The successful candidate will have a Masters degree in Archival Science&lt;/p&gt;
&lt;p&gt;(MAS), or a Master of Library and Information Science (MLIS), with
completion in archival&lt;/p&gt;
&lt;p&gt;courses, from an ALA-accredited institution, and a minimum of 3 years of
experience in an&lt;/p&gt;
&lt;p&gt;archival position. The candidate has extensive knowledge of management
and preservation&lt;/p&gt;
&lt;p&gt;of electronic documents, and experience in human resources management.
Excellent oral&lt;/p&gt;
&lt;p&gt;and written communication skills in both English and French are
required. Experience in&lt;/p&gt;
&lt;p&gt;project management is an asset.&lt;/p&gt;
&lt;p&gt;Archivists are members of the Laurentian University Faculty Association
(LUFA), and are&lt;/p&gt;
&lt;p&gt;expected to participate in university governance through service on
various committees, and&lt;/p&gt;
&lt;p&gt;participate in professional organizations. They must also be active in
scholarly research and&lt;/p&gt;
&lt;p&gt;publication.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 06 Nov 2007 03:39:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2007-11-06:/a-chance-to-work-at-laurentian-university-library.html</guid><category>Libraries</category><category>Coding</category></item><item><title>Laurentian goes ever greener</title><link>https://coffeecode.net/laurentian-goes-ever-greener.html</link><description>&lt;p&gt;This is slightly in advance of our official press release, which is
currently in translation, but I will be giving / have given a lightning
talk at Access 2007 on this subject and have decided to make the
following materials available:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Report: &lt;a class="reference external" href="http://www.coffeecode.net/uploads/reports/Assessing_Evergreen.pdf"&gt;Assessing Evergreen for an academic bilingual
library&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Evergreen Business Readiness Rating:
(&lt;a class="reference external" href="http://www.coffeecode.net/uploads/reports/BRR-Evergreen.ods"&gt;OpenOffice&lt;/a&gt;)
(&lt;a class="reference external" href="http://www.coffeecode.net/uploads/reports/BRR-Evergreen.xls"&gt;Excel&lt;/a&gt;)
- see &lt;a class="reference external" href="http://openbrr.org"&gt;OpenBRR&lt;/a&gt; for more information about the
Open Business Readiness Rating templates)&lt;/li&gt;
&lt;li&gt;Presentation: &lt;a class="reference external" href="http://www.coffeecode.net/uploads/talks/2007/Ever_greener_at_LU.pdf"&gt;Lightning talk: Going Ever Greener at Laurentian
University&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 12 Oct 2007 16:36:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2007-10-12:/laurentian-goes-ever-greener.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Ariel: Go back to your room, NOW!</title><link>https://coffeecode.net/ariel-go-back-to-your-room-now.html</link><description>&lt;p&gt;I've been working on automating the delivery of electronic documents to
our patrons; most of the work over the summer was spent in ensuring that
we had our legal and policy bases covered. I read through the
documentation for Ariel, our chosen ILL software, to ensure that
everything we wanted to do was technically feasible, and after backing
up our ILL workstation in case of disaster, I finally set out last week
to finish the job. For those not ensconced in the library software
world, ILL software is the equivalent of a fax machine, with the
additional feature of the automated destruction of documents to ensure
that you're respecting copyright.&lt;/p&gt;
&lt;p&gt;What a mess.&lt;/p&gt;
&lt;p&gt;Ariel licenses come in two forms:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;the full license, which enables you to send documents to other
libraries, and to receive documents from other libraries&lt;/li&gt;
&lt;li&gt;the receive-only license, which only enables you to receive documents
from other libraries&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We have one of each license set up on two different workstations so that
we can split the sending / receiving workloads across different
machines. So, after sitting down at the receive-only workstation, which
is the one that has its IP address advertised throughout the world as
our receiving address, I discovered that only the full license of Ariel
can be set up to automatically email received documents to the
requesting patrons. Okay, that restriction wasn't mentioned in the
documentation I read, but maybe it was a matter of interpretation. Fine.
After getting no answer from the sales department about the possibility
of upgrading to a second full license, or purchasing another full
license outright, I assume that Infotrieve has moved into a zen place
where it doesn't need to make sales or respond to customer inquiries.
Wait a couple of days while the right ports in the firewall are opened
up, switch IP addresses between the full and receive-only machines, and
move on. Well... sort of.&lt;/p&gt;
&lt;p&gt;For reasons that are lost in the haze of many hours desperately trying
to get the full license machine functional again, to access the
networked printer to which received documents are currently
automatically printed, I had to raise the privileges of the user running
Ariel from plain &lt;strong&gt;user&lt;/strong&gt; (which can do very little harm) to
&lt;strong&gt;administrator&lt;/strong&gt;. I'm sure there's a Windows policy I could change
somewhere on the machine to avoid this nasty move, but after three hours
of downtime sometimes you just go with what works, no matter how stupid
the solution is. So that was semi-defeat number one. But Windows had
nothing on the trickery that lay in wait for me with Ariel.&lt;/p&gt;
&lt;p&gt;To make electronic delivery to your patrons work, you have to have an
address book of your patrons. As a member of a provincial consortium, we
have a central registry of the users of our ILL services, and we were
able to get a dump of our patron data in Excel form relatively easily.
Great! Ariel imports data from Excel or CSV, so it should be a snap.
Should be.&lt;/p&gt;
&lt;p&gt;But no. Ariel's documentation of the 8 different fields that are
required in your CSV document would be great, if it was correct. Like,
say, telling me that there are actually 10 required fields. Or, say,
telling me the correct order for those fields. Apparently Infotrieve
gets its threes and fours mixed up. Whoopsie. Oh, and by the way, this
is 2007, but our importer only understands ASCII characters, so all of
your patrons with accents in their name suffer mangled names (sorry,
Josée and Geneviève!). This, despite the GUI interface enabling you to
directly type the proper accented characters.&lt;/p&gt;
&lt;p&gt;Mmmm, and about that patron list interface... it takes 3 clicks or
keystrokes to delete each patron. There is no bulk delete operation
available. Ye olde CTRL-click or SHIFT-click for selecting great swathes
of records to delete at once? No dice. So I actually sat there and
deleted about 300 records, representing about 900 repetitive motions,
before feeling my wrist throb warningly and my brain revolt. I know
Ariel runs against an embedded SQL Server database, so I found my
revenge about 45 minutes later: Eclipse + the SQLExplorer plug-in + the
Microsoft JDBC Driver for SQL Server = one good way of issuing &amp;quot;DELETE
FROM tblPatronList;&amp;quot; and watching the records that were loaded under
false pretenses (see documentation of swapped fields, above) simply melt
away. I think I issued the DELETE statement a couple of extra times, it
felt so damned good.&lt;/p&gt;
&lt;p&gt;As for the corrupted accented characters: I'm going in for round 3
tomorrow, and I'll take a stab at loading the table directly via the
JDBC interface. Bypassing brain-dead software seems like the right
direction to take this project. That being said, if you're one of our
patrons and your name doesn't contain any accents - you just might have
mail when your document arrives!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 02 Oct 2007 02:05:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2007-10-02:/ariel-go-back-to-your-room-now.html</guid><category>Libraries</category><category>Coding</category></item><item><title>"A canonical example of a next-generation OPAC?"</title><link>https://coffeecode.net/a-canonical-example-of-a-next-generation-opac.html</link><description>&lt;p&gt;Ooh, yes, I remember &lt;a class="reference external" href="http://www.infotoday.com/cilmag/oct07/Beccaria_Scott.shtml"&gt;writing
that&lt;/a&gt;
now. Not about Evergreen, which has book bags and format limiters and
facets and whiz-bangy unAPI goodness whose potential for causing mayhem
has barely been scratched - but about
&lt;a class="reference external" href="http://code.google.com/p/fac-back-opac"&gt;Fac-Back-OPAC&lt;/a&gt;, the
Django-and-Solr-and-Jython beast that Mike Beccaria and I picked up from
Casey Durfee's scraps pile, polished up with some multilingual support
and RSS feeds and Unicorn integration, and unleashed upon the world.
Calling it &amp;quot;a canonical example&amp;quot; is, in retrospect, rather obvious
hyperbole (and what's with my use of the indefinite article ruining a
perfectly good cliché?), but, in my defense, I wrote the bulk of the
article on the long trip back from Atlanta and after several days of
deep thought on Evergreen it felt good to just let the words flow.
Ahhhhhhhhh.&lt;/p&gt;
&lt;p&gt;Oh yeah, and one of the problems with writing on the road is that you
have to remember to do your link-checking when you get connected. And I
forgot -- so
&lt;a class="reference external" href="http://code4lib.org/conference"&gt;http://conf.code4lib.org&lt;/a&gt; wound up
as a broken link. D'oh! But all that having been said, it's pretty cool
to see my words (and Mike's words) in a print publication in my chosen
field. And Fac-Back-OPAC, despite being encumbered with a pretty lousy
name -- sorry -- is actually pretty nice to have as a backup. So, what
the heck, take a peek at &lt;a class="reference external" href="http://www.infotoday.com/cilmag/oct07/Beccaria_Scott.shtml"&gt;the
article&lt;/a&gt;:
it's a freebie from this month's issue of &lt;em&gt;Computers In Libraries&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Next time around, I hope to be able to offer something a little more
technical, and a little less self-indulgent.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 02 Oct 2007 01:49:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2007-10-02:/a-canonical-example-of-a-next-generation-opac.html</guid><category>Libraries</category><category>Coding</category></item><item><title>The Linux Documentation Project, DB2, XML, and nostalgia</title><link>https://coffeecode.net/the-linux-documentation-project-db2-xml-and-nostalgia.html</link><description>&lt;p&gt;I took a walk down memory lane this evening. I thought I might as well
bore you with the details.&lt;/p&gt;
&lt;p&gt;One of my first forays into the open source world was to participate in
the &lt;a class="reference external" href="http://tldp.org"&gt;Linux Documentation Project&lt;/a&gt; (TLDP). At the
time (circa 1999), I was working for IBM as a technical writer for &lt;a class="reference external" href="http://ibm.com/db2"&gt;DB2
database&lt;/a&gt;. IBM was releasing DB2 on the Linux
platform, I was part of the pre-release testing team, and I had turned
to TLDP to provide me with an introduction to the world of Linux as a
total n00b. It was a godsend of information.&lt;/p&gt;
&lt;p&gt;When DB2 was officially released on the Linux platform, it only
officially supported a handful of distributions. Given the normal
technical writing and release cycle, the officially supported versions
of the distributions were woefully out of date in the official
documentation. That, and much of the required installation and
configuration information was either missing, or wrong. Don't lay any
blame on the people involved; that was just the way that the release
process (including translation into umpteen languages that were all
available on release day) forced the end product to be. My focus was on
application development, but I had to get test environments set up so I
could ensure what I was writing actually worked (that's the way I roll
as a tech writer). Of course, I chose an unsupported-by-DB2 but much
more current distribution (Mandrake Linux 5.3 &amp;quot;Venus&amp;quot; I believe) simply
because it would install on my hardware, when Red Hat 5.2 would not.&lt;/p&gt;
&lt;p&gt;It struck me that my install experiences would help other DB2 users as
well. I realized it would also give IBM a way around the barrier imposed
by the restriction that the official documentation for a given release
was published once per release - no updates. By contributing a DB2 HOWTO
to TLDP, I would not only be able to provide documentation on the
distributions that people were actually using, I would also be able to
update the HOWTO as circumstances warranted. My manager supported the
project, and helped me stickhandle some obstacles. The result, I
believe, was beneficial all around; I contributed some code to TLDP to
help improve the PDF output and helped mentor some TLDP n00bs; DB2 got
some usable documentation when it really needed it; and I had the
opportunity to learn a technical writing DTD that made sense
(&lt;a class="reference external" href="http://docbook.org/"&gt;DocBook&lt;/a&gt;) and play with an impressive
open-source publishing toolchain.&lt;/p&gt;
&lt;p&gt;Over time, my friend and co-worker Ian Hakes picked up the ball and
drove the next iteration of the DB2 HOWTO with my help. It has been over
a year and a half since I left IBM, so I haven't paid any attention to
the DB2 HOWTO. Recently, however, as I was playing around with an
updated version of the DocBook toolchain, I discovered that Ian has
released a brand new version of the &lt;a class="reference external" href="http://tldp.org/HOWTO/DB2-HOWTO/index.html"&gt;DB2
HOWTO&lt;/a&gt; to cover
installation of DB2 Express-C on various distributions. He included a
touching tip of the hat to me, as well. What a swell guy!&lt;/p&gt;
&lt;p&gt;On one hand, I'm not sure that TLDP has nearly as much of a mandate as
it did eight years ago. There are scads of books, a handful of good
magazines, blogs, wikis, and web sites all publishing information about
Linux these days. On the other hand, there's something to be said for a
corpus of documentation maintained and edited by volunteers who just
want to get information into the hands of people who need help --
without compensation, without publicity, and generally without thanks.&lt;/p&gt;
&lt;p&gt;So, given how much TLDP has helped me - thank you, &lt;a class="reference external" href="http://tldp.org/vlist.html"&gt;TLDP
volunteers&lt;/a&gt;. And thank you, Norm Walsh
and the entire DocBook community, for providing an open-source
publishing toolchain that starts with semantic XML and results in
professional-looking documentation.&lt;/p&gt;
&lt;p&gt;P.S. I made another commit to the DB2 HOWTO tonight - just balancing out
an XML element that was missing to return the document to valid XML
state. And let me tell you, it felt good!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 17 Sep 2007 00:34:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2007-09-17:/the-linux-documentation-project-db2-xml-and-nostalgia.html</guid><category>Databases</category><category>DB2</category></item><item><title>Committing to Evergreen</title><link>https://coffeecode.net/committing-to-evergreen.html</link><description>&lt;p&gt;Yesterday, over on the Evergreen blog, Mike announced that I am now &lt;a class="reference external" href="http://open-ils.org/blog/?p=100"&gt;a
full committer&lt;/a&gt; to the Subversion
repository for Evergreen. (It was blog post #100 for Evergreen, by the
way - two milestones in one!). The road to getting here was pretty
standard fare for open-source projects: submit patches that do useful
things (like simplify build processes or add i18n support); listen to
feedback about those patches and incorporate those lessons leanred into
the next patches; and repeat, as described in Evergreen's &lt;a class="reference external" href="http://open-ils.org/documentation/contributing.html"&gt;contribution
process&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;p&gt;From time to time, and as individual community members become more
familiar and skilled with the complete codebase of Evergreen, some
individuals may be asked to join the core team. We see this as both
an honor and a responsibility, as this group is charged with being
the final quality control mechanism for the source code, as well as
helping other less experienced community members come up to speed.
It is not simply a way to get code into Subversion, but also about
mentoring new contributors and helping to keep the overall vision of
the project in focus, tempered by the history and evolution of the
code and lessons learned from past successes and failures.&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;I'm not just tooting my own horn, here. I think it's important to
emphasize that the Evergreen community is healthy, welcoming to
newcomers, and growing. I am honoured to join the Evergreen team (as
Mike says, &amp;quot;again&amp;quot;), this time as a committer - and I look forward to
helping the Evergreen community continue to grow.&lt;/p&gt;
&lt;p&gt;If you're interested, there are plenty of ways to help us - through your
contribution of use cases, documentation, graphics and design, patches,
translations, testing... Hmm. I'm &lt;a class="reference external" href="/archives/137-Open-source-in-libraries-community-strength.html"&gt;repeating
myself&lt;/a&gt;
a bit here &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt; See you on the lists / IRC!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sun, 09 Sep 2007 02:35:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2007-09-09:/committing-to-evergreen.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Open source in libraries: community = strength</title><link>https://coffeecode.net/open-source-in-libraries-community-strength.html</link><description>&lt;p&gt;Karen G. Schneider has a great post on &lt;a class="reference external" href="http://www.techsource.ala.org/blog/2007/08/enterprise-open-source.html"&gt;Enterprise Open
Source&lt;/a&gt;
on the &lt;a class="reference external" href="http://techsource.ala.org"&gt;ALA TechSource&lt;/a&gt; blog:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;But the truly significant activity in LibraryLand technology hasn't
been vendor-driven. It has been the maturation of what I call
&amp;quot;enterprise open source&amp;quot;: products such as Evergreen and Koha that
are robust, well-implemented library automation packages with strong
development communities and equally strong funded-support models.&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;Hear hear! Karen examines the value of open source, and finds that it's
not so much in that it's a lower-cost alternative (although that can be
a persuasive argument), and not so much that you have the ability to
modify the code (although that can also be a persuasive argument), but
that it depends on the strength of the community to continue to exist
and improve. And that makes it a very good match for libraries, because
we seem to do &amp;quot;community&amp;quot; better than most other industries.&lt;/p&gt;
&lt;p&gt;So let me take a different tack than Karen, and assume that if you've
read this far that you're interested in supporting open source for your
library, but maybe you don't have a programmer on staff. How can you
help?&lt;/p&gt;
&lt;p&gt;Well, there are many ways other than programming to contribute to an
open source community. &lt;a class="reference external" href="http://open-ils.org"&gt;Evergreen&lt;/a&gt;, for example,
just posted a call on its development mailing list for &lt;a class="reference external" href="http://list.georgialibraries.org/pipermail/open-ils-dev/2007-August/001696.html"&gt;help in defining
and prioritizing the requirements for its acquisitions and serials
modules&lt;/a&gt;.
If you have experience with these areas, and have blue-sky ideas for how
you could build a better system, this is a great opportunity to step
into the conversation. There's a bit of a parallel here to proprietary
systems, although with a proprietary system it's called a &amp;quot;request for
enhancement&amp;quot; and most of those tend to get filed in the distant future.
With Evergreen's invitation for discussion, you _know_ the developers
are happy to listen to the ideas for making the best possible product.
They don't have prior baggage holding them back, so they really can
start from square one - and they have a huge incentive to do better than
the existing options, because they want to convince you to pick
Evergreen the next time you're thinking about your next ILS.&lt;/p&gt;
&lt;p&gt;Or you can contribute your hard-won experience and knowledge to the
documentation wiki.
&lt;a class="reference external" href="http://open-ils.org/dokuwiki/doku.php"&gt;Evergreen&lt;/a&gt; and
&lt;a class="reference external" href="http://wiki.koha.org"&gt;Koha&lt;/a&gt; both have wikis to which you can
contribute. Interestingly, there is a parallel here to at least one
proprietary vendor, which set up a wiki (behind a password-protected
site) after many requests from their user group. It boggles _my_ mind,
but some of these same customers have also argued that they (the
customers) should pool their efforts and write a new set of manuals for
the product for which they are paying support and licensing fees. I'm
sure the Evergreen and Koha projects would really appreciate your
assistance in writing a good set of manuals, and they won't charge you
for the privilege, either.&lt;/p&gt;
&lt;p&gt;You can also participate simply by joining in the conversations on the
mailing lists or chat rooms (#OpenILS-Evergreen on Freenode for
Evergreen, #koha on Freenode for Koha). You'll take some time to get
familiar with the products, no doubt, but once you've climbed over the
brick walls (with the help of the others on the mailing list), you will
have the opportunity to pay it back a dozen times over as others face
the same walls that you faced. I see this same principle on our
proprietary vendor's mailing lists. The customers do a far better job of
supporting each other than the vendor to whom they're paying support and
licensing fees.&lt;/p&gt;
&lt;p&gt;And it feels good, working together to build something that belongs to
an entire community. For the little bits that I've been able to do, I
get a huge sense of satisfaction. It's a nice little addiction.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 31 Aug 2007 01:58:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2007-08-31:/open-source-in-libraries-community-strength.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>The pain: discovery layer selection</title><link>https://coffeecode.net/the-pain-discovery-layer-selection.html</link><description>&lt;p&gt;I returned from a week of vacation to land solidly in the middle of a
discovery layer selection process -- not for our library, yet, but from
a consortial perspective clearly having some impact on possible
decisions for us further on down the road. As the systems librarian, I
was nominated as the person with the required technical skills for
cutting through the skin of the vendor sales pitches and assessing the
meat of the proposals. So far, so good. I'm incredibly busy trying to
wrap up a number of projects before the return of the students in a few
weeks, but this is important stuff.&lt;/p&gt;
&lt;p&gt;As today's pitch went deeply into hour 4, I started mentally tallying up
the resources that were being invested in simply listening to the
presentations:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
20-odd library folk from various libraries8 vendor presentations~4 hours per presentation= 640 person-hours
&lt;/pre&gt;
&lt;p&gt;At an average of thirty person-hours per week (a rough project
management estimate allowing for vacations, sick leave, lunch, etc),
that's going to result in at least 32 person-weeks of effort that could
have been invested in taking an open source application like
&lt;a class="reference external" href="http://blacklight.betech.virginia.edu/"&gt;Blacklight&lt;/a&gt;,
&lt;a class="reference external" href="http://vufind.org"&gt;VUFind&lt;/a&gt;, or
&lt;a class="reference external" href="http://code.google.com/p/fac-back-opac"&gt;Fac-Back-OPAC&lt;/a&gt;, polishing it
up to meet the requirement specification, and contributing back the code
for the common good of all libraries. The secret sauce to all of these
applications is &lt;a class="reference external" href="http://lucene.apache.org/solr"&gt;Solr&lt;/a&gt;, a faceting
full-text search engine (excuse me, &amp;quot;information access platform&amp;quot; in
Endeca marketing speak). A few more person-weeks of effort invested in
Solr might finish off some of the features that are almost ready for
prime-time, like dynamic update of individual fields within a single
record.&lt;/p&gt;
&lt;p&gt;I &lt;em&gt;know&lt;/em&gt; that the buy or build decision is complex. I know that it's
very comforting to have someone to blame on the other end of the email,
or telephone. But folks? When you're looking at investing in annual
support and licensing fees, and possibly roping in 20 fellow libraries,
that's a heck of a lot of resources to be committing to technology
that's only slightly more advanced (in the best case; significantly
behind, in other cases) than existing open-source solutions. And let's
face it: with most of these solutions, you're going to be investing the
equivalent of a person-year or more in customization costs before you
even get out of the starting gate. This particular process may already
be too advanced to change direction, so perhaps all I can do is plead
with other libraries and consortiums facing a similar decision in the
future to please consider the build option (and really -- it's a &amp;quot;build
on top of existing components&amp;quot; option, not a ground-up deathmarch I'm
talking about) seriously.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 20 Aug 2007 23:24:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2007-08-20:/the-pain-discovery-layer-selection.html</guid><category>misc</category><category>Coding</category></item><item><title>Windows XP under VMWare Server... yay!</title><link>https://coffeecode.net/windows-xp-under-vmware-server-yay.html</link><description>&lt;p&gt;As a &lt;a class="reference external" href="/archives/86-Laundry-list-systems-librarians.html"&gt;laundry-list systems
librarian&lt;/a&gt;,
my responsibilities run the gamut from crawling under desks connecting
cables, administering our ILS, getting an institutional repository up
and running, and contributing to open source projects. Maintaining staff
workstations is part of the gig. Now, I'm pretty lenient when it comes
to personal workstations... everybody pretty much has Power User status,
so they can install and uninstall programs at will (&lt;strong&gt;sigh&lt;/strong&gt;, yes,
including WeatherBug and Dolphin Screensavers and other quasi-spyware).
But for shared workstations, like our reference desk workstations, I
recently enforced a stricter policy of plain old User access.&lt;/p&gt;
&lt;p&gt;This caused some legitimate grumbling, as our public workstations are
also locked-down and our Computer Services department hasn't figured out
how to enable students to use their U3 USB keys, so in the past our
reference people have taken on the role of saviour by accessing the U3
USB key on behalf of the panic-stricken student who needs to print their
assignment that is typically due in ten minutes (or less). Locking down
the reference desk workstations this summer removed this capability from
our reference people, leading to potential stressful situations in the
Fall when the students return &lt;em&gt;en masse&lt;/em&gt;. (From a quick read of the &lt;a class="reference external" href="https://u3.custhelp.com"&gt;U3
support forums&lt;/a&gt;, by the way, it sounds like
our workstations need to enable write access to the %AppData% directory.
I'll have to check on that.)&lt;/p&gt;
&lt;p&gt;I mentioned &lt;a class="reference external" href="/archives/122-Evergreen-VMWare-image-oh-so-close!.html"&gt;quite a while
ago&lt;/a&gt;
that I thought virtualization technology had plenty of potential for
software evaluation and testing purposes. Here's an example of another
kind of problem it can solve. Today, I installed Windows XP under VMWare
Server (running on top of my Gentoo laptop) and confirmed that its USB
support will work. So tomorrow I can install VMWare Server on the
reference desk workstations, drop a clean Windows XP image into VMWare,
and give the reference people the best of both worlds -- all of the
flexibility they need to meet the utmost of edge cases, and a stable
workstation that everyone can depend on every time they boot up.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 02 Aug 2007 01:05:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2007-08-02:/windows-xp-under-vmware-server-yay.html</guid><category>misc</category><category>Libraries</category></item><item><title>Access 2007 draft program is online!</title><link>https://coffeecode.net/access-2007-draft-program-is-online.html</link><description>&lt;p&gt;I had been getting anxious about the lack of news on the Access 2007
conference front, but just saw in my trusty RSS feed that the &lt;a class="reference external" href="http://access2007.uvic.ca/?page_id=18"&gt;draft
program schedule&lt;/a&gt; is now
available. I'm already looking forward to &lt;a class="reference external" href="http://www.jessamyn.com/"&gt;Jessamyn
West&lt;/a&gt;'s opening keynote and &lt;a class="reference external" href="http://techessence.info/blog/1"&gt;Roy Tennant's
closing keynote&lt;/a&gt;. They always bring
interesting perspectives to the table.&lt;/p&gt;
&lt;p&gt;I'm keenly anticipating (for obvious reasons) in the &lt;strong&gt;Open ILS, Web 2.0
and multitype provincial library initiatives in BC&lt;/strong&gt; session -- the
second implementation of a given application is always an interesting
exercise, and it will be good to finally see the
&lt;a class="reference external" href="http://bibliocommons.com/"&gt;BiblioCommons&lt;/a&gt; social interface on a live
system and find out how hard it was to write a BiblioCommons driver for
Evergreen. I've had a chance to talk with Brandon Uhlman about some of
the choices they've made for the hardware infrastructure and it should
provide an interesting contrast to the Georgia PINES mega-cluster &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;ILS Options for Academic Libraries&lt;/strong&gt; session will also be
interesting, although I'm a little worried about how well Evergreen will
be represented. I know that Don Hamilton, from Wilfred Laurier
University (WLU), has been working with Evergreen to a certain extent --
they have their e-book holdings loaded at
&lt;a class="reference external" href="http://tamarak.wlu.ca/"&gt;Tamarak&lt;/a&gt;, although at the moment it doesn't
seem to be responding. WLU is closely associated with the University of
Waterloo and they collaborate on information technology, so I guess
Allan Bell from WLU will be representing Evergreen on the panel. My
worries are probably not warranted. And I find it both interesting and
disappointing that Koha isn't mentioned at all as an option for an
academic library. I suppose there are no Canadian academic institutions
that have given Koha much serious consideration at this point; perhaps
that will change once a Koha 3.0 release candidate becomes available and
Koha will be better able to handle the volumes of items that academic
libraries hold.&lt;/p&gt;
&lt;p&gt;&amp;lt;rant&amp;gt;I don't understand why &lt;strong&gt;The Talis Platform&lt;/strong&gt; gets a session. From
the session description, it's purely a product presentation. Great, so
the Talis Platform offers Web service APIs, and some people are building
applications on that apparently. Yes, yes, you can share your data. What
does it cost to store your data into the Talis Platform, and what other
free or pay or income-generating features are Talis going to build on
the back of all of that data they're hoping to attract, and why can't I
simply get this information from the Web site, a product brochure, or a
chat with a friendly Talis salesperson at a booth rather than taking up
another valuable conference session?&amp;lt;/rant&amp;gt;&lt;/p&gt;
&lt;p&gt;Ah well. For one of the best library conferences, being held on
Vancouver Island, I can deal with one off-key note. I already have my
hotel room booked and I'll be keeping an eye on updates to the program
schedule -- oh yeah, and registration is &lt;a class="reference external" href="http://access2007.uvic.ca/?page_id=17"&gt;supposed to open up at the end
of the week&lt;/a&gt;. Hope to see you
there!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 01 Aug 2007 15:54:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2007-08-01:/access-2007-draft-program-is-online.html</guid><category>Libraries</category><category>Coding</category></item><item><title>Wrapping up the AcqFest</title><link>https://coffeecode.net/wrapping-up-the-acqfest.html</link><description>&lt;p&gt;Well, I'm finally back from Atlanta and the Evergreen AcqFest. I'll
apologize right off the top for not providing more blog updates over the
course of the weekend, but the requirements and design discussions were
pretty intense so I didn't want to risk continuously missing subtle but
important details and not being able to participate intelligently by
live-blogging the event. After each full day of work, we &amp;quot;unwound&amp;quot; with
a serious meal--which, after some socializing, usually involved slipping
back into kicking more design and implementation ideas, problems, and
potential solutions around. By the time I got back to the hotel room, I
was either completely wiped out, or itching to commit something to the
group document / or play with some code. So I hope you understand (all
three of you that are reading this!).&lt;/p&gt;
&lt;p&gt;On top of everything else, it was a bit of a gruelling trip back. In
order to save a few hundred dollars and make a greener transportation
choice for the final leg of my journey, I took the bus back to Sudbury.
Hello, five-hour layover in Toronto and a packed six-hour bus ride
(thanks to Hwy 401 construction) back home! It was quite a relief to get
back and see the family.&lt;/p&gt;
&lt;p&gt;Anyways, here is a mini-summary of what we accomplished:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Agreement on some realistic time frames for acquisitions and serials
development: call the stages one philosopher, two philosopher, and
three philosophers&lt;/li&gt;
&lt;li&gt;After kicking the left-of-field idea of using a calendar server to
handle serials schedules, coverage information, predictions, and
claiming events for a day or so, and clearly invoking the concern of
at least one library blogger, Mike had a brilliant idea for how to
represent all of this natively in PostgreSQL. He's going to take a
few days to work through a proof-of-concept to ensure that it's as
solid as it sounds, so I won't give away the details just yet...&lt;/li&gt;
&lt;li&gt;Agreement on the requirements for basic item-at-a-time acquisition
workflow support (to be implemented first) and more advanced
acquisitions support (batch orders via MARC record import, integrated
vendor discovery API support, EDI support)&lt;/li&gt;
&lt;li&gt;Agreement on adding internationalization support to OpenSRF. Right
now OpenSRF (the messaging infrastructure on which Evergreen depends)
knows nothing about locales. We've been able to use URL tricks to
support translation of the catalog interfaces thus far, but Mike
worked through the changes that will be required to pass locale as a
property of each session. This will enable the service being invoked
to &amp;quot;do the right thing&amp;quot; if locale is of a concern to whatever output
it returns.&lt;/li&gt;
&lt;li&gt;_Almost_ agreement on how to add internationalization support to
Evergreen. We worked through a number of different scenarios for
supporting translation of dynamic strings (library names, for
example) that reside in the database, from a single table that holds
all of the translated strings, to an i18n schema that holds tables
that parallel any table in another schema that holds translatable
content. We settled on the latter schema. I say &amp;quot;almost agreement&amp;quot;
because until something gets committed to code, I have a feeling that
this is still subject to change a little bit &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/li&gt;
&lt;li&gt;Exposure to some parts of Evergreen that many of us hadn't seen
before -- in particular, the reporting interface that Evergreen
provides is extremely powerful and well-designed. It even supports
basic line and bar charts for adding punch to your presentations.&lt;/li&gt;
&lt;li&gt;Art introduced us to OFBiz and OpenTaps via an online training video,
and later on Art and Ed successfully played around with the Java
OpenSRF client via BeanShell. My takeaway lesson about OFBiz if I
ever need to customize something built on it: it's all in
controller.xml!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There was a lot more than that that we covered, but for now I have to
get some shut-eye. For any skeptics out there, the actual acquisitions
and serials workflows employed at our constituent libraries were used as
testbed scenarios for the discussions about Evergreen's serials and
acquisitions requirements and design. I'm feeling good about the work we
accomplished, I think we found some elegant solutions for some of the
age-old problems in these areas, and I think we have a common
understanding of the path forward.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 24 Jul 2007 04:12:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2007-07-24:/wrapping-up-the-acqfest.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Horrible alternate realities</title><link>https://coffeecode.net/horrible-alternate-realities.html</link><description>&lt;img alt="York's Scott Library modified to 'Dan Scott Library'" src="/uploads/pics/dan-scott-library.jpg" /&gt;
&lt;p&gt;Bill Denton, you are a genius!&lt;/p&gt;
&lt;p&gt;So, my colleague Bill Denton recently landed a job as the Web Librarian
at York University. While chatting idly with him, err, strengthening my
professional network, I related a tale of mock woe and bitterness about
how York had turned me down for a job at their Scott Library when I was
attending library school.&lt;/p&gt;
&lt;p&gt;A few days later, Bill sent me this image envisioning a horrible
alternate reality where I got that job, and I laughed, and laughed, and
laughed a little bit more. So I must share it with you, and praise Bill,
and wonder just how things would have turned out had I spent my first
year of library school providing first-line reference services to
patrons, rather than manually converting SGML to HTML. Hmm... work
requiring social skills, or obscure technical skills? I think we all
know how that turned out.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 18 Jul 2007 03:23:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2007-07-18:/horrible-alternate-realities.html</guid><category>Libraries</category><category>Libraries</category></item><item><title>On the road again: Evergreen acqfest</title><link>https://coffeecode.net/on-the-road-again-evergreen-acqfest.html</link><description>&lt;p&gt;So I'm taking off tomorrow for Atlanta to spend four days deeply
immersed in discussing, designing, planning, and implementing
Evergreen's &lt;a class="reference external" href="http://open-ils.org/dokuwiki/doku.php?id=scratchpad:acq_serials"&gt;acquisitions and
serials&lt;/a&gt;
support. At least that's the plan. In our spare time (heh), we're going
to tackle the internationalization infrastructure as well. The spirit of
the event is modelled loosely after the Access conference hackfests, and
has therefore been dubbed &lt;strong&gt;Acqfest&lt;/strong&gt;. Unlike hackfest, however, where
the journey itself is usually the goal, with Acqfest there's a much
stronger emphasis on actually getting things done. I may, err, &lt;em&gt;acquire&lt;/em&gt;
a slight southern accent after a few days, but I mostly hope to increase
my understanding of Evergreen while kicking in some design suggestions,
code, and documentation here and there.&lt;/p&gt;
&lt;p&gt;Laurentian is covering my travel--at this point in our evaluation of the
future of our systems, it's in the library's interests to give me an
opportunity to stare deep into the heart of Evergreen--and my local
arrangements are being covered by BC Public Libraries, Georgia PINES,
and Equinox Software. I'm contributing my time and, uh, expertise. All
round, I think the whole community is going to benefit from the
Evergreen Acqfest. Assuming I have a few minutes, I'll try to post some
updates on our progress over the next few days.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 18 Jul 2007 01:21:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2007-07-18:/on-the-road-again-evergreen-acqfest.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Evergreen 1.2.0-rc1 is out! And so is the Gentoo VMWare image...</title><link>https://coffeecode.net/evergreen-120-rc1-is-out-and-so-is-the-gentoo-vmware-image.html</link><description>&lt;p&gt;So, yesterday afternoon Mike Rylander from the Evergreen (a.k.a
Open-ILS) project pushed out the &lt;a class="reference external" href="http://open-ils.org/blog/?p=96"&gt;first release candidate of Evergreen
1.2.0&lt;/a&gt;. Hurrah! If you tried
installing Evergreen before, but got hung up on some of the build,
install, or configuration steps, I think you'll find this release a lot
easier to deal with. For example, there's one less configuration file to
deal with now -- bootstrap.conf is a thing of the past.&lt;/p&gt;
&lt;p&gt;I'm happy to point out that I've updated my Gentoo-based VMWare image of
Evergreen as well: &lt;a class="reference external" href="http://open-ils.org/~denials/Evergreen_1.2.0-rc1_Gentoo_x86.zip"&gt;Evergreen
1.2.0-rc1&lt;/a&gt;
(479M). Along with that, I've updated my instructions for &lt;a class="reference external" href="http://open-ils.org/dokuwiki/doku.php?id=installing_prerequisites_on_gentoo"&gt;installing
Evergreen on
Gentoo&lt;/a&gt;
to reflect the newer, simpler install process.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sat, 07 Jul 2007 18:43:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2007-07-07:/evergreen-120-rc1-is-out-and-so-is-the-gentoo-vmware-image.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>SNO? Bah. How about SCO?</title><link>https://coffeecode.net/sno-bah-how-about-sco.html</link><description>&lt;p&gt;You've heard of the SNO (Sudbury Neutrino Observatory) before. This
morning we were treated to the SCO (Sudbury Comedian Observatory)
project; while walking through the Farmer's Market, Lynn spotted a
familiar face at a table. It turned out that this single table had &lt;a class="reference external" href="http://www.debmcgrath.com/"&gt;Deb
McGrath&lt;/a&gt;, &lt;a class="reference external" href="http://en.wikipedia.org/wiki/Robin_Duke"&gt;Robin
Duke&lt;/a&gt;, &lt;a class="reference external" href="http://www.womenfullyclothed.com/bios.html#tp"&gt;Teresa
Pavlinek&lt;/a&gt;, &lt;a class="reference external" href="http://www.womenfullyclothed.com/bios.html#je"&gt;Jayne
Eastwood&lt;/a&gt;, and
&lt;a class="reference external" href="http://www.womenfullyclothed.com/bios.html#kg"&gt;Kathryn Greenwood&lt;/a&gt;
sitting at it. Talk about comedic gravity! I'm surprised that the
Farmer's Market, and Sudbury itself, didn't collapse under the sheer
density of the celebrity presence in such a small area.&lt;/p&gt;
&lt;p&gt;They were in town putting on a couple of performances of &lt;a class="reference external" href="http://www.womenfullyclothed.com"&gt;Women Fully
Clothed&lt;/a&gt; as part of the &lt;a class="reference external" href="http://www.lolsudbury.com/"&gt;LOL
Sudbury&lt;/a&gt; comedy festival. I lamely told
them that although we weren't going to be able to make their show due to
a severe lack of babysitter, we did watch them on TV -- and that I had
grown up with SCTV (referring here to Robin Duke, of course). Which, in
retrospect, might have been a bit of a nasty thing to say. But hey --
how often do you get to see a comedic hero in person? Okay, but in
Sudbury? It was pretty cool. Kudos to Lynn's sharp eyes.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sun, 24 Jun 2007 03:31:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2007-06-24:/sno-bah-how-about-sco.html</guid><category>misc</category><category>Personal</category></item><item><title>Know your sources: Evergreen / Koha comparisons</title><link>https://coffeecode.net/know-your-sources-evergreen-koha-comparisons.html</link><description>&lt;p&gt;&lt;strong&gt;Correction update: 2007/06/26&lt;/strong&gt;Wow. I am incredibly embarassed.
Somehow, I made a very stupid mistake in my summary of the State Library&lt;/p&gt;
&lt;p&gt;of Ohio ILS Options Discussion Meeting Minutes - April 24, 2007. The
mistake was that I incorrectly attributed Joshua Ferraro of LibLime with
making statements about Evergreen at that meeting when he was not even
present. All of the statements about Evergreen should have been
attributed to Stephen Hedges. I apologize profusely to Josh for this
mistake, and will repeat this correction and apology in the section of
the blog entry closer to the text.&lt;/p&gt;
&lt;p&gt;I have been in the process of gathering information about the possible
future&lt;/p&gt;
&lt;p&gt;of our library system, with a focus on SirsiDynix's Rome, Evergreen, and
Koha,&lt;/p&gt;
&lt;p&gt;for a number of months now. This results in having to sift through
claims from&lt;/p&gt;
&lt;p&gt;a number of different sources about the capabilities (present and
future) for&lt;/p&gt;
&lt;p&gt;all of these systems. In the context of a recent post on the
open-ils.org blog (&lt;a class="reference external" href="http://open-ils.org/blog/?p=90"&gt;Lies, Damned Lies, and Library Automation
Software&lt;/a&gt;),&lt;/p&gt;
&lt;p&gt;as well as all of the shilling that will undoubtedly be going on on the
exhibit&lt;/p&gt;
&lt;p&gt;floor and in the hospitality rooms of ALA, and finally building on&lt;/p&gt;
&lt;p&gt;Karen Coombs' post on &lt;a class="reference external" href="http://www.librarywebchic.net/wordpress/2007/06/22/bias-objectivity-and-authority/"&gt;Bias, Objectivity and
Authority&lt;/a&gt;,
I would&lt;/p&gt;
&lt;p&gt;like to make a point that ideally shouldn't need to be made (especially
for&lt;/p&gt;
&lt;p&gt;librarians!), but sadly seems to be necessary in the context of
discussions about Evergreen and Koha.&lt;/p&gt;
&lt;p&gt;The point? &amp;quot;Know your sources.&amp;quot; And &amp;quot;Check your facts.&amp;quot; When you've been
given information about&lt;/p&gt;
&lt;p&gt;something, you don't blindly accept the information as given - you check
the&lt;/p&gt;
&lt;p&gt;references and determine the authority of the source. This is par for
the&lt;/p&gt;
&lt;p&gt;course for reference librarians educating patrons performing research in
their&lt;/p&gt;
&lt;p&gt;libraries, but oddly enough seems to be a common blind spot when it
comes to&lt;/p&gt;
&lt;p&gt;performing evaluations of the software that powers your libraries.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Problem #1&lt;/strong&gt;: Evaluating information about a given product from the
company or&lt;/p&gt;
&lt;p&gt;organization that stands to benefit from your adoption of that product.&lt;/p&gt;
&lt;p&gt;This is especially hard when dealing with companies offering proprietary&lt;/p&gt;
&lt;p&gt;products that won't hand you an evaluation copy to try out in your own&lt;/p&gt;
&lt;p&gt;organization; or that run closed mailing lists; or that don't make their&lt;/p&gt;
&lt;p&gt;documentation or support infrastructure openly available.&lt;/p&gt;
&lt;p&gt;But it can also be hard with companies or organizations offering open
source&lt;/p&gt;
&lt;p&gt;products or support for open source products. The company or
organization may&lt;/p&gt;
&lt;p&gt;point you at an online demo of their product, but that demo may reflect
a&lt;/p&gt;
&lt;p&gt;heavily customized, bleeding-edge version of the product that mere
mortals&lt;/p&gt;
&lt;p&gt;cannot install - or even more insidiously, may include code that is not&lt;/p&gt;
&lt;p&gt;currently included in the open source repository.&lt;/p&gt;
&lt;p&gt;The good news on the open source front is that independent contributors
have&lt;/p&gt;
&lt;p&gt;made VMWare images of some of the most popular library systems available&lt;/p&gt;
&lt;p&gt;(&lt;a class="reference external" href="http://open-ils.org/cvs.php"&gt;Evergreen&lt;/a&gt;,&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://kylehall.info/index.php/projects/koha/koha-virtual-appliance/"&gt;Koha&lt;/a&gt;)
for&lt;/p&gt;
&lt;p&gt;download that reflect a standard install of the product directly from
the open&lt;/p&gt;
&lt;p&gt;source repository.&lt;/p&gt;
&lt;p&gt;Note that a common approach to marketing a product is to provide a
feature&lt;/p&gt;
&lt;p&gt;list - basically a checklist of features. A naive decision maker might
assume&lt;/p&gt;
&lt;p&gt;that more is better, which often results in products breaking down the&lt;/p&gt;
&lt;p&gt;features that they do well into many sub-features. It's a form of
checklist&lt;/p&gt;
&lt;p&gt;inflation - but as long as you've got your eyes open, at least it's more&lt;/p&gt;
&lt;p&gt;information rather than less. For each feature you're actually
interested in,&lt;/p&gt;
&lt;p&gt;you have to ask a couple of additional questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;em&gt;How many other libraries are currently using this feature?&lt;/em&gt; It may
be&lt;/p&gt;
&lt;/p&gt;&lt;p&gt;great that the software you're looking at includes LDAP
authentication as an&lt;/p&gt;
&lt;p&gt;option, but if there's only one other library using the feature it's&lt;/p&gt;
&lt;p&gt;unfortunately likely that they will be using a different LDAP
directory&lt;/p&gt;
&lt;p&gt;product than you (Novell eDirectory vs. MS ActiveDirectory vs.
OpenLDAP vs.&lt;/p&gt;
&lt;p&gt;IBM Directory) and they will be using it in a different way.&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Is this feature part of the base package, or is it an optional extra&lt;/p&gt;
&lt;/p&gt;&lt;p&gt;that's going to cost me more? Not such a problem with the open source&lt;/p&gt;
&lt;p&gt;options, although it depends in that case whether you're buying
commercial&lt;/p&gt;
&lt;p&gt;support for the product. The model that the company uses may be
all-inclusive&lt;/p&gt;
&lt;p&gt;or a menu of different costed support options.&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Is this a massive feature that hasn't been broken down into&lt;/p&gt;
&lt;/p&gt;&lt;p&gt;sub-features? The danger here is that, for the purposes of looking
good in&lt;/p&gt;
&lt;p&gt;feature comparisons, a product may have added a number of &amp;quot;features&amp;quot;
that&lt;/p&gt;
&lt;p&gt;really just scratch the surface of what comparable products offer.&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example, if a library systems product says it has a serials module
and an&lt;/p&gt;
&lt;p&gt;acquisitions module, you have to dig into what that really means. Does
the&lt;/p&gt;
&lt;p&gt;&amp;quot;serials module&amp;quot; just mean that it will spit out a routing list whenever
you&lt;/p&gt;
&lt;p&gt;check in a new issue of a given serial? Or does it mean that it handles&lt;/p&gt;
&lt;p&gt;predictions, claiming, holdings, etc., in the way that meets your
library&lt;/p&gt;
&lt;p&gt;needs? By &amp;quot;acquisitions module&amp;quot;, does the product mean that it simply
records&lt;/p&gt;
&lt;p&gt;the cost of each item that you have acquired? Does it allow you to make&lt;/p&gt;
&lt;p&gt;on-order items visible in the catalogue, with the ability to place
holds? Does&lt;/p&gt;
&lt;p&gt;it include EDI capabilities? Does it provide a complete fiscal
management&lt;/p&gt;
&lt;p&gt;system with funds and reporting and electronic record import / export
hooks&lt;/p&gt;
&lt;p&gt;for the ERP system that your university or municipality uses so that
costs and&lt;/p&gt;
&lt;p&gt;invoices don't have to be manually entered multiple times in multiple
systems?&lt;/p&gt;
&lt;p&gt;Perhaps most importantly, does the system have the flexibility to adapt
to your&lt;/p&gt;
&lt;p&gt;needs, or does the system require you to adapt to its needs? Can you
live with&lt;/p&gt;
&lt;p&gt;the 80% of functionality that most sites need, or does your site live in
the&lt;/p&gt;
&lt;p&gt;long tail of requirements. In the case of serials, for example, do you
need&lt;/p&gt;
&lt;p&gt;the ability to specify any pattern, or can you just deal with irregular&lt;/p&gt;
&lt;p&gt;patterns those as exceptions?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Problem #2&lt;/strong&gt;: Evaluating information about a given product from a
company or&lt;/p&gt;
&lt;p&gt;organization that offers a competitive product.&lt;/p&gt;
&lt;p&gt;Sales people make it their business to know their competitors so that
they can&lt;/p&gt;
&lt;p&gt;accomplish two goals:&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Focus attention on (and often embellish) their own product's
strengths,&lt;/p&gt;
&lt;p&gt;and know how to spin responses to their own product's weaknesses that
might&lt;/p&gt;
&lt;p&gt;be identified by a competitor.&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first"&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Identify the weaknesses of their competitor's product, particularly
when&lt;/p&gt;
&lt;p&gt;their own product has comparable strengths in that same area. Note
that these&lt;/p&gt;
&lt;p&gt;weaknesses don't necessarily have to be real, they just have to be
believable&lt;/p&gt;
&lt;p&gt;and hard to disprove.&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Among the proprietary options, without having access to a hands-on test
system,&lt;/p&gt;
&lt;p&gt;the system documentation, or the product mailing lists, it is incredibly
hard to&lt;/p&gt;
&lt;p&gt;verify claims about a products' strengths or weaknesses. Even for claims
about&lt;/p&gt;
&lt;p&gt;the future development of a proprietary product that you already have
access&lt;/p&gt;
&lt;p&gt;to, the company cannot be held liable if plans change. Companies can,
for&lt;/p&gt;
&lt;p&gt;example, cancel an entire product even after beta versions of the
product have&lt;/p&gt;
&lt;p&gt;been released into the wild for &amp;quot;development partners.&amp;quot; Horizon 8,
anyone?&lt;/p&gt;
&lt;div class="section" id="development-partners-test-our-beta-for-us"&gt;
&lt;h2&gt;Development partners: test our beta for us!&lt;/h2&gt;
&lt;p&gt;Oh - on the topic of &amp;quot;development partners&amp;quot; - this is typically a
euphemism for&lt;/p&gt;
&lt;p&gt;&amp;quot;we'll give you a discount on product XXX if you put it into production
and&lt;/p&gt;
&lt;p&gt;report all the bugs you find.&amp;quot; Companies love this approach because it
gives&lt;/p&gt;
&lt;p&gt;them visibility in the marketplace (&amp;quot;Look, we already have deployed
product XXX&lt;/p&gt;
&lt;p&gt;to five sites! It's proven and ready for you!&amp;quot;) while enabling them to&lt;/p&gt;
&lt;p&gt;effectively continue development on product XXX and hope to have a
polished&lt;/p&gt;
&lt;p&gt;product ready in time for the bulk of their potential customer base to
actually&lt;/p&gt;
&lt;p&gt;adopt it. In the past, Microsoft very effectively used the &amp;quot;product
announce&amp;quot;&lt;/p&gt;
&lt;p&gt;to prevent customers from purchasing a competitor's product that offered&lt;/p&gt;
&lt;p&gt;compelling features and stalling the decision long enough to then
develop and&lt;/p&gt;
&lt;p&gt;bring their own product to market.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="disinformation-and-open-source-projects"&gt;
&lt;h2&gt;Disinformation and open source projects&lt;/h2&gt;
&lt;p&gt;Surprisingly, the disinformation approach works even in open source
projects.&lt;/p&gt;
&lt;p&gt;For example, I have read and heard claims about Evergreen like: &amp;quot;Oh,
Evergreen&lt;/p&gt;
&lt;p&gt;is just for massive consortiums / it needs 40 servers to run / it
doesn't scale&lt;/p&gt;
&lt;p&gt;down to just a single library.&amp;quot; You can see how this could be believable
if you&lt;/p&gt;
&lt;p&gt;don't push too hard on the claims, because Evergreen's was developed for
a&lt;/p&gt;
&lt;p&gt;consortial library system and much has been made about the impressive
server&lt;/p&gt;
&lt;p&gt;cluster that GPLS runs Evergreen on -- however, having run Evergreen on
a single&lt;/p&gt;
&lt;p&gt;VMWare machine on my laptop, I can personally attest to its ability to
scale&lt;/p&gt;
&lt;p&gt;down to a single server (or portion thereof). And you can run that same
VMWare&lt;/p&gt;
&lt;p&gt;image on your own laptop or spare desktop machine and disprove that
claim&lt;/p&gt;
&lt;p&gt;yourself; but many of the decision makers do not have the technical
skills,&lt;/p&gt;
&lt;p&gt;time, or interest to get hands-on with products like Evergreen. So they
have&lt;/p&gt;
&lt;p&gt;to trust what they read or hear, hopefully from the most trustworthy of&lt;/p&gt;
&lt;p&gt;sources.&lt;/p&gt;
&lt;p&gt;Another swipe at Evergreen is that it is not a true open source project;
that&lt;/p&gt;
&lt;p&gt;its history as a top-down project initiated by GPLS means that there is
no&lt;/p&gt;
&lt;p&gt;real development community around Evergreen. If you've followed the
Evergreen&lt;/p&gt;
&lt;p&gt;development&lt;/p&gt;
&lt;p&gt;mailing list, you wouldn't believe a claim like this, and you would&lt;/p&gt;
&lt;p&gt;proclaim it a blatant lie. To disprove this claim, you just&lt;/p&gt;
&lt;p&gt;need to browse through the open-ils-dev mailing list and look for the
emails&lt;/p&gt;
&lt;p&gt;with the subject keyword &amp;quot;PATCH&amp;quot; and you'll see that some of us have
indeed&lt;/p&gt;
&lt;p&gt;been contributing patches to the source code. Beyond that, you'll also
see&lt;/p&gt;
&lt;p&gt;that there are many volunteer contributors for install and configuration&lt;/p&gt;
&lt;p&gt;support, documentation, creation of VMWare images. So how could someone
make&lt;/p&gt;
&lt;p&gt;such a claim about Evergreen and get away with it?&lt;/p&gt;
&lt;p&gt;It's all about trusting &amp;quot;authorities&amp;quot;, not checking sources, and
integrity (or perhaps&lt;/p&gt;
&lt;p&gt;a lack thereof). Here's an excerpted quote about Evergreen from the
State Library&lt;/p&gt;
&lt;p&gt;of Ohio ILS Options Discussion Meeting Minutes - April 24, 2007&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;p&gt;The documentation for the process is very poor, which is typical
because it is&lt;/p&gt;
&lt;p&gt;the last thing developers are thinking about. ... The source code is
open but&lt;/p&gt;
&lt;p&gt;they don't really follow the &amp;quot;playground&amp;quot; rules for the open source
production&lt;/p&gt;
&lt;p&gt;process.&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;Here's where you need to really know your sources and check your
references.&lt;/p&gt;
&lt;p&gt;Note that the claims about the nature of Evergreen as not being a true
open&lt;/p&gt;
&lt;p&gt;source project are credited to the introductory speaker, Stephen Hedges.
Who&lt;/p&gt;
&lt;p&gt;is Stephen Hedges? He was the director of Nelsonville Public Library
(NPL)&lt;/p&gt;
&lt;p&gt;when he worked with Joshua Ferraro to install Koha as the NPL integrated&lt;/p&gt;
&lt;p&gt;library system. In addition, he is listed as the contact for Koha
documentation&lt;/p&gt;
&lt;p&gt;submissions. It seems, then, that he has a fairly significant personal
stake in&lt;/p&gt;
&lt;p&gt;the success of Koha, and if the meeting minutes accurately capture his&lt;/p&gt;
&lt;p&gt;statements about Evergreen, it sounds like he was interested in
dissuading&lt;/p&gt;
&lt;p&gt;attendees from seriously considering Evergreen as an option.
&lt;em&gt;Subjectivity alert&lt;/em&gt;: as one of the volunteer contributors of code,
documentation, install assistance, and a VMWare image of Evergreen from
outside GPLS, this quote got me pretty hot under the collar; I've
contributed to other open source projects, such as the Linux
Documentation Project and PHP, and you always have to prove that you
understand the project before being granted commit access.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Correction update: 2007/06/26&lt;/strong&gt;Wow. In the following paragraph, I
somehow made a very stupid mistake by incorrectly attributing Joshua
Ferraro of LibLime with making statements about Evergreen at that
meeting when he was not even present. All of the statements about
Evergreen should have been attributed to Stephen Hedges. I apologize
profusely to Josh and LibLime for this mistake.&lt;/p&gt;
&lt;p&gt;Who was Stephen introducing as the guest speaker of honour on the
subject of&lt;/p&gt;
&lt;p&gt;open source ILS options in libraries? The speaker was Joshua Ferraro,&lt;/p&gt;
&lt;p&gt;president of LibLime, the company best known for offering commercial
support&lt;/p&gt;
&lt;p&gt;for Koha. LibLime did announce that they would offer commercial&lt;/p&gt;
&lt;p&gt;support for Evergreen, and have added sections about Evergreen to their
Web&lt;/p&gt;
&lt;p&gt;site, so it would on the surface seem to be a logical choice to invite a&lt;/p&gt;
&lt;p&gt;LibLime employee as a one-speaker-fits-all host to cover both Koha and&lt;/p&gt;
&lt;p&gt;Evergreen. However, LibLime has a rather unusual relationship with
Evergreen.&lt;/p&gt;
&lt;p&gt;It seems that LibLime has positioned Evergreen among their other
offerings as&lt;/p&gt;
&lt;p&gt;such a high-end product that only a handful of potential customers would
qualify&lt;/p&gt;
&lt;p&gt;for that market:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;strong&gt;Evergreen&lt;/strong&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;For consortia who need:&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;* Scalability to hundreds of libraries, tens of millions of
records&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;[&lt;a class="reference external" href="http://liblime.com/products"&gt;LibLime Products&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;It sounds impressive, but way too high-end for the vast majority of&lt;/p&gt;
&lt;p&gt;libraries. So of course people browsing the LibLime Web site will focus
on the&lt;/p&gt;
&lt;p&gt;Koha options instead. It seems like a deliberate bait-and-switch&lt;/p&gt;
&lt;p&gt;move to attract libraries interested in Evergreen after the successful
launch in&lt;/p&gt;
&lt;p&gt;Georgia, but to get them to buy support for Koha instead. Consider:
LibLime&lt;/p&gt;
&lt;p&gt;has not contributed a single patch to the Evergreen development
(open-ils-dev)&lt;/p&gt;
&lt;p&gt;mailing list. LibLime has not contributed a single line of documentation
to&lt;/p&gt;
&lt;p&gt;the Evergreen wiki. LibLime does not include Evergreen among their
demos.&lt;/p&gt;
&lt;p&gt;LibLime hasn't made an Evergreen sale. So I think it's a fair question
to ask&lt;/p&gt;
&lt;p&gt;how committed LibLime really is to Evergreen - is LibLime's claim to
support&lt;/p&gt;
&lt;p&gt;Evergreen just a means to get people in the door, in hopes that they'll
walk&lt;/p&gt;
&lt;p&gt;out with a copy of Koha under their arms? I think so. You can come to
your own conclusions.&lt;/p&gt;
&lt;p&gt;In case you think that Ohio quote was just an unfortunate one-off, and
that&lt;/p&gt;
&lt;p&gt;I'm making a big deal about nothing, here's a more recent quote from the&lt;/p&gt;
&lt;p&gt;Open&lt;/p&gt;
&lt;p&gt;Source Session Q&amp;amp;A of the &amp;quot;Everything You Ever Wanted to Know about Open&lt;/p&gt;
&lt;p&gt;Source&amp;quot; conference held on June 6th, 2007 that caught my attention (and&lt;/p&gt;
&lt;p&gt;which apparently no-one in attendance at the meeting was capable of
providing&lt;/p&gt;
&lt;p&gt;a rebuttal to):&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Q. Contrast Koha &amp;amp; Evergreen?&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A. Major difference: Koha was grassroots: started w/rural libraries,
distributed organization, bottom-up decision making. Evergreen:
PINES library system; top-down decision making. Koha: 800 libs
worldwide, 8 years old; Evergreen: 1 year old, 1 consortium.&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;So there's the comment about the &amp;quot;top-down&amp;quot; nature of Evergreen again,
and&lt;/p&gt;
&lt;p&gt;this time Evergreen is being attacked for being immature and not very
widely&lt;/p&gt;
&lt;p&gt;used. (Note: on that very day, the British Columbia Ministry of
Education&lt;/p&gt;
&lt;p&gt;announced the &lt;a class="reference external" href="http://pines.bclibrary.ca/"&gt;BC PINES Website&lt;/a&gt; - so&lt;/p&gt;
&lt;p&gt;another consortium is getting on board the Evergreen express.) If there
really&lt;/p&gt;
&lt;p&gt;are 800 libraries using Koha, I'm shocked at how many basic install,
config,&lt;/p&gt;
&lt;p&gt;and runtime problems are being reported on the Koha mailing lists with
the&lt;/p&gt;
&lt;p&gt;current 2.2.9 release... but I'm getting off-topic. The speaker was&lt;/p&gt;
&lt;p&gt;[STRIKEOUT:once again] Joshua Ferraro, who:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;... talked with us about open source integrated library systems,&lt;/p&gt;
&lt;/p&gt;&lt;p&gt;specifically Koha and Evergreen, and about his company,&lt;/p&gt;
&lt;p&gt;LibLime... [&lt;/p&gt;
&lt;p&gt;&lt;p&gt;href=&amp;quot;&lt;a class="reference external" href="http://blogs.umass.edu/ealling/2007/06/06/open-source-session-reflections/"&gt;http://blogs.umass.edu/ealling/2007/06/06/open-source-session-reflections/&lt;/a&gt;&amp;quot;&amp;gt;reference]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If your definition of &amp;quot;talking about&amp;quot; is &amp;quot;praise the product that pays
your&lt;/p&gt;
&lt;p&gt;bills and criticize the product that represents a major threat&amp;quot;, then
mission&lt;/p&gt;
&lt;p&gt;accomplished. You can't blame the speaker for being in a perfect
position&lt;/p&gt;
&lt;p&gt;to pitch his product at the expense of a competing product, while being
credited&lt;/p&gt;
&lt;p&gt;with being an objective authority on both products. But I suspect the
audience actually wanted a balanced presentation&lt;/p&gt;
&lt;p&gt;about the two products.&lt;/p&gt;
&lt;p&gt;So what's my point? &lt;em&gt;Know your sources&lt;/em&gt;. If you invite someone to speak&lt;/p&gt;
&lt;p&gt;on a broad topic, such as the State Library of Ohio meeting, where [t]he
invitation was expanded to include any&lt;/p&gt;
&lt;p&gt;library interested in the possibility of open source integrated library&lt;/p&gt;
&lt;p&gt;systems (ILS), you might want to ensure&lt;/p&gt;
&lt;p&gt;that any personal biases are very much out in the open for your audience&lt;/p&gt;
&lt;p&gt;(both the in-person audience and the audience reading the meeting
minutes at&lt;/p&gt;
&lt;p&gt;home). If you're the speaker in such a situation, you should reveal any
such biases.&lt;/p&gt;
&lt;p&gt;If you're a company selling a&lt;/p&gt;
&lt;p&gt;product or services related to a product, perhaps it's inevitable that
the&lt;/p&gt;
&lt;p&gt;profit motive is going to override ethics in such opportunities - but I
can&lt;/p&gt;
&lt;p&gt;dream. If you read the full minutes from the State Library of Ohio
meeting,&lt;/p&gt;
&lt;p&gt;you can see that in terms of an open source ILS option, Evergreen is
given&lt;/p&gt;
&lt;p&gt;only the most cursory coverage and the major focus is on selling Koha.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="getting-a-fair-comparison"&gt;
&lt;h2&gt;Getting a fair comparison&lt;/h2&gt;
&lt;p&gt;For a fair comparison of Koha and Evergreen, please consider either&lt;/p&gt;
&lt;p&gt;hosting two separate presentations (you wouldn't consider asking
SirsiDynix&lt;/p&gt;
&lt;p&gt;to give a balanced presentation on all of the proprietary ILS options,
would&lt;/p&gt;
&lt;p&gt;you?), or try to find an independent speaker who can provide a more
objective&lt;/p&gt;
&lt;p&gt;analysis of the products at hand. Ask the speaker if they have any&lt;/p&gt;
&lt;p&gt;financial ties to the products at hand. Heck, has anybody asked Marshall&lt;/p&gt;
&lt;p&gt;Breeding and Andrew Pace if they've had any financial ties to ILS
companies? I&lt;/p&gt;
&lt;p&gt;assume the answer is no, but our community relies so much on their
analysis of&lt;/p&gt;
&lt;p&gt;the overall library systems landscape with so much financial implication
for the&lt;/p&gt;
&lt;p&gt;companies at question that it would be comforting to have a positive
assertion&lt;/p&gt;
&lt;p&gt;accompany any &amp;quot;state of the ILS landscape&amp;quot; articles in the future.&lt;/p&gt;
&lt;p&gt;Ideally, you would find a member of the development community for each
of&lt;/p&gt;
&lt;p&gt;Evergreen and Koha. At the moment, I'm afraid that I can only qualify as
a&lt;/p&gt;
&lt;p&gt;member of the Evergreen community, but I plan to become more familiar
with&lt;/p&gt;
&lt;p&gt;Koha's codebase over the course of the summer - so maybe I can grow into
that&lt;/p&gt;
&lt;p&gt;position. Of course, then you would have to trust me. C'mon, you can
trust me! **grin**&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="make-technology-not-war"&gt;
&lt;h2&gt;Make technology, not war&lt;/h2&gt;
&lt;p&gt;What would I like to avoid? I would really like to avoid negative energy
being&lt;/p&gt;
&lt;p&gt;invested in a Koha vs. Evergreen or LibLime vs. Equinox battle royale.
That&lt;/p&gt;
&lt;p&gt;doesn't interest me, but I'm sure it greatly interests the companies
offering&lt;/p&gt;
&lt;p&gt;proprietary products. Instead, I hope that this energy can continue to
be&lt;/p&gt;
&lt;p&gt;invested in making both Koha and Evergreen better by those with the
technical&lt;/p&gt;
&lt;p&gt;skills. Let's have a competition on product design and implementation,
rather than&lt;/p&gt;
&lt;p&gt;on marketing spin or dirty tricks. Everyone benefits from strong open
source&lt;/p&gt;
&lt;p&gt;library systems - even if you don't adopt an open source system, it
raises the&lt;/p&gt;
&lt;p&gt;bar for the proprietary systems to differentiate themselves.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sun, 24 Jun 2007 02:33:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2007-06-24:/know-your-sources-evergreen-koha-comparisons.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Amber's first birthday</title><link>https://coffeecode.net/ambers-first-birthday.html</link><description>&lt;p&gt;Amazing. 365.25 days have flown past and Amber is now a walking one year
old featuring approximately six teeth, fuzzy / curly hair, and an
extremely expressive personality. We held a party for her on her
birthday and were lucky to have family and friends visit and call to
share their love for Amber. Here are a few pictures from yesterday's
celebrations:&lt;/p&gt;
&lt;div class="serendipity_imageComment_left" style="width: 110px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external" href="/uploads/pics/amber/cake.jpeg"&gt;|image0|&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Lynn made this absolutely delicious carrot cake and pink icing from
scratch.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Amber enjoyed the icing, but didn't eat too much cake... she didn't even
smash it to bits or smear it all over her face. Crazy kid. I'm not sure
how Lynn happened to end up making carrot cake, my personal favourite,
when she usually isn't a big fan of it. I guess I'm just really, really
lucky. This cake was so good, though, that Lynn liked it and would
consider making it again -- YEAH!&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="serendipity_imageComment_left" style="width: 83px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external" href="/uploads/pics/amber/ball.jpeg"&gt;|image1|&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Amber had the most fun rolling the purple ball around the floor.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;p&gt;The ball in Adam's hand comes from an amazing shape-sorting machine that
features lights, sounds, music, and acts as a walker. It seems to have
almost magnetic powers to attract the Amber unit. Big thanks to old man
Uncle Mike, Christine, and Adam for getting something right up Amber's
alley!&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="serendipity_imageComment_left" style="width: 110px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external" href="/uploads/pics/amber/interact.jpeg"&gt;|image2|&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Lynn, Calev, Amber, and Deirdre all participated in the opening of
presents.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;p&gt;The pink jeep in the foreground was originally Abby's -- thanks David
and Karen! Calev is going to get to enjoy his first birthday in just a
couple more months, so this was good practice for him. Calev lives up
the street from us, and there's hope that maybe early contact with other
children her age means that Amber won't grow up to be as curmudgeonly
and anti-social as her dad...&lt;/p&gt;
&lt;p&gt;So... thanks to everyone who sent cards, called, emailed, or dropped by
to share in Amber's first birthday. We really appreciate it, and Amber
certainly felt the love. She's very lucky to be growing up with so many
people who care about her.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;And here's the gathered throng &lt;a class="reference external" href="http://video.google.com/videoplay?docid=-8183384292753008425"&gt;singing happy
birthday&lt;/a&gt;...&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 09 May 2007 03:02:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2007-05-09:/ambers-first-birthday.html</guid><category>Family</category><category>Amber</category></item><item><title>Evergreen VMWare image available for download</title><link>https://coffeecode.net/evergreen-vmware-image-available-for-download.html</link><description>&lt;p&gt;After much iteration and minor bug-squashing in my configuration, I am
pleased to announce the &lt;a class="reference external" href="http://open-ils.org/~denials/Evergreen_Gentoo.zip"&gt;Evergreen on Gentoo VMWare
image&lt;/a&gt; is
available for download. The download itself is approximately 500MB as a
zipped image; when you unzip the image, it will require approximately
6GB of disk space. (&lt;strong&gt;1&lt;/strong&gt;)&lt;/p&gt;
&lt;p&gt;Basic instructions for starting up Evergreen will be found in the
Evergreen_Gentoo/README file inside the unzipped image. To use this
image, you must have installed a VMWare product (&lt;strong&gt;2&lt;/strong&gt;) on a machine
somewhere. I've allocated 512 MB of RAM to the VMWare image, so the
machine you run it on should have a total of at least 768 MB of RAM --
or you can try decreasing the amount of RAM dedicated to the VMWare
image.&lt;/p&gt;
&lt;p&gt;The image is based on the 1.1.x development branch of Evergreen from CVS
as of April 23, 2007. There are a couple of bugs I have observed with
the image so far:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;[STRIKEOUT:Checking out an item doesn't work.] &lt;em&gt;Fixed as of this
morning - Bill Erickson noted on the open-ils-dev mailing list that
the **default*&lt;/em&gt; circ rule wasn't being created by the install scripts
and checked a fix into CVS. I spun a new image.*&lt;/li&gt;
&lt;li&gt;The first time you start up the Evergreen processes with osrf_ctl,
the OpenSRF-C process often dies with a segmentation fault.
Restarting the processes then results in a stable running system.
It's a race condition that we'll have to hunt down and eliminate.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="section" id="notes"&gt;
&lt;h2&gt;Notes&lt;/h2&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;I apologize for overestimating how much space the VMWare image would
require way back at the beginning of this exercise. Apparently while
VMWare Server offers an &amp;quot;expand disk&amp;quot; option, it does not offer a
&amp;quot;shrink disk&amp;quot; option. One tip that helped me shrink the image from
1GB to half that size was to run &amp;quot;cat /dev/zero &amp;gt; zero.txt ; sync ;
rm zero.txt&amp;quot; to zero out all of the bytes on the empty portion of the
virtual disk before compressing the image.&lt;/li&gt;
&lt;li&gt;VMWare Server and VMWare Player are both zero-dollar downloads from
&lt;a class="reference external" href="http://vmware.com/"&gt;http://vmware.com/&lt;/a&gt; - I use VMWare Server and don't know if VMWare
Player offers any advantages over that.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 25 Apr 2007 15:34:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2007-04-25:/evergreen-vmware-image-available-for-download.html</guid><category>Libraries</category><category>Coding</category></item><item><title>Evergreen and the business case for choosing an open source ILS</title><link>https://coffeecode.net/evergreen-and-the-business-case-for-choosing-an-open-source-ils.html</link><description>&lt;p&gt;Due to a sad event, &lt;a class="reference external" href="http://infoservices.uwindsor.ca/ils/"&gt;Art Rhyno&lt;/a&gt;
asked me to be his co-presenter at the &lt;a class="reference external" href="http://odyssey2007.wordpress.com"&gt;OLITA Digital Odyssey
2007&lt;/a&gt;. Our broad subject was
&lt;a class="reference external" href="http://open-ils.org"&gt;Evergreen&lt;/a&gt;, more specifically introducing the
Evergreen ILS to an audience that was aware of Evergreen's existence but
wanted to know more about it from both a technical and a business
perspective. I had two days' notice to prepare for the presentation, so
I split my time between polishing the &lt;a class="reference external" href="/archives/122-Evergreen-VMWare-image-oh-so-close!.html"&gt;VMWare image of
Evergreen&lt;/a&gt;
and creating the &lt;a class="reference external" href="/uploads/talks/EG_business.pdf"&gt;slides for my presentation
(PDF)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Art gave a general introduction to open source development, told the
story of how Evergreen came about, and described its architecture and
the capabilities currently demonstrated on the in-production system at
PINES. Perhaps of most interest to the audience, Art talked a bit about
the direction that he's taking
&lt;a class="reference external" href="http://open-ils.org/dokuwiki/doku.php?id=scratchpad:acq_serials"&gt;Woodchip&lt;/a&gt;,
the serials and acquisitions module based on &lt;a class="reference external" href="http://ofbiz.apache.org"&gt;Apache
OFBiz&lt;/a&gt; that the University of Windsor &lt;a class="reference external" href="http://open-ils.org/blog/?p=80"&gt;has
agreed to develop&lt;/a&gt; for Evergreen. No
pressure, Art &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;p&gt;Then the presentation was handed off to me. I started by asking for
demographic information from the audience; to no surprise, about half of
the audience of approximately 60 ran Horizon systems. Many of the
attendees in the audience paid more than $20,000 annually for support
and licensing costs. Most of the sites had the equivalent of one
full-time position devoted to the care and feeding of their current
library system.&lt;/p&gt;
&lt;p&gt;The goals of my presentation were to:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Demonstrate that the library community has a strong culture of
self-support with respect to library systems (based on the volume of
email on our closed library systems mailing lists)&lt;/li&gt;
&lt;li&gt;Suggest that the quality of official support we receive from our
closed library systems does not warrant the annual support fees we
pay&lt;/li&gt;
&lt;li&gt;Point out that we already devote personnel to the care and feeding of
our closed library systems, so the refrain of &amp;quot;open source is like
getting a free kitten&amp;quot; is fine given that we're currently paying for
a dog of a closed system&lt;/li&gt;
&lt;li&gt;Urge the audience to consider what a waste of money and time it is to
train staff to learn the proprietary API, templating language, etc
for a closed system when that knowledge can become useless if the
system is pulled from the market -- while investing money and time in
learning the API and templating language for Evergreen results in
reusable skills for your personnel because those are based on open
standards.&lt;/li&gt;
&lt;li&gt;Let the community know the preliminary results of my evaluation of
the internationalization support offered by Evergreen&lt;/li&gt;
&lt;li&gt;List some of the challenges that we face in achieving a wide adoption
of Evergreen&lt;/li&gt;
&lt;li&gt;Notify the community that my VMWare image is really, truly, close to
being released and suggest that it would be a great way to get
started with Evergreen&lt;/li&gt;
&lt;li&gt;Run a quick live demo with the VMWare image to prove that a full
install of Evergreen can scale down to running in a virtual machine
with 512M of RAM&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;My self-assessment? I did not want to come across as an open source
zealot; rather, I wanted to point out where our current relationships
with our vendors are failing us and how open source can fill in some of
those gaps. Unfortunately, I feel that I probably veered a little too
much towards the rant side of the continuum a couple of times -- my
passion for this subject came through, no doubt, but it was perhaps a
little too strong.&lt;/p&gt;
&lt;p&gt;I knew my presentation was text-heavy, but I didn't beat myself up too
much because a good visual presentation needs more than just a couple of
days to come together and I didn't have a variation of this already in
the can somewhere... this was brand new content. I was pleased that I
came up with and shared the visual image of &lt;strong&gt;migration ninjas&lt;/strong&gt;. As the
closed vendors' licensing terms might prevent us from openly sharing
migration kits or migration how-tos, the “migration ninjas” would be the
community's system gurus who would slip into a library and perform the
secret, inhuman feats necessary to migrate from a closed system to an
open system.&lt;/p&gt;
&lt;p&gt;I wasn't at all happy with my live demo. First, I failed to arrange with
the conference hosts to obtain an Internet connection, so the cover art
in the catalog and the Z39.50 copy cataloging in the staff client facets
of the demo were a bust. Second, while I knew it would be an exploratory
live demo, given that I had just achieved a full working install a few
days prior to the session, it's not very impressive for an audience to
watch a presenter fumbling around the command line in response to a
question about the API. Third, I failed to show off some really cool
features of Evergreen such as the shelf-browser (although without cover
art it wouldn't have been nearly as impressive). I tried firing up the
reports Web interface and failed. So, now that I have a working install,
I'll be able to prepare a much better live demo in the future - I just
hope that our audience didn't take away a bad impression from our
session on Friday.&lt;/p&gt;
&lt;div class="section" id="questions-from-the-audience"&gt;
&lt;h2&gt;Questions from the audience&lt;/h2&gt;
&lt;p&gt;We had some good questions from the audience; here's what I can
remember. Please add more to the comments on this post, if you have
them!&lt;/p&gt;
&lt;div class="section" id="why-is-there-so-much-interest-in-evergreen-and-why-aren-t-we-hearing-much-about-koha"&gt;
&lt;h3&gt;Why is there so much interest in Evergreen and why aren't we hearing much about Koha?&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Dan&lt;/strong&gt; said something about how his first investigation of Koha
revealed evidence of classic MySQL dependencies and assumptions in the
codebase that, as a former product planner for IBM DB2 relational
database, made him cringe. Evergreen, in comparison, is built on
PostgreSQL which was reassuring. &lt;em&gt;I failed to note at the time that
Evergreen has been developed so that it can support other databases,
although some work would be required to convert to the SQL dialect and
full-text search required by the target database.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Art&lt;/strong&gt; mentioned that while Koha had been quite popular internationally
for the past number of years, it had not been as popular in North
America. Part of that reason may have been a severe scalability problem
that kicked in somewhere around 450,000 records. Dan suggested that
problem could be traced directly to MySQL 3 / 4, but that it might have
been alleviated in MySQL 5 (which Koha does not yet support). Art noted
that Koha ZOOM, using indexdata.dk's Zebra indexing engine, overcame
that performance problem but some extra care was required to commit
updates to the index.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="what-about-the-dangers-of-someone-forking-the-code"&gt;
&lt;h3&gt;What about the dangers of someone forking the code?&lt;/h3&gt;
&lt;p&gt;In my opinion, we didn't really answer this question well. Art didn't
think that a fork was likely as Evergreen had been built with the
best-of-breed components and plenty of input from the PINES library
staff and community. What I should have added was that the ability to
create a fork of a project is actually a wonderful feature of open
source - it enables communities to route around projects that become
overly bureaucratic, or closed to new developers, or not interested in
input or exploring new directions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="you-dan-talked-a-lot-about-the-benefits-of-a-system-built-on-standards-can-you-show-us-what-the-web-templating-language-looks-like"&gt;
&lt;h3&gt;You (Dan) talked a lot about the benefits of a system built on standards. Can you show us what the Web templating language looks like?&lt;/h3&gt;
&lt;p&gt;I fumbled this one badly. I quickly brought up footer.xml, but that
doesn't contain any dynamic content so it was a bad example. I then
suffered from presentation brain and couldn't remember the word
“introspect” to demonstrate srfsh's ability to introspect its objects.
Finally I (lamely) showed an example of a srfsh API request.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="summary"&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;I believe that a solid business case needs to be developed on a
library-by-library basis or on a consortial basis for migrations to
Evergreen. I think that my presentation provided some useful input to
those business cases, but in and of itself is not enough. Certainly, as
our own library considers its options in the coming years, we're going
to have to have a much more solid set of criteria before we can make any
decision. I encourage you to take what you can from the presentation and
improve, polish, and contribute your own analysis back to the Evergreen
community so that you can help other libraries make an informed
decision.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sun, 22 Apr 2007 13:56:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2007-04-22:/evergreen-and-the-business-case-for-choosing-an-open-source-ils.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>Evergreen VMWare image -- oh so close!</title><link>https://coffeecode.net/evergreen-vmware-image-oh-so-close.html</link><description>&lt;p&gt;Many of you know that I have been working on step-by-step instructions
for &lt;a class="reference external" href="http://open-ils.org/dokuwiki/doku.php?id=installing_prerequisites_on_gentoo"&gt;installing Evergreen on
Gentoo&lt;/a&gt;
on the official Evergreen documentation wiki. At the same time, I have
been working on using that documentation to create a VMWare image of
Evergreen -- this avocation dates all the way back to the &lt;a class="reference external" href="http://infoservices.uwindsor.ca/ils/?p=29"&gt;ILS
Symposium&lt;/a&gt; hosted by the
University of Windsor in November, 2006. I owe endless thanks to miker,
berick, bradl, and phasefx from the Evergreen development team for all
of their assistance with my annoying questions over the past months.&lt;/p&gt;
&lt;p&gt;Obligatory defining of terms: &lt;em&gt;What is a VMWare image, and why should I
care?&lt;/em&gt; VMWare is a virtualization product (the &amp;quot;VM&amp;quot; stands for &amp;quot;virtual
machine&amp;quot;). &lt;em&gt;Virtualization&lt;/em&gt; is a technology that allows you to run one
or more &amp;quot;guest&amp;quot; operating systems on top of a &amp;quot;host&amp;quot; operating systems.
So, let's say you're really interested in trying out Evergreen, but
don't have a spare computer to install Linux on, or don't have the time
or interest in learning how to compile packages from source on Linux, or
don't have much Linux experience -- you can install the free (zero
dollar, but not open source) &lt;a class="reference external" href="http://vmware.com/products/server/"&gt;VMWare
Server&lt;/a&gt; on any Windows computer,
download an Evergreen VMWare image to your computer, and start up the
Evergreen image. In less than an hour (assuming you have good banwidth
to download VMWare Server and the Evergreen image), you can have
Evergreen-running-on-Linux, running in a virtual machine on top of
Windows. That's the basic testing / evaluation test case for
virtualization, anyways. For some small libraries, this may in fact be
all that they need for a production library system -- but that's a
discussion for another blog post.&lt;/p&gt;
&lt;p&gt;One more note on virtualization technology: there are other
virtualization options, like &lt;a class="reference external" href="http://www.xensource.com/"&gt;Xen&lt;/a&gt; or
&lt;a class="reference external" href="http://bochs.sourceforge.net/"&gt;Bochs&lt;/a&gt;. But VMWare is the 900-pound
gorilla on the scene, and it's what I happen to have the most experience
and success using, so that's why I'm working with it. But it's an open
community, so if you've got the skills to create images for other
virtualization software, go for it!&lt;/p&gt;
&lt;p&gt;The good news is that Evergreen appears to be running cleanly on my
system. The OPAC works, albeit without any bibliographic entries at the
moment as I'm still pestering &lt;strong&gt;miker&lt;/strong&gt; with questions about the MARC
record and holdings import process. But getting a working install seemed
like the more important first task. Importing holdings and patron
information is going to require different steps depending on which ILS
you are currently using, so this should be a reasonable starting point
for an image.&lt;/p&gt;
&lt;p&gt;In my documentation, I haven't attached the exact set of configuration
files that I have used in the VMWare image, but I can do that if people
indicate that they are desired. If you have questions about anything
that seems missing from my documentation or why I made certain choices,
I would be glad to share that information with you and correct the docs.
But rather than supplying just the docs and config files, I suspect the
whole VMWare image would be more generally useful in the short term. I'm
guessing that most libraries interested in kicking the tires of
Evergreen don't want to spend a large chunk of their evaluation period
working out the installation kinks, but just want to get right to the
hands-on portion of the evaluation.&lt;/p&gt;
&lt;p&gt;So, Sunday night I uploaded my first version of the image and shared the
URL with a few close contacts, asking them to flush out any bugs. Kudos
to &lt;strong&gt;dmcmorris&lt;/strong&gt; for indirectly leading me to discover that I had missed
a minor dependency. Another upload last night, and I'm anxiously
awaiting the feedback from my comrades in arms. If all goes well, a
VMWare image of Evergreen should be available for download by the end of
the week. &lt;em&gt;Crossing fingers...&lt;/em&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 18 Apr 2007 00:11:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2007-04-18:/evergreen-vmware-image-oh-so-close.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>In which I make one apology, and two lengthy explanations</title><link>https://coffeecode.net/in-which-i-make-one-apology-and-two-lengthy-explanations.html</link><description>&lt;p&gt;I recently insulted Richard Wallis and Rob Styles of Talis by stating on
Dan Chudnov's blog:&lt;/p&gt;
&lt;blockquote&gt;
To me it felt like Talis was in full sales mode during both
Richard's API talk and Rob's lightning talk&lt;/blockquote&gt;
&lt;p&gt;I must apologize for using the terms &amp;quot;sales mode&amp;quot; and &amp;quot;sales pitch&amp;quot; to
describe their talks. They were not selling anything; no tangible
product was available and no price was attached. My mistake was one of
terminology; I believe Richard and Rob were in full &lt;em&gt;marketing&lt;/em&gt; mode on
behalf of the Talis brand.&lt;/p&gt;
&lt;p&gt;My perspective on this comes from having been a product manager for a
commercial product and having been fortunate enough to have proposals
accepted at open source conferences. My approach to avoid accusations of
using the community as a sales platform was to make it very, very clear
when a presentation I proposed was related to my product by using the
name of the product in the title of the proposal and the presentation. I
also proposed and gave presentations on topics unrelated to my product
or company. If people wanted to find out how my product integrated with
a given open source technology, they knew they could attend my talk
about that product; likewise, they were able to avoid my talk about that
product because I had made the subject clear in advance. The community
also learned that they could trust that I wasn't going to spring product
pitches on them in the middle of my unrelated talks. I considered it a
matter of personal integrity - and I made a lot of friends during those
years.&lt;/p&gt;
&lt;p&gt;So maybe I have overly-sensitive marketing senses as a result of my
prior experiences as a representative of commercial interests. Or maybe
I'm all alone on this, out on the edge of the code4lib community. But I
feel that I have to explain why I believe Richard and Rob were in
marketing mode during their presentations at code4lib 2007.&lt;/p&gt;
&lt;div style="font-size: 1.5em; font-face: bold; margin-top: 1.5em;"&gt;&lt;p&gt;Richard Wallis&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;Richard's proposal for the conference, which was voted in by the
code4lib community, was submitted as:&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;p&gt;Title: Library data APIs abound! Richard Wallis, Talis&lt;/p&gt;
&lt;p&gt;From Z39.50 to xISBN, they share the limitation of providing a
single&lt;/p&gt;
&lt;p&gt;stream of data from a single source.&lt;/p&gt;
&lt;p&gt;How to add value to data from one source with relevant data from&lt;/p&gt;
&lt;p&gt;another, and how do you orchestrate that interaction in a scalable
way?&lt;/p&gt;
&lt;p&gt;A review and practical demonstration of augmentation APIs and their&lt;/p&gt;
&lt;p&gt;orchestration in a way that would make those used to Unix Pipes&lt;/p&gt;
&lt;p&gt;principles, feel at home.&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;I felt, and still feel, deceived by the presentation that Richard
actually gave at the conference because it was simply a demonstration of
Talis APIs.&lt;/p&gt;
&lt;p&gt;Richard responded to my comment:&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;p&gt;The only Platform that is currently openly delivering that
functionality in that way is the Talis Platform. Therefore as all
the examples are based upon Talis Platform capabilities this can
unfortunately be easily interpreted as a sales pitch.&lt;/p&gt;
&lt;p&gt;Nevertheless, looking at the proposal I submitted and the
presentation I gave, I think my presentation was mostly as
advertised[...]&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;quot;mostly as advertised&amp;quot; suggests that Richard knows he made a mistake.
His presentation wasn't advertised as a demonstration of Talis-specific
functionality. All that Richard had to do to avoid any whiff of
deception by commercial interests from the beginning was to include the
word &amp;quot;Talis&amp;quot; in the text of the proposal. As in:&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;p&gt;A review and practical demonstration of Talis' augmentation APIs and
their&lt;/p&gt;
&lt;p&gt;orchestration in a way that would make those used to Unix Pipes&lt;/p&gt;
&lt;p&gt;principles, feel at home.&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;One little word, and this really wouldn't have been a problem. People
would have voted on the proposal with the full knowledge that it would
have been a Talis demonstration. Or they wouldn't have voted on it as a
result. Either way, I wouldn't have had anything to complain about.&lt;/p&gt;
&lt;div style="font-size: 1.5em; font-face: bold; margin-top: 1.5em;"&gt;&lt;p&gt;Rob Styles&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;Rob was personally offended as well. At the end of his response was a
lot of hyperbole about &amp;quot;evil vendors&amp;quot; and &amp;quot;scary vendors&amp;quot; that has no
relevance to anything I said, and which I will not discuss. He also made
a reductivist argument suggesting that as we all get paid to write code
for libraries, you can't draw a line between business models. Well, you
can draw a line if you consider the degree of freedom associated with
that code. If you share that code freely with others, that's a hell of a
lot different than if you make the APIs available, but require your
users to store their data on your servers and pay for the privilege to
use those APIs in conjunction with your data.&lt;/p&gt;
&lt;p&gt;What I will address is Rob's stated motivation for giving that lightning
talk:&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;p&gt;The reason I chose to do the lightning talk was essentially because
I saw a lot of talk about Open Source and yet one of the biggest
problems we face (all of us, not just me) is one of Open Data. I
probably was &amp;quot;in full sales mode&amp;quot; but for Open Data, not for Talis.&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;If so, there is an incredible correspondence between the substance of
Rob's talk and Talis' trademarked phrase: &lt;strong&gt;shared innovation&lt;/strong&gt; (yes,
this is literally a trademarked phrase). Watch Rob's talk again. Note
how many times Rob mentions the keyword &amp;quot;share&amp;quot;, &amp;quot;shared&amp;quot;, or &amp;quot;sharing&amp;quot;
(I counted 4). Note the slides in the middle of the presentation that
pick up keywords highlighted on Talis' home page. Note that Rob ends the
talk with a slide showing Talis' trademarked phrase. In the marketing
world, this would immediately be recognized as a branding exercise:
you're attempting to make a connection in your audience's minds between
your brand and a few key elements. And that audience just happens to be
a room full of the most influential library developers in the western
world!&lt;/p&gt;
&lt;p&gt;Sorry, Rob, but I simply can't buy your claim that your lightning talk
was not a marketing pitch for Talis. Colour me skeptical.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sat, 31 Mar 2007 03:41:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2007-03-31:/in-which-i-make-one-apology-and-two-lengthy-explanations.html</guid><category>misc</category><category>Coding</category></item><item><title>Milestones: walking</title><link>https://coffeecode.net/milestones-walking.html</link><description>&lt;p&gt;Our baby is growing up so fast. Near the end of February she tottered a
couple of tentative steps from me to Lynn.&lt;/p&gt;
&lt;p&gt;Last weekend, she walked right across Jason and Kelly's kitchen floor.
You can &lt;a class="reference external" href="/uploads/pics/amber/Amber_walks.avi"&gt;see for
yourself&lt;/a&gt;
if you don't believe me!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;By popular demand, I've posted this video on &lt;a class="reference external" href="http://video.google.com/videoplay?docid=7487606305626101693"&gt;Google
Video&lt;/a&gt;.
No more worries about codecs! Of course, Google owns me: my searches, my
email, my programming projects, my RSS feeds, and now my videos. Curse
them for being so competent!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sun, 18 Mar 2007 15:24:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2007-03-18:/milestones-walking.html</guid><category>Family</category><category>Amber</category></item><item><title>FacBackOPAC: making Casey Durfee's code talk to Unicorn</title><link>https://coffeecode.net/facbackopac-making-casey-durfees-code-talk-to-unicorn.html</link><description>&lt;p&gt;For the past couple of days, I've been playing with Casey Durfee's
&lt;a class="reference external" href="http://extranet.spl.org/code/code4lib2007.zip"&gt;code&lt;/a&gt; that uses Solr
and Django to offer a faceted catalogue. My challenge? Turn a dense set
of code focused on Dewey and Horizon ILS into a catalogue that speaks LC
and Unicorn. Additionally, I want it to serve as both a proof of several
technologies (Solr for faceted searching and Django as a Web application
framework) to my colleagues and as a reasonable backup catalogue for
when our main catalogue fails (as it all too often does).&lt;/p&gt;
&lt;p&gt;I emailed Casey today to tell him that I had a number of patches to
contribute as a result of my experiments. It turns out that he's not
really interested in pursuing this particular project much further, so
he gave me his blessing to take his throwaway code and do whatever I
want with it. Thus, the emergence of the
&lt;a class="reference external" href="http://code.google.com/p/fac-back-opac/"&gt;FacBackOPAC&lt;/a&gt; project on
code.google.com. If there's a grant out there for worst project name
ever, this project's in the running... Anyways, I have contorted Casey's
code so that it supports both Dewey and LC, and with a bit more torture
it should be flexible enough to support both Horizon and Unicorn.&lt;/p&gt;
&lt;p&gt;Right now I've twisted it all the way to meet my Unicorn needs and
consequently have broken Horizon support, but it won't take much to make
it support Horizon again - or any other ILS, for that matter. The main
requirement is that you have to be able to get your MARC records and
holdings out of your ILS. A secondary requirement is to know how to
create links to detailed item views in your current catalogue, because
this thing does not yet have any current awareness about item status.&lt;/p&gt;
&lt;p&gt;There. My itch has been scratched for the time being. Go play with the
&lt;a class="reference external" href="http://code.google.com/p/fac-back-opac/"&gt;FacBackOPAC&lt;/a&gt; project -- I
even have (very) rough documentation on how to get the pieces installed
andthe MARC records indexed, although you'll have to dig through the
source in the Django catalog tree to overcome some hardcoded strings and
URLs for the time being. Don't worry, pulling that hardcoded stuff out
of the templates is high on the list of priorities.&lt;/p&gt;
&lt;p&gt;So, a huge thank you to Casey for freeing this code and making this
possible. For something he considers throwaway code, I've learned a lot
from walking through it and making it start to meet my needs. I hope it
helps you, too!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2007-03-18:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Edited links to point to the FacBackOPAC project page, rather than the
wiki (which is subject to change, and which did -- breaking the dang
links in the original version of this story. Argh!)&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 15 Mar 2007 06:06:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2007-03-15:/facbackopac-making-casey-durfees-code-talk-to-unicorn.html</guid><category>Libraries</category><category>Coding</category><category>Python</category></item><item><title>Lightning talk: File_MARC for PHP</title><link>https://coffeecode.net/lightning-talk-file_marc-for-php.html</link><description>&lt;p&gt;I gave a lightning talk at the &lt;a class="reference external" href="http://code4lib.org/2007"&gt;code4lib
conference&lt;/a&gt; today on “File_MARC for PHP”
introducing the &lt;a class="reference external" href="http://pear.php.net/File_MARC"&gt;File_MARC&lt;/a&gt; library
to anybody who hasn't already heard about it. I crammed nine slides of
information into five minutes, which was hopefully enough to convince
people to start using it and provide feedback on what could be improved
or smoothed out... I'm looking forward to chatting with more people
about it over the remaining days of the conference. I've already
introduced a few people to PHP's simple tests for test-driven
development, so even if nobody ends up using File_MARC, at least people
are learning about some of the hidden gems in PHP.&lt;/p&gt;
&lt;p&gt;The funny thing is that I had originally pitched a full session talk on
this subject for the conference, and it didn't make the cut of the
ruthless democracy that is code4lib. In retrospect, even a twenty-minute
thunder talk probably would have been too much information for anybody
but the most die-hard PHP and MARC coder out there; the lightning talk
was a perfect format for the talk. I hope to let the documentation do
most of the talking in the future.&lt;/p&gt;
&lt;p&gt;Here are the slides from the talk in
&lt;a class="reference external" href="/uploads/talks/2007/File_MARC-lightning.odp"&gt;OpenOffice.org&lt;/a&gt;
and
&lt;a class="reference external" href="/uploads/talks/2007/File_MARC-lightning.pdf"&gt;PDF&lt;/a&gt;
format. Enjoy!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;/me notes that UnAPI would be useful here... Gotta try and submit a
patch to the s9y repository...&lt;/em&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 28 Feb 2007 23:48:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2007-02-28:/lightning-talk-file_marc-for-php.html</guid><category>Libraries</category><category>Coding</category><category>PHP</category></item><item><title>What's that all about?</title><link>https://coffeecode.net/whats-that-all-about.html</link><description>&lt;p&gt;In a post on the &lt;a class="reference external" href="http://theologyinthevineyard.wordpress.com/2007/02/22/priorities/"&gt;priorities of Canadian academic
insitutions&lt;/a&gt;
on academics vs. sport, Ted Schmidt wrote a number of words that I
agreed with, among which were:&lt;/p&gt;
&lt;blockquote&gt;
200 spectators watching a beautifully coached University of Toronto
team take on the Laurentian Voyagers in the biggest city in Canada.
200 spectators.And therein lies the difference between Canada and
the USA.&lt;/blockquote&gt;
&lt;p&gt;However, I objected to the following statement:&lt;/p&gt;
&lt;blockquote&gt;
What was more impressive was to see 13 of the 15 players on the U of
T team were from the Metro Toronto area. No embarrassing recruiting
here. You need real marks to attend this school. Sadly the
Laurentian team had three players from Saginaw, Michigan.What's that
about? We have to go to Michigan for scholar-athletes?&lt;/blockquote&gt;
&lt;p&gt;Unfortunately, I was unable to post a comment on his blog due to some
requirement to log in to wordpress.com, so I have to post my reply here.&lt;/p&gt;
&lt;p&gt;Let's see. Metro Toronto has a population of approximately &lt;a class="reference external" href="http://www.canadianencyclopedia.ca/index.cfm?PgNm=TCE"&gt;3
million&lt;/a&gt;
(based on the 2001 census). The Greater Sudbury Area has a population of
around 200,000. &amp;quot;That&amp;quot; is probably about wanting to field a competitive
team (which is one of the ways universities get brand recognition, and
which is arguably more important to smaller universities than to massive
research universities), which means that smaller universities have to
expand their recruiting efforts outside of their given geographical
boundaries if they want to avoid a continuous run of embarrassing
losses... with perhaps an occasional miracle thrown in.&lt;/p&gt;
&lt;p&gt;You seem to be suggesting that students shouldn't go to a university
that's not the closest one to their home town. Perhaps the Saginaw
students were attracted to Laurentian's Sports Administration program,
or the Kinesiology program, or want to specialize in mining-related
research. Maybe the possibility of attending lectures by &lt;a class="reference external" href="http://www.tvo.org/TVOsites/WebObjects/TvoMicrosite.woa?bestlecturer_professors#Michael%20Persinger"&gt;TVO's 2007
Best Lecturer Competition
winner&lt;/a&gt;
was a draw. Or perhaps they are interested in participating in a
bilingual university. Maybe the ruggedness of the Sudbury landscape
draws them. Sure, it's probable that they were recruited -- but it's
also probable that they had other choices of universities that they
could attend. They chose Laurentian, and they chose Sudbury. We're happy
to have them.&lt;/p&gt;
&lt;p&gt;I'm a big fan of CIAU basketball (ah, dating myself there, I guess it's
CIS now); I used to cover it for the student newspaper when I was a
student myself, and went all the way to Thunder Bay to cover the CIAU
finals. And yes, it is good fun if it is relatively competitive. Back
when the women's basketball team at LU was continuously headed to
national finals, it was _not_ fun when teams suffered horribly
one-sided losses to them. That wasn't really fun for anyone. So, yes...
let's keep it competitive, let's encourage the exchange of ideas and the
movement of students between academic institutions and cities, and let's
celebrate the Canadian academic culture without slighting people and
institutions that contribute to that culture.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 23 Feb 2007 01:49:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2007-02-23:/whats-that-all-about.html</guid><category>misc</category><category>Personal</category></item><item><title>Google Summer of code4lib?</title><link>https://coffeecode.net/google-summer-of-code4lib.html</link><description>&lt;p&gt;Google just
&lt;a class="reference external" href="http://google-code-updates.blogspot.com/2007/02/speaking-of-summer.html"&gt;announced&lt;/a&gt;
that they will start accepting applications in March for the Google
Summer of Code (GSoC) 2007. In 2006, &lt;a class="reference external" href="http://code.google.com/support/bin/answer.py?answer=60535&amp;amp;topic=10726"&gt;over 100
organizations&lt;/a&gt;
participated in the GSoC, and Google expects to have a similar number
participating in 2007. There are no lack of potential open-source
development projects in the code4lib arena that could use a student's
help for the summer, and I think there are sufficient potential mentors
in the code4lib community that we could handle a number of successful
applications.&lt;/p&gt;
&lt;p&gt;So what do you think? I think we can start discussing possible projects
now, and we should take advantage of the perfect timing of code4libcon
to try and crystallize a list of potential projects and willing mentors.&lt;/p&gt;
&lt;p&gt;A couple of ideas to get started with:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Merging ANSEL and MARC-8 encoding support into iconv for the good of
all library applications (maybe we could co-sponsor the project with
GNU?)&lt;/li&gt;
&lt;li&gt;Refactor &lt;a class="reference external" href="http://libraryfind.org"&gt;LibraryFind&lt;/a&gt; to be I18N-friendly
and remove embedded style tags (although yeah, I know the good LF
folk are already working on this)&lt;/li&gt;
&lt;li&gt;Package and/or document and/or I18N-enable and/or provide
translations for selected applications for
&lt;a class="reference external" href="http://www.ibiblio.org/bess/?p=51"&gt;Library-in-a-Box&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 16 Feb 2007 14:04:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2007-02-16:/google-summer-of-code4lib.html</guid><category>Software Freedom</category><category>Coding</category></item><item><title>Every reader their book...</title><link>https://coffeecode.net/every-reader-their-book.html</link><description>&lt;p&gt;I made a mistake, or several mistakes, a few weeks back.&lt;/p&gt;
&lt;p&gt;Yes, shocking to hear me admit that, I know.&lt;/p&gt;
&lt;p&gt;Here's the set up: one night a week, I'm the Librarian&lt;strong&gt;TM&lt;/strong&gt; on
reference duty. In practice, this means that I continue to sit in my
office working on library systems problems while the library assistants
who actually staff the reference desk out on the library floor
masterfully answer the questions of our patrons. In theory, this means
that I'm available to assist the librarian assistants with any
particularly thorny reference problems that come their way. Over the
course of the past year, that theoretical scenario hasn't happened once.&lt;/p&gt;
&lt;p&gt;Until, of course, a few weeks ago. A knock came at my door around 6:45
pm, and D****, the librarian assistant staffing the reference desk
said that I had the opportunity to resolve my first issue. The issue? A
patron wanted to borrow one of the books that we keep on our quick
reference shelf (a combination dictionary / thesaurus) for an exam she
was supposed to write in fifteen minutes. D****, knowing my lack of
experience in these matters, told me that the typical response to this
kind of request was &amp;quot;No&amp;quot;, but that if I wanted to allow the student to
sign out the book anyways then D**** would have to fill out some
forms to enable the circ desk to temporarily circulate the item.&lt;/p&gt;
&lt;p&gt;I thanked D**** for the quick summary of the library norms and went
out to meet with the patron. I hadn't quite made up my mind, but after
allowing the patron to explain the situation, we checked the catalogue
to find out if there were any similar books available in our circulating
collection. It turned out that there was at least one older edition (by
ten or fifteen years) of the same book listed as being on the shelves;
so I apologized and told the patron that they should find and check out
that book, and that I wouldn't authorize the quick reference item to go
out.&lt;/p&gt;
&lt;p&gt;The patron seemed to understand this response, and went off to get the
book. So one would think that, all in all, this was a successful end to
an exceptional situation: library policies that had been put in place
years ago prevailed, and the patron was still pointed to a resource that
would more or less meet their needs. But I can't qualify it as a
success, because I don't know what happened next. Was the patron even
able to find the book on the shelf? It's not unusual for these things to
be misplaced... Did the last-minute hassle of having to go through this
process of twice explaining why she hadn't yet purchased a copy from the
bookstore, as had been advised by her instructor, then find this older
edition of the book, cause her to under perform on her exam?&lt;/p&gt;
&lt;p&gt;If I had the chance to do it again, I would send her on her way with the
quick reference book in hand on a four-hour loan. It would have meant
breaking with library policy, but we would have had one more grateful
patron who would have positive associations with our library. To that
patron: my apologies. I hope your exam went well despite your
last-minute hassles.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 14 Feb 2007 09:59:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2007-02-14:/every-reader-their-book.html</guid><category>misc</category><category>Libraries</category></item><item><title>Long time, no wild conjecture</title><link>https://coffeecode.net/long-time-no-wild-conjecture.html</link><description>&lt;p&gt;So here's the first of two posts based on purely wild conjecture. In a
lengthening chain of trackbacks, &lt;a class="reference external" href="http://blog.ryaneby.com/archives/google-ads-and-springer/"&gt;Ryan
Eby&lt;/a&gt;
mentioned
&lt;a class="reference external" href="http://christinaslibraryrant.blogspot.com/2007/01/flabbergasted-springerlink-has-google.html"&gt;Christina's&lt;/a&gt;
observation that Springlink has started displaying Google ads,
presumably to supplement their subscription and pay-per-article income.
Ryan goes on to wonder:&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;p&gt;Will vendors continue with the subscription model or move towards a
pay-per-view only model since they already have it for search
engines in the future and can probably make more money? Will a
search engine convince some of them to end the subscriptions and
subsidize the change in order to try to pull more people into using
their product instead of libraries? Will Google integrate Google
Checkout with Scholar for easy shopping or perhaps personal
subscriptions?&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;For a few months now, I've been wondering why Google hasn't made a move
to purchase the Elseviers, Springers, and the rest of the ilk of the
commercial research journal publishing world. If they could pull it off
(and potentially avoid anti-trust measures by making the content
available for &amp;quot;free&amp;quot;), I thought that ad revenue would be their public
rationale for the move, but that the real reason for making that move
would simply be keeping tabs on all of the research interests at both
aggregated and granular levels. Think about the implications of being
able to track all of the search patterns emanating from within a given
company (quite often correlated with an individuals Gmail account, if
they happen to have authenticated against Gmail during the same Web
session). It would essentially amount to opt-in corporate espionage.&lt;/p&gt;
&lt;p&gt;Or, for that matter, how about tracking the research interests of a
given country. Iran, perhaps?&lt;/p&gt;
&lt;p&gt;But now I've realized that Google doesn't even have to purchase the
publishers. If the publishers accept Google Ads, then Google gets to
track all of the searches or item views performed on that site. No
purchase required.&lt;/p&gt;
&lt;p&gt;Luckily for us, Google isn't evil, and their &lt;a class="reference external" href="http://www.google.com/privacypolicy.html"&gt;privacy
policy&lt;/a&gt; doesn't leave too
much room for selling that information; they can really only use it to
develop new services. Hmm.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 01 Feb 2007 02:54:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2007-02-01:/long-time-no-wild-conjecture.html</guid><category>misc</category><category>Coding</category></item><item><title>A short-term SirsiDynix prediction</title><link>https://coffeecode.net/a-short-term-sirsidynix-prediction.html</link><description>&lt;p&gt;The second of tonight's wild conjecture-based predictions.&lt;/p&gt;
&lt;p&gt;One of the things that I was thinking about as I was shovelling the snow
off our driveway on Monday (other than &lt;em&gt;yes! finally some snow... one of
these days Amber is going to go rolling around in it&lt;/em&gt;) was the position
that SirsiDynix has backed themselves into with their current catalog
offerings. To recap, on the Unicorn side of the house they offered
WebCat, then iLink / iBistro (commonly referred to as &amp;quot;iBLink&amp;quot;), and
have been positioning EPS/Rooms as the next generation of their
catalogs. Perhaps Web2 was somewhere in there, too. Consider it a gamut
of Web-based catalogue offerings for SirsiDynix Unicorn.&lt;/p&gt;
&lt;p&gt;However, given all of the talk of &amp;quot;next-generation catalogs&amp;quot; in the
library world, and comparing the high expectations set by given the
first impressive example of a faceted catalog that was built on top of
Unicorn using the services of Endeca
(&lt;a class="reference external" href="http://www.lib.ncsu.edu/catalog/"&gt;NCSU&lt;/a&gt;, and the announcement that
another Endeca catalog will be built on top of Horizon
(&lt;a class="reference external" href="http://ulatmac.wordpress.com/2006/10/07/transforming-our-catalog/"&gt;McMaster&lt;/a&gt;),
I can't help but think that one of the announcements in this session
from Tom Gates at the upcoming SirsiDynix Super Conference (&lt;a class="reference external" href="http://www.superconference.info/2007/sc2007_view_session.php?y=2007&amp;amp;s=99&amp;amp;i=3"&gt;User
Experience&lt;/a&gt;)
is going to be something along these lines:&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;p&gt;Based on the experience that SirsiDynix and Endeca have gained in
implementing several new catalogues based on Endeca search
technology and SirsiDynix's flagship integrated library systems,
Unicorn and Horizon, SirsiDynix is proud to announce
&amp;quot;Endeca-in-a-box&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;Note that the preceding sentence is pure conjecture, not an actual
product announcement. But here's how I think it would make sense.
Despite &lt;a class="reference external" href="http://endeca.com/byIndustry/media/libraries.html"&gt;adding
libraries&lt;/a&gt; to the
list of industries that they service, I doubt that Endeca wants to spend
the next few years sending consultants off to individual libraries to
earn $10K a pop to reimplement the same basic technology on top of
SirsiDynix library systems. They would be happy to simply sell an Endeca
license without having to lift a finger. SirsiDynix, on the other hand,
desperately needs an offering that can counter the likes of &lt;a class="reference external" href="http://open-ils.org"&gt;Open-ILS,
a.k.a Evergreen&lt;/a&gt; (with commercial support
offered by &lt;a class="reference external" href="http://esilibrary.com"&gt;esilibrary&lt;/a&gt;,
&lt;a class="reference external" href="http://talis.com"&gt;Talis&lt;/a&gt;, &lt;a class="reference external" href="http://koha.org"&gt;Koha&lt;/a&gt; (with
commercial support offered by &lt;a class="reference external" href="http://liblime.com"&gt;LibLime&lt;/a&gt;, or the
still rather vapourish
&lt;a class="reference external" href="http://primo.exlibris-usa.com/contentmgr/showdetails.php?id=4&amp;amp;tp=VE1HUj0xLHRpZD0xNiw%3D"&gt;Primo&lt;/a&gt;
from Ex Libris.&lt;/p&gt;
&lt;p&gt;SirsiDynix will be happy, of course, to generate revenue from their own
consulting services, as witnessed by the nickel-and-diming for basic
configuration changes. Providing a single Web catalogue that sits in
front of both Unicorn and Horizon library systems is one step towards
eliminating one of their redundant platforms. &amp;quot;Fixing&amp;quot; the front end by
ponying up a few extra thousand per year while retaining the same old
backend library system for staff will undoubtedly appeal to most library
administrators. But most attractive for SirsiDynix would be to position
Endeca-in-a-box so that it requires Unicorn sites to purchase the Oracle
and Unicode modules that otherwise would sit on the shelf. This would be
the real revenue-generator for the company, and that's one of the
directions Vista is going to take SirsiDynix to “enable [this good
business] to achieve [its] full potential” (yep, I still translate &amp;quot;full
potential&amp;quot; as &amp;quot;more money&amp;quot;).&lt;/p&gt;
&lt;p&gt;It's wild conjecture, but damn it, I think it makes a lot of sense.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 01 Feb 2007 01:45:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2007-02-01:/a-short-term-sirsidynix-prediction.html</guid><category>Libraries</category><category>Coding</category></item><item><title>Reflections at the start of 2007</title><link>https://coffeecode.net/reflections-at-the-start-of-2007.html</link><description>&lt;p&gt;2006 was a year full of change - wonderful, exhausting change. Here's a
month-by-month summary of the highlights of 2006:&lt;/p&gt;
&lt;dl class="docutils"&gt;
&lt;dt&gt;January&lt;/dt&gt;
&lt;dd&gt;I did a whole lot of work on the PECL &lt;a class="reference external" href="http://pecl.php.net/ibm_db2"&gt;ibm_db2
extension&lt;/a&gt;, reviewed a &lt;a class="reference external" href="http://www.coffeecode.net/archives/32-Review-No-Nonsense-XML-Web-Development-With-PHP-by-Thomas-Myer.html"&gt;good book on
XML and
PHP&lt;/a&gt;,
and finally &lt;a class="reference external" href="http://www.coffeecode.net/archives/31-CoffeeCode-tweaks.html"&gt;fixed up my blog a little
bit&lt;/a&gt;.
I've got a few more book reviews in the works for 2007, and hope I
can spruce up good old Coffee|Code a little more.&lt;/dd&gt;
&lt;dt&gt;February&lt;/dt&gt;
&lt;dd&gt;I
&lt;a class="reference external" href="http://www.coffeecode.net/archives/36-Live-blogging-the-WWdN-Sabboth-Invitational.html"&gt;live&lt;/a&gt;
&lt;a class="reference external" href="http://www.coffeecode.net/archives/42-Live-blogging-WWdN15-KentAllard-Invitational.html"&gt;blogged&lt;/a&gt;
a few &lt;a class="reference external" href="http://www.coffeecode.net/archives/45-Live-blogging-WWdN-16-Robbie-Robb-Invitational.html"&gt;WWdN
invitational&lt;/a&gt;
poker tourneys, wrote about Larry Menard's work on &lt;a class="reference external" href="http://www.coffeecode.net/archives/37-ADOdb-getting-good-support-for-IBM-DB2,-Cloudscape,-and-Apache-Derby.html"&gt;building an
ADOdb driver for DB2 based on the ibm_db2
extension&lt;/a&gt;
(which is now &lt;a class="reference external" href="http://phplens.com/lens/adodb/docs-adodb.htm#drivers"&gt;officially
supported&lt;/a&gt;),
documented my &lt;a class="reference external" href="http://www.coffeecode.net/archives/41-Simple-wonder.html"&gt;installation of a bird
feeder&lt;/a&gt;
(update: Spook was happy because a few chickadees visited, but Amber
hasn't really noticed yet), &lt;a class="reference external" href="http://www.coffeecode.net/archives/43-ibm_db2-close.html"&gt;announced that I was leaving
IBM&lt;/a&gt;,
and apologized for having to &lt;a class="reference external" href="http://www.coffeecode.net/archives/44-Some-apologies,-some-reassurances.html"&gt;back out of some
engagements&lt;/a&gt;
due to the change in jobs. I also promised to write up some fixes to
PDO_ODBC and spread out my documentation efforts for PHP, neither
of which really happened in 2006 (8 commits to phpdoc ain't all
that) -- but I recently made use of the
&lt;a class="reference external" href="http://php.net/xmlwriter"&gt;xmlwriter&lt;/a&gt; extension in implementing
MARCXML support for &lt;a class="reference external" href="http://pear.php.net/File_MARC"&gt;File_MARC&lt;/a&gt;
and noticed that xmlwriter badly needs a tech writer. So maybe I can
pull it together in 2007.&lt;/dd&gt;
&lt;dt&gt;March&lt;/dt&gt;
&lt;dd&gt;&lt;a class="reference external" href="http://www.coffeecode.net/archives/46-Live-blogging-WWdN-17-Fishy-McDonk-Invitational.html"&gt;More&lt;/a&gt;
&lt;a class="reference external" href="http://www.coffeecode.net/archives/47-Stop-me-if-youve-heard-this-one-before.html"&gt;live&lt;/a&gt;
&lt;a class="reference external" href="http://www.coffeecode.net/archives/49-Live-blogging-WWdN-something,-pink-floyd-in-the-house.html"&gt;blogging&lt;/a&gt;
of &lt;a class="reference external" href="http://www.coffeecode.net/archives/51-Semi-live-blogging-WWdN-21,-jg-2323-invitational.html"&gt;WWdN
tournaments&lt;/a&gt;.
How did I manage to have this much time in the first month of my new
job? Amazing. I also &lt;a class="reference external" href="http://www.coffeecode.net/archives/48-No-Hot-Coffee,-please,-Im-Canadian.html"&gt;helped horny
teenagers&lt;/a&gt;
find relief with &lt;em&gt;GTA: San Andreas&lt;/em&gt;. But, in the middle of all that
completely trivial stuff, our friends Mike and Kelly threw an
&lt;a class="reference external" href="http://www.coffeecode.net/archives/50-Baby-shower-from-Jamies-point-of-view.html"&gt;incredible baby
shower&lt;/a&gt;
for us. It was amazing to be surrounded by so many friends who were
actually &lt;strong&gt;happy&lt;/strong&gt; that we were procreating! I do wish that we could
visit more often, but based on last weekend's shenanigans this
travel thing is starting to take more of a toll on Amber and her
parents.&lt;/dd&gt;
&lt;dt&gt;April&lt;/dt&gt;
&lt;dd&gt;Lynn and I attended an &lt;a class="reference external" href="http://www.coffeecode.net/archives/52-Theatre-of-the-macabre.html"&gt;vaudeville-style horror
show&lt;/a&gt;.
Who says Sudbury doesn't have culture? I took my readers on &lt;a class="reference external" href="http://www.coffeecode.net/archives/53-Walk-to-work-with-me.html"&gt;my walk
to
work&lt;/a&gt;,
and I should note that within a couple of months of taking on the
new job I had lost a bunch of weight. Activity is good! I
&lt;a class="reference external" href="http://www.coffeecode.net/archives/54-Live-blogging-WWdN,-presdlee-invitational.html"&gt;live-blogged&lt;/a&gt;
a couple more &lt;a class="reference external" href="http://www.coffeecode.net/archives/56-Live-blogging-WWdN-Change100-Invitational.html"&gt;WWdN
invitationals&lt;/a&gt;,
and Lynn and I
&lt;a class="reference external" href="http://www.coffeecode.net/archives/57-No-baby-yet.html"&gt;waited&lt;/a&gt;
and
&lt;a class="reference external" href="http://www.coffeecode.net/archives/58-Not-today,-either....html"&gt;waited&lt;/a&gt;
for the baby to arrive, including such fine events as attending
Earth Day and the inaugural Nickel City Triathlon Team barbecue.&lt;/dd&gt;
&lt;dt&gt;May&lt;/dt&gt;
&lt;dd&gt;We continued to
&lt;a class="reference external" href="http://www.coffeecode.net/archives/59-Until-tomorrow,-Ill-just-keep-movin-on.html"&gt;wait&lt;/a&gt;
&lt;a class="reference external" href="http://www.coffeecode.net/archives/62-We-prefer-our-baby-well-done,-thanks.html"&gt;for&lt;/a&gt;
&lt;a class="reference external" href="http://www.coffeecode.net/archives/63-No-baby-tonight-in-my-coffee,-no-baby-tonight-in-my-tea.html"&gt;Amber&lt;/a&gt;
to arrive, and managed to fit in a viewing of &lt;em&gt;V for Vendetta&lt;/em&gt;
during pre-labor. Eventually Amber did decide to join us in the
outer world (saving me from having to run a 10K--yay!), and I
&lt;a class="reference external" href="http://www.coffeecode.net/archives/64-Emergency-cabbage-Amber-Colleen-has-arrived.html"&gt;posted&lt;/a&gt;
the &lt;a class="reference external" href="http://www.coffeecode.net/archives/66-More-Amber-photo-goodness.html"&gt;pictorial
evidence&lt;/a&gt;.
Oh, and I
&lt;a class="reference external" href="http://www.coffeecode.net/archives/61-Live-blogging-WWdN-IlliniFan-Invitational.html"&gt;live-blogged&lt;/a&gt;
some more &lt;a class="reference external" href="http://www.coffeecode.net/archives/65-Live-blogging-WWdN-godard-invitational.html"&gt;WWdN
tourneys&lt;/a&gt;.&lt;/dd&gt;
&lt;dt&gt;June&lt;/dt&gt;
&lt;dd&gt;I &lt;a class="reference external" href="http://www.coffeecode.net/archives/69-Tour-de-Sudbury.html"&gt;rode around
Sudbury&lt;/a&gt;,
posted some &lt;a class="reference external" href="http://www.coffeecode.net/archives/70-High-traffic-zone.html"&gt;more Amber
pics&lt;/a&gt;
while putting my antisocial tendencies on display, and rather
shockingly &lt;a class="reference external" href="http://www.coffeecode.net/archives/71-Walking-away-from-online-poker,-towards-the-fambly.html"&gt;announced my departure from online
poker&lt;/a&gt;.
Shortly thereafter, the withdrawal symptoms kicked in and I
unleashed in my first library-oriented post &lt;a class="reference external" href="http://www.coffeecode.net/archives/72-My-answer-to-I-would-recommend-Vendor-X-to-other-libraries..html"&gt;about our library
system
vendor&lt;/a&gt;.
Looking back, I can't believe it took me almost four months to
publicly snap at our vendor.&lt;/dd&gt;
&lt;dt&gt;July&lt;/dt&gt;
&lt;dd&gt;I started my parental leave, and oddly enough wrote two blog entries
in all of July. I guess I was actually spending significant quality
time with Amber -- cool! On Canada Day, I ran &lt;a class="reference external" href="http://www.coffeecode.net/archives/74-The-rough-beast-slouches-towards-Lively.html"&gt;my first 5K
race&lt;/a&gt;
in about five years. Unfortunately, the other entry dealt with the
loss of my co-worker, Alain Letourneau. I found out later that some
of his friends from library school only found out about his death
through my &lt;a class="reference external" href="http://www.coffeecode.net/archives/73-Passing,-brighter-than-ever-before.html"&gt;brief memorial to
Alain&lt;/a&gt;,
which is a bittersweet result I suppose. Tomorrow, a new librarian
who was hired to fill Alain's position is joining the library; we
won't forget Alain, but in a way it will be nice to have someone new
moving around that office so that I don't have to walk past that
empty room and locked door anymore.&lt;/dd&gt;
&lt;dt&gt;August&lt;/dt&gt;
&lt;dd&gt;During the second month of my parental leave, I focused a bit more
on communicating to the outside world and posted some &lt;a class="reference external" href="http://www.coffeecode.net/archives/75-Admirers-of-the-little-one.html"&gt;more pictures
of
Amber&lt;/a&gt;
(although I still have to install that baby gate correctly) and
pictures of the &lt;a class="reference external" href="http://www.coffeecode.net/archives/76-Northern-Ontario-scenery.html"&gt;French River bridge and Bell Park dragon boat
races&lt;/a&gt;.
I kicked off my efforts to build a &lt;a class="reference external" href="http://www.coffeecode.net/archives/78-Super-alpha-MARC-package-for-PHP-comments-requested.html"&gt;MARC package for
PHP&lt;/a&gt;,
which ultimately spawned &lt;a class="reference external" href="http://www.coffeecode.net/archives/81-File_MARC-and-Structure_Linked_List-new-alpha-releases.html"&gt;another package to implement a basic
linked list
structure&lt;/a&gt;.
Lynn, Amber, and I made it to &lt;a class="reference external" href="http://www.coffeecode.net/archives/80-Cultural-influences-young-childs-fragile-eggshell-mind.html"&gt;a couple of bad
movies&lt;/a&gt;,
and I finished &lt;a class="reference external" href="http://www.coffeecode.net/archives/79-Im-not-as-sore-as-I-thought-I-would-be.html"&gt;my first sprint
duathlon&lt;/a&gt;.
Lynn gets the top kudos, though, for running in a Try-a-Triathlon
just three months after bringing Amber into the world. This year I'm
hoping to do an Olympic distance triathlon, although I understand
that some swimming skill is required for that...&lt;/dd&gt;
&lt;dt&gt;September&lt;/dt&gt;
&lt;dd&gt;I started out the month a little bit bitter after
&lt;a class="reference external" href="http://www.coffeecode.net/archives/82-AfterMARC-Morphing,-murdering,-or-massaging-the-MARC-format.html"&gt;responding&lt;/a&gt;
to &lt;a class="reference external" href="http://kcoyle.blogspot.com/2006/09/marc-we-can-do-it.html"&gt;a call for a
wiki&lt;/a&gt;
on the MARC listserv, only to be told later &amp;quot;thanks but no thanks,
we're working on something ourselves&amp;quot;. Eventually it ended up
&lt;a class="reference external" href="http://futurelib.pbwiki.com/"&gt;getting hosted on pbwiki&lt;/a&gt; where
everybody shares a single user account (&lt;em&gt;shrug&lt;/em&gt;). Lynn, Amber, and I
ran &lt;a class="reference external" href="http://www.coffeecode.net/archives/83-Another-day,-another-5K.html"&gt;another
5K&lt;/a&gt;
in our neighbourhood. I wrote about some recent examples of how
&lt;a class="reference external" href="http://www.coffeecode.net/archives/84-Why-open-source-works....html"&gt;open source
works&lt;/a&gt;
based on the PEAR proposal process and PHP ext/filter API
discussions, and noted &lt;a class="reference external" href="http://www.coffeecode.net/archives/85-Why-quasi-open-source-doesnt-work.html"&gt;how pseudo-open-source doesn't
work&lt;/a&gt;
after I found that IBM developerWorks had completely pulled the
Mapuccino project. Come to think of it, I never did find a good
open-source Web site visualization tool. Late in the month, I
reflected on the role I'm fulfilling as a &lt;a class="reference external" href="http://www.coffeecode.net/archives/86-Laundry-list-systems-librarians.html"&gt;laundry list system
librarian&lt;/a&gt;.
That kind of role satisfies my generalist nature, even though it's a
bit overwhelming at times.&lt;/dd&gt;
&lt;dt&gt;October&lt;/dt&gt;
&lt;dd&gt;I attended Access 2006 and felt like I had finally met other members
of my own species in the flesh (although I had previously met many
of the same people on &lt;tt class="docutils literal"&gt;#code4lib&lt;/tt&gt;, it was nice to put names to
faces and share thoughts over food). After
&lt;a class="reference external" href="http://www.coffeecode.net/archives/90-Backlog-of-Access-2006-notes.html"&gt;taking&lt;/a&gt;
&lt;a class="reference external" href="http://www.coffeecode.net/archives/99-Belated-Access-2006-notes-Saturday,-Oct.-14th.html"&gt;a&lt;/a&gt;
&lt;a class="reference external" href="http://www.coffeecode.net/archives/95-Access-2006-notes-October-12.html"&gt;ton&lt;/a&gt;
of
&lt;a class="reference external" href="http://www.coffeecode.net/archives/97-Getting-the-Goods-Libraries-and-the-Last-Mile.html"&gt;notes&lt;/a&gt;,
I &lt;a class="reference external" href="http://www.coffeecode.net/archives/89-Calling-for-access-to-all-future-Access-presentations.html"&gt;called for all future Access conferences to require
presenters&lt;/a&gt;
to make their presentations available. I took a trip immediately
after Access 2006 to Huntsville, Alabama for a week of training by
our library systems vendor, and noted &lt;a class="reference external" href="http://www.coffeecode.net/archives/91-Feeling-sorry-for-our-vendor.html"&gt;how
horrible&lt;/a&gt;
their customer experience was for sales and training pitches. Maybe
their new owner will take a gander at some of their customer
surveys... My &lt;a class="reference external" href="http://www.coffeecode.net/archives/92-Double-barreled-PHP-releases.html"&gt;PEAR
proposal&lt;/a&gt;
became an &lt;a class="reference external" href="http://pear.php.net/Structures_LinkedList"&gt;official PEAR
package&lt;/a&gt;, and I
revised File_MARC based on the results of the Access 2006 Hackfest
(where I learned that loading a 500 Mb file into memory and then
parsing it doesn't work too well with most systems).&lt;/dd&gt;
&lt;dt&gt;November&lt;/dt&gt;
&lt;dd&gt;Amber &lt;a class="reference external" href="http://www.coffeecode.net/archives/100-Its-Halloween,-baby!.html"&gt;dressed up for
Hallowe'en&lt;/a&gt;,
and &lt;a class="reference external" href="http://www.coffeecode.net/archives/101-PEAR-File_MARC-0.1.0-alpha-officially-released.html"&gt;File_MARC became an official PEAR
package&lt;/a&gt;.
I discovered that
&lt;a class="reference external" href="http://www.coffeecode.net/archives/102-Neat-o-Archimede-uses-Apache-Derby.html"&gt;Archimedes&lt;/a&gt;
uses Apache Derby as its database of choice, but was disappointed
with the &amp;quot;guessing game&amp;quot; user interface that broke all known
usability rules. I took a bus/train journey down to Windsor for the
&lt;a class="reference external" href="http://www.coffeecode.net/archives/103-Future-of-the-ILS-Symposium-building-our-community-and-a-business-case.html"&gt;Future of the ILS
Symposium&lt;/a&gt;,
got a &lt;a class="reference external" href="http://www.coffeecode.net/archives/104-BiblioCommons-wireframe-walk-through.html"&gt;sneak
preview&lt;/a&gt;
of what BiblioCommons is up to, and pressed Mike Rylander for
details on &lt;a class="reference external" href="http://www.coffeecode.net/archives/105-Evergreen-internationalization-chat.html"&gt;how Evergreen / Open-ILS supports
internationalization&lt;/a&gt;.
I began trying in earnest to build a VMWare image running Evergreen,
&lt;a class="reference external" href="http://open-ils.org/dokuwiki/doku.php?id=installing_prerequisites_on_ubuntu"&gt;first with
Ubuntu&lt;/a&gt;
and &lt;a class="reference external" href="http://open-ils.org/dokuwiki/doku.php?id=installing_prerequisites_on_gentoo"&gt;then with
Gentoo&lt;/a&gt;,
before stalling out somewhere in early December. This is one ball I
intend to pick up again in early 2007 -- we badly need a backup
OPAC. Somehow I failed to mention the week that Lynn, Amber, and I
spent in Cuba for my sister-in-law's wedding.&lt;/dd&gt;
&lt;dt&gt;December&lt;/dt&gt;
&lt;dd&gt;In December I was fairly quiet, as I was highly focused at work on
finishing a number of projects that I had artificially set year-end
deadlines for myself. To be honest, I just didn't want to spend my
Christmas break thinking about them... I noticed that SirsiDynix
made an odd press release on December 22nd, and &lt;a class="reference external" href="http://www.coffeecode.net/archives/108-Musing-about-SirsiDynixs-new-investment-partner.html"&gt;indulged in wild
speculation&lt;/a&gt;
over what that meant. Library Journal picked up my blog post and
quoted my creative conjecture, spawning several other posts on the
topic, and I resolved to take the power of the blog a bit more
seriously in the future. On December 21st I started responding to an
LWN article that I felt &lt;a class="reference external" href="http://www.coffeecode.net/archives/110-The-state-of-PHP-security-LWN-article.html"&gt;misrepresented the state of PHP
security&lt;/a&gt;;
although I wondered at times if the holiday egg nog had me tilting
at windmills, the author of the article &lt;a class="reference external" href="http://lwn.net/Articles/215123/#Comments"&gt;ultimately agreed with
me&lt;/a&gt;. On Christmas eve I
gave the present of &lt;a class="reference external" href="http://www.coffeecode.net/archives/109-We-want-Amber!-We-want-Amber!.html"&gt;more Amber
photos&lt;/a&gt;.&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;So, all in all, it was a pretty full year of geekdom, some regular
exercise, a bit too much poker, a ton of travel, and a whole lot of
change. There wasn't nearly enough Amber (of course there can never be
enough), even though I have her all to myself a couple of mornings each
week. But I'm living with the people that I love, doing fulfilling work,
and that's all I can really ask for.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 03 Jan 2007 01:42:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2007-01-03:/reflections-at-the-start-of-2007.html</guid><category>misc</category><category>Coding</category><category>Personal</category><category>PHP</category></item><item><title>Oh, Vista has _acquired_ SirsiDynix...</title><link>https://coffeecode.net/oh-vista-has-_acquired_-sirsidynix.html</link><description>&lt;p&gt;A little over a week ago, I made the following prediction following the
extremely under-the-radar press release on December 22nd that &lt;a class="reference external" href="/archives/108-Musing-about-SirsiDynixs-new-investment-partner.html"&gt;Vista
Equity Partners was investing in
SirsiDynix&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
I'll go out on a limb and say that a merger or acquisition of
SirsiDynix in 2007 is unlikely (33% confidence), but after proving
their new business strategy and the nice spikes on their revenue and
profit charts, I'll say that it's quite likely in 2008 (80%
confidence).&lt;/blockquote&gt;
&lt;p&gt;Ed Corrado &lt;a class="reference external" href="http://ecorrado.us/?p=289"&gt;just pointed out&lt;/a&gt; the
subsequent news release on December 27th that Vista has actually
&lt;em&gt;acquired&lt;/em&gt; SirsiDynix.&lt;/p&gt;
&lt;p&gt;So, first: I failed to make any prediction about SirsiDynix being
acquired in the last nine days of 2006. Shame on me for that oversight.&lt;/p&gt;
&lt;p&gt;And second: press releases on December 22nd and 27th? I can't think of a
better time to try to bury some news.&lt;/p&gt;
&lt;p&gt;And third: given that five of the thirteen Vista-held companies
&lt;a class="reference external" href="http://www.vistaequitypartners.com/Companies.html"&gt;profiled on Vista's web
site&lt;/a&gt; have been
acquired, I'm going to stick by my prediction that an acquisition in
2008 is a likely event.&lt;/p&gt;
&lt;p&gt;Jessamyn &lt;a class="reference external" href="http://www.librarian.net/stax/1929"&gt;picked up the story&lt;/a&gt;,
adding some further info from a Huntsville Times news article. Her post
drew some further details on the acquisition from Andrew Pace (who had
his &lt;a class="reference external" href="http://blogs.ala.org/pace.php?title=sirsidynix_finds_a_new_investor_1"&gt;own blog
post&lt;/a&gt;
on the subject).&lt;/p&gt;
&lt;p&gt;These are interesting times, indeed. I'm still waiting for Stephen Abram
to blog about the acquisition, but here we are: 21 blog posts since
December 22nd, the initial press release on the investment /
acquisition, and not a single word about what this means to SirsiDynix
or its customers.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 03 Jan 2007 00:05:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2007-01-03:/oh-vista-has-_acquired_-sirsidynix.html</guid><category>Libraries</category><category>Coding</category><category>Libraries</category></item><item><title>The state of PHP security (LWN article)</title><link>https://coffeecode.net/the-state-of-php-security-lwn-article.html</link><description>&lt;p&gt;One of my favourite online publications, the Linux Weekly News, recently
published an article called &lt;a class="reference external" href="http://lwn.net/Articles/215123"&gt;The state of PHP
security&lt;/a&gt;. Given Stefan's departure,
the great taint debate, the addition of &lt;tt class="docutils literal"&gt;ext/filter&lt;/tt&gt; in 5.2.0 and all
of the associated security changes in both the 5.2.x and the 6 branches,
I settled down to enjoy a nice pre-Christmas read. I was hoping for some
provocative thoughts about the direction that PHP has been taking for
the last six months or so in the arena of security.&lt;/p&gt;
&lt;p&gt;Unfortunately, I was greatly disappointed. Beyond using Stefan's
departure as a kicking-off point for the article, the author didn't even
mention any of these issues. Instead, he simply rehashed the history of
PHP design missteps (&lt;tt class="docutils literal"&gt;magic_quotes&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;register_globals&lt;/tt&gt;, allowing
URLs in &lt;tt class="docutils literal"&gt;include&lt;/tt&gt;) and noted that many PHP tutorials rely on dangerous
practices.&lt;/p&gt;
&lt;p&gt;What bothered me the most, however, was the author's decision to
paraphrase a quote Rasmus gave in an interview from 2002 without
explicitly noting that the quote was from 2002. The sentence in the
article, talking about &lt;tt class="docutils literal"&gt;register_globals&lt;/tt&gt;, is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;p&gt;It is an extremely dubious feature, but one that PHP creator, Rasmus
Lerdorf, seems to think should have been &lt;a class="reference external" href="http://www.sitepoint.com/article/phps-creator-rasmus-lerdorf/3"&gt;left
on&lt;/a&gt;
by default.&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;Would it have been too much for the author to have actually asked Rasmus
if he might have changed his mind in the past five years? Or perhaps the
author could have done a little more research and dug up the &lt;a class="reference external" href="http://www.php.net/~derick/meeting-notes.html"&gt;PHP 6
planning meeting
minutes&lt;/a&gt; that state
that &lt;tt class="docutils literal"&gt;register_globals&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;magic_quotes&lt;/tt&gt; were going to be removed
entirely from the language. Instead, the author concludes with the
following statement:&lt;/p&gt;
&lt;blockquote&gt;
Security seems to fall somewhere below simplicity in the minds of
the PHP language developers; that makes it more difficult to have
secure PHP applications. Security is a hard problem and any attempt
to 'dumb down' a language is likely to run into security issues.
Encouraging amateur programmers to write web applications is
unlikely to produce secure code in any language, but by providing
tutorials and examples that have glaring security issues and by not
concentrating on teaching secure coding, PHP makes it that much
worse. A great deal of useful code has been written on the PHP
platform; it would be nice to find a way to keep that code coming
while simultaneously making it more secure.&lt;/blockquote&gt;
&lt;p&gt;The first sentence in that statement is the most damning of PHP
developers, but it entirely ignores the evidence exhibited in the
changes we've seen in &lt;a class="reference external" href="http://www.php.net/releases/5_2_0.php"&gt;PHP
5.2.0&lt;/a&gt; and that are in the
works for PHP 6. The third sentence, oddly enough, attributes the
existence of &amp;quot;tutorials and examples that have glaring security issues&amp;quot;
to PHP itself, as though the language itself or the core developers of
the language have the ability to prevent insecure tutorials from being
published.&lt;/p&gt;
&lt;p&gt;So I launched into the fray and attempted to right those injustices,
perhaps a bit too passionately -- but so be it. I've been pretty quiet
in the PHP world for the past while, outside of my little PEAR projects,
but I still care about the language.&lt;/p&gt;
&lt;p&gt;If I can glean anything from this article, it suggests that it might be
a good idea to revamp the php.net landing page and documentation a bit
to try to highlight tutorials that teach developers how to write secure
PHP applications. Right now the landing page is largely a bulletin board
for events. It might benefit, say, from a prominent and permanent link
to the &lt;a class="reference external" href="http://phpsec.org/"&gt;PHP Security Consortium&lt;/a&gt; (if that project
is actually still alive--the last posted article dates back to March
2005). We may also want to improve the visibility of the security
chapter of the manual (although briefly revisiting the section on SQL
injection suggests that we need to revise it to encourage the use of PDO
and placeholders).&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 28 Dec 2006 04:52:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-12-28:/the-state-of-php-security-lwn-article.html</guid><category>PHP</category><category>PHP</category></item><item><title>"We want Amber! We want Amber!"</title><link>https://coffeecode.net/we-want-amber-we-want-amber.html</link><description>&lt;p&gt;Okay, okay... I've heard the complaints (which have been streaming in
over the past couple of weeks). The general tone is something like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;p&gt;So I've been checking this site that is dedicated to celebrating all
of the wonder that is Amber, and all I've seen is a bunch of &lt;em&gt;beep
blippity boop database beep doo bloop library bip blop open source
blippity bleep&lt;/em&gt; which I couldn't care less about. I want to see some
some pictures of Amber! Where are the pictures of Amber?&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;May I remind my gentle readers that, should they wish to defend their
fragile eggshell minds from my ruminations on the
techno-info-library-drivel that fills up my working days, that there is
a link on the right hand side of the page which allows you to only see
blog posts about Amber. You can bookmark that link and never read
another word about Apache Derby, PHP, or MARC... unless, of course,
Amber decides to follow in Daddy's footsteps. Which, given her interest
in bashing at the keyboard, seems entirely possible.&lt;/p&gt;
&lt;p&gt;I'm afraid I can't do too much about the (in)frequency of postings. My
natural anti-social tendencies can only be suppressed so much. And, just
to implicate Lynn, I have offered to show her how she can post entries
to the blog multiple times now... for some reason she prefers to send
the occasional email pretending to be making up for my own lack of
effort in keeping family and friends up to date on Amber.&lt;/p&gt;
&lt;p&gt;Err, umm... I love you honey!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Anyhoo&lt;/em&gt;, we do happen to have one or two photos of Amber from the last
couple of months that you might be interested in.&lt;/p&gt;
&lt;div class="serendipity_imageComment_center" style="width: 110px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/amber/adorable.jpg"&gt;&lt;img alt="image0" src="/uploads/pics/amber/adorable.serendipityThumb.jpg" style="width: 110px; height: 83px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;A little too adorable, don't you think? (October 2006)&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="serendipity_imageComment_center" style="width: 110px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/amber/ARGOOOSSSS.jpg"&gt;&lt;img alt="image1" src="/uploads/pics/amber/ARGOOOSSSS.serendipityThumb.jpg" style="width: 110px; height: 83px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Amber and Daddy kick back and enjoy the Grey Cup. (November 2006)&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="serendipity_imageComment_center" style="width: 110px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/amber/spaghetti.jpg"&gt;&lt;img alt="image2" src="/uploads/pics/amber/spaghetti.serendipityThumb.jpg" style="width: 110px; height: 83px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Zombie Amber: &amp;quot;Brains! BRAINS!&amp;quot; (December 2006)&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="serendipity_imageComment_center" style="width: 83px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/amber/santa_amber.jpg"&gt;&lt;img alt="image3" src="/uploads/pics/amber/santa_amber.serendipityThumb.jpg" style="width: 83px; height: 110px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Possessed by the spirit of Santa. (December 2006)&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sun, 24 Dec 2006 20:56:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-12-24:/we-want-amber-we-want-amber.html</guid><category>Family</category><category>Amber</category></item><item><title>Musing about SirsiDynix's new investment partner</title><link>https://coffeecode.net/musing-about-sirsidynixs-new-investment-partner.html</link><description>&lt;p&gt;Sirsi Corporation merged with Dynix Corporation in June 2005. Now
SirsiDynix has announced that &lt;a class="reference external" href="http://www.imakenews.com/sirsi/e_article000719737.cfm?x=b8G7PBR,b65sKl5s"&gt;Vista Equity Partners is
investing&lt;/a&gt;
in their company.&lt;/p&gt;
&lt;p&gt;Let's take a look at &lt;a class="reference external" href="http://www.vistaequitypartners.com/Philosophy.html"&gt;Vista's investment
philosophy&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;p&gt;&lt;strong&gt;*We invest in companies that uniquely leverage technology to
deliver best-of-class products or services.*&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;I wonder if Vista confused &amp;quot;most market share&amp;quot; with &amp;quot;best-of-class&amp;quot; in
their analysis. Given SirsiDynix's two flagship library systems, Unicorn
and Horizon, it seems unlikely that they're talking about Unicorn here.
True, you could say that Unicorn has &amp;quot;leveraged&amp;quot; decades-old proprietary
technology, but it is Horizon that seems to be getting the real facelift
these days based on modern technologies like Lucene.&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;p&gt;Our investment philosophy is to enable good businesses to achieve
their full potential. This starts by selecting well positioned
companies with attractive market dynamics, aligning the interests of
management with those of shareholders, and reducing unnecessary
distractions.&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;Hmm - &amp;quot;enable good businesses to achieve their full potential&amp;quot;. Well, at
least Vista recognizes that SirsiDynix could be doing better. But wait:
&amp;quot;attractive market dynamics&amp;quot; suggests that Vista sees SirsiDynix as
holding the most market share in a relatively small market with
institutions that are seen as having deep pockets (gee, look at all the
books those libraries buy and electronic resources to which they
subscribe--they can afford a 10% hike in support fees per year!) and a
reluctance to face the pain of migrating to a different software
platform. In short, SirsiDynix's customers are ripe for the picking.
And, quite possibly, Vista sees opportunity to acquire a few more
customers from shakier library products like Voyager. At least, those
customers who have not already decided to &lt;a class="reference external" href="http://open-ils.org/blog/?p=80"&gt;join forces with an
open-source solution like Evergreen&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;quot;Aligning the interests of management with those of shareholders&amp;quot;
suggests that SirsiDynix management hasn't been doing a good job to date
of delivering profit and growth to their shareholders. Well, you can
increase profit by offering a leading product that enables you to grow
your market share -- or you can crank up the margin on your existing
products by increasing prices and cutting overhead... overhead like
customer service people, or developers. Now, it seems that SirsiDynix
isn't a publicly traded company, so it doesn't really have shareholders
at the moment. I can't imagine that Vista would be trying to prep
SirsiDynix for an IPO -- there just isn't enough potential for growth to
justify shareholder interest in this company -- so I'm going with &amp;quot;plump
up the profit margin in preparation for a takeover&amp;quot;. I'm basing this
largely on the last bullet in the last category of Vista's investment
philosophy (from &lt;a class="reference external" href="http://www.vistaequitypartners.com/WhoWeFund.html"&gt;Who we
fund&lt;/a&gt;):&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;p&gt;While our portfolio companies need not fit a specific profile, many
of our prospective investments have some common characteristics
including:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Technology provider or technology-enabled business&lt;/li&gt;
&lt;li&gt;Recurring revenue business model&lt;/li&gt;
&lt;li&gt;Mission critical, &amp;quot;sticky&amp;quot; solutions&lt;/li&gt;
&lt;li&gt;Experienced management team&lt;/li&gt;
&lt;li&gt;Favorable customer characteristics&lt;/li&gt;
&lt;li&gt;Defensible competitive position&lt;/li&gt;
&lt;li&gt;Favorable market dynamics&lt;/li&gt;
&lt;li&gt;Strong value proposition&lt;/li&gt;
&lt;li&gt;Potential for high margins&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;The most pertinent characteristics here are probably &amp;quot;recurring revenue
business model&amp;quot; (the revenue from annual support fees are certainly
attractive), &amp;quot;favorable customer characteristics&amp;quot; (due to our service
focus, most libraries are pretty conservative about foisting a new
search interface on our users and therefore unwilling to turn to a
different product simply because the fees our vendor charges will
increase), and &amp;quot;potential for high margins&amp;quot; (read: charge what the
market will bear, just short of extortion).&lt;/p&gt;
&lt;p&gt;You heard it here first: expect lots of news from SirsiDynix in 2007.
I'm predicting more service fees (100% confidence), increased annual
support fees (100% confidence), and the beginning of the end of Unicorn
with an announcement that Horizon is the strategic product for new
development efforts going forward (75% confidence). I'll go out on a
limb and say that a merger or acquisition of SirsiDynix in 2007 is
unlikely (33% confidence), but after proving their new business strategy
and the nice spikes on their revenue and profit charts, I'll say that
it's quite likely in 2008 (80% confidence).&lt;/p&gt;
&lt;p&gt;Now, if I had the deep pockets of an equity firm, I would be investing
in the Evergreen team; there's a core organization with low overhead (4
developers!), a proven product, and amazing potential for growth in the
library market. But alas, I'll just have to cheer them on from the
sidelines &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sat, 23 Dec 2006 04:28:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-12-23:/musing-about-sirsidynixs-new-investment-partner.html</guid><category>misc</category><category>Coding</category></item><item><title>Java 6 is out; now including JavaDB (aka Apache Derby)</title><link>https://coffeecode.net/java-6-is-out-now-including-javadb-aka-apache-derby.html</link><description>&lt;p&gt;A quick little note to mention the &lt;a class="reference external" href="http://java.sun.com/javase/6/"&gt;official release of Java
6&lt;/a&gt;. &lt;em&gt;Okay, Dan, but why do you care?&lt;/em&gt;,
you might ask. Good question, oh person-who-does-not-read-headlines.&lt;/p&gt;
&lt;p&gt;The reason I care is that Sun chose to bundle &lt;a class="reference external" href="http://db.apache.org/derby"&gt;Apache
Derby&lt;/a&gt; in this release -- take a peek in
the &lt;tt class="docutils literal"&gt;/db/&lt;/tt&gt; subdirectory of the Java SDK. Bundling Derby is going to
mean a huge boost to the visibility and usage of the little Java
database that could. It will be the &lt;em&gt;de facto&lt;/em&gt; default database for Java
developers; and if they haven't already used it, I suspect they're going
to be pleasantly surprised at Derby's robustness and ability to perform.
I was chatting with a few of the DSpace developers a week or so ago, and
mentioned my hope (in all my spare time) to port the
&lt;a class="reference external" href="http://dspace.org"&gt;DSpace&lt;/a&gt; institutional repository to Derby as a
possible default database. Right now, you see, the default database for
DSpace is PostgreSQL, and unfortunately correctly configuring PostgreSQL
seems to be the biggest barrier new users encounter while deploying
DSpace. Switch to an embedded Derby database, and those headaches go
away.&lt;/p&gt;
&lt;p&gt;On the other hand, it seems that at least one of the DSpace developers
have done a bit of experimenting with Derby in the past, as he claimed
its performance suffered after 500,000 rows of data or so. Well, even if
that is an insurmountable limit, that's a pretty good start for most
institutional repositories -- and I suspect that the Derby developers
would be highly motivated to show that Derby can, in fact, scale beyond
that limit.&lt;/p&gt;
&lt;p&gt;So, if you're a Java developer or dabbler, get on out there and give
Derby + Java 6 a try. You're going to have a lot of company. Oh yeah,
and if you need a good book on Derby...&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 12 Dec 2006 04:50:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-12-12:/java-6-is-out-now-including-javadb-aka-apache-derby.html</guid><category>Databases</category><category>Apache Derby</category></item><item><title>Save your forehead from flattening prematurely</title><link>https://coffeecode.net/save-your-forehead-from-flattening-prematurely.html</link><description>&lt;p&gt;I gave up on trying to get Ubuntu 6.10 (Edgy Eft) to run ejabberd today;
it looks like there are some fundamental issues going on between the
version of erlang and the version of ejabberd that get bundled together.
That was a fairly serious setback to my &amp;quot;Evergreen on VMWare&amp;quot; project.&lt;/p&gt;
&lt;p&gt;So I decided to give it a go on Gentoo instead. Yes, I can hear the
groans already... but hey, I've been running Gentoo at home now for a
long time (four years or something like that) and I like that I can
pretty easily switch package versions if I don't like the current
blessed versions. However, I ran into the nasty
&lt;tt class="docutils literal"&gt;cannot open root device or unknown block&lt;/tt&gt; Grub error when I tried to
reboot into my virgin VMWare Gentoo image.&lt;/p&gt;
&lt;p&gt;After much gnashing of teeth -- we're talking hours here -- I finally
tracked down the problem: I had failed to compile the correct SCSI
driver for VMWare into the kernel. Folks, if you're trying to build a
VMWare image with a Linux kernel that you're compiling from scratch, the
SCSI driver you need is the Fusion MPT driver. And no, it doesn't happen
to be kept in the &amp;quot;low-level SCSI drivers&amp;quot; section of the kernel config
menu, for some reason. Gah.&lt;/p&gt;
&lt;p&gt;Onward to the next painful barrier!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Also, the net device is an AMD PCnet32 Lance. 'Cause you
know, I managed to forget to configure that on my most recent Gentoo
install.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 21 Nov 2006 04:16:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-11-21:/save-your-forehead-from-flattening-prematurely.html</guid><category>misc</category><category>Coding</category></item><item><title>Evergreen internationalization chat</title><link>https://coffeecode.net/evergreen-internationalization-chat.html</link><description>&lt;p&gt;I managed to corner Mike Rylander after Brad Lajeunesse waved his hands
in surrender and offered Mike up as a sacrifice to my questions about
Evergreen's support for internationalization. If you're travelling to
Canada to tout a piece of (or multiple components of) software, you can
be sure that somebody in the crowd is going to be interested in knowing
how capable that software is of supporting a bilingual community. As
Laurentian University is a bilingual institution, I took it upon myself
to be &amp;quot;that guy&amp;quot; and grill Mike a bit on that topic. The good news is
that he survived the grilling, and didn't earn the nickname &amp;quot;pork chop&amp;quot;;
the better news is that it sounds like Evergreen hits most of the
internationalization requirements on the head.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;OPAC interface can be multilingual; Georgia has a large Spanish
community and PINES is in the process of translating the OPAC
interface into Spanish&lt;/p&gt;
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;Sorting results alphabetically (for browsing by author / title) is
problematic, however:&lt;/p&gt;
&lt;/p&gt;&lt;ul class="simple"&gt;
&lt;li&gt;PostgreSQL doesn't have a good locale implementation for
collating sequences&lt;/li&gt;
&lt;li&gt;Probably not as much of an issue for French / English as it
would be for Finnish&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Search currently ignores diacritics (e == é == è), but this setting
can be changed in TSearch2&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Subject heading equivalency is possible for the simple use case of
&amp;quot;when I search for History--United States--19th century, also show me
records with Histoire--Les Etats Unis--19e annee&amp;quot; (or whatever the
real LCSH/RVM equivalence would be)&lt;/p&gt;
&lt;/p&gt;&lt;ul class="simple"&gt;
&lt;li&gt;This possibility is based on authority records containing both
sets of headings -- we can probably rely on / or possibly
participate in the EU project to generate equivalence for LCSH,
RVM, and German subject headings to seed this data&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Staff client is mostly multilingual-ready (hasn't been a priority
requirement for PINES):&lt;/p&gt;
&lt;/p&gt;&lt;ul class="simple"&gt;
&lt;li&gt;Most strings are contained in XML files, but there are still
pockets of hardcoded strings&lt;/li&gt;
&lt;li&gt;Switching the locale would immediately load the new strings in the
staff client interface&lt;/li&gt;
&lt;li&gt;&amp;quot;JavaScript doesn't have a good sprintf() implementation&amp;quot; -- check
to see whether this suggests that token order can't be rearranged.
LibX seems to manage to be able to do this.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Forgot to ask about boolean operators (e.g. AND / ET, OR / OU)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 17 Nov 2006 05:11:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-11-17:/evergreen-internationalization-chat.html</guid><category>Libraries</category><category>Evergreen</category></item><item><title>BiblioCommons wireframe walk-through</title><link>https://coffeecode.net/bibliocommons-wireframe-walk-through.html</link><description>&lt;p&gt;After the Future of the ILS Symposium wrapped up, Beth Jefferson walked
some of us through the current state of the BiblioCommons mocked-up Web
UI for public library catalogs; the project grew out of a youth literacy
project designed to encourage kids to read through the same sort of
social networking and recommendation mechanisms as employed by Amazon,
NetFlix, etc.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;Users spend an incredible amount of time in My Account (possibly
skewed somewhat due to the Unicorn defaults) -- almost 50% of the
page hits in the subject catalogs; therefore they make the account
page the home page, rather than the PINES approach of a stripped-down
Google-like search interface&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Default settings favour maximum privacy, but initial activities (e.g.
adding a review) prompt the user to decide whether they want to share
this information or not; very granular, dynamic scheme&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Avoid &amp;quot;top ten&amp;quot; item lists on front page because you're setting your
patrons up for a disappointingly long hold time&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Home page is &amp;quot;recently returned items&amp;quot;, which prompts users for
reviews, tagging, discussions, &amp;quot;users waiting for this item might
also like&amp;quot; recommendations; they're trying to build an electronic
analogue of the physical return cart (which is what many patrons
intuitively use as a recommendation service today&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Tagging is categorized (genre, personal, some other categories I
forget)&lt;/p&gt;
&lt;/p&gt;&lt;ul class="simple"&gt;
&lt;li&gt;You can subscribe to individual tags that another user has set (so
if you only care about what somebody has tagged &amp;quot;mystery&amp;quot;, you can
avoid getting recommendations for what they tagged &amp;quot;earth science&amp;quot;&lt;/li&gt;
&lt;li&gt;Unlike most social networking sites, a targeted user has no option
to prevent you from adding them as a friend; they can, however,
prevent you from sending them an instant message&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;User avatars consist of username + font customizations; icon avatars
presented too much visual conflict with book covers&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;List of books on hold provides alternate recommendations per book&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Technically, the project is being built on top of Unicorn -- catalog
data and circ status is dumped on a nightly basis, live circ status
is retrieved via NCIP only when an individual item record is
displayed&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;If a given item is not available at a branch, display says &amp;quot;Available
in 2-4 weeks&amp;quot; (or whatever) rather than saying &amp;quot;request by
interlibrary loan&amp;quot; -- maybe not so applicable to the OPAC in
single-site libraries, but a possible enhancement for a link
resolver: &amp;quot;Get it &amp;#64; XYZ Library&amp;quot; is exactly what students are trying
to do in the overall research process, so instead tell them whether
something is &amp;quot;available via full text download&amp;quot;, &amp;quot;available in print
in the XYZ Library&amp;quot;, or &amp;quot;available in 1-2 weeks&amp;quot; (for something that
will require ILL)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Bibliocommons hope to make the module an interface that can provide
different wrappers for underlying library systems&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Beth offered to provide a webcast walk-through of the UI for a
broader audience -- stay tuned&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 17 Nov 2006 05:09:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-11-17:/bibliocommons-wireframe-walk-through.html</guid><category>Libraries</category><category>Coding</category></item><item><title>Future of the ILS Symposium: building our community and a business case</title><link>https://coffeecode.net/future-of-the-ils-symposium-building-our-community-and-a-business-case.html</link><description>&lt;p&gt;I headed down to Windsor early on Tuesday morning for the &lt;a class="reference external" href="http://infoservices.uwindsor.ca/ils/"&gt;Future of the
ILS Symposium&lt;/a&gt; hosted by the
Leddy Library at the University of Windsor. It was a good thing I
decided to take the 12 hours of bus + train approach to getting there,
as Sudbury's airport was completely shut down due to fog. Despite the
fogginess of my own brain after that trip, I managed to make it out to
the welcoming reception where Dr. Ross Paul, the president of the
University of Windsor (and formerly the president of Laurentian
University when I was but an undergrad student there), gave a warm and
mercifully short welcome address. It looked like about 75 people made it
to the reception, and more like 85 or 90 for the symposium the next day.&lt;/p&gt;
&lt;p&gt;If you haven't already, I strongly suggest glancing through Peter
Binkley's &lt;a class="reference external" href="http://www.wallandbinkley.com/quaedam/?p=86"&gt;ultra-concise round-up of the
symposium&lt;/a&gt; as well as
Ryan Eby's
&lt;a class="reference external" href="http://blog.ryaneby.com/archives/future-of-the-ils-symposium/"&gt;summary&lt;/a&gt;
to get the flavour of the event. I'll put the two unique pieces that I
have to offer -- answers to my questions about the I18N support that
Evergreen is capable of, and Beth Jefferson's impromptu and impressive
demo of the wireframe mockups for BiblioCommons -- here, along with my
micro-summary. Ah, and Art pointed to &lt;a class="reference external" href="http://www.blogwithoutalibrary.net/"&gt;Amanda Etches-Johnson's
blog&lt;/a&gt; for impressively complete
notes from the sessions and discussion panel.&lt;/p&gt;
&lt;p&gt;Art Rhyno gave an excellent opening talk on &lt;a class="reference external" href="http://infoservices.uwindsor.ca/ils/sessions/ils/"&gt;the state of the
ILS&lt;/a&gt; that came to
the conclusion that, if we as the library community want to try to
address some of the problems we're facing with the ILS today using our
own tools and know-how, the &amp;quot;barn-building&amp;quot; approach is a better fit for
our relatively small community with specialized needs than the &amp;quot;bazaar&amp;quot;
approach of more general open-source projects. The barn-building
tradition of rural communities gives participants a chance to work
collectively, share knowledge, and build expertise in the community as
they complete project after project. I think this really set the tone:
in informal discussions and panel discussions throughout the day,
directors were asking &amp;quot;what can we do to move this forward?&amp;quot; and techie
types like Peter Murray (despite his assistant director status) were
saying &amp;quot;don't let tactical problems consume all of our time; raise the
priority of focusing on strategic issues; and let us continue to come
together via events and communication channels like code4lib, Access,
and this symposium to build that community and expertise&amp;quot;.&lt;/p&gt;
&lt;p&gt;When asked what we wanted to get out of the day, Art suggested metrics,
Eric Lease Morgan suggested a &amp;quot;Windsor manifesto&amp;quot;, and I was hankering
for a business case to decide whether to continue with a commercial ILS
or adopt an open-source ILS like Evergreen. I think Art and I were in
the same ballpark (albeit without Ty Cobb); you need metrics for a
business case, and they can't simply be &amp;quot;we pay $XXX for annual support,
and open-source is free!&amp;quot;. You have to take into account how many staff
you require for supporting and customizing the commercial ILS vs. an
open-source ILS, but that's relatively easy. Measuring patron
satisfaction is getting into the harder realm.&lt;/p&gt;
&lt;p&gt;What's arguably hardest are the soft metrics for the business case: take
human resources concerns. Staff might be afraid that all of the
investment that they've put into learning vendor X's cataloging
interface will be thrown away with a migration to a different ILS, but
if enough libraries adopt that other ILS then staff actually have a more
valuable, more portable skill. And if that ILS can be freely deployed by
library school students eager to get some hands-on experience, and the
install is incredibly easy because it's a preconfigured VMWare image,
then libraries gain by being able to hire co-ops or new librarians who
already come with useful skill sets. I don't see the traditional vendors
satisfying this model today; I can't even tinker with our commercial ILS
at home during the evening because I don't want to pay the thousands of
dollars that would be required for a test version of that ILS.&lt;/p&gt;
&lt;p&gt;So guess what ILS I've been working on creating a simple VMWare image
of? If you said &amp;quot;Evergreen&amp;quot;, you guessed right!&lt;/p&gt;
&lt;p&gt;Anyways, I think most of us need to go through the exercise of building
a business case. The time is right for starting serious conversations
about where we're going to go in the next couple of years. It doesn't
make sense that we should all have to go off and build our business
cases in private; there's an awful lot of criteria that we should be
able to share, even if we don't want to share numbers. Hopefully we'll
continue this discussion, perhaps over at that &lt;a class="reference external" href="http://infoservices.uwindsor.ca/ils"&gt;Future of the ILS
blog&lt;/a&gt;.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 17 Nov 2006 03:54:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-11-17:/future-of-the-ils-symposium-building-our-community-and-a-business-case.html</guid><category>Libraries</category><category>Coding</category></item><item><title>Neat-o: Archimède uses Apache Derby</title><link>https://coffeecode.net/neat-o-archimede-uses-apache-derby.html</link><description>&lt;p&gt;A while back I &lt;a class="reference external" href="http://sourceforge.net/mailarchive/message.php?msg_id=37113278"&gt;mentioned on the DSpace-devel mailing
list&lt;/a&gt;
that I was interested in adapting DSpace to use embedded Apache Derby as
the default database, rather than PostgreSQL, as a means of lowering the
installation and configuration barriers involved with setting up access
to an external database. I haven't had time yet to actually carry out my
musing, but today I had the chance to set up the
&lt;a class="reference external" href="http://sourceforge.net/projects/archimede"&gt;Archimède&lt;/a&gt; institutional
repository on a test server -- and imagine my surprise when I saw a
derby.log file sitting in the Archimède repository. It looks like
someone else at Université Laval had the same idea as me much further
back.&lt;/p&gt;
&lt;p&gt;It's still on my horizon to adapt DSpace to Derby; seeing that it works
well for Archimède confirms my belief that it's the right direction to
go.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 14 Nov 2006 19:04:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-11-14:/neat-o-archimede-uses-apache-derby.html</guid><category>Databases</category><category>Apache Derby</category><category>Coding</category></item><item><title>PEAR File_MARC 0.1.0 alpha officially released</title><link>https://coffeecode.net/pear-file_marc-010-alpha-officially-released.html</link><description>&lt;p&gt;Just a short note to let y'all know that I received the thumbs-up from
my fellow PEAR developers to add
&lt;a class="reference external" href="http://pear.php.net/File_MARC"&gt;File_MARC&lt;/a&gt; as an official PEAR
package.&lt;/p&gt;
&lt;p&gt;What does this mean? Well, assuming you have PHP 5.1+ and PEAR
installed, you can now download and install File_MARC and its
prerequisite with a simple command:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
pear install File_MARC-alpha
&lt;/pre&gt;
&lt;p&gt;I've also imported the File_MARC source into the PEAR CVS repository,
so you can poke and prod and provide patches.&lt;/p&gt;
&lt;p&gt;Before moving to a 1.0 release, I have to write up some user-oriented
documentation. I have a hankering to provide MARCXML support as well, so
that will probably work its way into the package before 1.0. I'd love
some more testing and feedback from other library geeks; now that
installation is so simple, I'm hoping to see the
[STRIKEOUT:bugs]feedback roll in.&lt;/p&gt;
&lt;p&gt;Oh yes: a big thanks to the PEAR developers who have given me some
excellent suggestions along the way, from my first proposal all the way
through to this alpha release. File_MARC wouldn't be what it is today
without your help!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 14 Nov 2006 18:55:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-11-14:/pear-file_marc-010-alpha-officially-released.html</guid><category>Libraries</category><category>Coding</category><category>PHP</category></item><item><title>It's Hallowe'en, baby!</title><link>https://coffeecode.net/its-halloween-baby.html</link><description>&lt;p&gt;No candy for Amber this year... just unbearable cuteness!&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/amber/halloween_baby.png"&gt;&lt;img alt="Amber" src="/uploads/pics/amber/halloween_baby.serendipityThumb.png" style="width: 110px; height: 83px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Her first tooth is poking through her gums, and it was a bit of a tough
process for her, but she always has lots of giggles and smiles for us.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 02 Nov 2006 12:04:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-11-02:/its-halloween-baby.html</guid><category>Family</category><category>Amber</category></item><item><title>Belated Access 2006 notes: Saturday, Oct. 14th</title><link>https://coffeecode.net/belated-access-2006-notes-saturday-oct-14th.html</link><description>&lt;p&gt;Final entry in publishing my own hastily jotted Access 2006 conference
notes--primarily for my own purposes, but maybe it will help you
indirectly find some real content relating to your field of interest at
the &lt;a class="reference external" href="http://www.access2006.uottawa.ca/index.php?page_id=10"&gt;official podcast/presentation Web site for Access
2006&lt;/a&gt;.
Contents include:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;consortial updates from
&lt;a class="reference external" href="http://www.coffeecode.net/archives/99-Belated-Access-2006-notes-Saturday,-Oct.-14th.html#ASIN"&gt;ASIN&lt;/a&gt;,
&lt;a class="reference external" href="http://www.coffeecode.net/archives/99-Belated-Access-2006-notes-Saturday,-Oct.-14th.html#Quebec"&gt;Quebec&lt;/a&gt;,
&lt;a class="reference external" href="http://www.coffeecode.net/archives/99-Belated-Access-2006-notes-Saturday,-Oct.-14th.html#COPPUL"&gt;COPPUL&lt;/a&gt;,
and OCUL&lt;/li&gt;
&lt;li&gt;Thom Hickey's updates on &lt;a class="reference external" href="http://www.coffeecode.net/archives/99-Belated-Access-2006-notes-Saturday,-Oct.-14th.html#OCLC"&gt;OCLC's Virtual International Authority File
(VIAF) and WorldCat
Identities&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Clifford Lynch's
&lt;a class="reference external" href="http://www.coffeecode.net/archives/99-Belated-Access-2006-notes-Saturday,-Oct.-14th.html#keynote"&gt;keynote&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="consortium-update"&gt;Consortium update&lt;/p&gt;
&lt;p class="rubric" id="asin-slavko-manojlovich"&gt;&lt;cite&gt;ASIN, Slavko Manojlovich&lt;/cite&gt;&lt;/p&gt;
&lt;p class="rubric" id="asin-overview"&gt;ASIN Overview&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;17 atlantic academic libraries&lt;/li&gt;
&lt;li&gt;300 - 18,000 students&lt;/li&gt;
&lt;li&gt;2 unilingual francophone sites&lt;/li&gt;
&lt;li&gt;Sirsi, Ex Libris, and Innovative&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="why-our-users-hate-us"&gt;Why our users hate us&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;choose format over subject&lt;/li&gt;
&lt;li&gt;learn multiple database interfaces&lt;/li&gt;
&lt;li&gt;citations presented in confusing formats&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="addressing-the-problems"&gt;Addressing the problems&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;a la carte user authentication&lt;/li&gt;
&lt;li&gt;EZProxy servers&lt;/li&gt;
&lt;li&gt;SingleSearch federated search tool over 400 resources (including 100+
open access)&lt;/li&gt;
&lt;li&gt;1Cate OpenURL resolvers&lt;/li&gt;
&lt;li&gt;Relais ILL&lt;/li&gt;
&lt;li&gt;Refwork/Refshare&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="principles"&gt;Principles&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Click, don't type&lt;/li&gt;
&lt;li&gt;when you have it, show it&lt;/li&gt;
&lt;li&gt;when you don't have it, make it easy to get&lt;/li&gt;
&lt;li&gt;focus on appropriate links rather than click counts&lt;/li&gt;
&lt;li&gt;let the user determine the appropriate copy from the available
formats&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="stephen-sloan"&gt;Stephen Sloan&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Missing ingredient -- enabling subject choice for users, rather than
format&lt;/li&gt;
&lt;li&gt;working with SirsiDynix on a consortium version of EPS Rooms CMS&lt;/li&gt;
&lt;li&gt;production version to be available in 1st quarter of 2007&lt;/li&gt;
&lt;li&gt;Rooms is basically a portal environment, with different
defaults/scoping for each subject (so that single search&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="outstanding-challenges"&gt;Outstanding challenges&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Federated search connectors based on screen scraping will break&lt;/li&gt;
&lt;li&gt;Citations from certain resources cannot be linked to Resolver&lt;/li&gt;
&lt;li&gt;Cookie pushing in a public environment&lt;/li&gt;
&lt;li&gt;Implementation of the NISO Metasearch standard to improve federated
searching&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="recognizing-our-differences"&gt;Recognizing our differences&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Local customization of interfaces&lt;/li&gt;
&lt;li&gt;Emulating local default search options--everyone use EBSCO, but
everyone has configured different behaviour&lt;/li&gt;
&lt;li&gt;Relying on local expertise at each site&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="coppul-carmen-kazakoff-lane"&gt;&lt;cite&gt;COPPUL, Carmen Kazakoff-Lane&lt;/cite&gt;&lt;/p&gt;
&lt;p class="rubric" id="coppul-overview"&gt;COPPUL Overview&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;ANTS: Using Open Source, Social Software (in the COPPUL consortium)&lt;/li&gt;
&lt;li&gt;sharing and updating animated tutorials that were believed to be a
better option than long information literacy tutorials&lt;/li&gt;
&lt;li&gt;make it easy to locate and use these tutorials (central location and
explicit copyright / reuse statement)&lt;/li&gt;
&lt;li&gt;Make sharing easy and desirable through quality standards, help, and
the allowance for local customization&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="how-does-it-work"&gt;How does it work?&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Project is hosted at &lt;a class="reference external" href="http://brandonu.ca/Library/coppul"&gt;http://brandonu.ca/Library/coppul&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ask each institution to take responsibility for a certain set of
databases so that they can be updated along with the user interface&lt;/li&gt;
&lt;li&gt;wiki enables institutions to update database list with status of
development, whenever they create a tutorial, or add a new database
to the list&lt;/li&gt;
&lt;li&gt;rss feeds enable you to track which tutorials have been updated or
created&lt;/li&gt;
&lt;li&gt;tutorials are housed within a single institutional repository,
licensed under CC licenses with options to the creators&lt;/li&gt;
&lt;li&gt;Other organizations (like LU) are welcome to participate!&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="guy-teasdale-laval-universite"&gt;&lt;cite&gt;Guy Teasdale, Laval Universite&lt;/cite&gt;&lt;/p&gt;
&lt;p class="rubric" id="quebec-digital-infrastructure-the-year-in-review"&gt;Quebec Digital Infrastructure: The Year in Review&lt;/p&gt;
&lt;p class="rubric" id="main-players"&gt;Main players&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;BAnQ - Bibliotheque et archives nationales du Quebec&lt;/li&gt;
&lt;li&gt;CREPUQ - Conference of Rectors and Principals of Quebec Universities&lt;/li&gt;
&lt;li&gt;Erudit&lt;/li&gt;
&lt;li&gt;Museums&lt;/li&gt;
&lt;li&gt;Quebec Gov.&lt;/li&gt;
&lt;li&gt;SRC and other media&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="banq"&gt;BAnQ&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;BNQ started in 1967&lt;/li&gt;
&lt;li&gt;April 2005, opening of la Grande Bibliotheque of the BNQ&lt;/li&gt;
&lt;li&gt;Jan 2006 - Merger of ANQ and BNQ; mandate to acquire and disseminate
collections&lt;/li&gt;
&lt;li&gt;October 2006 - Second meeting on digital national library&lt;/li&gt;
&lt;li&gt;1996 - beginning of digitization activities&lt;/li&gt;
&lt;li&gt;2003 - permanent digitation program&lt;/li&gt;
&lt;li&gt;3.2 million pages of digital materials (newspapers, etc) currently in
the collection; 62000 images&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="meanwhile-in-the-world"&gt;Meanwhile in the World&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Dec 2004 - Google print project: 15 M ebooks by 2010&lt;/li&gt;
&lt;li&gt;Jan 2005 - CEO of BND Jeanneney react in Le Monde &amp;quot;Quand Google defie
l'Europe&amp;quot;, results in the proposal for the Creation of European
Digital Library&lt;/li&gt;
&lt;li&gt;2010 European DL expect 6M books&lt;/li&gt;
&lt;li&gt;Fevrier 2006 Franco network of digital libraries was formed
(including France and Quebec)&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="meanwhile-in-canada"&gt;Meanwhile in Canada&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Quebec is participating in Alouette Canada, hoping that nobody is
reinventing the wheel&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="erudit"&gt;Erudit&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;18000 scholarly articles from 48 journals&lt;/li&gt;
&lt;li&gt;150000 backfiles projected&lt;/li&gt;
&lt;li&gt;Erudit schema adopted by www.persee.fr and www.cens.cnrs.fr = franc
interoperability&lt;/li&gt;
&lt;li&gt;$3,000 annually to join&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="oclc-thom-hickey"&gt;&lt;cite&gt;OCLC, Thom Hickey&lt;/cite&gt;&lt;/p&gt;
&lt;p class="rubric" id="virtual-international-authority-file-viaf"&gt;Virtual International Authority File (VIAF)&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Link national authority records&lt;/li&gt;
&lt;li&gt;Build on their authority work&lt;/li&gt;
&lt;li&gt;Move towards universal bibliographic control, while allowing local
variations to exist&lt;/li&gt;
&lt;li&gt;Deutsche Nationalbiblithek, LoC, and OCLC -- hoping for the BNF
(French) national file&lt;/li&gt;
&lt;li&gt;OCLC is responsible for the actual coding for the project&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="matching-variations"&gt;Matching variations&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;In the LCNAF and PND authority files:&lt;ul&gt;
&lt;li&gt;Same name, same person&lt;/li&gt;
&lt;li&gt;Same name, different people&lt;/li&gt;
&lt;li&gt;Different names, same person&lt;/li&gt;
&lt;li&gt;Missing person in one file&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="enhancing-the-authorities"&gt;Enhancing the authorities&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Bibliographic record -&amp;gt; Derived authority -&amp;gt; Enhanced authority&lt;/li&gt;
&lt;li&gt;Authority record -&amp;gt; Enhanced authority&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="weaker-attributes"&gt;Weaker attributes&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Only one of birth/death dates&lt;/li&gt;
&lt;li&gt;Subject area of works&lt;/li&gt;
&lt;li&gt;Format&lt;/li&gt;
&lt;li&gt;Language&lt;/li&gt;
&lt;li&gt;Publisher&lt;/li&gt;
&lt;li&gt;Partial title match&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="even-weaker-attributes"&gt;Even weaker attributes&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Date of publication&lt;/li&gt;
&lt;li&gt;Country&lt;/li&gt;
&lt;li&gt;Role&lt;/li&gt;
&lt;li&gt;Format&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="compute-it"&gt;Compute it&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Standard approach:&lt;ul&gt;
&lt;li&gt;Generate keys and data&lt;/li&gt;
&lt;li&gt;Load information into a database&lt;/li&gt;
&lt;li&gt;Index it&lt;/li&gt;
&lt;li&gt;Extract fields needed&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Map/reduce approach (adopted from Google)&lt;ul&gt;
&lt;li&gt;Split the database up&lt;/li&gt;
&lt;li&gt;Run parallel jobs against those pieces of the database&lt;/li&gt;
&lt;li&gt;Bring information together through map/reduce&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="mapreduce"&gt;Map/Reduce&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Map&lt;ul&gt;
&lt;li&gt;Read in source file (e.g MARC21)&lt;/li&gt;
&lt;li&gt;Write out key + data&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Reduce&lt;ul&gt;
&lt;li&gt;Read in array of data for each unique key&lt;/li&gt;
&lt;li&gt;Write out key + data&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="mapreduce-implementation"&gt;Map/Reduce implementation&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Written in Python&lt;/li&gt;
&lt;li&gt;Uses ssh and XML-RPC for control and communication&lt;/li&gt;
&lt;li&gt;Map/Reduce seems to add around 10% overhead&lt;/li&gt;
&lt;li&gt;Earlier implementation ran on a 48 CPU cluster&lt;/li&gt;
&lt;li&gt;Current VIAF cluster is a 12 CPU cluster on 4 nodes&lt;/li&gt;
&lt;li&gt;Running Linux and 64-bit Python (no need to worry about 2GB memory
limit)&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="viaf-matching-code"&gt;VIAF matching code&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;17 modules&lt;/li&gt;
&lt;li&gt;1,100 lines of code&lt;/li&gt;
&lt;li&gt;600 lines of configuration&lt;/li&gt;
&lt;/ul&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 31 Oct 2006 16:07:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-10-31:/belated-access-2006-notes-saturday-oct-14th.html</guid><category>Libraries</category><category>Coding</category></item><item><title>Getting the Goods: Libraries and the Last Mile</title><link>https://coffeecode.net/getting-the-goods-libraries-and-the-last-mile.html</link><description>&lt;p&gt;In my continuing series of publishing my Access 2006 notes, Roy
Tennant's keynote on finishing the task of connecting our users to the
information they need is something to which every librarian should pay
attention.&lt;/p&gt;
&lt;p&gt;If you don't understand something I've written, there's always the
&lt;a class="reference external" href="http://www.access2006.uottawa.ca/2006-10-13-01-tennant-keynote.mp3"&gt;podcast&lt;/a&gt;
of Roy's talk. In fact, there are a ton of podcasts of individual Access
2006 talks available from the &lt;a class="reference external" href="http://www.access2006.uottawa.ca/?page_id=10"&gt;Access 2006 Speakers, Presentations and
Podcasts&lt;/a&gt; page. It's
the next best thing to actually being there...&lt;/p&gt;
&lt;p&gt;As always, any errors in capturing Roy's thoughts are undoubtedly mine.&lt;/p&gt;
&lt;p class="rubric" id="roy-tennant"&gt;Roy Tennant&lt;/p&gt;
&lt;p class="rubric" id="the-last-mile"&gt;The Last Mile&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;analogous to the telecom problem of having an amazing network but
being unable to make the connection to the customer&lt;/li&gt;
&lt;li&gt;we've done a better job describing things than we have delivering
them&lt;/li&gt;
&lt;li&gt;our systems suck for online delivery&lt;/li&gt;
&lt;li&gt;after retrospective conversion and implementing automation, we've
basically stalled and are being overtaken by other players like
Google&lt;/li&gt;
&lt;li&gt;We need the 'two-click solution' (one click to find, one click to get
full-text)&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="books"&gt;Books&lt;/p&gt;
&lt;p&gt;raw Google search for &amp;quot;before taliban&amp;quot; -- first hit links to the
full-text (successful two-click find-get solution)
Melvyl forces users to click locations/details, then scroll down, then
click through a copyright notice&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Why are libraries so bad at this? Partially because we have been
asking for the wrong things from our vendors&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But Google Books search &lt;em&gt;doesn't&lt;/em&gt; provide a link to the full-text
version in the top search hits at all
Mirlyn (UMich) catalogue recently began working with Google to digitize
100,000 books; so let's see how things are going:
Search for &lt;em&gt;croquis and italiens&lt;/em&gt; Publication date - 1890
Compare the results in Mirlyn:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Brief display links to the physical version, when of course the users
in all probability would prefer the electronic version&lt;/li&gt;
&lt;li&gt;Clicking on details shows 2 electronic results - full text from
UMich, but and the &lt;a class="reference external" href="http://books.google.com"&gt;Google Books&lt;/a&gt; version
which provides only the &amp;quot;snippet view&amp;quot;; if you search within Google
Books then you still don't get full text but you will get segments of
the book&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;OCLC WorldCat is working on &amp;quot;Audience Levels&amp;quot; to indicate what level of
audience a given book is appropriate for (on a range of &amp;quot;Schooler&amp;quot; to
&amp;quot;Scholar&amp;quot;)
&lt;a class="reference external" href="http://www.oclc.org/research/projects/xisbn/"&gt;xISBN&lt;/a&gt; service
implements some level of FRBR to provide related ISBNs and enables
NCSU's catalog availability service to find other items that satisfy the
user's request
So people are going to be coming through &lt;a class="reference external" href="http://books.google.com"&gt;Google
Books&lt;/a&gt; and &lt;a class="reference external" href="http://www.oclc.org/worldcat/open/"&gt;Open
Worldcat&lt;/a&gt;, we need to accept this
and work well with those services to direct users to libraries when
appropriate
Currently, libraries can provide better discovery of open content than
Google is, because Google Books is mostly about publishers
However, libraries need to fix their discovery systems, because they're
broken -- this is going to take time&lt;/p&gt;
&lt;p class="rubric" id="link-resolvers"&gt;Link resolvers:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;We tend to throw intermediate levels of windows at users as a search
result&lt;/li&gt;
&lt;li&gt;Why don't we just give them full text immediately if the resolver
knows that it's there? Why the heck do we link to ILL if full-text is
available?&lt;/li&gt;
&lt;li&gt;Let's recognize that the OpenURL resolver is a beginning, not the end&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="umlaut-at-georgia-tech"&gt;Umlaut at Georgia Tech:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Checks for full text, checks for on-shelf availability, checks for
closest search results, and surfaces all of those with the bib record&lt;/li&gt;
&lt;li&gt;Read more about the
&lt;a class="reference external" href="http://umlaut.library.gatech.edu/umlaut/"&gt;Umlaut&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="guf-getting-users-to-full-text"&gt;GUF: Getting users to full-text&lt;/p&gt;
&lt;p&gt;Check for &lt;a class="reference external" href="http://www.nelinet.net/edserv/conf/cataloging/google/lindahl.ppt"&gt;David Lindahl's
slides&lt;/a&gt;
for a deeper description
Try to get to full-text&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Improve metadata transfer&lt;/li&gt;
&lt;li&gt;Eliminate errors&lt;/li&gt;
&lt;li&gt;Eliminate clicks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you can't get users to full-text, get them to print&lt;/p&gt;
&lt;p class="rubric" id="journals-key-components"&gt;Journals: Key Components&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;OpenURL resolver&lt;/li&gt;
&lt;li&gt;OpenURL resolver directory&lt;/li&gt;
&lt;li&gt;Other resolvers (DOI)&lt;/li&gt;
&lt;li&gt;Aggregators (arXive.org, oaister.org)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Berkeley sends professors an email saying &amp;quot;we found that you published
this article, but it's not freely available in our IR, please click this
link to upload a copy!&amp;quot; and this seems to be a successful strategy to
building a repository. Make it as easy as possible for the users to
contribute.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 20 Oct 2006 06:00:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-10-20:/getting-the-goods-libraries-and-the-last-mile.html</guid><category>Libraries</category><category>Coding</category></item><item><title>Serendipity (s9y) blog: Security release</title><link>https://coffeecode.net/serendipity-s9y-blog-security-release.html</link><description>&lt;p&gt;Folks, if you use &lt;a class="reference external" href="http://www.s9y.org"&gt;Serendipity&lt;/a&gt;, I thought you
should know they just released a security update to fix an XSS issue in
the administration backend. Unfortunately, s9y.org itself appears to be
very ill at the moment: I kept getting &lt;tt class="docutils literal"&gt;500 - Internal Server Error&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;However, the new release with the security fix (1.0.2) is available for
download from &lt;a class="reference external" href="http://prdownloads.sourceforge.net/php-blog/"&gt;http://prdownloads.sourceforge.net/php-blog/&lt;/a&gt; -- I
recommend you go forth and upgrade.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 19 Oct 2006 12:08:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-10-19:/serendipity-s9y-blog-security-release.html</guid><category>misc</category><category>PHP</category></item><item><title>Access 2006 notes: October 12</title><link>https://coffeecode.net/access-2006-notes-october-12.html</link><description>&lt;p&gt;My continuing summaries from Access 2006. Thursday, October 12th was the
first &amp;quot;normal&amp;quot; day of the conference featuring the following
presentations:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://www.coffeecode.net/archives/95-Access-2006-notes-October-12.html#Open_access_2C_open_source_2C_content_deals_3A_who_pays_3F"&gt;Open access, open source, content deals: who
pays?&lt;/a&gt;
(Leslie Weir)&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://www.coffeecode.net/archives/95-Access-2006-notes-October-12.html#Our_Ontario_3A_Yours_to_Recover"&gt;Our Ontario: Yours to
Recover&lt;/a&gt;
(Art Rhyno, Walter Lewis)&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://www.coffeecode.net/archives/95-Access-2006-notes-October-12.html#Improving_the_Catalogue_Interface_using_Endeca"&gt;Improving the Catalogue Interface using
Endeca&lt;/a&gt;
(Tito Sierra)&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://www.coffeecode.net/archives/95-Access-2006-notes-October-12.html#Lightning_talks_3A"&gt;Lightning
talks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://www.coffeecode.net/archives/95-Access-2006-notes-October-12.html#Towards_a_Canadian_Digital_Information_Strategy"&gt;Panel: Towards a Canadian Digital Information
Strategy&lt;/a&gt;
(Susan Haigh, Lucie Molgat, Brian Bell, Bill Maes)&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://www.coffeecode.net/archives/95-Access-2006-notes-October-12.html#TEL__E2_80_93_European_initiative"&gt;Progress and Prospects for European Digital Libraries (TEL â€“
European
initiative)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;` &amp;lt;&amp;gt;`__&lt;/p&gt;
&lt;p class="rubric" id="open-access-open-source-content-deals-who-pays"&gt;` &amp;lt;&amp;gt;`__Open access, open source, content deals: who pays?&lt;/p&gt;
&lt;p class="rubric" id="leslie-weir-vppresident-elect-of-carl"&gt;` &amp;lt;&amp;gt;`__Leslie Weir, VP/President-Elect of CARL&lt;/p&gt;
&lt;p&gt;Open access mandates from research funders such as CERN, and near
mandates from research funders such as SSHRC, are encouraging&lt;/p&gt;
&lt;p class="rubric" id="university-of-ottawa"&gt;` &amp;lt;&amp;gt;`__University of Ottawa:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;disappointing experience with BioMed Central which touts itself as an
open access journal (following the &amp;quot;author pays&amp;quot; model)&lt;/li&gt;
&lt;li&gt;UofO had subsidized their researchers until this year, when BioMed
demanded a 15x increase in their funding&lt;/li&gt;
&lt;li&gt;but researchers are now campaigning for a return of the subsidies&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="open-source-modules-as-an-alternative-to-the-traditional-commercial-ils"&gt;` &amp;lt;&amp;gt;`__Open source modules as an alternative to the
traditional commercial ILS&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Libraries have been early adopters of technology, starting with
mainframes, through PCs and Internet access&lt;/li&gt;
&lt;li&gt;ILS reflects the need for integrated information&lt;/li&gt;
&lt;li&gt;While our OPACs were originally cutting-edge, they've been relatively
unchanged since their inception compared to rich catalogues offered
by commercial retailers&lt;/li&gt;
&lt;li&gt;Ex Libris touts Primo as a way for libraries to unlock the potential
of their information&lt;/li&gt;
&lt;li&gt;McMaster announced on September 6th plans to adapt the same search
and browse technologies underlying Home Depot's catalog system
(Endeca) to provide faceted search and browse&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="role-of-scholars-portal-in-ocul-vs-individual-opacs"&gt;` &amp;lt;&amp;gt;`__Role of Scholar's Portal in OCUL vs. individual
OPACs:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Should we implement a shared ILS?&lt;/li&gt;
&lt;li&gt;If so, should it be a vendor's ILS, a collaborative open source ILS,
a new layer of discovery tools over top of a traditional ILS?&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="content-deals-for-consortial-arrangements"&gt;` &amp;lt;&amp;gt;`__Content deals for consortial arrangements:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Canadian libraries invest heavily in consortial access to e-resources&lt;/li&gt;
&lt;li&gt;OCUL invests approximately $20 million annually for 20 university
members&lt;/li&gt;
&lt;li&gt;Problem is how to divide the costs:&lt;/li&gt;
&lt;li&gt;OCUL in 2002/2003 tried to adopt a five-year plan for a &amp;quot;user-pay&amp;quot;
model based on the amount of use of each product&lt;/li&gt;
&lt;li&gt;Now in the fourth year of the plan, many institutions were
experiencing 20% increases (capped maximum) year over year that was
not sustainable, while others were experiencing significant decreases&lt;/li&gt;
&lt;li&gt;Budgetary certainty has quickly become a stronger requirement for the
formula, while continuing to refine the balance of ability to pay vs.
use&lt;/li&gt;
&lt;li&gt;CKRN began with a grant for $59 million for traditional 'hard'
sciences&lt;/li&gt;
&lt;li&gt;On November 4th CKRN is going before an international panel to
propose a $48 million project to move into social sciences and
humanities&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="how-to-deal-with-the-administrator-who-questions-the-value-of-library-services-in-the-age-of-google"&gt;` &amp;lt;&amp;gt;`__How to deal with the administrator who questions
the value of library services in the age of Google?&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;OCLC has determined that the vast majority of the information that is
available on the Internet is not freely available&lt;/li&gt;
&lt;li&gt;Libraries have a role in providing the keys to that information&lt;/li&gt;
&lt;li&gt;Accepting that not all roads lead through the library and integrating
with other services like Google Scholar will help lead users to the
information they need&lt;/li&gt;
&lt;li&gt;Google has raised the bar; it's no longer okay to tell our users
&amp;quot;These are the 22 interfaces you need to learn to find the
information you need&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="our-ontario-yours-to-recover"&gt;` &amp;lt;&amp;gt;`__Our Ontario: Yours to Recover&lt;/p&gt;
&lt;p class="rubric" id="art-rhyno-walter-lewis"&gt;` &amp;lt;&amp;gt;`__Art Rhyno, Walter Lewis&lt;/p&gt;
&lt;p class="rubric" id="knowledge-ontario"&gt;` &amp;lt;&amp;gt;`__Knowledge Ontario&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Knowledge Ontario grew out of the Ontario Digital Library and is now
consituted by six projects; Our Ontario (search.ourontario.ca)
reflects community content&lt;/li&gt;
&lt;li&gt;Hope to use Lucene as the &amp;quot;digital hammer&amp;quot; to search community
content (pulling from newspaper records, historical society data,
etc)&lt;/li&gt;
&lt;li&gt;Excellent at merging indexes, so potential for libraries to use their
regular workstations to index in parallel&lt;/li&gt;
&lt;li&gt;Excellent separation between indexing/searching layer and
presentation layer&lt;/li&gt;
&lt;li&gt;OurOntario includes digitized books (searchable via additional
metadata), fonds (indexing EAD), images from Images Canada
(stripped-down DC), TEI documents&lt;/li&gt;
&lt;li&gt;AlouetteCanada is a layer on top of the same Lucene backend using
SOLR to present facets&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="great-lakes-images"&gt;` &amp;lt;&amp;gt;`__Great Lakes Images&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Great Lakes Images presents pictures with Google Map integration to
show where the pictures were taken&lt;/li&gt;
&lt;li&gt;Includes images donated from individuals, questions raised by
KnowledgeOntario staff, and comments from users that actually correct
or enhance the metadata for the records&lt;/li&gt;
&lt;li&gt;Museums etc. often don't make the high-res version of the image
available for free, and that's fine with KnowledgeOntario&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="local-stories"&gt;` &amp;lt;&amp;gt;`__Local stories&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Full community newspapers that are ignored by most aggregators or
services&lt;/li&gt;
&lt;li&gt;Essex Free Press includes PDF directly from the production system,
with fully searchable text that is extracted from the PDF&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="improving-the-catalogue-interface-using-endeca"&gt;` &amp;lt;&amp;gt;`__Improving the Catalogue Interface using Endeca&lt;/p&gt;
&lt;p class="rubric" id="tito-sierra-ncsu-libraries"&gt;` &amp;lt;&amp;gt;`__Tito Sierra, NCSU Libraries&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;NC State was the first library to use Endeca as a front end to the
library system&lt;/li&gt;
&lt;li&gt;Endeca is a software company in Cambridge, MA that is a software
provider for Home Depot, Indigo, and others&lt;/li&gt;
&lt;li&gt;McMaster has just announced that they will be using Endeca&lt;/li&gt;
&lt;li&gt;Project details: &lt;a class="reference external" href="http://www.lib.ncsu.edu/endeca"&gt;http://www.lib.ncsu.edu/endeca&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="motivation"&gt;` &amp;lt;&amp;gt;`__Motivation:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Improve the user experience when using the library catalogue keeping
the backend system the same&lt;/li&gt;
&lt;li&gt;Exploit the existing authority infrastructure possible within the
MARC record format&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="why-endeca"&gt;` &amp;lt;&amp;gt;`__Why Endeca?&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Relevant result ranking (previous system provided &amp;quot;most recently
added to the catalog&amp;quot; approach)&lt;/li&gt;
&lt;li&gt;Faceted browsing narrows search results, or starting with a browse:&lt;/li&gt;
&lt;li&gt;Facets include language, LC classification, subject genre, subject
access, author, most popular (based on circulation data)&lt;/li&gt;
&lt;li&gt;You can deselect a facet you chose previously at any given time&lt;/li&gt;
&lt;li&gt;Performance and speed&lt;/li&gt;
&lt;li&gt;Search &amp;quot;comforts&amp;quot;:&lt;/li&gt;
&lt;li&gt;Spell correction (auto-correct)&lt;/li&gt;
&lt;li&gt;&amp;quot;Did you mean...&amp;quot; (prompts user)&lt;/li&gt;
&lt;li&gt;Stemming&lt;/li&gt;
&lt;li&gt;Sort options (publication date is most popular)&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="relevance-ranking-controlled-by-order-of-ranking-modules"&gt;` &amp;lt;&amp;gt;`__Relevance ranking controlled by order of ranking
modules:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Original query match&lt;/li&gt;
&lt;li&gt;Phrase match&lt;/li&gt;
&lt;li&gt;Field match (tiered -- multiple submodules)&lt;/li&gt;
&lt;li&gt;Number of fields matched&lt;/li&gt;
&lt;li&gt;Weighted frequency&lt;/li&gt;
&lt;li&gt;Publication date descending&lt;/li&gt;
&lt;li&gt;Circulation date descending&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="interface-was-built-from-scratch-on-top-of-the-endeca-search-software-and-indexing"&gt;` &amp;lt;&amp;gt;`__Interface was built from scratch on top of the
Endeca search software and indexing:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Benefit is that NCSU has local control over the UI to enhance it
based on user feedback&lt;/li&gt;
&lt;li&gt;URL is persistent -- so you can copy and paste the URL resulting from
a search and share it with others&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="features-not-supported"&gt;` &amp;lt;&amp;gt;`__Features not supported:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Work level aggregations / roll-up (no ability to show the item rather
than the expression)&lt;/li&gt;
&lt;li&gt;Customization&lt;/li&gt;
&lt;li&gt;Folksonomies&lt;/li&gt;
&lt;li&gt;Recommendations&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="technical-overview"&gt;` &amp;lt;&amp;gt;`__Technical overview:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Co-exists with SirsiDynix Unicorn ILS and Web2 online catalog&lt;/li&gt;
&lt;li&gt;Still uses Web2 authority search&lt;/li&gt;
&lt;li&gt;Export MARC records&lt;/li&gt;
&lt;li&gt;Endeca parses the MARC records on a nightly basis&lt;/li&gt;
&lt;li&gt;Resources: 5 IT staff, 1 cataloging librarian, 1 reference librarian&lt;/li&gt;
&lt;li&gt;Timeline: License in spring 2005, production in summer 2006&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="implementation-challenges"&gt;` &amp;lt;&amp;gt;`__Implementation challenges:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Some feedback suggests too many facets have been exposed&lt;/li&gt;
&lt;li&gt;Relevance ranking is hard&lt;/li&gt;
&lt;li&gt;Faceted navigation across logical groupings (like item type of
audio-visual for CDs, tapes, etc)&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="usage-statistics"&gt;` &amp;lt;&amp;gt;`__Usage statistics:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Most popular facets:&lt;/li&gt;
&lt;li&gt;Subject topic&lt;/li&gt;
&lt;li&gt;LC classification&lt;/li&gt;
&lt;li&gt;Format&lt;/li&gt;
&lt;li&gt;Keyword search (default) is most popular by far&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="usability-test-compared-5-users-on-old-system-with-5-on-new-system"&gt;` &amp;lt;&amp;gt;`__Usability test compared 5 users on old system with
5 on new system&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;New catalog was proven to be easier and faster on 9 out of 10 tasks&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="reflections"&gt;` &amp;lt;&amp;gt;`__Reflections&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Post-launch, new interface required backend data cleanup as many
interesting variations were exposed by the facets&lt;/li&gt;
&lt;li&gt;Search and discovery were &amp;quot;broken&amp;quot; with the old interface&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="lightning-talks"&gt;` &amp;lt;&amp;gt;`__Lightning talks:&lt;/p&gt;
&lt;p class="rubric" id="john-derno-uvic"&gt;` &amp;lt;&amp;gt;`__John Derno, UVic&lt;/p&gt;
&lt;p class="rubric" id="building-a-backup-catalogue-in-a-week-and-a-half"&gt;` &amp;lt;&amp;gt;`__Building a backup catalogue in a week and a half&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Facing a four-day Voyager upgrade &amp;amp; outage&lt;/li&gt;
&lt;li&gt;Considered WorldCat, but it only allows 16 simultaneous users&lt;/li&gt;
&lt;li&gt;Zebra indexed 1million records in 40 minutes on a reasonable
development box (1GB RAM)&lt;/li&gt;
&lt;li&gt;Basic PHP interface through PHP/Yaz to talk to Zebra via Z39.50&lt;/li&gt;
&lt;li&gt;Major challenge was documentation of indexdata.dk technology, e.g.
building queries&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="godmar-back-and-annette-bailey-virginia-tech"&gt;` &amp;lt;&amp;gt;`__Godmar Back and Annette Bailey, Virginia Tech&lt;/p&gt;
&lt;p class="rubric" id="majax-or-look-ma-no-server"&gt;` &amp;lt;&amp;gt;`__MAJAX or &amp;quot;Look Ma, no server&amp;quot;&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;OpenURL services provide a link to check catalog for searches that
don't work&lt;/li&gt;
&lt;li&gt;Desire to integrate live OPAC information (MARC records, holdings
records) into web pages in your organization's domain&lt;/li&gt;
&lt;li&gt;JavaScript library provides an AJAX interface to III Millenium
catalog&lt;/li&gt;
&lt;li&gt;Does not require any changes to Millenium installation&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="jeremy-frumkin-osu"&gt;` &amp;lt;&amp;gt;`__Jeremy Frumkin, OSU&lt;/p&gt;
&lt;p class="rubric" id="libraryfind"&gt;` &amp;lt;&amp;gt;`__LibraryFind&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;attempt to build a federated search tool that is not slow&lt;/li&gt;
&lt;li&gt;the approach: cache search results&lt;/li&gt;
&lt;li&gt;version 1 built with PHP &amp;amp; MySQL, will be thrown away with version 2
(RoR)&lt;/li&gt;
&lt;li&gt;layout deliberately designed on Google interface, user testing shows
that the adwords column gets ignored (no surprise there)&lt;/li&gt;
&lt;li&gt;does describe related terms&lt;/li&gt;
&lt;li&gt;linked titles are available in full text, link for AJAX-y link
resolver that no users clicked&lt;/li&gt;
&lt;li&gt;show/hide affordance also wasn't used&lt;/li&gt;
&lt;li&gt;Jeremy and Mr. T (including full photoshopping of Jeremy with a Mr. T
haircut)&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="david-fiander-uwo"&gt;` &amp;lt;&amp;gt;`__David Fiander, UWO&lt;/p&gt;
&lt;p class="rubric" id="how-i-spent-my-summer-as-an-evergreen-developer"&gt;` &amp;lt;&amp;gt;`__How I spent my summer as an Evergreen developer&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Georgia Public Library consortium decided that it would be cheaper to
devote 6 people to developing their own ILS rather than continue to
pay a vendor&lt;/li&gt;
&lt;li&gt;System did slow down the day it launched due to the immense load&lt;/li&gt;
&lt;li&gt;Development team works entirely online (email and chatrooms), with
sporadic meetings&lt;/li&gt;
&lt;li&gt;David wrote the code that enables the self-checkout terminals as a
separately available open source module&lt;/li&gt;
&lt;li&gt;Koha would like to offer self-checkout, David will probably adapt the
module for them&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="terry-reese-osu"&gt;` &amp;lt;&amp;gt;`__Terry Reese, OSU&lt;/p&gt;
&lt;p class="rubric" id="intro-to-marcedit"&gt;` &amp;lt;&amp;gt;`__Intro to MarcEdit&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Written in C#, works well on Windows, reasonably well under Mono on
Linux and Mac&lt;/li&gt;
&lt;li&gt;Converts between MARC and various XML formats&lt;/li&gt;
&lt;li&gt;Converts between MARC-8 and Unicode&lt;/li&gt;
&lt;li&gt;Includes a Z39.50 client&lt;/li&gt;
&lt;li&gt;Designed to be programmable rather than forcing you to use the GUI&lt;/li&gt;
&lt;li&gt;Possible cataloging tool replacement for SmartPort / WorkFlows?&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="marc-jordan-sfu"&gt;` &amp;lt;&amp;gt;`__Marc Jordan, SFU&lt;/p&gt;
&lt;p class="rubric" id="shameless-self-promotion"&gt;` &amp;lt;&amp;gt;`__&amp;quot;Shameless self-promotion&amp;quot;&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Mark wrote a book Putting content online: a practical guide for
libraries, Chandos Publishing&lt;/li&gt;
&lt;li&gt;Wanted to make it fully open access, in the belief that making it
available would encourage sales of more copies&lt;/li&gt;
&lt;li&gt;Two sample chapters are online&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="walter-lewis-windsor"&gt;` &amp;lt;&amp;gt;`__Walter Lewis, Windsor&lt;/p&gt;
&lt;p class="rubric" id="what-do-we-do-with-content-thats-too-big-to-fit-on-the-screen"&gt;` &amp;lt;&amp;gt;`__What do we do with content that's too big to fit on
the screen?&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Frequently occurs with maps, high-res photos&lt;/li&gt;
&lt;li&gt;First option is to provide a small version of the photo, but that
doesn't give proper treatment to the real image&lt;/li&gt;
&lt;li&gt;Digitization engine behind is Mr. Sid (proprietary, LizardTech) --
gives a Google Maps-like ability to drag around&lt;/li&gt;
&lt;li&gt;Mr. Sid is geographically aware, so it knows which way is North on a
map&lt;/li&gt;
&lt;li&gt;You can index X-Y offsets that would make it possible to deliver
historical map pointering&lt;/li&gt;
&lt;li&gt;JPEG2000 standard includes some x-y axis capabilities&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="towards-a-canadian-digital-information-strategy"&gt;` &amp;lt;&amp;gt;`__Towards a Canadian Digital Information Strategy&lt;/p&gt;
&lt;p class="rubric" id="susan-haigh-lac"&gt;` &amp;lt;&amp;gt;`__Susan Haigh, LAC&lt;/p&gt;
&lt;p&gt;More information -- &lt;a class="reference external" href="http://collectionscanada.ca/cdis"&gt;http://collectionscanada.ca/cdis&lt;/a&gt;&lt;/p&gt;
&lt;p class="rubric" id="why-the-need-for-a-national-strategy"&gt;` &amp;lt;&amp;gt;`__Why the need for a national strategy?&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;current efforts are fragmented, uncoordinated, under-resourced&lt;/li&gt;
&lt;li&gt;incapable of preserving what we create&lt;/li&gt;
&lt;li&gt;inconsistent across the provinces&lt;/li&gt;
&lt;li&gt;weak in comparison to other countries&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="why-now"&gt;` &amp;lt;&amp;gt;`__Why now?&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;enough accrued experience&lt;/li&gt;
&lt;li&gt;volume of digital content is rising sharply&lt;/li&gt;
&lt;li&gt;methodology is becoming clearer, storage costs are coming down&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="who-or-what-can-it-serve"&gt;` &amp;lt;&amp;gt;`__Who or what can it serve?&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;research, elearning, community building, e-democracy, public
accountability&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="canadas-scientific-infostructure-csi-universal-seamless-and-permanent-access-to-information-for-canadian-research-and-innovation"&gt;` &amp;lt;&amp;gt;`__Canada's Scientific Infostructure (Csi): Universal,
seamless and permanent access to information for Canadian research
and innovation&lt;/p&gt;
&lt;p class="rubric" id="lucie-molgat-director-csi-program-cisti"&gt;` &amp;lt;&amp;gt;`__Lucie Molgat, Director Csi Program, CISTI&lt;/p&gt;
&lt;p class="rubric" id="what-is-cisti"&gt;` &amp;lt;&amp;gt;`__What is CISTI?&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Canada's national science library&lt;/li&gt;
&lt;li&gt;Has experience providing seamless access for NRC users across Canada&lt;/li&gt;
&lt;li&gt;Publisher of 15 journals&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="csi-vision"&gt;` &amp;lt;&amp;gt;`__Csi vision&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;National information and infrastructure network to provide seamless
and permanent access to full-text digital content&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="csi-components"&gt;` &amp;lt;&amp;gt;`__Csi components:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Infrastructure, repository, and services and tools&lt;/li&gt;
&lt;li&gt;Using an SOA to enable partner projects&lt;/li&gt;
&lt;li&gt;Csi's repository currently has 5.7 million articles licensed from
providers, will have 7 million by spring 2007&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="alouettecanada"&gt;` &amp;lt;&amp;gt;`__AlouetteCanada&lt;/p&gt;
&lt;p class="rubric" id="brian-bell-alouettecanada"&gt;` &amp;lt;&amp;gt;`__Brian Bell, AlouetteCanada&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://alouettecanada.ca/"&gt;http://alouettecanada.ca&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Single-line summary: provide views over top of a comprehensive
collection of regional and local digital repositories&lt;/li&gt;
&lt;li&gt;Addendum: variety of methods to encourage more content, including
making a Web interface available for small regional organizations,
Digimobiles for sending out trainers of the trainers and technology
to sites that need assistance, and harvesting / normalization of
existing repositories&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="cidl"&gt;` &amp;lt;&amp;gt;`__CIDL&lt;/p&gt;
&lt;p class="rubric" id="bill-maes-cidl-httpwww-collectionscanada-cacidl"&gt;` &amp;lt;&amp;gt;`__Bill Maes, CIDL --
&lt;a class="reference external" href="http://www.collectionscanada.ca/cidl/"&gt;http://www.collectionscanada.ca/cidl/&lt;/a&gt;&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&amp;quot;We are bereft of content&amp;quot;&lt;/li&gt;
&lt;li&gt;YouTube didn't need ten years of vision statements and meetings about
infrastructure to get up and run&lt;/li&gt;
&lt;li&gt;CIDL protocol from 10 years ago is fairly applicable today, but needs
to include more than just libraries&lt;/li&gt;
&lt;li&gt;One of the major problems so far has been a lack of content&lt;/li&gt;
&lt;li&gt;Need more products like OurRoots with actual content&lt;/li&gt;
&lt;li&gt;CIDL encourages AlouetteCanada to be inclusive -- to get everybody in
the game -- but don't wait for another year to go by; DO IT NOW.&lt;/li&gt;
&lt;li&gt;While CARL has been an important part of startup support,
AlouetteCanada needs to distance itself from CARL to encourage more
partners to join in the effort&lt;/li&gt;
&lt;li&gt;But another goal is to get Canadians to actually view this content,
and making access to the content is only part of the problem; getting
people interested at even a fraction of the rate that Canadians have
been downloading YouTube videos is critical.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="progress-and-prospects-for-european-digital-libraries-tel-a-european-initiative"&gt;` &amp;lt;&amp;gt;`__Progress and Prospects for European Digital
Libraries (TEL â€“ European initiative)&lt;/p&gt;
&lt;p class="rubric" id="ron-davies"&gt;Ron Davies&lt;/p&gt;
&lt;p class="rubric" id="macs-mapping-subject-headings-across-languages"&gt;` &amp;lt;&amp;gt;`__MACS (mapping subject headings across languages)&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;English (LC), French (Rameau), and German (SWD)&lt;/li&gt;
&lt;li&gt;Currently have 30,000 mappings in total, 3,000 mappings across all
three languages&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="bs-8723-revises-ukiso-standards-for-thesauri"&gt;` &amp;lt;&amp;gt;`__BS 8723 revises UK/ISO standards for thesauri&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Includes guidance on mapping between different structured
vocabularies and ontologies&lt;/li&gt;
&lt;li&gt;Includes advice on standardizing electronic exchange&lt;/li&gt;
&lt;/ul&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 19 Oct 2006 10:57:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-10-19:/access-2006-notes-october-12.html</guid><category>Libraries</category><category>Coding</category></item><item><title>Library Geeks in human form</title><link>https://coffeecode.net/library-geeks-in-human-form.html</link><description>&lt;p&gt;So, I think I read somewhere on #code4lib that Dan Chudnov, the most
excellent host of the Library Geeks podcast, refused to make
human-readable links to the MP3 files for the podcasts available in
plain old HTML because he had bought into the stodgy old definition of
podcasts (hah! &amp;quot;stodgy&amp;quot; and &amp;quot;old&amp;quot; in relation to podcasts) as:&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;p&gt;A podcast is rich media, such as audio or video, distributed via
RSS. (&lt;a class="reference external" href="http://feeds.feedburner.com/librarygeeks"&gt;FeedBurner&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;This may explain why, as a non-iTunes user and a person who likes his
links nice and clicky, dammit, I have yet to listen to a single Library
Geeks episode. Oh, I know -- the shame! What's a geek to do?&lt;/p&gt;
&lt;p&gt;Well, if you're sitting in Alabama with just enough free wifi bandwidth
to watch individual characters travel through the ether, the geek thing
to do is to go out and write yourself a nice &lt;a class="reference external" href="/geeks.xsl"&gt;XSL
stylesheet&lt;/a&gt; and combine that with a
PHP script that presents a &lt;a class="reference external" href="/geeks.php"&gt;raw but clickable
HTML&lt;/a&gt; representation of the RSS 2.0
feed. Now I can sit back and let those bits crawl down my thin pipe as I
await the pleasures of hearing my first Library Geeks episode, limited
only by bandwidth.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;P.S.&lt;/em&gt;: Yeah, I know FeedBurner [STRIKEOUT:renders the]provides a more
human readable representation of the feed, but this human likes his
content with as little advertising clutter as possible. Over and out.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 18 Oct 2006 04:09:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-10-18:/library-geeks-in-human-form.html</guid><category>Libraries</category><category>Coding</category></item><item><title>Double-barreled PHP releases</title><link>https://coffeecode.net/double-barreled-php-releases.html</link><description>&lt;p&gt;I'm the proud parent of two new releases over the past couple of days:
one official PEAR release for linked list fans, and another revision of
the
&lt;a class="reference external" href="http://pear.php.net/pepr/pepr-proposal-show.php?id=443"&gt;File_MARC&lt;/a&gt;
proposal for library geeks.&lt;/p&gt;
&lt;div class="section" id="structures-linkedlist"&gt;
&lt;h2&gt;Structures_LinkedList&lt;/h2&gt;
&lt;p&gt;A few days ago marked the first official PEAR release of the
&lt;a class="reference external" href="http://pear.php.net/package/Structures_LinkedList"&gt;Structures_LinkedList&lt;/a&gt;.
Yes, it's only at 0.1.0-alpha, but I'm pretty damned happy with the code
at this stage and unless something drastic happens the only significant
change I foresee between now and 1.0-stable is the addition of some
user-oriented documentation. This code got a severe workout at the
&lt;a class="reference external" href="http://feeds.feedburner.com/~r/onebiglibrary/~3/38149988/006-access-hackfest"&gt;Access 2006
Hackfest&lt;/a&gt;,
where I ran headlong into some significant limitations in parsing huge
files.&lt;/p&gt;
&lt;p&gt;A few days later, after misdirecting some precious #php.pecl brainpower
(sorry, sorry, sorry Wez, Ilia, and Tony) on the wrong problem, I
discovered the reason writing your own &lt;tt class="docutils literal"&gt;__destruct()&lt;/tt&gt; methods can be
very, very necessary. If you don't clean up variables that PHP doesn't
know how to deal with--say, nodes in a doubly-linked list that look like
circular reference hell to PHP--then you're going to be in for a world
of hurt for anything but the smallest of test scenarios. This particular
problem has had a stake put through its heart in Structures_LinkedList
as of the 0.1.0-alpha release. Go forth and create linked lists!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="file-marc"&gt;
&lt;h2&gt;File_MARC&lt;/h2&gt;
&lt;p&gt;On the library geek front, I pushed out File_MARC 0.0.9 via the PEAR
Proposal process today. This new release repairs another embarassing
problem that I originally blamed for breaking down during our Hackfest
work. You see, I hadn't touched emilda.org's php-marc core routine for
parsing MARC files, and it happened to call &lt;tt class="docutils literal"&gt;file()&lt;/tt&gt; to read the
entire target MARC file into memory as an array of lines before enabling
you to start parsing the individual MARC records. That's nifty if you
just want to count all of the MARC records in a given file, but it
doesn't scale up very well when you've brought, oh, a single file with a
half-million MARC records to parse. In fact, PHP kind of gets very upset
with you.&lt;/p&gt;
&lt;p&gt;The solution, as Dan Chudnov suggested on the fly during my Hackfest
interview, was to go with streams. It turns out that
&lt;tt class="docutils literal"&gt;stream_get_line()&lt;/tt&gt; was perfectly suited to the task: given a file
pointer, it sucks in the contents of that file until it reaches a
maximum length or a given string, then waits until you ask it to suck in
the next chunk of data. It was a breeze to convert the code to the
following approach:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
const END_OF_RECORD = &amp;quot;\x1D&amp;quot;;const MAX_RECORD_LENGTH = 99999;...$this-&amp;gt;source = fopen($source, 'rb');...$record = stream_get_line($source, MAX_RECORD_LENGTH, END_OF_RECORD);
&lt;/pre&gt;
&lt;p&gt;That change solved the &amp;quot;big file&amp;quot; problem, but as File_MARC represents
MARC records as linked lists (fields) containing linked lists
(subfields), the big file issue was just covering up the slightly more
twisted memory managment issue in the Structures_LinkedList library.
However, after those two changes, testing out the same code I had
hastily written at Hackfest shows that the script to parse a 512M MARC
file now never takes more than 0.8% of my system memory.&lt;/p&gt;
&lt;p&gt;So, library geeks -- this is a last call for significant comments on the
File_MARC API. In a couple of days, I plan to put this proposal up for
a vote to become an official PEAR package. Of course, if you want to
test it out right now, I have high confidence in the code: you can grab
it from &lt;a class="reference external" href="http://marc.coffeecode.net"&gt;marc.coffeecode.net&lt;/a&gt;. And yes,
if you visit that site, I &lt;em&gt;am&lt;/em&gt; grasping for the worst throwback HTML
design award ever, thank you very much!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2006-10-19:&lt;/strong&gt; Correct XHTML syntax errors. Heh.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 18 Oct 2006 03:15:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-10-18:/double-barreled-php-releases.html</guid><category>PHP</category><category>Coding</category><category>PHP</category></item><item><title>Feeling sorry for our vendor</title><link>https://coffeecode.net/feeling-sorry-for-our-vendor.html</link><description>&lt;p&gt;So I'm here in rainy Alabama (the weather must have followed me from
Ottawa) taking a training course from our ILS vendor. I'm getting some
disturbing insights into the company that are turning my general state
of disbelief at the state of the system that we're paying lots of money
for into pity. Here are four observations that moved me towards
sympathy:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Our training room is in the basement of their head quarters. They
have several floors upstairs with nice windows overlooking a historic
section of town that could set up a nice positive association with
our vendor, but now, whenever I think of our vendor, I shall forever
be thinking of windowless rooms with exposed brick walls.
Claustrophobia anyone?&lt;/li&gt;
&lt;li&gt;The “server rack” in the training room is actually the same kitchen
hardware from Home Depot that we use at home.&lt;/li&gt;
&lt;li&gt;The framed letters and emails of praise and thanks from customers
took a steep nosedive around 2000 and seem to have trailed off
completely as of 2002.&lt;/li&gt;
&lt;li&gt;Perhaps worst of all, the workstations outside the training room
provided for customers to check their email are ancient 80486
machines with that peculiar yellow plastic that you only get after
years of aging under fluorescent lights. Another association is that
the technology that we have purchased from this vendor largely seems
to be stuck in the age of the 80486 processor.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The marketing people at our vendor should be taking a long, hard look at
the kind of impression they're making on their customers who have spent
large sums of money to come and visit their headquarters for training.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 16 Oct 2006 18:14:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-10-16:/feeling-sorry-for-our-vendor.html</guid><category>misc</category><category>Coding</category></item><item><title>Backlog of Access 2006 notes</title><link>https://coffeecode.net/backlog-of-access-2006-notes.html</link><description>&lt;p&gt;Following on my plea for &lt;a class="reference external" href="/archives/89-Calling-for-access-to-all-future-Access-presentations.html"&gt;access to Access
presentations&lt;/a&gt;,
I'm in the process of posting the notes I took at the CARL instutitional
repository pre-conference and Access 2006. I probably should have posted
these to a wiki so that others (like the presenters) could go ahead and
make corrections/additions, but I've only got a few minutes before my
training course starts.&lt;/p&gt;
&lt;p&gt;Note that while a good chunk of the content was transcribed directly
from the presenters' words or presentations (therefore all of this is
posted under dubious copyright/licensing conditions), I can't guarantee
that I actually recorded anything correctly. So, read on, and if
something seems outrageously dumb, it's probably my brain acting as the
filter for the speaker that introduced the dimness.&lt;/p&gt;
&lt;p&gt;First up: the CARL Institutional Repository Preconference!&lt;/p&gt;
&lt;p class="rubric" id="leslie-weir-chief-librarian-ottawa-university"&gt;Leslie Weir, Chief Librarian, Ottawa University&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;CARL - 27 academic research libraries + various government libraries&lt;/li&gt;
&lt;li&gt;CARL Institutional Repository Project was founded in 2003; several
CARL members were planning an IR and decided to work together&lt;/li&gt;
&lt;li&gt;2004 - SFU created the harvester&lt;/li&gt;
&lt;li&gt;Metadata working group -- to improve quality of metadata in
repositories&lt;/li&gt;
&lt;li&gt;Marc Jordan (SFU) highly involved in harvester and metadata
initiative&lt;/li&gt;
&lt;li&gt;Open Access News: many mandates either implemented or in the works
for researchers around the globe; self-archiving is likely to become
a normal part of research activities&lt;/li&gt;
&lt;li&gt;1/2 of CARL members have IRs up and running; 1/4 are planning one&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="david-moorman-senior-policy-advisor-for-sshrc-council-responsible-for-archiving-policy-at-sshrc"&gt;David Moorman, Senior Policy Advisor for SSHRC council,
responsible for archiving policy at SSHRC&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Recently submitted final draft of a 22-country OECD policy on access
to research data&lt;/li&gt;
&lt;li&gt;One way of moving into international arena is through open access to
research data&lt;/li&gt;
&lt;li&gt;SSHRC has embraced open access in principle&lt;/li&gt;
&lt;li&gt;SSHRC serves 18,000 researchers on a regular basis, moving from
principle to action is hard&lt;/li&gt;
&lt;li&gt;Support for research journals vs. the role of the article as a unit
in IRs&lt;/li&gt;
&lt;li&gt;How do you take the publicly funded research in the universities and
make it available to __anyone__, regardless of who they are or
where they are?&lt;/li&gt;
&lt;li&gt;Canada has one of the most highly educated populations with 1/4 of
the population having a university degree&lt;/li&gt;
&lt;li&gt;Issues about research data respecting anonymity of research subjects&lt;/li&gt;
&lt;li&gt;Citation analysis does not work very well for social sciences or
humanities -- SSHRC wants better measures of the effectiveness of
their funding for research outcomes&lt;/li&gt;
&lt;li&gt;In 1991, physical scientists already had access to full-text on disc,
while humanities were far behind -- more a measure of institutional
barriers than technology&lt;/li&gt;
&lt;li&gt;David wants to ensure that SSHRC helps libraries&lt;/li&gt;
&lt;li&gt;SSHRC currently has no policy on IR; some simplistic approaches
suggest that IRs should be mandated (ignoring all backlash); however,
the policy on open access is the measure that is required to help
work out the details that may result in IRs or open access journals&lt;/li&gt;
&lt;li&gt;Size of a grant is currently based on revenue, but that means that
publication in an open access forum is a problem -- currently working
on correcting that issue&lt;/li&gt;
&lt;li&gt;SSHRC is not attached to an insitution, they deal with researchers
and the support system that researchers have; vs. CARL which is
highly institutional, with universities that are provincially
regulated and funded -- so SSHRC can't reach beyond its jurisdictions&lt;/li&gt;
&lt;li&gt;Of 94 Canadian universities, there are fewer than half that have an
IR running or in planning stage; until that number is closer to 80%
the remaining resistance to providing resources will not fall&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="what-can-carl-do-build-on-other-experiences-out-there"&gt;What can CARL do? Build on other experiences out there&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;California is building one common system (roughly comparable to all
of Canada)&lt;/li&gt;
&lt;li&gt;European system development -- the DRIVER project will build a test
case for an IR across 10 universities in 8 countries to try solving
the technology, political, and cultural issues for all of those at
once&lt;/li&gt;
&lt;li&gt;Public knowledge project -- peers of John Melanski(?) -- originally
funded by SSHRC&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="facing-the-social-barriers"&gt;Facing the social barriers&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Real challenge is to face the social barriers; faculty are both
highly conservative and radical; change to an IR messes with
prestige, faculty advancement and tenure -- you're messing with the
way things have been for decades&lt;/li&gt;
&lt;li&gt;Use of longitudinal data sets in research data centers has been a
remarkable success -- on any given day 1000 researchers are using the
research data centers (up from 7 or 8 researchers at StatsCan a few
years ago)&lt;/li&gt;
&lt;li&gt;SSHRC is going to attempt to pull in the 5,000 papers per year that
these researchers generate from the social statistics, beginning with
the Universite de Montreal&lt;/li&gt;
&lt;li&gt;No objection in principle, but highly skeptical that this is going to
be successful because these are highly skilled researchers who know
what signing an exclusive copyright transfer agreement means&lt;/li&gt;
&lt;li&gt;Working with Copyright Canada to handle the copyright issues; after a
first round of letters to researchers asking them to allow SSHRC to
add their paper to the IR -- expect 80% to say they can't because
they have signed the exclusive agreement; second round of letters to
publishers asking for their permission -- if no success, SSHRC will
put up a Creative Commons License on the front page of the RDC to
place intense pressure on the journals&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="two-problems-with-sshrc-or-cisti-creating-their-own-ir"&gt;Two problems with SSHRC or CISTI creating their own IR&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Treasury board regulations govern transfer payments from feds to
individuals ang groups&lt;/li&gt;
&lt;li&gt;Grants can only be placed on eligibility and intent, not on
post-grant conditions -- so SSHRC and CISTI cannot require funded
researchers to make papers available via open access means; they're
working on getting the government to fix this limitation but SSHRC or
CISTI are relatively low priority&lt;/li&gt;
&lt;li&gt;Under the Official Languages Act all federally published documents
are supposed to be available in both languages -- but this would
require translating approximately 15,000 objects per year -- in
SSHRC's lawyers' opinion, it would be okay unless somebody
complained, at which point it would be brought to the floor of the
House of Commons for debate, with no predictable result&lt;/li&gt;
&lt;li&gt;IDRC is not in the same boat for some reason&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="can-sshrc-support-irs-directly-with-grants"&gt;Can SSHRC support IRs directly with grants?&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;SSHRC used to support libraries, largely for special collection
development projects, but haven't since the early 90's&lt;/li&gt;
&lt;li&gt;One problem is the direct funding of 300 million from feds to
universities, which is meant to cover all of the direct costs of
research at the universities&lt;/li&gt;
&lt;li&gt;Could be funded directly from SSHRC budget, but demand outstrips
supply (SSHRC can support 40% of its community, NSERC supports 60% of
its community) and researchers would not support cutting their
funding to build an IR instead&lt;/li&gt;
&lt;li&gt;Best approach is to convince researchers to contribute to the
virtuous circle to make it better for all&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="conclusions"&gt;Conclusions&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;In David's opinion, IRs have the best opportunity to succeed,
compared to open access journals -- given that Yahoo and Google
understand that content is critical to their business models (think
about the 1.6 billion for YouTube vs. the cost of something like
Elsevier?)&lt;/li&gt;
&lt;li&gt;Back-issue digitization project for Canadian Historical Association
has been a struggle: finding the right people to do the project, the
right technology, working out the loss of revenue from sales of print
materials&lt;/li&gt;
&lt;li&gt;SSHRC needs to hear from universities about the problems we face and
where we want to go&lt;/li&gt;
&lt;li&gt;Problems like University of Manitoba, who want to add confidential
research data sets to their IR -- RDC enforces confidentiality
through law (RDC users are considered StatsCan employees and face
massive fines / jail time) -- but how do you enforce that for a
university community? Came up as a requirement for the SSHRC grant to
make the data set available in an IR&lt;/li&gt;
&lt;li&gt;Since 1990, SSHRC has had a policy that as a funding requirement you
must make your data set available in one of 10 IRs; however, outside
of fellowships, about 4,000 data sets since then were funded but only
10 (no zeros missing!) have complied with that regulation&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="beyond-institutional-and-disciplinary-boundaries-the-role-of-open-access-repositories"&gt;Beyond Institutional and Disciplinary Boundaries: The Role
of Open Access Repositories&lt;/p&gt;
&lt;p class="rubric" id="leslie-chan-u-of-t-scarborough-professor-of-new-media-studies-and-on-the-steering-committee-of-the-american-anthropological-associations-portal-anthrosource"&gt;Leslie Chan, U of T &amp;#64; Scarborough, Professor of New Media
Studies, and on the steering committee of the American
Anthropological Associations portal Anthrosource&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Lessons learned from implementing an IR, working with colleagues on
the benefits of participating in an Open Access Repository (&lt;em&gt;OAR&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Anthrosource has gone purely digital thanks to a Mellon grant,
offering a repository with value-added tools to maintain revenue from
individual and institutional memberships rather than just content&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="value-added-tools"&gt;Value added tools&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Membership fee now offers access to all publications, rather than
simply one print journal as it used to be&lt;/li&gt;
&lt;li&gt;Adding third-party journals as well&lt;/li&gt;
&lt;li&gt;AnthroSource repository will be &amp;quot;Web 2.0&amp;quot;: wiki, blog, tagging
folksonomies, RSS feeds, community reviewing tools, just-in-time
publication tools (e.g. community repository will hold papers in the
marginal sections of community until sufficient number of papers is
met and a new issue is published), data sets, data mining texts that
go back a hundred years now that retro-digitization project is
complete&lt;/li&gt;
&lt;li&gt;Why deposit in AnthroSource? One should deposit in home institution
as well, but AnthroSource has members internationally and many
researchers either don't have or don't trust their home institution&lt;/li&gt;
&lt;li&gt;Oddly enough, AAA staff signed a letter against federal research open
access proposal, while steering committee (academics) are laying out
a strategy towards open access&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="open-source-open-repositories"&gt;Open source, open repositories&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;KMDI is an interdisciplinary &amp;quot;virtual institute&amp;quot; across the three
campuses of U of T, considered an intellectual&lt;/li&gt;
&lt;li&gt;Two years ago U of T provost funded Project OS|OR (open source open
repositories) to discover and build linkages between OS and OR
projects at U of T&lt;ul&gt;
&lt;li&gt;Discovered many professors were editing open access journals&lt;/li&gt;
&lt;li&gt;Open source shares many of the same goals as open access --
building community, not for profit, collaboration&lt;/li&gt;
&lt;li&gt;Existing open source projects at U of T include:&lt;ul&gt;
&lt;li&gt;ATutor - a free competitor to Blackboard available in 22
languages&lt;/li&gt;
&lt;li&gt;epresence - for archiving digital video, such as lectures by
Michael Geist&lt;/li&gt;
&lt;li&gt;TSpace - an instance of DSpace&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="opportunities-for-increased-access-via-electronic-resources"&gt;Opportunities for increased access via electronic resources:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;integrate knowledge from diverse locations and sources&lt;/li&gt;
&lt;li&gt;infrastructure for an expanded view of scholarly communication&lt;/li&gt;
&lt;li&gt;new services and business models&lt;/li&gt;
&lt;li&gt;implementation of Semantic Web technologies&lt;/li&gt;
&lt;li&gt;E-Science (UK), E-Research (Australia), Cyberinfrastructure (US) are
large-scale compute clusters that also make research results
available -- includes humanities and social sciences&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="oai-pmh-model-separates-data-and-service-providers"&gt;OAI-PMH model separates data and service providers:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Content deposit -&amp;amp;rt; Metadata generation -&amp;amp;rt; Aggregation -&amp;amp;rt;
End-user services&lt;/li&gt;
&lt;li&gt;An IR is a &amp;quot;place for people to put their stuff&amp;quot; -- search included
with DSpace, for example, is rudimentary, but value-added services
such as citation linking, use frequency statistics, etc -- which
could be &amp;quot;deluxe&amp;quot; options for revenue generation&lt;/li&gt;
&lt;li&gt;&amp;quot;In using the term 'open access', we mean the free availability of
peer-reviewed literature on the public internet...&amp;quot;
(&lt;a class="reference external" href="http://www.soros.org/openaccess/read.shtml"&gt;http://www.soros.org/openaccess/read.shtml&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="open-access-enables"&gt;Open access enables:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;New &amp;quot;business&amp;quot; and funding models (author or &amp;quot;input&amp;quot; pay model, which
seems more suitable for hard sciences and not humanities --
subscription model effectivly prevents readership)&lt;/li&gt;
&lt;li&gt;Disaggregation of &amp;quot;content&amp;quot; and &amp;quot;services&amp;quot;&lt;/li&gt;
&lt;li&gt;Post-publication evaluation and impact (we know that ISI analysis is
bad for humanities, but continue to use it anyways; one hope is that
with openly accessible content new and better models of impact
analysis will arise)&lt;/li&gt;
&lt;li&gt;Integration of open source software and open standards:&lt;ul&gt;
&lt;li&gt;URI (new proposal available at &lt;a class="reference external" href="http://uri.org"&gt;http://uri.org&lt;/a&gt; to provide permanent
URLs)&lt;/li&gt;
&lt;li&gt;OpenURL vs DOI (DOI is a proprietary model that is a pay service:
$10,000 to enter, $0.10/click, completely unacceptable for
developing countries)&lt;/li&gt;
&lt;li&gt;CrossRef (relies on DOI for analysis)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Linking of research and education: breaks down the wall imposed by
federal funding for research vs. provincial funding for education&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="what-authors-need"&gt;What authors need:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Support for new modes of authorship and dissemination of data (video
ethnographies with GB of data, archaeological 3D scans with GB of
data -- how do you store, make this accessible, and make it
persistent through different formats over time?)&lt;/li&gt;
&lt;li&gt;Data base storage&lt;/li&gt;
&lt;li&gt;Media integration&lt;/li&gt;
&lt;li&gt;Long term archiving (one of Leslie's colleagues lost 30 years of
research data when one building was being 'tidied up' and the boxes
ended up in Michigan landfill)&lt;/li&gt;
&lt;li&gt;Linking research and teaching&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="tspace"&gt;TSpace:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;UofT decided to make communities very loosely organized; departments,
or collaborative groups of researchers (including researchers from
other institutions) -- requirement for entry is showing institutional
affiliation&lt;/li&gt;
&lt;li&gt;Using their IR for purposes other than preprint/postprint:&lt;/li&gt;
&lt;li&gt;Supporting local journals (Women's Health and Urban Life: separate
presentation for the journal, but pulls the article from the
repository)&lt;/li&gt;
&lt;li&gt;Supporting international journals (archiving Bioline International,
defunct journals)&lt;/li&gt;
&lt;li&gt;Enabling digital scholarship (new forms of publications that are
digital-only)&lt;/li&gt;
&lt;li&gt;Easily found in Google Scholar (gives repositories priority ranking,
also enables citation analysis -- especially with defunct journals
that suddenly become available agian)&lt;/li&gt;
&lt;li&gt;Curriculum vitae (ability to link directly to full-text
publications); University of Rochester builds online CVs for their
faculty&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://romeo.eprints.org"&gt;http://romeo.eprints.org&lt;/a&gt; lists journals and associated policies that
allow authors to post their publications; however, it tends to lag
behind the actual journal policies -- good starting point though&lt;/li&gt;
&lt;li&gt;International outreach: Ptolemy project for east African surgeons
gives them access to UofT's e-journals, and these surgeons and their
students are in turn being encouraged to write research papers that
will be deposited in the IR&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="a-review-of-content-recruitment-strategies"&gt;A review of content recruitment strategies&lt;/p&gt;
&lt;p class="rubric" id="tim-mark-executive-director-of-carl"&gt;Tim Mark, Executive Director of CARL&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://www.ifla.org"&gt;http://www.ifla.org&lt;/a&gt; holds the original paper on which this
presentation is based&lt;/li&gt;
&lt;li&gt;International review of strategies performed in 2005&lt;/li&gt;
&lt;li&gt;Researchers are enthusiastic in principle, but in practice the
follow-through has not been there when voluntary compliance is relied
upon&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="what-excites-researchers-is-not-what-excites-librarians"&gt;What excites researchers is not what excites librarians:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Impact&lt;/li&gt;
&lt;li&gt;Visibility&lt;/li&gt;
&lt;li&gt;Reputation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Therefore we need to speak the same language as the research community
(permanent URLs and digital preservation doesn't work)&lt;/p&gt;
&lt;p class="rubric" id="carl-ir-project-launched-in-2002"&gt;CARL IR Project launched in 2002:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Purpose: To enhance the visibility and impact of Canadian scholarly
output and Canadian research institutions by building a number of
robust, content-rich university-based repositories that will form
part of a larger federation of institutional repositories worldwide.&lt;/li&gt;
&lt;li&gt;Assigned Kathleen Shearer as the part-time coordinator of the CARL IR
Project&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="carl-ir-project-activities"&gt;CARL IR Project Activities:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;CARL Harvester (&lt;a class="reference external" href="http://carl-abrc-oai.lib.sfu.ca"&gt;http://carl-abrc-oai.lib.sfu.ca&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Developing a metadata profile for Canadian IRs&lt;/li&gt;
&lt;li&gt;Advocacy - presentations to faculty and administration, CIHR will be
announcing a new open access policy&lt;/li&gt;
&lt;li&gt;Meetings and conferences&lt;/li&gt;
&lt;li&gt;Annual survey&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="carl-members-implementation-status-as-of-june-2006"&gt;CARL Members' implementation status as of June 2006:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;14 working&lt;/li&gt;
&lt;li&gt;2 pilot&lt;/li&gt;
&lt;li&gt;3 planning&lt;/li&gt;
&lt;li&gt;-- so 19 out of a possible 30 members&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="types-of-content-recruitment-strategies"&gt;Types of content recruitment strategies:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Carrot (voluntary)&lt;/li&gt;
&lt;li&gt;Stick (mandatory policy)&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="types-of-content-recruitment-strategies-ii"&gt;Types of content recruitment strategies (II):&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;General promotional strategies&lt;/li&gt;
&lt;li&gt;Depositing services (staff to assist deposit of materials)&lt;/li&gt;
&lt;li&gt;Content harvesting (staff track down already-published materials and
arrange for their deposit)&lt;/li&gt;
&lt;li&gt;Researcher bibliographies (included in the repository)&lt;/li&gt;
&lt;li&gt;University policies (either encouragement or mandatory)&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="case-studies"&gt;Case studies:&lt;/p&gt;
&lt;p class="rubric" id="dare-dutch"&gt;DARE (Dutch)&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Funded in 2002, in 2004 began content recruitment strategy across
their 16 partner universities&lt;/li&gt;
&lt;li&gt;Each researcher was given a personal page with photo, biography,
awards, research publications, and a link to their own home page&lt;/li&gt;
&lt;li&gt;All work done by DARENet staff&lt;/li&gt;
&lt;li&gt;Outcome: 40000 articles, 26000 in full text&lt;/li&gt;
&lt;li&gt;Very expensive, no indications yet whether faculty will deposit on
their own&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="glasgow-eprints-service"&gt;GLASGOW ePrints Service:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;In the UK, all researchers &lt;strong&gt;must&lt;/strong&gt; make bibliographic information
available&lt;/li&gt;
&lt;li&gt;Script developed to harvest full-text versions of those articles&lt;/li&gt;
&lt;li&gt;Still requires staff time to check copyright&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="qut-eprints-queensland"&gt;QUT ePRINTS (Queensland):&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Policy 'formally requests' that all researchers deposit articles in
the IR when copyright allows&lt;/li&gt;
&lt;li&gt;Estimate that 45% of research output is being captured&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="cern-document-server"&gt;CERN Document Server:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Mandatory policy for research staff to deposit publications IF the
researcher allows it&lt;/li&gt;
&lt;li&gt;Library works very hard to find and deposit publications&lt;/li&gt;
&lt;li&gt;Only 1500 out of 60000/year are directly from the researcher&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="conclusions-1"&gt;Conclusions:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Ego massaging works:&lt;ul&gt;
&lt;li&gt;Bio page&lt;/li&gt;
&lt;li&gt;Ensure researchers know that Google Scholar etc. indexi and rank
repositories highly&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Speak the language of the research faculty&lt;/li&gt;
&lt;li&gt;Staff will have to find and deposit items, assign metadata, and check
copyright agreements&lt;/li&gt;
&lt;li&gt;CARL has done a large amount of work with Creative Commons Canada to
make a Canadian version of the Creative Commons license available --
this may help assuage&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="content-recruitment-is-expensive"&gt;Content recruitment is expensive:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;QUT estimates $10,000 / researcher, $50 / document until process
becomes standardized -- then estimate is $10 / document&lt;/li&gt;
&lt;li&gt;Mandated archiving is most effective means, but even then staff time
is required and compliance is still relatively low (~50%)&lt;/li&gt;
&lt;li&gt;Sustainable solutions require long-term commitments: current CARL
experience is one person a couple of days every week or so, but this
is not expected to be a sustainable approach&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="advocacy-materials"&gt;Advocacy materials:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;CARL will try to make theirs updated and available&lt;/li&gt;
&lt;li&gt;SPARK web site has open-access presentation templates&lt;/li&gt;
&lt;li&gt;University of Calgary repository contains the CARL community
documents, should have fruitful results under a CC license&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="carlcore-metadata-application-profile"&gt;CARLCore Metadata Application Profile&lt;/p&gt;
&lt;p class="rubric" id="mark-jordan-simon-fraser-university-head-of-systems"&gt;Mark Jordan, Simon Fraser University, Head of Systems&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Mark guides the development of the CARL Harvester, has conducted an
analysis of the quality of the metadata that has been harvested
(available in &lt;em&gt;Library Hi-Tech&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="background-on-the-application-profile"&gt;Background on the Application Profile&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;CARL Harvester was launched June 2004 primarily as a search engine
for the aggregated metadata from the participating repositories, uses
the Public Knowledge Project (PKP) Metadata Harvester software&lt;/li&gt;
&lt;li&gt;The CARL Harvester is open to all Canadian scholarly repositories,
not just CARL members, as long as that repository implements OAI-PMH&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="the-problem"&gt;The Problem&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;As more records have been added, reports of increased dissatisfaction
with search capabilities (performance and reliability) -- metadata
added to institutional records was not being found in CARL Harvester&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="the-solutions"&gt;The Solutions&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Improve the software -- ended up being a complete rewrite of the
harvester, now at version 2&lt;/li&gt;
&lt;li&gt;Develop an application profile to ensure that the metadata that is
harvested is actually consistent and useful&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="application-profile"&gt;Application profile&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&amp;quot;A set of metadata elements, policies, and guidelines defined for a
particular application or implementation&amp;quot; (e.g. aggregation)&lt;/li&gt;
&lt;li&gt;Defines best practices appropriate to the application -- goal was to
define something both implementable and useful&lt;/li&gt;
&lt;li&gt;CEN (European Committee for Standardization) CWA 14855&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="goals"&gt;Goals:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Develop a profile that:&lt;ul&gt;
&lt;li&gt;Improves quality of aggregated metadata&lt;/li&gt;
&lt;li&gt;Is practical&lt;/li&gt;
&lt;li&gt;Is voluntary&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Benefits include:&lt;ul&gt;
&lt;li&gt;Better centralized services&lt;/li&gt;
&lt;li&gt;Streamlined local practices&lt;/li&gt;
&lt;li&gt;Guidance for new repositories (avoiding some of the problems with
defaults shipped in common repository software)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="development-process"&gt;Development Process&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Analyze the metadata from June 2005; the data was harvested with a
Perl script to avoid quantum effect on the metadata that the
Harvester introduces&lt;/li&gt;
&lt;li&gt;Develop use cases and functional requirements&lt;/li&gt;
&lt;li&gt;Survey other application profiles&lt;ul&gt;
&lt;li&gt;ePrints UK &amp;quot;Using Simple Dublin Core to Describe ePrints&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;ARROW Discovery Service Harvesting Guide&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Proposal delivered October 2006&lt;/li&gt;
&lt;li&gt;Deadline for comments: November 10, 2006&lt;/li&gt;
&lt;li&gt;Final release (including French translation): January 31, 2007 --
will include IR platform-specific implementation guidelines&lt;/li&gt;
&lt;li&gt;Ongoing: CARLCore Level 2 (extend qualified Dublin Core to offer
richer services than unqualified Dublin Core)&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="carlcore"&gt;CARLCore&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Document is a standard application profile&lt;ul&gt;
&lt;li&gt;Rationale&lt;/li&gt;
&lt;li&gt;General principles and recommendations&lt;/li&gt;
&lt;li&gt;Entries for each uDC element&lt;/li&gt;
&lt;li&gt;Appendices:&lt;ul&gt;
&lt;li&gt;Implementation guidelines&lt;/li&gt;
&lt;li&gt;Sample records&lt;/li&gt;
&lt;li&gt;Relationship between CARLCore and the CARL Harvester (Harvester
2 enables dynamic interface widgets for scoping searches with
the side effect of showing a given institution's level of
consistency)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="carlcore-level-1"&gt;CARLCore Level 1&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Uses only unqualified Dublin Core&lt;/li&gt;
&lt;li&gt;Goal is to make use of the DC elements in OAI as consistent as
possible&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="sample-elements-of-carlcore-level-1"&gt;Sample elements of CARLCore Level 1&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;strong&gt;Identifier&lt;/strong&gt; - an unambiguous reference to the resource at the
originating repository (must point to the metadata records at the
originating repository, not the document itself)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Source&lt;/strong&gt; - points back to the original source from which the
digital version was derived&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Type&lt;/strong&gt; - genre of the work&lt;ul&gt;
&lt;li&gt;Somewhat controversial, as it requires agreement on a controlled
vocabulary&lt;/li&gt;
&lt;li&gt;Equivalence for translations is necessary&lt;/li&gt;
&lt;li&gt;One hope would be to provide a type mapping between institution's
local types and the controlled vocabulary exposed by the CARL
Harvester interface&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="carlcore-level-2"&gt;CARLCore Level 2&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Will add elements to CARLCore Level 1&lt;/li&gt;
&lt;li&gt;Provide faceted discipline browsing (Using OAI sets? Using one or
more non uDC elements?)&lt;/li&gt;
&lt;li&gt;May focus on disciplinary archives&lt;/li&gt;
&lt;li&gt;Other features leading to &amp;quot;added value&amp;quot; for users&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="implementation-issues"&gt;Implementation issues&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Legacy metadata -- thousands of existing records&lt;/li&gt;
&lt;li&gt;Conflicts with local IR metadata practice&lt;/li&gt;
&lt;li&gt;Inflexible OAI gateways in IR platforms&lt;/li&gt;
&lt;li&gt;Lack of tools to test compliance; should be fairly simple to adapt
Mark's Perl &amp;quot;raw&amp;quot; harvester as a feedback mechanism&lt;/li&gt;
&lt;li&gt;Yes, using CARLCore is optional... but there is strength in numbers&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="to-do-list"&gt;To do list&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Take advantage of PKP Harvester's data normalization features to map
between local and CARL ontologies&lt;/li&gt;
&lt;li&gt;CARLCore Level 2&lt;/li&gt;
&lt;li&gt;Stay current and collaborate with IR platforms&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="panel-discussion-on-encouraging-increased-submissions-to-irs"&gt;Panel discussion on encouraging increased submissions to IRs&lt;/p&gt;
&lt;p&gt;Focus on solving the problems of researchers, and slide the
institutional repository in the back door (&amp;quot;by the way, we would like to
include a copy of your paper(s) in our IR&amp;quot;)&lt;/p&gt;
&lt;p class="rubric" id="uoft-tspace-experience"&gt;UofT TSpace experience&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;13,000 archived journal articles, 1,000 self-submitted items&lt;/li&gt;
&lt;li&gt;Current human resources: .8 admin, 1 system programmer for open
conference system, open journal system, and the DSpace instance&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="some-moves-uoft-made-to-make-faculty-happier"&gt;Some moves UofT made to make faculty happier:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Implemented full-text search instead of just metadata search&lt;/li&gt;
&lt;li&gt;Making IR visible to Google (better ranking in&lt;/li&gt;
&lt;li&gt;Addressing metadata quality concerns of subject librarians&lt;/li&gt;
&lt;li&gt;Ability to restrict document to UofT but decided to enforce metadata
access (required a lot of work to implement and not a single document
has actually chosen yet)&lt;/li&gt;
&lt;li&gt;Batch importing&lt;/li&gt;
&lt;li&gt;RefWorks import / export&lt;/li&gt;
&lt;li&gt;Full support models for high-profile collections&lt;/li&gt;
&lt;li&gt;&amp;quot;Home Depot&amp;quot; model for departmental hires for work-study students to
assist with IR submissions (interview questions, regular meetings for
training)&lt;/li&gt;
&lt;li&gt;Attempt to help self-archiving using publisher's PDF (to avoid issues
with getting the wrong version of the PDF in the repository)&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="failures-of-the-repository-at-u-of-t"&gt;Failures of the repository at U of T:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Inflexible modification (vs. Yahoo! &amp;quot;My Profile&amp;quot; model of being able
to change info at any time)&lt;/li&gt;
&lt;li&gt;Require collective agreement with publishers to use publisher's PDF
(faculty very rarely reserve the author's version)&lt;/li&gt;
&lt;li&gt;Statistics on a per-item basis in a scalable way&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="sfu"&gt;SFU:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Customized interface between open conference system and DSpace to
enable batch imports (conference submissions required presenters to
sign off on copyright clearance and permission to add paper to SFU
repository)&lt;/li&gt;
&lt;li&gt;ETDs are merged from DSpace URL in spreadsheet to thesis metadata and
generating MARC records that are then loaded into the library catalog&lt;/li&gt;
&lt;li&gt;Student self-submission process for all metadata is foundering on
their assignement of call number, so process has been adjusted to
include reference librarians in process; technical services is
actually happier because theses are extremely specialized&lt;/li&gt;
&lt;li&gt;Grad students paid by faculty member but working with library hasn't
worked out well so far (conflicting priorities means that meeting the
exacting metadata standards often doesn't happen) - in case where
faculty member was retroactively adding his body of work to the IR&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="copyright-issues"&gt;Copyright issues:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;For theses, SFU students sign a license that includes the ability of
SFU to add the thesis to the repository;&lt;/li&gt;
&lt;li&gt;SFU faculty members sign a standard license as well&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="reason-for-choosing-dspace"&gt;Reason for choosing DSpace:&lt;/p&gt;
&lt;p class="rubric" id="sfu-1"&gt;SFU&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;DSpace is free&lt;/li&gt;
&lt;li&gt;Cost for customization (if you do any) may be less than the cost of
annual maintenance fee for commercial software&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="uoft"&gt;UofT:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;when TSpace was set up, there weren't many commercial options that
were viable;&lt;/li&gt;
&lt;li&gt;ability to customize for user demands has been nice;&lt;/li&gt;
&lt;li&gt;might choose a hosted solution given the expense involved in hosting
their own if starting over but proprietary options don't offer
anything startlingly better than TSpace&lt;/li&gt;
&lt;li&gt;would never pay to have their own theses hosted&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="waterloo"&gt;Waterloo&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Examined DSpace capabilities vs. their own in-house ETD solution,
found that DSpace offered everything for ETDs and the additional
objects they were interested in making available&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="preservation"&gt;Preservation:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;DSpace includes a checksum to enable you to confirm that the file now
in the repository == the file that was originally ingested&lt;/li&gt;
&lt;li&gt;DSpace allows you to configure &amp;quot;supported formats&amp;quot; indicating which
formats you're prepared to support in your repository -- so you can
specify PDF archival, and prevent PowerPoint&lt;/li&gt;
&lt;li&gt;UofT has created practical scanning standards for their departments&lt;/li&gt;
&lt;li&gt;UofT: &amp;quot;You can't guarantee that the PowerPoint file will be useful
500 years from now, but you can guarantee that it won't be useful if
you don't submit it to the repository at all.&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="rubric" id="including-the-ir-in-the-realm-of-article-abstracts-and-indexes"&gt;Including the IR in the realm of article abstracts and
indexes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Added the IR to the Library home page as an equal partner&lt;/li&gt;
&lt;li&gt;Adding theses to the IR and MARC records in the ILS gave SFU major
buy-in&lt;/li&gt;
&lt;li&gt;UofT also adds records to the ILS (and there is some discussion about
making those records available through Scholar's Portal)&lt;/li&gt;
&lt;li&gt;UofT: Including the IR in the federated search (Ontario's take is
that first step is local loading, second step is federated search)&lt;/li&gt;
&lt;li&gt;Waterloo: quoting Lorcan Dempsey, federated search as it is does not
work because it takes too long; indexing the sources first, then
doing the search locally across those indexed sources provides the
speed that is required for a good search&lt;/li&gt;
&lt;/ul&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 16 Oct 2006 13:29:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-10-16:/backlog-of-access-2006-notes.html</guid><category>Libraries</category><category>Coding</category></item><item><title>Calling for access to all future Access presentations</title><link>https://coffeecode.net/calling-for-access-to-all-future-access-presentations.html</link><description>&lt;p&gt;It's a bit late now, but as the guy in the corner with the clicky
keyboard desperately trying to take notes during the presentations (when
not stifling giggles and snorts from #code4lib), I would be a lot more
relaxed if I was certain that the presentations were going to be made
accessible through the Access 2006 Web site.&lt;/p&gt;
&lt;p&gt;So, I would like to put forward the following motion:&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;p&gt;Be it resolved that the organizers of future Access conferences
shall ask speakers to make a copy of their presentations available
under an open access license.&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;Do I have a seconder? Discussion?&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sat, 14 Oct 2006 12:50:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-10-14:/calling-for-access-to-all-future-access-presentations.html</guid><category>Libraries</category><category>Coding</category></item><item><title>Secretssss of Free WiFi at Access 2006</title><link>https://coffeecode.net/secretssss-of-free-wifi-at-access-2006.html</link><description>&lt;p&gt;The bulk of the Access 2006 conference is being held at a
&lt;em&gt;hotel-that-shall-not-be-named-for-reasons-that-will-become-apparent-shortly&lt;/em&gt;
in Ottawa this week. I was at the CARL Pre-Conference on Institutional
Repositories today and a kind man (Wayne Johnston from the University of
Guelph) tipped me off that the hotel's pay-for-wifi system is a little
bit flawed: they redirect any port 80 (plain old HTTP) requests to their
“You must pay for Internet service” page, but any other TCP/IP ports are
wide open -- including port 443 (HTTPS).&lt;/p&gt;
&lt;p&gt;So if you use a service like Gmail, just go directly to the
&lt;a class="reference external" href="https://mail.google.com"&gt;https://mail.google.com&lt;/a&gt; URL and you'll be fine. Or if you run your sshd
service on port 443, then you're golden. Free wifi! Thanks
&lt;em&gt;hotel-that-shall-not-be-named-for-fear-of-killing-the-goose-that-laid-the-golden-egg&lt;/em&gt;
for going through the motions of running a pay-for-wifi service but not
really following through -- I can assure you that we all appreciate it!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 10 Oct 2006 23:49:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-10-10:/secretssss-of-free-wifi-at-access-2006.html</guid><category>Libraries</category><category>Coding</category></item><item><title>Laundry list systems librarians</title><link>https://coffeecode.net/laundry-list-systems-librarians.html</link><description>&lt;p&gt;On the always excellent &lt;strong&gt;Techessence&lt;/strong&gt;, Dorothea Salo posted &lt;a class="reference external" href="http://techessence.info/node/71"&gt;Hiring a
systems librarian&lt;/a&gt;. The blog post
warned against libraries who put together a “laundry-list job
description” for systems librarians:&lt;/p&gt;
&lt;blockquote&gt;
Sure, it'd be nice to have someone who can kick-start a printer, put
together a desktop machine from scraps, re-architect a website, do
Gantt charts for the library's technology projects, write a MARC-DC
crosswalk, performance-tune the ILS database, and build a custom IM
bot. It won't happen.&lt;/blockquote&gt;
&lt;p&gt;Oddly enough, that's a pretty close description of what's on my plate
these days.&lt;/p&gt;
&lt;p&gt;Certainly my duties include:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;em&gt;Kick-starting printers&lt;/em&gt;. Well, at least in helping staff add a
printer to their XP profile.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Putting together machines from scraps&lt;/em&gt;. If one of the staff member's
machines dies, I've been known to cobble together a new machine from
the remnants of a few old machines if a suitable replacement isn't
ready and waiting. It seems like a waste let staff experience
downtime.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Re-architect a website&lt;/em&gt;. That's actually been my highest priority
for the last few months. Granted, I'm part of a good team, but most
of the structural &amp;amp; navigational principles came from my keyboard. As
part of the follow-through, I've been asked to provide a
visualization of the web site -- hence &lt;a class="reference external" href="/archives/85-Why-quasi-open-source-doesnt-work.html"&gt;my previous
post&lt;/a&gt;
that was tangentially asking for good sitemap visualization software.
It looks like &lt;a class="reference external" href="http://www.graphviz.org/"&gt;Graphviz&lt;/a&gt; might be my
answer, by the way.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Do GANTT charts for the library's technology projects&lt;/em&gt;. No, not yet.
Right now the GANTT chart would show one primary resource for every
technology project. The problem I'm facing at the moment is
prioritizing and tracking them all in an open fashion that can be
understood by all stakeholders. I started trying to do this with a
wiki, but an install of something like
&lt;a class="reference external" href="http://trac.edgewall.org"&gt;Trac&lt;/a&gt; is probably in the works.
Anything to help consolidate all of those emails, phone calls, and
slips of paper has got to help avoid important items from slipping
off the plate -- not to mention making it painfully evident just how
many requests for changes are in the queue.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Write a MARC-DC crosswalk&lt;/em&gt;. Well, no, but I certainly have plenty of
MARC transformations on my plate. We haven't updated several
important union databases with our holdings for a while, and those
databases all seem to require different input formats, so this is a
high-priority too. Apparently a PAPYRUS-to-MARC conversion is in the
future as well. It's a good thing that my
&lt;a class="reference external" href="http://marc.coffeecode.net"&gt;File_MARC&lt;/a&gt; project is coming along
nicely.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Performance-tune the ILS database&lt;/em&gt;. Well, heh, our ILS doesn't allow
for much performance-tuning -- but happily that's not a problem at
the moment. However, every other customization and administration
matter, from user accounts with bounced emails to creating look and
feels for the OPAC for each of the dozen partners in our consortium
is my bailiwick. I think my major accomplishment so far has been to
stabilize the ILS so that we haven't had any crashes for the past
three months (&lt;strong&gt;knock wood&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Build a custom IM bot&lt;/em&gt;. Well no, this won't be happening anytime
soon -- but in a university with so many remote and off-campus
students, I believe it would be very useful to provide virtual
reference. So this one tugs at my heart strings.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On top of that, I have collection development, reference, and occasional
public service duties. Oh yes, and writing circulation policies and
procedures for big new projects like our loaner laptop program. &lt;em&gt;Et,
bien sur, je doit apprendre franÃ§ais&lt;/em&gt; as a condition for obtaining
tenure, along with the scholarly publications expected of us academic
types.&lt;/p&gt;
&lt;p&gt;So it's one big old workload that I face every day, and sometimes it's
overwhelming. But it's also quite invigorating--I get direct contact
with our patrons and the users of our systems, as a result--and probably
quite necessary given the size of our institution. Every librarian has
to play multiple roles on our team to offer the level of service that we
feel is necessary for a university. And it does give me a darned good
basis for understanding the complexity of how all of the different parts
of the library work together: a true systems view, where “systems” is
about more than just technology.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 26 Sep 2006 12:07:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-09-26:/laundry-list-systems-librarians.html</guid><category>Libraries</category><category>Coding</category></item><item><title>BEARS! BEARS IN MY NEIGHBOURHOOD!!!</title><link>https://coffeecode.net/bears-bears-in-my-neighbourhood.html</link><description>&lt;p&gt;Every once in a while I'm allowed to get hysterical, okay?&lt;/p&gt;
&lt;p&gt;According to &lt;a class="reference external" href="http://cbc.ca/sudbury"&gt;CBC Radio in Sudbury&lt;/a&gt;, there's a
150 kilogram black bear prowling around our neighbourhood, tearing apart
garbage and causing great concern for residents. We've brought it on
ourselves, though. Apparently my neighbours are so filthy that they've
been leaving out garbage that is much more alluring than the bait that
the ministry of natural resources uses for their traps.&lt;/p&gt;
&lt;p&gt;I, for one, welcome our large, furry, omnivorous new overlords. Although
I might reconsider some of the late-night walks that take me through
wooded paths that offer almost no visibility. Or I'll bring a flashlight
and some jingly bells.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Large black bear" src="http://upload.wikimedia.org/wikipedia/en/thumb/0/02/Black_bear_large.jpg/200px-Black_bear_large.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Image courtesy of `Wikipedia &amp;lt;http://wikipedia.org&amp;gt;`__. Yeah, big
surprise...&lt;/em&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 25 Sep 2006 20:36:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-09-25:/bears-bears-in-my-neighbourhood.html</guid><category>Family</category><category>Personal</category></item><item><title>Why quasi-open source doesn't work</title><link>https://coffeecode.net/why-quasi-open-source-doesnt-work.html</link><description>&lt;p&gt;A few minutes ago, I gave you some &lt;a class="reference external" href="/archives/84-Why-open-source-works....html"&gt;examples of how open source
works&lt;/a&gt;.
Now I'm going to give you an example of how quasi-open source doesn't
work.&lt;/p&gt;
&lt;p&gt;Looking for a tool to help visualize the development of our library's
new Web site, I came across a reference in the &lt;a class="reference external" href="http://www.cybergeography.org/atlas/web_sites.html"&gt;Atlas of
Cyberspaces&lt;/a&gt; to:&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;p&gt;a neat Java application for dynamically constructing interactive
visual maps of Web sites&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;The “neat Java application” was called
&lt;a class="reference external" href="http://www.alphaworks.ibm.com/tech/mapuccino"&gt;Mappucino&lt;/a&gt;. The tool
was released through IBM's
&lt;a class="reference external" href="http://www.alphaworks.ibm.com"&gt;alphaWorks&lt;/a&gt;, a site that I had long
(and wrongly) associated with as IBM's location for open source
projects. One must read the fine print, however; the following sentences
from &lt;a class="reference external" href="http://www.alphaworks.ibm.com/about"&gt;About alphaWorks&lt;/a&gt;
summarize alphaWork's purpose for existence:&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;p&gt;Since 1996, alphaWorks has succeeded in helping IBM connect with
innovative developers to lead the development of promising new
standards, products, and open-source technology.&lt;/p&gt;
&lt;p&gt;To date, forty percent of technologies posted to the alphaWorks Web
site have been incorporated into IBM products or licensed to
third-party developers.&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;So, other than the remarkably commercial bent of the goals for the site
projects, what surprised me was the text displayed when I followed the
link to &lt;a class="reference external" href="http://www.alphaworks.ibm.com/tech/mapuccino"&gt;Mappucino&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
Mapuccino has been retired.&lt;/blockquote&gt;
&lt;p&gt;Yup, that's it. No link to a download. No source code. Just the bios of
six researchers who probably laboured over this project for months--not
to mention any input from the “innovative developers” from outside
IBM--only to see it disappear without a trace. Even if the tool was
stuck deeply in JRE 1.3 (or earlier) code, somebody might have been
willing to pick it up and update it for JRE 1.5. Blah. Boo. Based on
this experience, I wouldn't suggest volunteering too much time to help
out with an alphaWorks project. Real open source has an openly
accessible source code repository with an accompanying open source
license and a genuine commitment behind it to make the code available.&lt;/p&gt;
&lt;p&gt;My quest for a good Web site visualization tool continues, by the way.
Recommendations are welcomed.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 19 Sep 2006 23:27:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-09-19:/why-quasi-open-source-doesnt-work.html</guid><category>misc</category><category>Programming languages</category></item><item><title>Why open source works...</title><link>https://coffeecode.net/why-open-source-works.html</link><description>&lt;p&gt;A couple of recent examples in the PHP community have reaffirmed my
faith in the open source development model: the PEAR proposal process,
and the delay in the 5.2.0 release.&lt;/p&gt;
&lt;p class="entrytitle rubric" id="example-1-phps-pear-project"&gt;Example #1: PHP's PEAR project&lt;/p&gt;
&lt;p&gt;Over the past month I've been working on a couple of
&lt;a class="reference external" href="http://pear.php.net"&gt;PEAR&lt;/a&gt; proposals
(&lt;a class="reference external" href="http://pear.php.net/pepr/pepr-proposal-show.php?id=443"&gt;File_MARC&lt;/a&gt;
and
&lt;a class="reference external" href="http://pear.php.net/pepr/pepr-proposal-show.php?id=444"&gt;Structures_LinkedList&lt;/a&gt;).
When the first proposals went public, I waited anxiously for floods of
positive feedback and constructive criticism. Heh. After a few days of
near-silence, I waited anxiously for any feedback, then poked around on
IRC (#pear on EFNet) to see if anybody was awake. Well, it was the end
of summer in the northern hemisphere, so perhaps I was being a bit too
hasty...&lt;/p&gt;
&lt;p&gt;The feedback started coming in, and it was right on target. Comments
ranged from improving the coding style to stay in step with PEAR coding
standards, to name changes to allow other (as-yet non-existing)
variations on my packages to co-exist in the future, to possible
improvements (&lt;a class="reference external" href="http://www.php.net/manual/en/language.oop5.typehinting.php"&gt;type
hinting&lt;/a&gt;,
yeah!) and plain old corrections (object reference hangovers from an
earlier PHP 4.x cut at the same project). As a result, I am much more
confident in my code, and I'm almost ready to put the proposals out for
a vote. So thank you, PEAR folk, for using your eyeballs and brains to
surface the bugs and help me improve my code.&lt;/p&gt;
&lt;p class="entrytitle rubric" id="example-2-phps-filter-extension"&gt;Example #2: PHP's filter extension&lt;/p&gt;
&lt;p&gt;The release manager was just about to roll what he called the final
release candidate of a brand new minor version increment of PHP -- 5.2.0
-- when I noticed that the function names for the new core functionality
of the &lt;a class="reference external" href="http://php.net/filter"&gt;filter&lt;/a&gt; extension didn't follow the
PHP coding standards. Given that this is an extremely important addition
to PHP (it helps application developers improve the security of apps), I
sent an email to the PHP internals mailing list asking whether the
function names should be changed to follow the standard, provided a
suggested set of changes, and offered to create a patch that would
implement the changes. The suggested set of changes gave people
something concrete to chew on, and although the suggestions will
probably be thrown overboard in favour of shorter names, it served to
illustrate the problem to light.&lt;/p&gt;
&lt;p&gt;In a commercial organization, such a late request for changes to enhance
usability in the long term [STRIKEOUT:wouldn't stand a hope in hell]
would probably be filed under &amp;quot;future considerations&amp;quot;. But in the open
source world, even the co-founder of one of the commercial entities that
depends on PHP-related services for revenue recognized the problem and
recommended delaying the release until the problem was resolved. At this
point, it looks like the primary filter developers are close to
agreement. In the end, I believe common sense will prevail over the
imposition of an arbitrary deadline. Props to the PHP developers.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 19 Sep 2006 22:56:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-09-19:/why-open-source-works.html</guid><category>Software Freedom</category><category>PHP</category></item><item><title>Another day, another 5K</title><link>https://coffeecode.net/another-day-another-5k.html</link><description>&lt;p&gt;Lynn and I ran a 5K (the &lt;strong&gt;Ramsey Lake Tour&lt;/strong&gt;) this morning with Amber
in the stroller. The route was pretty much the same route I take to
work, so we opted to walk over to the University for the event. Of
course, we were running late thanks to Missy Amber so we walked at a
fast enough pace that Lynn ended up getting a bit of a stitch in her
side on the way over. It was a little more of an intense warm-up than we
had anticipated.&lt;/p&gt;
&lt;p&gt;The race itself went well; we decided to make it a true family event and
stayed together throughout the entire event. Even though half the course
was over a gravel path, the stroller didn't hold us back much at all; we
posted a time of 30:19, which isn't too bad given that my previous 5k
result &lt;em&gt;sans&lt;/em&gt; stroller was only about 2.5 minutes faster. Lynn and I
finished well back in our categories, but I'm sure Amber took first
place in the infant category! She certainly seemed to enjoy being in
motion; her only complaints came when we were standing still waiting for
the race to begin, or hanging out post-race shooting the breeze with
some of the other participants.&lt;/p&gt;
&lt;p&gt;The 5k run, and corresponding 5k brisk walk to/from the venue, wasn't
enough though. This afternoon, I helped our friends Andrea and Richard
move a few large, heavy objects into their new house just a few blocks
down the street. One of the objects was a restaurant-quality stove/oven
that would have been an absolute bear to move via the brute force
method, but happily Richard had rented a dolly that made light work out
of the job. That being said, I suffer from the delusion that as long as
I'm wearing gloves I can lift anything... and I was wearing my gloves.
So it's just as well that I didn't have to put that delusion to the
test.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sun, 10 Sep 2006 23:22:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-09-10:/another-day-another-5k.html</guid><category>misc</category><category>Personal</category></item><item><title>AfterMARC: Morphing, murdering, or massaging the MARC format</title><link>https://coffeecode.net/aftermarc-morphing-murdering-or-massaging-the-marc-format.html</link><description>&lt;p&gt;&lt;strong&gt;Update 2007/01/02:&lt;/strong&gt; The wiki you are looking for is at
&lt;a class="reference external" href="http://futurelib.pbwiki.com/"&gt;http://futurelib.pbwiki.com/&lt;/a&gt; -- sorry for not updating this earlier.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2006/09/10:&lt;/strong&gt; I have been informed that while my effort was
appreciated, Karen and Eric Lease Morgan are working on setting up their
own wiki instead. So please ignore this message. I will update this
space once their wiki is unveiled.&lt;/p&gt;
&lt;p&gt;[STRIKEOUT:In response to &lt;a class="reference external" href="http://listserv.loc.gov/cgi-bin/wa?A2=ind0609&amp;amp;L=marc&amp;amp;T=0&amp;amp;P=4047"&gt;Karen Coyle's
post&lt;/a&gt;
to the MARC listserv in which she said she was &amp;quot;trying to set up some
organized wiki space where we can get some of the great ideas coming out
into some kind of shape&amp;quot; about a proposal for a NISO standard that would
potentially augment or replace MARC, I created
&lt;a class="reference external" href="http://aftermarc.coffeecode.net"&gt;aftermarc.coffeecode.net&lt;/a&gt;.]&lt;/p&gt;
&lt;p&gt;[STRIKEOUT:I hate to see the early energy for these kinds of proposals
get derailed by basic infrastructure hurdles and I happen to be pretty
good at setting up and maintaining a wiki. Given my own experiences as a
systems librarian and with &lt;a class="reference external" href="http://marc.coffeecode.net"&gt;parsing the MARC format in
PHP&lt;/a&gt;, I am really interested in helping
to turn vague dissatisfaction into concretely documented requirements,
so voila: the &lt;a class="reference external" href="http://aftermarc.coffeecode.net"&gt;AfterMARC&lt;/a&gt; wiki!]&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 08 Sep 2006 04:09:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-09-08:/aftermarc-morphing-murdering-or-massaging-the-marc-format.html</guid><category>Libraries</category><category>Libraries</category></item><item><title>File_MARC and Structure_Linked_List: new alpha releases</title><link>https://coffeecode.net/file_marc-and-structure_linked_list-new-alpha-releases.html</link><description>&lt;p&gt;Earlier in the month I asked for feedback on the &lt;a class="reference external" href="/archives/78-Super-alpha-MARC-package-for-PHP-comments-requested.html"&gt;super-alpha MARC
package&lt;/a&gt;
for PHP. Most of the responses I received were along the lines of
&amp;quot;Sounds great!&amp;quot; but there hasn't been much in the way of real
suggestions for improvement. In the mean time, I've figured out (with
&lt;a class="reference external" href="http://pooteeweet.org"&gt;Lukas&lt;/a&gt; and
&lt;a class="reference external" href="http://blog.thepimp.net"&gt;Pierre's&lt;/a&gt; assistance, &lt;em&gt;merci beaucoup&lt;/em&gt;) how
to make use of PEAR::ErrorStack for error handling. I've also decided to
split my linked-list-in-PHP implementation into a separate package;
first, because it might be useful for someone else; second, because as a
separate package the PHP gurus that care deeply about things like
returning references can go over it with a fine-toothed comb without
having to worry about all of the MARC stuff.&lt;/p&gt;
&lt;p&gt;So, once again I'm interested in your comments -- but this time I'm
looking for comments on two different packages:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://marc.coffeecode.net/Link/"&gt;Structure_Linked_List&lt;/a&gt; -
implements a doubly-linked list&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://marc.coffeecode.net/"&gt;File_MARC&lt;/a&gt; - reads and generates
MARC formatted records&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next steps are to build real PEAR packages for these beasties and put
together PEAR proposals for consideration of the community... but don't
feel that you have to wait until the proposal to offer any suggestions!&lt;/p&gt;
&lt;p&gt;I will put up &lt;strong&gt;.phps&lt;/strong&gt; versions of the examples for each package, but
for some reason I'm having problems getting my host to accept my
.htaccess file... look for an update on the respective pages after I
contact my hosting support team.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 25 Aug 2006 21:52:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-08-25:/file_marc-and-structure_linked_list-new-alpha-releases.html</guid><category>Libraries</category><category>Coding</category><category>PHP</category></item><item><title>Cultural influences: young child's fragile eggshell mind</title><link>https://coffeecode.net/cultural-influences-young-childs-fragile-eggshell-mind.html</link><description>&lt;p&gt;Amber watched her first film in a real theatre(&lt;strong&gt;*1*&lt;/strong&gt;) this morning.
She had slept straight through &lt;em&gt;You, Me, and Dupree&lt;/em&gt; two weeks ago, but
insisted on paying attention to today's showing of &lt;em&gt;Talladega Nights:
The Legend of Ricky Bobby&lt;/em&gt;. Maybe it was the NASCAR action, maybe it was
the redneck hollering; maybe it was the unrelenting onslaught of product
placements, or maybe it was simply Wil Ferrell's kind, gentle, and let's
not kid ourselves, downright handsome face blown up to twenty-foot
dimensions, but she was riveted to that screen.&lt;/p&gt;
&lt;p&gt;I'm glad we're taking the time to expose her to these cultural
influences early; so many people waste their children's crucial first
formative months with mindless noise like Beethoven. When my darling
baby girl grows up, she's going to be able to say with pride &amp;quot;My daddy
done taken me to that there picture show when I was nothing but a squirt
in a diaper -- soooo-EEEEE!&amp;quot;.&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;em&gt;A local cinema offers a bi-weekly screening of a popular film in a
baby-friendly environment. They turn down the volume, leave the
lights on dim, provide changing tables and diapers, and nobody minds
if the babies cry or if moms are breastfeeding during the flick. It's
pretty cool. If the gods are kind, maybe
`Beerfest &amp;lt;http://imdb.com/title/tt0486551/&amp;gt;`__ will be up for
viewing in a month or two...&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 23 Aug 2006 00:12:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-08-23:/cultural-influences-young-childs-fragile-eggshell-mind.html</guid><category>misc</category><category>Amber</category></item><item><title>I'm not as sore as I thought I would be</title><link>https://coffeecode.net/im-not-as-sore-as-i-thought-i-would-be.html</link><description>&lt;p&gt;Although my fingers are pretty sore after writing this entry.&lt;/p&gt;
&lt;p&gt;Over the weekend, our household participated in the &lt;a class="reference external" href="http://www.trisportcanada.com/orillia.php"&gt;Orillia Triathlon,
Duathlon and Try-a-Tri&lt;/a&gt;. A
couple of weeks ago, Lynn decided that she was ready to jump back into
the triathlon waters with a Try-a-Tri (350m swim, 10k bike, 2.5k run).
The Orillia event also happened to be the provincial athletic
championships where triathlon clubs could compete for an infusion of
cash based on their participation rate, and given that this was the
&lt;a class="reference external" href="http://nickelcitytri.com"&gt;Nickel City Triathlon Team&lt;/a&gt;'s first year
of existence Lynn wanted to support our team and ensure that Sudbury
would be known for more than mining. &lt;em&gt;Aside&lt;/em&gt;: our team actually came in
third for participation points at the event, so we won $300 for the club
-- yay team!&lt;/p&gt;
&lt;p&gt;Lost in the wake of her enthusiasm, I decided a few days before the
event to join her: partially because I wanted to support the team in
more than just a &amp;quot;I paid my membership fee and got a Web site going&amp;quot;
way; partially because I wanted to cheer Lynn on; and partially because
I totally screwed up the date that our friends were hosting a going-away
barbecue and I suddenly found myself with a free day. So, because
someone was going to have to look after Amber during Lynn's race, I was
going to have to choose either the sprint triathlon or duathlon for my
own event. Not having put much time into swimming practice over the
summer (and by &amp;quot;not much time&amp;quot; I meant three swims of over 250m), and
knowing that I would have to breast stroke the swim portion and face the
ridicule of my fellow athletes, I opted for the duathlon instead.&lt;/p&gt;
&lt;p&gt;The sprint duathlon is a 2k run, 32k bike, 7k run event. I decided to
view the first run as a warm-up, bear down for the bike, and pray for
divine intervention to carry me through the final run. You see, given
that I'm a member of a triathlon team, I have put some time into
running... but not much recently. And my biking, well, I can't say that
I've had any structured practice at distances beyond riding to the
supermarket to pick up some groceries. I did complete a 24k mountain
biking race a few weeks ago, which at least gave me confidence that I
could make it through a slightly longer road race. But I'll be honest,
here: I would normally view a 7k run as a complete workout. Tacking it
on to the end of what I would view as a complete bike workout was pretty
scary.&lt;/p&gt;
&lt;p&gt;Anyways, enough preamble. How did the whole thing go down? It started
with Lynn, Amber, and I all waking up at about 4:00 am and not being
able to get back to sleep, thanks to Amber's continuous restlessness for
the next hour and a half. Of course, as soon as we gave up hope and
started putting our things together for the event, she was very happily
snoozing away again. Maybe she just wanted to have the whole bed to
herself.&lt;/p&gt;
&lt;p&gt;By 7:15 we had arrived in Orillia at Couchiching Park. The sky was
overcast, there was a steady breeze, and it was cool: about 15 degrees
at that point. Perfect weather for me. My race time was 8:20, and
despite Nature's urgent call I took a quick glance at the l-o-n-g
portable washroom lines and decided to shut down my innards, rack my
bike and complete the registration forms first. It was a vain hope that
the lines were a fluke and would be gone by the time that I was ready.
Instead, I ended up finding a normal park washroom and waited in line
for another fifteen minutes: thankfully the race start had been delayed
by fifteen minutes, so I wasn't panicking about time. It was a very
communal event: only one of the three stalls had toilet paper left, so
the person that landed that stall got to pass TP to the stalls on either
side. By the time that I got out of that miserable but necessary
situation, I had less than ten minutes until my race began... no time
for last-minute adjustments of the bike, or for ensuring that I was
properly hydrated, or even for checking the race course layouts. Before
Lynn realized that the duathlon was starting, I was lined up in the
first wave -- then I was off and running.&lt;/p&gt;
&lt;p&gt;That first 2k warm-up run? Nasty. I think my body was still a little
shocked by the lack of sleep and the overly-long wait for the washrooms.
Each kilometre seemed way longer than it should have been. By the time I
got to the transition zone, a few duathletes from the second wave that
started two minutes after mine had already passed me. But that was cool:
my goal was to complete the race. I had no illusions about how my
fitness level compared with the average participant in the sprint &lt;img alt=":-)" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;p&gt;I was in and out of the much-feared transition zone (the area where you
change into your biking shoes and helmet, grab your bike, and run out to
the start of the bike course) in under two minutes. I say &amp;quot;much-feared&amp;quot;
because I had heard horror stories from other first-time triathletes and
duathletes about the level of confusion they experienced in the
transition. To be honest, I don't get it: as long as you remember where
you racked your bike, you just run over there, do your thing, and run
back out. No big deal. Maybe you just have to be mentally prepared to do
this in the middle of a race with hundreds of other people rushing
around at the same time. Maybe I have no mind, and therefore don't
understand why that's a scary thing.&lt;/p&gt;
&lt;p&gt;It was great to see Lynn and Amber on the sidelines, cheering me on. In
previous events I've always felt embarassed to have people cheering for
me when I know I'm in the middle or bottom of the pack, but I realized
that I should probably stop taking myself so damned seriously. Yeah, I
know, duh... but it was really nice to see them there, and to hear Lynn.
Amber was apparently babbling away too; Lynn claimed she started just as
I came into sight, so who knows? I also heard Andrea from the triathlon
team cheering me on. Maybe there's something to this team thing after
all!&lt;/p&gt;
&lt;p&gt;It was a relief to get on the bike. I was looking forward to grabbing a
bottle of water that I thought I had read would be available at various
points throughout the bike course, rehydrating, and putting in the best
leg of my race. Unfortunately, the first 5k felt horrible. I think part
of that was the fatigue and low bodily fluids; part of it was that
Orillia is a pretty hilly place, and much of the first 5k was uphill;
and part of it was that I hadn't practiced for a real race situation on
my bike all summer. Hmm. After the 10k mark, however, I settled into a
good rhythm and felt very relaxed with my pace. The course winds through
some beautiful farmland, and it was honestly enjoyable. In fact, I was
in such a good mood that I was actually jovially congratulating the two
or three other cyclists I saw on mountain bikes or with luggage racks.&lt;/p&gt;
&lt;p&gt;Ah, did I mention my bike? In the midst of some pretty serious road
bikes (100mm aerodynamic tires, carbon frames, aero bars, and other
thousand dollar options), I was one of about five people on a mountain
bike. Not just any mountain bike, either: this is my 8 year old, steel
frame, front suspension Oryx Equipe 2000 that I converted into a
commuting bike (with the addition of a luggage rack) a couple of years
ago. To be fair, it does have semi-slick tires on it: but I also noticed
just before racking my bike that the cable for the front derailleur had
frayed to the point of just a couple of strands holding the derailleur
in place.&lt;/p&gt;
&lt;p&gt;You know how in old TV shows where the hero would be handing onto a rope
over a cliff's edge and the rope is slowly popping fibers? Yeah, that
was my derailleur cable. As I didn't have time to fix that pre-race, I
knew that I was going to be stuck in the middle ring for the entire 32k.
That's not bad for me when I'm hill-climbing; I've been blessed with
thunderous thighs that can power up hills (and indeed, I passed many a
labouring fancy road-bike cyclist on my way up hills), but the downside
is that I was forced to merely coast down the hills rather than
switching into my top gear and keeping my cadence up to make the most of
inertia.&lt;/p&gt;
&lt;p&gt;During the final few kilometres I saw one crash victim huddled in an
emergency blanket waiting for the ambulance to arrive. It was a sobering
moment. I realized that I really shouldn't take any part of the race for
granted. Next time, I'll make the time to do some proper maintenance on
my bike; it would completely suck to have my brakes seize up at the
bottom of a hill and go from hoping to post a decent time to hoping to
get out of the hospital without a permanent injury.&lt;/p&gt;
&lt;p&gt;Oh, and that water that I was going to pick up on the bike portion to
rehydrate myself with in preparation for the run? Never happened. I
don't know where I got the crazy idea that somebody would be handing out
water on the bike section, but I was wildly wrong about that. During one
of those jovial moments, one of my fellow cyclists took pity on me and
handed me his sport drink, so I had a few squirts of that around the 20k
mark. It's a good thing that I've had plenty of camel training on my
bike in past years before getting spoiled with a hydration pack a few
years back. It's also a good thing that the sun stayed hidden behind the
clouds. In the end, I finished the bike portion of the race averaging
26k/hr on my poor old bike -- and you know what? I'll take some pride in
that.&lt;/p&gt;
&lt;p&gt;Ah, I also had some disgusting sport gel packets to give me energy for
the race; Clif's &amp;quot;Razz&amp;quot; and &amp;quot;Mango&amp;quot; flavours. They tasted like jam that
was super-saturated with sugar. I had one packet during the first 5k,
and another packet around the 25k mark. I think they helped; I imagine
that the toast I had downed almost three hours earlier was long gone by
the time the race rolled around. So, yay sports gel packets for energy!
Boo sports gel packets for taste.&lt;/p&gt;
&lt;p&gt;The transition from bike to run went relatively smoothly, although I
lost a few precious seconds as I retied the laces on my running shoes
and wound up taking just over two minutes in the transition. Elite
racers get through the transition zone in under a minute and every
second counts, but I'm not fooling myself here: I've got a lot more work
to do on the running side of things before I have to worry about shaving
a minute or two off my transition time.&lt;/p&gt;
&lt;p&gt;The final 7k run was, well, brutal. For me, it wasn't so much of a run,
as it was a run, then walk a little bit, then run some more, then walk a
bit more. I got to watch many, many people in their 50's and 60's blow
past me on the run, but I did manage to chase down the 71 year old guy
and leave him in my dust. There was water every kilometre on the run,
but at that point I didn't really care; after the first cup of water in
the first kilometre, it wasn't going to make enough of a difference for
the rest of the race.&lt;/p&gt;
&lt;p&gt;In the end, I finished the whole course in 2:12:36 -- that was 120/144
overall, and 27/29 in my age/sex category. Had I shaved off three
seconds somewhere, I would have caught the next person in my category...
damn, maybe those shoelaces &lt;em&gt;do&lt;/em&gt; did count! My split times were: 2k run
- 11:10, 32k bike - 1:16:05, 7k run - 41:20.&lt;/p&gt;
&lt;p&gt;So that's the lengthy story of my race. I completed my first sprint
duathlon, and completed my first brick workout at the same time. I've
got some numbers to compare my future performance with, and some
motivation to stop letting those 40, 50, and 60-somethings pass me on
the runs. And I wasn't even the primary reason we were at the event...
but Lynn's story is going to have to wait, because let's face it, you
want to hear it and it deserves a front-page entry of its own: it is way
more impressive that she's been able to throw her hat back into the
triathlon ring so quickly after a C-section, and you want to know just
how well she did. Jeez, maybe there &lt;em&gt;is&lt;/em&gt; something to this whole &amp;quot;living
an active life style&amp;quot; thing?&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 22 Aug 2006 12:25:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-08-22:/im-not-as-sore-as-i-thought-i-would-be.html</guid><category>misc</category><category>Personal</category></item><item><title>Super-alpha MARC package for PHP: comments requested</title><link>https://coffeecode.net/super-alpha-marc-package-for-php-comments-requested.html</link><description>&lt;p&gt;Okay, I've been working on &lt;a class="reference external" href="http://marc.coffeecode.net"&gt;this project&lt;/a&gt;
(let's call it PEAR_MARC, although it's not an official PEAR project
yet) in my spare moments over the past month or two. It's a new PHP
package for working with MARC records. The package tries to follow the
&lt;a class="reference external" href="http://pear.php.net"&gt;PEAR project&lt;/a&gt; standards (coding, documentation,
error handlers, etc) in the hopes that, when I put a proposal forward,
it will be accepted as a true PEAR package. For now, I'm most interested
in getting feedback from coders for libraries on the usability of the
API that I've designed -- is it easy enough to use and does it offer the
functionality that you require for your day-to-day work?&lt;/p&gt;
&lt;p&gt;The core MARC decoding routine was taken from the
&lt;a class="reference external" href="http://php-marc.sf.net"&gt;php-marc&lt;/a&gt; package that Christoffer Landtman
coded for the &lt;a class="reference external" href="http://emilda.org"&gt;Emilda&lt;/a&gt; open source library
management system. The decoding routine was based on the algorithm
contained in Perl's MARC::Record package. Christoffer generously
relicensed php-marc under an LGPL license so that I could use it as the
basis of a (hopefully, eventually) official PEAR package. PEAR_MARC
itself will therefore be licensed under LGPL.&lt;/p&gt;
&lt;p&gt;Some of the major differences that users will see between php-marc and
PEAR_MARC are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;System requirements: php-marc requires PHP 4 or 5, while PEAR_MARC
requires PHP 5 due to my desire to offer a relatively clean OO
structure.&lt;/li&gt;
&lt;li&gt;API: php-marc was based closely on Perl's MARC::Record API, while
with PEAR_MARC I've created a new API from the ground up that is
hopefully cleaner, more intuitive where possible, and more
transparent where necessary&lt;/li&gt;
&lt;li&gt;Class hierarchy: php-marc offers one major class that contained all
of the methods, with different subclasses used as constructors for
different MARC sources (files, strings,
&lt;a class="reference external" href="http://php.net/yaz"&gt;YAZ&lt;/a&gt;). PEAR_MARC is designed with different
classes representing subfields, data fields, control fields, and
entire records, with just one class representing all MARC sources.&lt;/li&gt;
&lt;li&gt;Functionality: php-marc fields and subfields are based on arrays,
which results in some interesting limitations (for example, when you
add a subfield in php-marc it is always added to the end of the
existing subfields). PEAR_MARC is based on a linked list structure,
which enables the user to add fields and subfields at any point in
the list.&lt;/li&gt;
&lt;li&gt;Error handling: php-marc implemented warn() and croak() methods as a
clone of Perl's API. PEAR::MARC relies on PEAR_ErrorStack as a
standard that conforms to the PEAR project requirements.&lt;/li&gt;
&lt;li&gt;Performance: php-marc offers a class, MARC_Index, that claims to be
incredibly fast but which can only be used for read-only operations.
I haven't benchmarked PEAR_MARC yet, but I have to assume that it
will appear sluggish for read-only operations and would probably lag
php-marc in performance for operations that add, modify, or delete
subfields. It might be possible to create a class similar to
MARC_Index that offers read-only operations with the same API as
PEAR_MARC and simply make it an option passed in to the constructor.
At this point... not a priority.&lt;/li&gt;
&lt;li&gt;Tests: PEAR_MARC includes a number of unit tests that have already
been helpful in ensuring that the classes operate correctly. php-marc
currently offers no unit test suite; however, it is used in
production by emilda so it is arguably well-tested in practice &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can find the latest version of the PEAR_MARC package posted at
&lt;a class="reference external" href="http://marc.coffeecode.net"&gt;http://marc.coffeecode.net&lt;/a&gt;. Please append any comments as replies to
this post, or email me at &lt;a class="reference external" href="mailto:dan&amp;#64;coffeecode.net"&gt;dan&amp;#64;coffeecode.net&lt;/a&gt;.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 14 Aug 2006 18:23:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-08-14:/super-alpha-marc-package-for-php-comments-requested.html</guid><category>Libraries</category><category>Coding</category><category>PHP</category></item><item><title>Today's trivial tech tip: Getting RSS feeds from diaryland.com blogs</title><link>https://coffeecode.net/todays-trivial-tech-tip-getting-rss-feeds-from-diarylandcom-blogs.html</link><description>&lt;p&gt;diaryland.com is a hosting service for people interested in blogging
without worrying too much about the technical side of things. It still
exists because it predated blogger / blogspot's free services and
managed to attract a community consisting of some really great writers,
like my friend &lt;a class="reference external" href="http://coldandgray.diaryland.com"&gt;cloudy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The problem is that I have become a convert to reading via RSS feed
aggregators, and for the longest time I was perplexed that diaryland
didn't appear to offer an RSS feed. However, I recently discovered that
they do offer RSS; they just don't make it visible in any useful way.
So, the solution:&lt;/p&gt;
&lt;p&gt;If you are a diaryland blogger and you want to expose your RSS feed (not
as naughty as that might sound), add the following chunk of code to your
HTML template between the &amp;lt;head&amp;gt; ... &amp;lt;/head&amp;gt; tags:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;lt;link rel=&amp;quot;alternate&amp;quot; type=&amp;quot;application/rss+xml&amp;quot; title=&amp;quot;RSS feed&amp;quot;    href=&amp;quot;http://blogname.diaryland.com/index.rss&amp;quot; /&amp;gt;
&lt;/pre&gt;
&lt;p&gt;If you just want to add the RSS feed for a diaryland blog to your own
RSS feed aggregator, the URL is:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
http://blogname.diaryland.com/index.rss
&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Posted because diaryland doesn't appear to have published this info
anywhere on their own site, and **man*&lt;/em&gt; is it annoying to track
something like this down*.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Strict XHTML alert -- added the missing / in the &amp;lt;link&amp;gt; tag.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 04 Aug 2006 14:54:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-08-04:/todays-trivial-tech-tip-getting-rss-feeds-from-diarylandcom-blogs.html</guid><category>misc</category></item><item><title>Northern Ontario scenery</title><link>https://coffeecode.net/northern-ontario-scenery.html</link><description>&lt;p&gt;Just wanted to post a couple of pics we took during the past few weeks.&lt;/p&gt;
&lt;div class="serendipity_imageComment_left" style="width: 110px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/french_river.jpg"&gt;&lt;img alt="image0" src="/uploads/pics/french_river.serendipityThumb.jpg" style="width: 110px; height: 82px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Walkway over the French River&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;p&gt;About a half an hour south of Sudbury on highway 69 is the French River
information centre. The centre is brand new and boasts an impressive
display on the origins of the area and its importance as one of the
early routes for the fur trade in the 17th century before the Northwest
Trading Company asserted itself and redirected almost all trade through
Hudson's Bay instead (which pretty much relegated the French River
community to a well-regarded tourist area). Okay, so if history isn't
your thing then you simply have to be impressed with the view of the
French River itself. Well worth a twenty minute stop.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="serendipity_imageComment_left" style="width: 110px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/dragon_boat.jpg"&gt;&lt;img alt="image1" src="/uploads/pics/dragon_boat.serendipityThumb.jpg" style="width: 110px; height: 82px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Dragon boat races on Ramsey Lake&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Bell Park plays host to Sudbury's annual dragon boat racing competition.
We took Amber for a stroll on an intensely hot day along the boardwalk
that borders Lake Ramsey's western edge all the way from Science North
to Bell Park and, along with thousands of other souls seeking the
comfort of the beach, watched the colourful dragon boats vie for fame
and glory. Those poor paddlers must have been roasting in the sun. Parts
of Bell Park turned into a campground for the contestants, so at least
they had some respite under the tents when they weren't getting ready
for their next race. In the background, you can see some of the
Laurentian University campus buildings. I was / still am on parental
leave, and I must admit that on that beatiful day I didn't think about
work once.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="serendipity_imageComment_left" style="width: 110px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/leopard_frog.jpg"&gt;&lt;img alt="image2" src="/uploads/pics/leopard_frog.serendipityThumb.jpg" style="width: 110px; height: 82px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Change your spots?&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;p&gt;We have a few different kinds of frogs that visit our backyard; this
leopard frog is just one magnificent specimen. All of the shots of the
grey tree frogs that like to hang out on our deck have turned out fuzzy
so far, and I have only heard the spring peepers -- but I'm down with
anything that eats bugs. Particularly black flies and mosquitos. Hmm,
any chance that amphibians getting a taste of human blood second-hand
will suddenly develop an unslakable thirst for my crimson vitality? As
Mr. Bush said, bring'em on!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 03 Aug 2006 17:25:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-08-03:/northern-ontario-scenery.html</guid><category>misc</category><category>Personal</category></item><item><title>Admirers of the little one</title><link>https://coffeecode.net/admirers-of-the-little-one.html</link><description>&lt;p&gt;&lt;strong&gt;Dear Amber:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Little girl, you have a lot of people interested in seeing you; there is
no doubt that you are well-loved by friends and family.&lt;/p&gt;
&lt;div class="serendipity_imageComment_left" style="width: 220px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/amber/dennis.jpg"&gt;&lt;img alt="image0" src="/uploads/pics/amber/dennis.serendipityThumb.jpg" style="width: 110px; height: 82px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Great-grandpa, a.k.a. Dennis&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Your great grandpa travelled all the way from St. Catharines to see just
how poorly you're being treated here. You two had a lovely time
together, and you saved one of your best morning moods to curl up in his
arms in this photo.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="serendipity_imageComment_left" style="width: 220px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/amber/lynn_jama.jpg"&gt;&lt;img alt="image1" src="/uploads/pics/amber/lynn_jama.serendipityThumb.jpg" style="width: 110px; height: 82px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;No, Amber's neck is _not_ broken!&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Then there's Auntie Jama (on the left there, with you and Lynn): she
drove up from Barrie one morning just to visit with you for a couple of
hours, then drove all the way back that afternoon! That's love (well,
love, and a hectic schedule with work and buying a new home where you
are &lt;em&gt;absolutely&lt;/em&gt; going to be thrilled to visit in a couple of years--I
can already predict the tears that will flow every time we have to leave
Jama and Terry's place out in the country).&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="serendipity_imageComment_left" style="width: 220px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/amber/jason_kelly.jpg"&gt;&lt;img alt="image2" src="/uploads/pics/amber/jason_kelly.serendipityThumb.jpg" style="width: 110px; height: 83px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Yeah, they're a little too photogenic, if you ask me...&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Oh, and how about your Uncle Jason and Aunt Kelly? They were willing to
leave their beloved puppy Hanna behind for a weekend to spend some
quality time with you. Kelly pushed you in the stroller all the way to
Nepahwin beach and back, and we all did a lot of sight-seeing in the
Sudbury area (including the obligatory shot of the Big Nickel).&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="serendipity_imageComment_left" style="width: 220px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/big_nickel.jpg"&gt;&lt;img alt="image3" src="/uploads/pics/big_nickel.serendipityThumb.jpg" style="width: 110px; height: 82px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;&amp;quot;Uh, I think we're going to need a bigger binder to collect this here
nickel.&amp;quot;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="serendipity_imageComment_left" style="width: 110px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/amber/peppa_sloppy.jpg"&gt;&lt;img alt="image4" src="/uploads/pics/amber/peppa_sloppy.serendipityThumb.jpg" style="width: 110px; height: 82px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;She loves the Peppa Sloppy... a lot.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;p&gt;So how about just a simple shot of you to appease those who haven't been
able to make the trip (or who have, but haven't made it up for a while?)
The papparazzi are swarming, you might as well give in to the pressure.
Let's see if we can find some good killer cuteness shots... Thank you,
Colleen, for sending the killer cool environmentally friendly fair trade
Peppa Sloppy our way. Amber loves to have it tucked under her arm as she
naps, and she naps &lt;em&gt;a lot&lt;/em&gt;.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="serendipity_imageComment_left" style="width: 110px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/amber/belly_shot.jpg"&gt;&lt;img alt="image5" src="/uploads/pics/amber/belly_shot.serendipityThumb.jpg" style="width: 110px; height: 82px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Targeting... targeting...&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;p&gt;At almost three months, she's also impressively strong. Amber has been
able to lift her head since day one, and is constantly threatening to do
damage to our lips, chin, nose, or other soft squishy parts of our body
when she throws it around. In this shot, she's demonstrating her ability
to lie on her belly and check out the world around her. Tummy time is no
longer an automatic descent into frustration and tears. On the whole
strength thing: she has massive thighs, and can support a good chunk of
her weight on her legs. This leads us to the fear that she may learn to
walk before she can crawl, resulting in a mad dash to baby-proof our
house.&lt;/p&gt;
&lt;p&gt;Speaking of which, I rushed to install a baby gate at the top of our
stairs this weekend because Ian and Christine were visiting with Emma
(their 4 year old) and Maria (their 2 year old). Mental note for my
future self: even if it's late at night, you're tired, and there is no
good light in the area that you are working, use the level to ensure
that the latch side of the gate is level. And do it twice. Fortunately
(well, relatively fortunately), this installation was a temporary
measure anyways as the top of the stairs only has drywall on the wall
side. So I'm going to have to cut out the drywall to expose the studs,
install some two-by-fours between the studs as braces, and run another
two-by-four vertically between those horizontal braces to have a nice
solid place to mount the baby gate.&lt;/p&gt;
&lt;p&gt;But I have to wonder: the previous owners had a couple of daughters.
Were securely mounted gates at the top of stairs optional accessories in
the eighties? I wonder if they also had one of those crazy
walkers-on-wheels that were banned after the drug haze of the seventies
cleared up and people realized that those devices were a spectacularly
bad idea...&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 03 Aug 2006 16:29:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-08-03:/admirers-of-the-little-one.html</guid><category>Family</category><category>Amber</category></item><item><title>The rough beast slouches towards Lively</title><link>https://coffeecode.net/the-rough-beast-slouches-towards-lively.html</link><description>&lt;p&gt;On Canada Day, Lynn mentioned the Firecracker 5K race around 5:15 PM as
we were driving home from visiting Charlotte's family. Crazy,
spontaneous me hemmed and hawed about it for another 45 minutes while
ingesting a hot caramel sundae and a spoonful of my freshly made rhubarb
crumble, then decided to go for it. The race had a 7:00 PM start, so we
had to hightail it to make it on time. Fortunately we have two months of
battle-hardened experience packing Amber and the Chariot into the car
and hitting the road.&lt;/p&gt;
&lt;p&gt;On the drive into Lively, the storm clouds gathered and rain began to
fall. Not an auspicious beginning for the event, but the rain subsided
for the race itself, then doubled and redoubled itself into a full-on
lightning storm. Fireworks for this Canada Day were supplied by Mother
Nature.&lt;/p&gt;
&lt;p&gt;As for the race itself, I placed 85th out of 140 participants with a
time of 27:03 (yeesh). All three males in the 60+ age category kicked my
butt, but I left the 70+ guy in my dust. I have to admit that my stomach
really didn't feel great; next time, I'm going to forgo the pre-race ice
cream and rhubarb concoction. But hey, at least I posted a time for this
year: now that I've put that stake in the ground, I'm motivated to
return to a regular training routine and shave some minutes off my time.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Dan and Amber at the IncoWalden Firecracker 5K 2006" src="http://nickelcitytri.com/system/files?file=images/dan-amber-firecracker2006_0.jpeg" /&gt;&lt;/p&gt;
&lt;p&gt;The good news is that we've decided to make this an annual family event.
Next year Amber's doing the whole 5K in her stroller, and I'll have a
much better excuse for my dismal showing &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 07 Jul 2006 02:57:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-07-07:/the-rough-beast-slouches-towards-lively.html</guid><category>misc</category><category>Personal</category></item><item><title>Passing, brighter than ever before</title><link>https://coffeecode.net/passing-brighter-than-ever-before.html</link><description>&lt;p&gt;I found out yesterday that one of my colleagues, Alain Letourneau,
passed away overnight. He was just 41. He died of a brain hemorrhage
after he fell and banged his head while shopping at a local mall.&lt;/p&gt;
&lt;p&gt;The crazy thing is that nobody, including Alain himself, really expected
him to last to a ripe old age: he had been the recipient of a heart
transplant, and he was frequently battling low-grade rejection while
suffering from weakened kidneys. But by dying from something as random
and universally applicable as slipping and falling, Alain managed to
inject healthy dose of perspective into all of our lives. &lt;em&gt;Did you live
your life today the way that you would have if it was your last day?&lt;/em&gt; is
one of the few things I can think about. As cliched as it may be, I
think it's a perfectly appropriate reminder to take away from Alain's
death.&lt;/p&gt;
&lt;p&gt;I'm going to miss Alain. In the few months that we worked together, I
felt like we had already developed a close bond. He had studied
philosophy and loved coffee; enough said. He had worked in the New York
public library system in the Bronx straight out of library school, in
near poverty, and I was looking forward to hearing stories about his
time there. Alain had no family in Sudbury, not even a girlfriend. He
told me several times that he did not love himself enough to reproduce
himself, but he could love a woman enough to want to reproduce her...
then he would sigh, and say &amp;quot;Ah well, but it seems that there is no
woman for me&amp;quot; and shrug off any suggestion that that was nonsense. Maybe
he wasn't cut out for romantic relationships, but I enjoyed our
too-brief working relationship.&lt;/p&gt;
&lt;p&gt;So this morning I went for a nice, long walk with Lynn and Amber, then
puttered around the house most of the rest of the day. I planted some
mint and chives out back, mowed more of the lawn, and pedalled around
town to take care of a few errands. Life is a little greyer with Alain's
passing, but it is very clear to me that my life is very good.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 07 Jul 2006 02:27:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-07-07:/passing-brighter-than-ever-before.html</guid><category>misc</category><category>Personal</category></item><item><title>My answer to "I would recommend Vendor X to other libraries."</title><link>https://coffeecode.net/my-answer-to-i-would-recommend-vendor-x-to-other-libraries.html</link><description>&lt;p&gt;I was recently given the opportunity to answer a customer satisfaction
survey about the vendor of our integrated library system (ILS). It was
actually my fourth opportunity, but I had passed up the chance in the
past because the survey invitation stated:&lt;/p&gt;
&lt;blockquote&gt;
You must use Microsoft Internet Explorer 4.x or higher to complete
the survey.&lt;/blockquote&gt;
&lt;p&gt;That doesn't exactly inspire confidence... anyways, I was feeling in a
risky mood this morning and brought up the survey page in Firefox
anyways. Most of the questions were about Vendor X's support staff,
which I am generally happy with, but I gave a good honest response to
the following statement:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The statement:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
I would recommend Vendor X to other libraries.&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;My answer&lt;/strong&gt; (supporting a response of &amp;quot;Disagree&amp;quot;):&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;p&gt;The client care center has always responded promptly to my reports;
however, I am quite disappointed in the XYZ software and its
&amp;quot;openness&amp;quot;. It is ridiculous to be running Apache 1.3.19 when the
current 1.x version is 1.3.36 (due in large part to security
vulnerabilities that have been closed). The Web interface uses
hidden form fields to pass usernames and passwords from page to
page, which is a blatant security problem. The much-vaunted
&amp;quot;openness&amp;quot; of XYZ is contradicted by closed mailing lists and closed
documentation; sites require a $3000 course to access a lousy API
just to add basic functionality to their Web site (like emailing a
PIN back to the user). I would strongly recommend that other
libraries evaluate all the alternatives before settling on XYZ.&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;This fits into the larger discussion about &lt;a class="reference external" href="http://onebiglibrary.net/story/the-problem-with-the-ils-bill-of-rights"&gt;the choices libraries make
when buying/building
systems&lt;/a&gt;.
I joined our library three years after they had made the switch to their
current ILS, so this is a perfect opportunity to experience all of the
pain and pleasure our current system has to offer. I plan to be a major
part of the decision-making process to upgrade or replace this system.
You can probably tell which way I'm leaning...&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Vendor and system name changed because I'm a chicken.&lt;/em&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 20 Jun 2006 12:44:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-06-20:/my-answer-to-i-would-recommend-vendor-x-to-other-libraries.html</guid><category>Libraries</category><category>Libraries</category></item><item><title>Walking: away from online poker, towards the fambly</title><link>https://coffeecode.net/walking-away-from-online-poker-towards-the-fambly.html</link><description>&lt;p&gt;I'm sure it has nothing to do with Amber, but my brain has faded into
pure fuzziness the past couple of weeks. I'm missing appointments (both
work and personal) and frequently wander from one room to the other
wondering why I left the other room in the first place. Hell, I often
sit down at the computer and wonder what it was I planned to look up /
blog about / game I wanted to play.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Warning: some sappy content ahead...&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;So today is a prime example. I had two activities on my agenda, total,
today: hang out with Lynn and Amber a whole lot, and play in the world
poker blogger tournament this afternoon. For some reason I got it in my
head that the tournament kicked off at 6:30 pm EST. I had an awesome day
of leisure:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;home roasted coffee (Ethiopian, deep into second crack)&lt;/li&gt;
&lt;li&gt;reading the weekend paper in bed with the whole family (Spook
included)&lt;/li&gt;
&lt;li&gt;walking to the local beach to take turns swimming &amp;amp; minding Amber&lt;/li&gt;
&lt;li&gt;quickly mowing of the back lawn before the rain storm hit&lt;/li&gt;
&lt;li&gt;viewing assorted PVRed football matches in fast-forward with Lynn and
Amber hanging out on the couch next to me&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So at 6:00 I decided to log on to PokerStars just to make sure that the
blogger tournament didn't actually start at 6:00. Hmm, well that's
interesting: it doesn't show up at all on my radar. I step back, follow
the link to the Web page, and damn... it started at 4:00. I probably
finished blinding out around 5:30, in 1224th place. Yep, I ended up
being one of those bastards that just sat out the entire game.&lt;/p&gt;
&lt;p&gt;But that's okay, because I wouldn't take any of it back to sit and play
two hours of online poker by myself. And that fits with my decision a
few weeks back to cash out. I started playing online poker for real cash
back in October 2005, entirely due to
&lt;a class="reference external" href="http://www.wilwheaton.net/mt/archives/003352.php"&gt;Wil's&lt;/a&gt; charity
tournament for Hurricane Katrina relief, and stuck around because it was
a lot of fun. After earning my frequent play bonus for my initial
deposit, I was down around $30; but then I started to place in the money
pretty consistently. All at the $1.50 turbo SNG level, mind you. After
popping back over the break-even point, I pumped another $100 in to
qualify for another cash bonus, and pretty quickly surged towards the
+$100 level. Then my brother enticed me in to higher buy-in SNGs, and my
account varied a little wider. Still, all was overall pretty well.&lt;/p&gt;
&lt;p&gt;I began playing and live-blogging the WWdN Tuesday blogger tourneys, and
had a hell of a time. Somewhere in there I cashed out around &amp;gt; $100,
twice, and my balance was still $200. So I had been winning and was now
bankrolled for free. One more 20% deposit bonus enticed me to buy back
in one more time, this time for $300. I figured I was playing enough
that I might as well earn a bonus while I was at it.&lt;/p&gt;
&lt;p&gt;Right around then, I switched jobs, and we were in the end game for
Amber's arrival. Suddenly, my time was becoming a lot more precious:
painting the house and preparing for the new baby was a far higher
priority than poker. Still, Tuesday nights at the WWdN were sacrosanct
and a whole lot of fun--and I actually spent more time talking with my
brother Dave through the WWdN than I had for most of the past ten years,
otherwise. However, clearing that deposit bonus was starting to look
like more of a chore than a reward, and playing poker at other times was
less &amp;quot;fun&amp;quot; and the money was becoming a little more important: the new
job pays less than the old one (but makes up for that in many other
soul-satisfying ways), the vehicle insurance and property taxes and
utility bills all hit at once, and there seemed to be so much stuff to
buy for Amber that suddenly our bank account was a little on the low
side.&lt;/p&gt;
&lt;p&gt;I had funneled around $350 to Dave to pick up a &lt;a class="reference external" href="http://www.chariotcarriers.com/html_english/cougar1.htm"&gt;kick-ass
stroller&lt;/a&gt;,
and after playing around ten SNGs in a row where every one of my tight
tourney lives ended in a horrendous bad beat, I cashed out completely.
Cousin Jason witnessed the historic event: a cheque for $347 was
requested at around 2:30 am, and after all was said and done, counting
up all the deposits, withdrawals, and transfers, my hours of online
poker over nine months netted me about $400 in earnings. No complaints
here: it's a pittance compared to some of my blogger peers, but without
a doubt wildly above normal for most online players, and it's definitely
appreciated at home.&lt;/p&gt;
&lt;p&gt;I miss the WWdNs already, but I don't miss the rest of the online poker.
I had hoped to enjoy the blogger tourney today, but screwed that up by
completely blowing the start time. However, I did get to railbird a few
of my fellow WWdN comrades: Jules, Rico, Dave, and Frank got shout-outs.
I guess if there's anything ghey-er than blogging, or more girly than
chat-things, it's being resigned to pure railbird mode. But that's cool
with me, because kicking it at home with Amber and Lynn beats a royal
flush any day.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Yep, it's quite fitting that it happens to be father's day...&lt;/em&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sun, 18 Jun 2006 22:00:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-06-18:/walking-away-from-online-poker-towards-the-fambly.html</guid><category>Gaming</category><category>Poker</category></item><item><title>High-traffic zone</title><link>https://coffeecode.net/high-traffic-zone.html</link><description>&lt;p&gt;Well, after living in Sudbury for five months we had had no visitors...
then Amber came along, and--surprise surprise--visitors galore! It's
been great seeing so many of our friends and family again, even though
my hosting abilities have been put sorely to the test (purely as a
result of my antisocial geek nature, you understand). To be honest, at
times it has felt like I've been so focused on keeping our guests
comfortable that I've ended up spending very little time with Amber,
myself, and that just ain't right. But I know all too well that the
flood of houseguests will subside and in a few months we'll be wondering
what everybody is doing and where they have gone. Ah well... on to the
photos.&lt;/p&gt;
&lt;div class="serendipity_imageComment_center" style="width: 640px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;img alt="image0" src="/uploads/pics/amber/sunglasses.jpeg" style="width: 640px; height: 480px;" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;She's all about the fashion. Shades? Good. Bonnets? Bad... but sun?
Worse.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;p&gt;` &amp;lt;&amp;gt;`__&lt;/p&gt;
&lt;div class="serendipity_imageComment_center" style="width: 640px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;img alt="image1" src="/uploads/pics/amber/nancy.jpeg" style="width: 640px; height: 479px;" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Nancy holds Amber in the wee hours of the morning&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="serendipity_imageComment_center" style="width: 640px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;img alt="image2" src="/uploads/pics/amber/leah_mike.jpeg" style="width: 640px; height: 479px;" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Leah and Mike experienced Amber's three week growth spurt&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="serendipity_imageComment_center" style="width: 640px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;img alt="image3" src="/uploads/pics/amber/jama.jpeg" style="width: 640px; height: 479px;" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Jama visited the old stomping/triple-jumping grounds at Laurentian with
Amber&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="serendipity_imageComment_center" style="width: 479px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;img alt="image4" src="/uploads/pics/amber/jerry.jpeg" style="width: 479px; height: 640px;" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Grandpa Kabaroff marvels at Amber's tenacious grip&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="serendipity_imageComment_center" style="width: 640px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;img alt="image5" src="/uploads/pics/amber/kelly.jpeg" style="width: 640px; height: 479px;" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Auntie Kelly says goodbye...&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 15 Jun 2006 09:38:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-06-15:/high-traffic-zone.html</guid><category>misc</category><category>Amber</category></item><item><title>Tour de Sudbury</title><link>https://coffeecode.net/tour-de-sudbury.html</link><description>&lt;p&gt;On the cold, grey, windy morning of Saturday, June 10th, Lynn kicked my
butt out of bed for the 26 km &lt;strong&gt;Tour de Sudbury&lt;/strong&gt;. Over the past years
I've built up a tradition of long-ish June bike rides, from the Ride for
Heart in Toronto with Mike, David, et al, to the Tour de Grand in
Cambridge with Jamie, so it's nice to continue the tradition in my new
hometown. This was the second annual &lt;strong&gt;Tour de Sudbury&lt;/strong&gt;, and apparently
the turn-out was much better than last year. I would estimate somewhere
around 75-100 riders made it out to Bell Park this year.&lt;/p&gt;
&lt;div class="serendipity_imageComment"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/registration.jpeg"&gt;&lt;img alt="image0" src="/uploads/pics/registration.serendipityThumb.jpeg" style="width: 110px; height: 82px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;About fifteen minutes before the ride started, things were pretty quiet
at the registration desk...&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;p&gt;I was pleased to see Tim, Lyla, and Antonia show up for the ride. For
the first half of the ride, which took us around bike lanes on various
Sudbury streets, Tim and I had a nice chat. He wrote up the event over
at &lt;a class="reference external" href="http://www.timchristie.ca/?p=77"&gt;The Sudblog&lt;/a&gt;. Tim's going back
to grad school, so he only has a few months left in Sudbury -- at least
he'll get a chance to see Sudbury at its best. He also reminded me to
get out to the Townehouse, as the local promoter still gets some great
artists (in a [STRIKEOUT:cheap little]intimate venue).&lt;/p&gt;
&lt;p&gt;Moonlight Beach marked the halfway point of the ride. I &lt;em&gt;think&lt;/em&gt; I recall
my uncle and aunt taking us to this beach back when I was just a wee
brat. This is where the ride switched from roads to the packed gravel of
the Laurentian Conservation Area trails, and within a few minutes the
latent mountain biker in me emerged. These were wide trails, nothing too
technical, but lots of steep hills and recent rain made for a lot of
fun. It's nice to know that my seven year old Oryx can still bite into
the dirt, even with semi-slick tires, a rear rack, and a pannier. (&lt;em&gt;OK,
the two-hour mountain biking odyssey that Mike and I took a couple of
weeks back on the single-track in the area already proved that... but I
need frequent reassurance!&lt;/em&gt;)&lt;/p&gt;
&lt;div class="serendipity_imageComment"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/moonlight.jpeg"&gt;&lt;img alt="image1" src="/uploads/pics/moonlight.serendipityThumb.jpeg" style="width: 110px; height: 82px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;On Moonlight Beach, far away in time... Notice the grey, cold
cloudiness?&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;p&gt;I returned to Bell Park a little over an hour after I left, so I
definitely made good time on the second gruelling portion of the ride.
The barbecue was over an hour away, I was in short sleeves and cooling
down quickly, and Amber and Lynn were patiently waiting at home, so I
rode back to make some fresh coffee. I'll definitely be back for next
year's Tour de Sudbury.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 15 Jun 2006 08:43:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-06-15:/tour-de-sudbury.html</guid><category>misc</category><category>Personal</category></item><item><title>In-depth _and_ official DB2 and PHP documentation</title><link>https://coffeecode.net/in-depth-_and_-official-db2-and-php-documentation.html</link><description>&lt;p&gt;I should have mentioned this before, but now that I noticed Chris Jones'
post on the &lt;a class="reference external" href="http://blogs.oracle.com/opal/2006/06/12#a39"&gt;Underground PHP and Oracle
Manual&lt;/a&gt;, I felt obliged
to point out that one of the final fruits of my labours at IBM is now
visible in the DB2 &amp;quot;Viper&amp;quot; Information Center -- a &lt;a class="reference external" href="http://publib.boulder.ibm.com/infocenter/db2luw/v9/topic/com.ibm.db2.udb.apdv.php.doc/doc/c0021523.htm"&gt;set of task-oriented
documentation&lt;/a&gt;
that describes how to do all of the things that you really need to do
with DB2 and PHP, using either the &lt;a class="reference external" href="http://php.net/ibm_db2"&gt;ibm_db2&lt;/a&gt;
or &lt;a class="reference external" href="http://php.net/pdo_odbc"&gt;PDO_ODBC&lt;/a&gt; modules.&lt;/p&gt;
&lt;p&gt;By &amp;quot;task-oriented&amp;quot; I mean that, instead of documenting a set of objects
and methods, the docs take the perspective of a developer and describe
how to accomplish specific tasks (like &amp;quot;Connecting to a DB2 database
from PDO&amp;quot; or &amp;quot;Calling a stored procedure&amp;quot; or &amp;quot;Retrieving multiple result
sets&amp;quot;). I hope it works as both a good introduction to PHP development
for DB2 users, and a good introduction to DB2 for PHP developers. And,
of course, the same approach will work for Apache Derby databases as
well.&lt;/p&gt;
&lt;p&gt;I find it interesting that Oracle has positioned their PHP documentation
as &amp;quot;underground&amp;quot;, while IBM has chosen to incorporate their PHP
documentation into their official set of DB2 documentation. Oracle gets
the points for coolness, but IBM's approach will make the pointy-headed
types a bit more comfortable.&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Ok, one qualification: this is the DB2 Viper beta 1 documentation, so
calling it &amp;quot;official&amp;quot; is a tad premature... but you get my drift. An
example of the beta-ness of these docs is the table of contents entry
for &lt;strong&gt;Executing XQuery expressions&lt;/strong&gt; that remains tantalizingly
empty... hmm, might it have anything to do with &lt;a class="reference external" href="http://cvs.php.net/viewcvs.cgi/pecl/ibm_db2/ibm_db2.c?r1=1.48&amp;amp;r2=1.49"&gt;this CVS
commit&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;Second qualification: I can't take full credit for the PHP docs in
the DB2 manual, because they weren't frozen by the time I left IBM.
And the DB2-related reference documentation from php.net has been
incorporated into the DB2 manual, which represents the efforts of
php.net doc writers as well. But I'll certainly take credit for any
errors &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Corrected bad XHTML (unescaped ampersand in URL). Bad Dan.
And corrupted an intermediate version with garbage from another posting.
Even worse.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 13 Jun 2006 12:40:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-06-13:/in-depth-_and_-official-db2-and-php-documentation.html</guid><category>Databases</category><category>DB2</category><category>PHP</category></item><item><title>More Amber photo goodness</title><link>https://coffeecode.net/more-amber-photo-goodness.html</link><description>&lt;p&gt;Well, it's been over two weeks, surely it's time for more Amber photos!
Read on below...&lt;/p&gt;
&lt;div class="serendipity_imageComment_left" style="width: 447px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;img alt="image0" src="/uploads/pics/amber/amber-victoria.jpg" style="width: 447px; height: 640px;" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Grandma Sanderson looks into Amber's wee eyes (2006-05-07)&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="serendipity_imageComment_left" style="width: 640px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;img alt="image1" src="/uploads/pics/walk2work/amber-blue-hat.jpg" style="width: 640px; height: 479px;" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Blue hats aren't just for boys (2006-05-11)&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="serendipity_imageComment_left" style="width: 640px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;img alt="image2" src="/uploads/pics/amber/amber-alma.jpg" style="width: 640px; height: 479px;" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Grandma Scott takes a turn with Amber (2006-05-11)&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="serendipity_imageComment_left" style="width: 640px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;img alt="image3" src="/uploads/pics/amber/amber-dad.jpg" style="width: 640px; height: 479px;" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Grandpa Scott shows off his granddaughter (2006-05-11)&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="serendipity_imageComment_left" style="width: 640px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;img alt="image4" src="/uploads/pics/amber/amber-mom.jpg" style="width: 640px; height: 479px;" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Grandma Parsons teaches Amber about fruit and vegetables (2006-05-22)&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="serendipity_imageComment_left" style="width: 479px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;img alt="image5" src="/uploads/pics/amber/its-all-about-amber.jpg" style="width: 479px; height: 640px;" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Mom and daughter have matching shirts: &amp;quot;It's all about me&amp;quot; (2006-05-22)
-- and it really is!&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 24 May 2006 01:43:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-05-24:/more-amber-photo-goodness.html</guid><category>Family</category><category>Amber</category></item><item><title>Live-blogging WWdN: godard invitational</title><link>https://coffeecode.net/live-blogging-wwdn-godard-invitational.html</link><description>&lt;p&gt;&lt;a class="reference external" href="https://www.coffeecode.net/archives/64-Emergency-cabbage-Amber-Colleen-has-arrived.html"&gt;Had a
baby&lt;/a&gt;
2.1777 weeks ago, have a cold, had visitors tonight, joined 20 minutes
late with my stack blinded down to T1410, jumped into the action,
bounced up to T2100 pretty quickly, hung out and watched
&lt;a class="reference external" href="http://wilwheaton.typepad.com"&gt;Wil's&lt;/a&gt; JJ fall to
&lt;a class="reference external" href="www.upforanything.net/poker"&gt;CJ&lt;/a&gt;'s KK, followed shortly by NHL
200X's failed attempt to steal on the turn against a set of sixes.&lt;/p&gt;
&lt;p&gt;The WWdN is now pretty much the only poker action that I'm going to see
for the foreseeable future; Amber is &lt;strong&gt;gasp&lt;/strong&gt; much more important than
poker. But enough people seem to like reading this live blog, and the
WWdN is just so much fun, that I'm going to to try to hang in there for
one night a week.&lt;/p&gt;
&lt;p&gt;Which means that, now that I've cashed out most of my bankroll, if I
actually want to play for any amount of time in the future, I'm going to
have to make money at the WWdN. Good luck, I know! And if I want to last
deep into the tourney, I'm going to have to stop making loose calls like
defending my AQo big blind against an 8x BB bet from AlCantHang... maybe
if AAQ hit on the flop I would have stuck around for the turn, but 664
meant that I was checking and then folding once Al made his inevitable
bet on the flop. Ah well... back to my starting wages, it seems.&lt;/p&gt;
&lt;p&gt;9:17 - Pocket sevens in early position, I raise to 300 (3xBB), and ricoM
immediately calls. 234 rainbow on the flop, so I bet 300, and ricoM
calls again. An ace on the turn, I bet 400, and ricoM raises me... I
fold, and shore enough, the bastard was holding AKo. I'm happy he
showed, but damn, that hurts a bit. My stack is now in the T600 range.
Not good, captain.&lt;/p&gt;
&lt;p&gt;9:24 - A9h, in early position with T475, and the big blind (100) coming
around; I attempt the
&lt;a class="reference external" href="http://hammerplayer.blogspot.com/2006/05/wwdn-not.html"&gt;hoyazo&lt;/a&gt; --
but xkm1245 pushes with his significantly larger stack, silencing any
possible conversation. He has ATo, and as I catch neither a flush nor a
9 I go home in 34th place: right in the middle of the 68-player field.
Ah well; that's what I get for mixing money talk with the WWdN.&lt;/p&gt;
&lt;p&gt;9:29 - I'm followed very rapidly by Katitude, whose attempt to push with
the hammer is called by ClaudiaPadme's AQo. Claudia pairs up the queen,
and Katitude takes 33rd place. It happens to the best of them, I'm
afraid.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 24 May 2006 00:58:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-05-24:/live-blogging-wwdn-godard-invitational.html</guid><category>Gaming</category><category>Poker</category></item><item><title>Emergency cabbage: Amber Colleen has arrived</title><link>https://coffeecode.net/emergency-cabbage-amber-colleen-has-arrived.html</link><description>&lt;p&gt;&lt;strong&gt;Amber Colleen&lt;/strong&gt; was born on May 6, 2006, just 54 minutes past
midnight. Due to overwhelming demand, here are some photos of our
beautiful little girl:&lt;/p&gt;
&lt;div class="serendipity_imageComment_center" style="width: 640px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;img alt="image0" src="/uploads/pics/amber/lynn-and-amber-resting.jpg" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Recuperating from a very long day.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;p&gt;` &amp;lt;&amp;gt;`__&lt;/p&gt;
&lt;div class="serendipity_imageComment_center" style="width: 640px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;img alt="image1" src="/uploads/pics/amber/amber-swaddle.jpg" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Dad has learned how to swaddle me. I've learned how nice it is to be
cuddled. I've also learned that hospital furniture tends to be very,
very ugly.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="serendipity_imageComment_center" style="width: 480px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;img alt="image2" src="/uploads/pics/amber/daddys-girl-6-54am.jpg" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;It's 6:54 AM. Apparently Amber takes after her Dad as far as early
mornings go...&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="serendipity_imageComment_center" style="width: 480px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;img alt="image3" src="/uploads/pics/amber/hands.jpg" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Lynn and Amber holding hands.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="serendipity_imageComment_center" style="width: 640px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;img alt="image4" src="/uploads/pics/amber/amber-angry.jpg" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;I'm either hungry, or tired, or my diaper needs changing, or it's too
bright, or too loud, or I'm too cold, or too hot... but despite my
anger, this little outfit looks pretty damned good on me!&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 10 May 2006 02:30:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-05-10:/emergency-cabbage-amber-colleen-has-arrived.html</guid><category>Family</category><category>Amber</category></item><item><title>No baby tonight (in my coffee), no baby tonight (in my tea)</title><link>https://coffeecode.net/no-baby-tonight-in-my-coffee-no-baby-tonight-in-my-tea.html</link><description>&lt;p&gt;Ah yeah, a little malformed quote from &lt;strong&gt;The Guess Who&lt;/strong&gt; for you there.&lt;/p&gt;
&lt;p&gt;The baby watch continues; we had a little flurry of activity last night,
but things tapered off with the morning sun, strongly suggesting a baby
of vampiric origin. Given my looks, I'm thinking
&lt;a class="reference external" href="http://clans.owbn.org/nosferatu"&gt;Nosferatu&lt;/a&gt;, but
&lt;a class="reference external" href="http://clans.owbn.org/toreador/"&gt;Toreador&lt;/a&gt; or
&lt;a class="reference external" href="http://clans.owbn.org/ventrue/"&gt;Ventrue&lt;/a&gt; would be more to our
liking.&lt;/p&gt;
&lt;p&gt;Because I had already called in to work to tell them I was taking the
day off, Lynn and I decided to see &lt;strong&gt;V for Vendetta&lt;/strong&gt; at the afternoon
matinee. Given that Alan Moore has had his name removed from the movie
credits (and, in fact, retroactively from any of the work that he did
for DC Comics in the past), the movie was better than I expected. Hugo
Weaving did a great job with his voice and body to make up for the
frozen face; but the deviations from the original story were pretty
typical Hollywood meddling, unfortunately. Worth a rental, maybe, but
even more worthwhile, buy and read the original &lt;a class="reference external" href="http://www.amazon.com/exec/obidos/redirect?link_code=ur2&amp;amp;tag=coffeecode-20&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;path=http%3A%2F%2Fwww.amazon.com%2Fgp%2Fproduct%2F0930289528%2F"&gt;V for
Vendetta&lt;/a&gt;
(graphic novel).&lt;/p&gt;
&lt;p&gt;Side note: holy crap! I just noticed how much the original issues of &lt;strong&gt;V
for Vendetta&lt;/strong&gt; are selling for these days... I have 8 of the 10 original
issues stashed away. &lt;a class="reference external" href="http://www.er.uqam.ca/pasteur/e303515/Comic%20Book%20Guy%204.png"&gt;Comic book
guy&lt;/a&gt;
was on to something...&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 04 May 2006 23:10:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-05-04:/no-baby-tonight-in-my-coffee-no-baby-tonight-in-my-tea.html</guid><category>Family</category><category>Amber</category></item><item><title>We prefer our baby well-done, thanks</title><link>https://coffeecode.net/we-prefer-our-baby-well-done-thanks.html</link><description>&lt;p&gt;As of this morning, our family still consists of Dan, Lynn, and our cat
Spook. Baby seems to be pretty comfortable where s/he is right now, but
of course things could change at any moment. I'm still schlepping into
work every day, although it's pretty hard to concentrate. The cell phone
is set to &lt;strong&gt;STUN&lt;/strong&gt; and accompanies me everywhere; luckily I'm only a
40-minute walk from home (and at a run, in dress shoes, probably about
25 minutes).&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 03 May 2006 14:26:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-05-03:/we-prefer-our-baby-well-done-thanks.html</guid><category>Family</category><category>Amber</category></item><item><title>Live-blogging WWdN IlliniFan Invitational</title><link>https://coffeecode.net/live-blogging-wwdn-illinifan-invitational.html</link><description>&lt;p&gt;As Gibby Haynes of the Butthole Surfers liked to sing:&lt;/p&gt;
&lt;blockquote&gt;
I'm all hopped up on cough syrup now&lt;/blockquote&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;It seems it's pollen season, and up here in Sudbury the birch trees have
these massively well-hung pollen dispensers:&lt;/p&gt;
&lt;div class="serendipity_imageComment_center" style="width: 320px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;img alt="image0" src="/uploads/pics/well-hung-birch.jpeg" style="width: 320px; height: 239px;" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Well-hung pollen unit&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;p&gt;And yours truly has a backyard that's filled with birch trees:&lt;/p&gt;
&lt;div class="serendipity_imageComment_center" style="width: 640px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;img alt="image1" src="/uploads/backyard-birch.jpeg" style="width: 640px; height: 479px;" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Dan's backyard is full of pollen-dispensing units.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;p&gt;And even though most of my allergies disappeared along with puberty,
there is definitely enough pollen to set my sinuses spinning and get my
eyes watering. So tonight's WWdN is brought to you by a special,
medicated Mr. Scott... good thing that
&lt;a class="reference external" href="http://wilwheaton.typepad.com"&gt;Wil&lt;/a&gt; hasn't introduced any
anti-doping measures yet.&lt;/p&gt;
&lt;p&gt;With that, the live-blog commences...&lt;/p&gt;
&lt;p&gt;8:34 -- Wil is out first tonight, having fallen prey to rmgustaf's evil
luckitude. AQ beats KK. Wil loves cowboys.&lt;/p&gt;
&lt;p&gt;8:50 -- I'm getting bad cards and playing worse with the few cards I do
catch. Caught top pair with ATo but four callers gave me the willies
about higher kickers or second pairs, so I bailed. Right now I'm hanging
out at T1270.&lt;/p&gt;
&lt;p&gt;8:55 -- KDE crashed half an hour ago, with has been a bit of a pain.
Don't expect any cool screen shots tonight. I'm still card-dead. By the
way, at my table is rmgustaf, MiamiDon, Budohorseman, sellthekids,
FatBaldGuy, Tactix, darval, and mookie99. Good table! I only have a
chance if I suck out heavily here...&lt;/p&gt;
&lt;p&gt;8:57 -- FatBaldGuy flails wildly with a pair of sevens against
MiamiDon's solid straight. FBG is gone.&lt;/p&gt;
&lt;p&gt;9:00 -- I get a solid, betworthy hand and bet out 4xBB. I have four
callers. Hey... haven't you seen that I've been folding everything?
Well, after the start anyways, where I would limp and quickly fold.
Damn, maybe I've cultivated a loose weak image instead of a tight savvy
one. Ah well; the flop is good for me, so I bet out and three callers
drop out, leaving it to me and the rather short-stacked Budohorseman.
The turn is even better, so I bet a bit more; and the river clinches it
for me, although I bet only half of Budohorseman's remaining stack of
470 to give him the option to push or fold. He chooses the latter, and
I'm back around T1900. That feels a bit better...&lt;/p&gt;
&lt;p&gt;9:03 -- Budohorseman goes out against MiamiDon's two pair. MiamiDon
appears to be a bit of a wrecking crew early on.&lt;/p&gt;
&lt;p&gt;9:05 -- darval, with a stack of around 800, bets 200 in late position
and successfully drops the dreaded HAMMER shortstacked. Nice!&lt;/p&gt;
&lt;p&gt;9:10 -- Ks8h3s flop, darval pushes, transfish goes into the tank and
pushes, and CintiKid68 calls. darval and transfish reveal high spades,
both hoping for the flush draw; CintiKid68 has a pair of eights, and
that holds up. Cinti now has T5600 and first place in the tourney.
darval and transfish have the rest of the night ahead of them.&lt;/p&gt;
&lt;p&gt;9:14 -- Following hand, CintiKid68 and rmgustaf battle it out over
another flush draw. The spade hits on the river and darval shows the
King to take the hand. rmgustaf, T4700; CintiKid68, T4400.&lt;/p&gt;
&lt;p&gt;9:16 -- I &lt;em&gt;am&lt;/em&gt; weak! I've seen a solid 10% of flops so far, including
1/7 in BB and 1/7 in SB.&lt;/p&gt;
&lt;p&gt;9:17 -- Make that 1/8 and 1/8. WEEAK.&lt;/p&gt;
&lt;p&gt;9:17 -- On the bright side, psycoma has arrived at our table. Chatter
intensity has increased exponentially. This is why I play the WWdN
invitationals.&lt;/p&gt;
&lt;p&gt;9:20 -- psycoma goes to the well with pocket 9's against CintiKid (with
a flop of three diamonds) and picks up a 9 on the river to ensure that
CintiKid68's big slick can't do any damage. This must be her reward for
noting that mookie99's avatar looks like a vagina (giving birth to a
spade). Nice!&lt;/p&gt;
&lt;p&gt;9:28 -- Pocket kings for me in LP. YES! I pop in a bet of 4xBB, and get
a caller in psycoma. An ace drops on the flop, coma bets 5xBB, and I
think long and hard before folding. psycoma kindly displays her AQo to
make me feel better. She's so nice. But my stack is once again much
smaller. Damn.&lt;/p&gt;
&lt;p&gt;Mmm, positions at break:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Grobman - 8720&lt;/li&gt;
&lt;li&gt;Quatloos - 8685&lt;/li&gt;
&lt;li&gt;rmgustaf - 5810&lt;/li&gt;
&lt;li&gt;Columbo777 - 4575&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;9:40 -- rmgustaf (T5000) shows down with CintiKid68 (T1400) on a preflop
push. It's AQo vs Cinti's KJo, and rmg pairs up the queen to take it
home.&lt;/p&gt;
&lt;p&gt;9:44 -- Pocket jacks, I push with T1100 and get the blinds. Good enough.
The table fears Mr. 8% flop...&lt;/p&gt;
&lt;p&gt;9:45 -- MiamiDon sucessfully drops the all-in pre-flop hammer on
mookie99.&lt;/p&gt;
&lt;p&gt;9:48 -- Suited big slick in the BB. Coma limps, mookie99 calls, and I
raise to 6xBB to steal (and show, to placate the most demanding
psycoma).&lt;/p&gt;
&lt;p&gt;9:50 -- sellthekids pushes with A3o, against tactix's cowboys, and
catches an ace on the turn to double up to T4570. tactix is left with
T250. Oh ow ouch.&lt;/p&gt;
&lt;p&gt;9:51 -- tactix pushes against me in the big blind with T450, I call with
an uncharacteristically loose J8o but (sigh, beer / decongestant playing
a part here), fail to notice that cailin deas is still in the hand and
s/he also calls. I catch nothing on the flop and quickly check, but
cailin deas minbets, so I painfully fold. cailin deas flopped top pair
and takes out tactix's QJo. I didn't stand a chance, and am glad I
folded.&lt;/p&gt;
&lt;p&gt;9:52 -- I teleport to a new table. Uh-oh. Lots of big stacks now.
Grobman, Columbo, ZeemJr all have T6000 or greater to my pitiful T1100.
Fold fold fold.&lt;/p&gt;
&lt;p&gt;9:55 -- I push with TJo, and GRobman obligingly calls with the big
slick. Someone up there is looking out for me, and I catch a ten on the
flop that stays solid through the river.&lt;/p&gt;
&lt;p&gt;10:03 -- Now that we're down I've stolen the blinds a few more times
with decent yet not exactly comfortable hands (A9o, AJ suited).&lt;/p&gt;
&lt;p&gt;10:05 -- mookie99's pocket tens fail to hold up against jjok's paired-up
ace, and he's gone around 22nd place.&lt;/p&gt;
&lt;p&gt;10:07 -- I'm in the big blind with 34 (suited!), and both Columbo777 and
GRobman call me. Uh oh. I hit bottom pair on the flop (yeah!) and we all
check around. We check around the ace on the turn, and a four hits on
the river. Well, two pair (even weak, ugly pair like that) is as good as
I can hope for, so I make a pot-size bet and Columbo and GRobman both
fold. Okay, I'm happy with that.&lt;/p&gt;
&lt;p&gt;10:08 -- Pocket rockets UTG. Cool. I don't want to slow-play, so I bet
3xBB. AAjoshmanAA and Columbo777 fold the big blind and small blind,
respectively. Okay, some action would have been nice there... but I'm
back up to T3000, so I really can't complain.&lt;/p&gt;
&lt;p&gt;GRobman is throwing non-sequiturs out like there's no tomorrow. I'm sure
it's meant to throw us off our game, but it is amusing, and it is the
WWdN, so I do my best to respond with a witty repartee. Hmm. Where's
psycoma?&lt;/p&gt;
&lt;p&gt;10:19 -- And it's all over. Ah-Kh in the BB, I reraise peacecorn and
GRobman pre-flop. peacecorn folds, and GRobman calls. Flop brings two
more hearts, and that's all I see. I bet 800 (most of my remaining
stack), GRobman pushes, and I follow... GRobman caught a set of fives on
the flop, and I don't catch a heart on the turn or river. I'm out in
17th place.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 03 May 2006 00:27:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-05-03:/live-blogging-wwdn-illinifan-invitational.html</guid><category>Gaming</category><category>Poker</category></item><item><title>I shall have my revenge!</title><link>https://coffeecode.net/i-shall-have-my-revenge.html</link><description>&lt;p&gt;Hmm... perhaps I played this one (45-player SNG) just a &lt;em&gt;bit&lt;/em&gt; too tight:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
During current Hold'em session you were dealt 58 hands and saw flop: - 2 out of 7 times while in big blind (28%) - 1 out of 9 times while in small blind (11%) - 4 out of 42 times in other positions (9%) - a total of 7 out of 58 (12%) Pots won at showdown - 2 of 4 (50%) Pots won without showdown - 4
&lt;/pre&gt;
&lt;p&gt;I ended up busting out in tenth place, just out of the money. My
patience is improving, but I probably could have made it into the money
had I not over-played Kournikova in EP to try to steal the blinds
against a big stack -- who cold-called, then pushed when an ace turned
up on the flop. Damn. That cut my stack in half, but at least I've
learned enough to get away from that particular danger signal.&lt;/p&gt;
&lt;p&gt;The particularly galling bit was that of the final two tables, I had
been seated at the little stack table; 7 of the players had M &amp;lt; 2, and I
was one of the big stacks just salivating for some cards so I could feed
off the weak. Then the evil teleporter sent me to the table of big
stacks, and I became an average stack (until that little Kournikova
play, which made me a wee wee stack).&lt;/p&gt;
&lt;p&gt;Ah well. Poker, I shall have my revenge.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 02 May 2006 03:54:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-05-02:/i-shall-have-my-revenge.html</guid><category>Gaming</category><category>Poker</category></item><item><title>Until tomorrow, I'll just keep movin' on</title><link>https://coffeecode.net/until-tomorrow-ill-just-keep-movin-on.html</link><description>&lt;p&gt;No baby today, although Lynn and I both had a bit of insomnia last
night.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note to sleep-coordinating self:&lt;/em&gt; Not being able to sleep from 4:00 -
6:00, but being able to sleep just fine from 6:00-8:20, is not good for
keeping one's job where one has the luxury of having somewhat flexible
hours.&lt;/p&gt;
&lt;p&gt;On the bright side, I used the time to start thinking up some topics for
conference sessions or community courses that I could offer in the
future. And I actually wrote down some of the ideas, so they won't just
be whiffs of fantasy that disappear with the morning sun. Once upon a
time, I thought that I really enjoyed the travel part of speaking at
conferences. Now that I've been away from the circuit since last
October, I find that I really enjoy speaking in public. So if I just end
up giving some talks in Sudbury and Toronto, that's cool with me... and
easier to keep baby close by, too.&lt;/p&gt;
&lt;p&gt;Which reminds me, baby... any time now, okay? I promise, your home is
very comfortable, your parents aren't too scary, and you have lots of
family and friends who are looking forward to meeting you &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 01 May 2006 14:36:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-05-01:/until-tomorrow-ill-just-keep-movin-on.html</guid><category>misc</category><category>Amber</category></item><item><title>Not today, either...</title><link>https://coffeecode.net/not-today-either.html</link><description>&lt;p&gt;First of all--no baby yet.&lt;/p&gt;
&lt;p&gt;We had a great time last night at the gathering of &lt;a class="reference external" href="http://nickelcitytri.com"&gt;Sudbury
triathlon&lt;/a&gt; athletes -- I can't say
&amp;quot;triathletes&amp;quot; because apparently you're not a triathlete until you've
actually completed one, and there are a number of us who are simply in
training to compete in a triathlon (or duathlon, in my case) this
summer.&lt;/p&gt;
&lt;p id="small"&gt;The event began with a training session: biking or running. As my bike
is currently in bad shape (can't shift out of the second chainring, with
a flat tire to top it off), I opted for the run. Tracey (the host of the
event), Andrea, Richard, and I trotted off and had a good conversation.
I eventually found out that Richard works at the Sudbury Neutrino
Observatory, and he had actually hired &lt;a class="reference external" href="http://timchristie.ca"&gt;Tim&lt;/a&gt;
(who Lynn and I met at the Earth Day information / awareness event just
last weekend)[&lt;cite&gt;1 _smallworld&amp;gt;&lt;/cite&gt;].&lt;/p&gt;
&lt;p id="meat"&gt;After the training session came the payoff: tons and tons of food. Craig
(Tracey's man) was a barbecuing machine, masterfully handling burgers,
sausages, steaks, pork tenderloin, hot dogs, and portobello mushrooms to
serve up to the masses. To complement all of the meat (and our modest
vegetarian offering) there were many bowls of salad... however, lest you
be fooled into thinking that this was a disgustingly healthy
spread[&lt;cite&gt;2 _vegetarians&lt;/cite&gt;], there was no shortage of snackfood: chips,
dip, and beernuts a-plenty.&lt;/p&gt;
&lt;p&gt;All in all, a great time, and a reminder to the usually dominant
solitude-seeking side of myself that hanging out with large groups of
people can be fun. You just have to hang out with the right people &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;ol class="arabic simple" id="smallworld"&gt;
&lt;li&gt;&lt;cite&gt;*Sung to the tune of &amp;quot;It's a Small World After All&amp;quot;*&lt;/cite&gt; &lt;a class="reference internal" href="#small"&gt;small&lt;/a&gt;&lt;/li&gt;
&lt;li id="vegetarians"&gt;&lt;cite&gt;*Vegetarians, of course, may differ about the healthiness of meat.
Before entering into a debate on either the health or ethics of meat,
please note that Lynn and I brought the portobellos as our burnt
offering. I am such a fungi!*&lt;/cite&gt; &lt;a class="reference internal" href="#meat"&gt;meat&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sun, 30 Apr 2006 18:43:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-04-30:/not-today-either.html</guid><category>misc</category><category>Amber</category></item><item><title>No baby yet</title><link>https://coffeecode.net/no-baby-yet.html</link><description>&lt;p&gt;.... just in case you're wondering. Although my body and mind seem to be
in training for the arrival of the kid, as everybody at work yesterday
told me how tired I look, I was in bed by 10:00 pm last night, and I
woke up around 3:00 am with no hope of getting back to sleep.&lt;/p&gt;
&lt;p&gt;Of course, I have no idea what it will really be like. (I'm psychic, you
see: I could sense all of the parents out there mentally screaming &lt;em&gt;Oh,
he really doesn't know what he's getting into, just wait&lt;/em&gt;). So... off to
more social events today. I wonder how many phone calls we'll get asking
&amp;quot;Have you had the baby yet? Have you had the baby yet?&amp;quot;.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sat, 29 Apr 2006 11:22:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-04-29:/no-baby-yet.html</guid><category>Family</category><category>Amber</category></item><item><title>Live-blogging WWdN Change100 Invitational</title><link>https://coffeecode.net/live-blogging-wwdn-change100-invitational.html</link><description>&lt;p&gt;No tourney next week, so I guess I've gotta do good this time around.
Except doing good means actually making a decision on all hands, and
since I started late tonight that's not how things went... I sat out the
first four hands, including when I was big blind, and entered the game
in the small blind with JJ. Oh yeah! I reraised hacker59 to scare him
off the blinds, a bit overeager perhaps but a nice start.&lt;/p&gt;
&lt;p&gt;8:36 - Even better, pocket kings. Small raise, TequilaMom (love that
nick!) calls, and I get a king on the flop. Cool. Check. Unfortunately,
a third spade falls on the turn; not only that, but some sick person
could also put together a low straight with what's come together. Ah
well; a modest raise keeps TequilaMom in, so I'm suspecting that she's
hunting for some happier cards. The river offers another straight
possibility, but I throw a 1/3 pot value bet at it; TequilaMom reraises
to triple that, and I call. Stomach's not feeling great, but it turns
out that she was fishing for an ace and my set of kings handles her
ace-high with ease. Up to T2060 with my fifth hand of the game... nice!&lt;/p&gt;
&lt;p&gt;BTW, &lt;a class="reference external" href="http://hometownpoker.blogspot.com"&gt;drewspop&lt;/a&gt; is at the table,
as is CawtBluffin, hacker59, TheSubhuman, Dr. Flopacet, chauski...
&lt;a class="reference external" href="http://www.poker-tastic.com"&gt;Ingoal&lt;/a&gt; was here but left when his
overpair eights ran into drewspop's aces.&lt;/p&gt;
&lt;p&gt;8:41 - I successfully drop the unsuited hammer, to silence. I must be
doing this wrong. &lt;em&gt;Tap, tap...&lt;/em&gt; Is this thing on?&lt;/p&gt;
&lt;p&gt;8:51 - I'm off my high horse after an ill-fated A8s raise caught middle
pair with the eight against the big blind; continuation bets were
flat-called by chauski, and when a K on the river dropped (also opening
up a flush possibility), we both checked around. chauski showed pocket
9s, and I was back to T1650. Kudos to chauski for sticking to his guns!&lt;/p&gt;
&lt;p&gt;9:06 - After folding umpteen times (5-2, A-rag ad nauseum), I pick up a
pair of tens and enthusiastically raise to 4xBB. The Subhuman, sitting
around T1000 right after me, pushes all in. Hmm... I should fold, I know
I should fold, but I can cover it with about T500 to spare, so I call,
and he shows the Hiltons. Oww. But the flop shows TJK. Guilt rises in
the back of my throat, and neither an A, 9, or Q falls to prevent my
massive suckout. I feel so dirty, and yet my stack is much nicer now.&lt;/p&gt;
&lt;p&gt;9:12 - Pocket queens, I raise to 4xBB (hmm, curious pattern there), and
chauski pushes all-in. Calculation time: I can cover it, I sense aces,
but it's still early -- and I call, to see JJ. Karma be damned, as
chauski does not improve and he gets sent to the rail. My stack is much
nicer now (again).&lt;/p&gt;
&lt;p&gt;9:13 - drewspop, after a few nice runs but a bit of bad luck with
chauski in the previous hands, is sent packing early again when his pair
o' fives (starting hand: 56c) gets straightened out by CawtBluffin
(starting hand: A4o).&lt;/p&gt;
&lt;p&gt;9:14 - drewspop has been replaced by dsheep, the bovine swine! What a
poor replacement. dsheep has been sitting out most of the tournament...&lt;/p&gt;
&lt;p&gt;9:24 - After a nice AJh 3xBB raise in EP that won me the blinds, and
accusations of being a blind-stealer, I am teleported to Wil's table
(along with GRobman, Change100, malice51, thewatcherau, and Golrish89).
Many large stacks here.&lt;/p&gt;
&lt;p&gt;9:30 - No action for me, we're at the break with the top positions
shaking out thusly:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;penner42 - 6895&lt;/li&gt;
&lt;li&gt;louddwnunder - 6055&lt;/li&gt;
&lt;li&gt;SumoreZ - 5650&lt;/li&gt;
&lt;li&gt;thewatcherau - 5455&lt;/li&gt;
&lt;li&gt;serialMouse - 4425&lt;/li&gt;
&lt;li&gt;denials - 4285&lt;/li&gt;
&lt;li&gt;Golrish89 - 4270&lt;/li&gt;
&lt;li&gt;Up4Poker - 4255&lt;/li&gt;
&lt;li&gt;RandomSam - 4020&lt;/li&gt;
&lt;li&gt;change100 - 3705&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;How come 4 of the top ten are at &lt;strong&gt;MY&lt;/strong&gt;table? Wahh..&lt;/p&gt;
&lt;p&gt;9:36 - First post-break hand, Wil at T960 pushes all-in on the button;
N1kita calls and barely covers, and its A8o (Wil) versus AQc (N1kita).
Uh-oh. Wil is eliminated as PokerStars holds no miracle suckout for him
tonight.&lt;/p&gt;
&lt;p&gt;9:47 - Getting blinded down a bit, to T3700 now. Had one small pair that
I min-bet with, but &lt;a class="reference external" href="http://gcox25.blogspot.com"&gt;GCox25&lt;/a&gt; pushed all
in and I didn't have the guts to tango with the extra 1000 that it would
have cost me to call at that point.&lt;/p&gt;
&lt;p&gt;9:51 - My complaints have been heard. Dealt pocket jacks, I reraise
&lt;a class="reference external" href="http://erraticblogger.wordpress.com"&gt;thewatcherau&lt;/a&gt;'s 4xBB and the
stakes rapidly have me push all in preflop. He flips over tens and I
coast in to doubling up (swigging beer nervously all the while) to
T7370.&lt;/p&gt;
&lt;p&gt;9:59 - Change100 loses most of his stack when his pocket sevens run into
malice51's brick wall of aces (which, just for extra effect, turn into a
flush).&lt;/p&gt;
&lt;p&gt;10:23 - In a severe folding pattern for a long time, with only an
occasional steal of the blinds, I hit pocket jacks in EP. thewatcherau
jumps in ahead of me with 4xBB, and I come flailing over top with
another 1000 in chips. He pushes all in, I call, and his KTo can't make
the grade.&lt;/p&gt;
&lt;p&gt;10:32 - I've had a HUGE run of picture pairs, suited big slick, and the
like (including a successfully played sooted hammer UTG, perhaps in bad
taste but you can't argue with the hammer gods) to bring me up to
T23000. Unreal, the only thing that brought me down to earth was my
pocket aces being hurt by a set of kings. Then I sucked out with KQc vs.
ATc when my king paired up and took sparkyedge out of the tournament. In
all of the poker I've played, I've never seen anything like this ten
minute rush. I could get used to it I suppose &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;p&gt;At the break, the standings (with 21 players left) are:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;denials - 26975&lt;/li&gt;
&lt;li&gt;GScottW - 16465&lt;/li&gt;
&lt;li&gt;RandomSam - 12345&lt;/li&gt;
&lt;li&gt;Maudie - 11845&lt;/li&gt;
&lt;li&gt;hacker59 - 10590&lt;/li&gt;
&lt;li&gt;louddwnunder - 6917&lt;/li&gt;
&lt;li&gt;maigrey - 6685&lt;/li&gt;
&lt;li&gt;IlliniFan - 6335&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;10:47 - We're down to 18 players now, SirFWALGMan got knocked out
somehow to bring us down to two tables. Had we had two more players,
these would have been paying positions; instead, all the cash is
concentrated in the final table. With blinds at 300/600, though, I
expect the consolidation to occur quickly.&lt;/p&gt;
&lt;p&gt;10:57 - My AJ holds against CawtBluffin's AT and I'm now sitting at
T31665 with LuparFiend in second at T20000. I'll find a way to blow
this, I'm sure of it.&lt;/p&gt;
&lt;div class="serendipity_imageComment_center" style="width: 801px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;img alt="image1" src="/uploads/pics/final_table_2006_04_18.jpg" style="width: 801px; height: 552px;" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Final table: WWdN 2006/04/18&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="serendipity_imageComment_center" style="width: 801px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;img alt="image2" src="/uploads/pics/final_table_2007_04_18_aces.jpg" style="width: 801px; height: 582px;" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;I thought everything was glorious until we revealed our sister-kissing
hands!&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;p&gt;11:27 - I found a way. The story is long and painful, but it has
something to do with doubling up Maudie, then getting most of those
chips back from louddwnunder, then giving them right back to
louddwnunder. My final hand had me raising KJo against louddwnunder, who
pushed me all-in with her pocket sevens. She made the set on the flop
and never looked back, meaning that I wound up in fifth place tonight.
That's cool, I guess, but I feel like a bit of a chump for giving up
that lead built up with the mini-rush of the gods... should have cooled
my heels unless I had the nuts and let everybody else grind themselves
down. Ah well: three money finishes out of the last five WWdN's makes
Dan a pretty happy boy.&lt;/p&gt;
&lt;p&gt;11:35 - Congratulations to Maudie, who took the big enchilada;
louddwnunder, who came back from being short-stacked at the final table
to take second place, and props to GScottW who had enough patience
(despite his short stack) to watch several of us frantically annihilate
ourselves before he claimed third place. Well played, one and all!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 19 Apr 2006 00:33:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-04-19:/live-blogging-wwdn-change100-invitational.html</guid><category>Gaming</category><category>Poker</category></item><item><title>Holiday shopping for a MiniDV camcorder</title><link>https://coffeecode.net/holiday-shopping-for-a-minidv-camcorder.html</link><description>&lt;p&gt;Over the weekend I ordered a &lt;a class="reference external" href="http://www.amazon.com/exec/obidos/redirect?link_code=ur2&amp;amp;tag=coffeecode-20&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;path=http%3A%2F%2Fwww.amazon.com%2Fgp%2Fproduct%2FB000E0DU62%2Fsr%3D8-1%2Fqid%3D1145297919%2Fref%3Dpd_bbs_1%3F%255Fencoding%3DUTF8"&gt;Sony
DCR-H36&lt;/a&gt;&lt;img alt="image0" src="http://www.assoc-amazon.com/e/ir?t=coffeecode-20&amp;amp;l=ur2&amp;amp;o=1" style="width: 1px; height: 1px;" /&gt;
HandyCam camcorder from Best Buy Canada... the unit was on sale for
$50.00 off, the shipping cost was $0.00, and its going to arrive within
a couple of days. We have to have something to capture all of the images
and sounds of the little bambino for maximum embarassment in the future.
Speaking of which (whom?), the little bugger has not yet arrived, but it
could happen any day now -- so my procrastination in securing this item
isn't really a good thing.&lt;/p&gt;
&lt;p&gt;Why a MiniDV (digital tape) camcorder instead of mini-DVD or hard drive
version? Simple -- the price / quality ratio. The quality of the images
captured by all three media is pretty much on par, but the price for
MiniDV is far lower than the alternatives. I suppose the drawback is
having to play back the recording through the camcorder and using
FireWire to transfer the video to the computer... but hey, I'm in the
process of ripping my CD collection for the third time (FLAC this time
around), so I can deal with that minor inconvenience.&lt;/p&gt;
&lt;p&gt;Two things about ordering online from Best Buy:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Online shopping kicks ass. I don't feel guilty about shopping on a
holiday weekend, because I get to spend maximum time with my family
and friends instead of tromping through an overcrowded store with
those poor employees who drew the short straw and ended up having to
work over a holiday.&lt;/li&gt;
&lt;li&gt;Best Buy has a crazy online purchase process where, for the first
seven or eight purchases, they actually send you an email asking you
to call their customer service people to confirm every one of your
orders. So some poor employee still has to work over the holidays
after all... and I ended up having to talk to a person outside of the
category of friend or family.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Oh, and if you're wondering why I'm linking to Amazon.com instead of
Best Buy, well, as far as I know Best Buy doesn't have an associates
program... So far Amazon has earned me a solid &lt;strong&gt;eight&lt;/strong&gt;, yes, count-em,
eight dollars in referrals. That's pure gold, ladies and gentlemen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE: 2006/04/18&lt;/strong&gt; - Mike pointed out the doubled up Sony Sony, and
w3 validator pointed out the b-a-d URL (ampersands need to be entities,
Mr. Scott).&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 17 Apr 2006 17:22:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-04-17:/holiday-shopping-for-a-minidv-camcorder.html</guid><category>misc</category><category>Personal</category></item><item><title>Live-blogging WWdN, presdlee invitational</title><link>https://coffeecode.net/live-blogging-wwdn-presdlee-invitational.html</link><description>&lt;p&gt;I was there last [STRIKEOUT:night]week when Wil got all of his chips
in with jacks against presdlee's aces... I met my own demise when I
raised to 5X the BB with QJo at M9 and ArtOfSuckout decided to call when
he was holding the mighty 58s -- and caught two fives on the flop to
send me home in twelfth place. Sigh.&lt;/p&gt;
&lt;p&gt;With that pitiful recap, here's tonight's tourney, live!&lt;/p&gt;
&lt;p&gt;8:30 -- Cards are flying, and I'm seated at a table with GScottW,
heffmike, ricoM, Donegal, Jester9494, SWhoBA, and brdweb. There are 65
players in the tourney tonight.&lt;/p&gt;
&lt;p&gt;8:39 -- I've played exactly one hand so far, 58o in the big blind, and
took home the chips (all 60 of them!) when my eight paired up for top
pair on the flop. Oh yeah!&lt;/p&gt;
&lt;p&gt;8:39 -- I just noticed that my dear brother dsheep is the first out of
the tourney tonight. Sorry man! Looking forward to the update on that
one...&lt;/p&gt;
&lt;p&gt;8:42 -- BB again, this time with an even more awesome T5o. Four limpers,
and the flop gives me top pair with the ten. My modest bet causes
everyone to fold and brings me more chips, more chips! I'm so special...&lt;/p&gt;
&lt;p&gt;8:45 -- BrainMC is out, too. Man, there must be some bad beats going on
at the other tables. I just folded my best hand of the tourney so far
(A9o) when faced with a 3xBB bet. Not too much risk of a tourney-ending
showdown in these parts, I'm afraid.&lt;/p&gt;
&lt;p&gt;8:49 -- SERNE is out. That I can believe; he can be a fearsomely
aggressive player, and while that normally serves him well, it can also
serve up a dish called &amp;quot;early night&amp;quot; now and then.&lt;/p&gt;
&lt;p&gt;8:53 -- Donegal is talking in fits and starts, dropping in and out of
the tourney. He's complaining that his computer is messed up.
Interesting -- ploy, or should we point him at some free antivirus /
anti-spyware software? I run PStars on Linux under Wine, and although
there are some minor issues with minimizing windows now and then, things
are pretty stable otherwise (although you have to update the PStars
client manually).&lt;/p&gt;
&lt;p&gt;8:55 -- heffmike is dead to us. Earlier, his straight ran into SWhoBA's
cruelly-played full house and he was left with about 525; he just
finished going all-in with K9o against GScottW's pair of tens. Although
heff caught a 9 and came one card away from a flush, his hand didn't
improve enough. Sad to see the goat go...&lt;/p&gt;
&lt;p&gt;9:00 -- More notable obits: presdlee shall not be seeing the final table
tonight, nor shall kaellin18. What is this world coming to?&lt;/p&gt;
&lt;p&gt;10:06 -- Pocket nines are apparently the best hand I can expect tonight.
Good for stealing blinds, but scary in early position nonetheless.&lt;/p&gt;
&lt;p&gt;9:08 -- psycoma perishes (at another table, but her psychic agony
pierces my perception). JTs just ain't what it used to be, poor thing.&lt;/p&gt;
&lt;p&gt;9:11 -- weak, I am weak for folding the hammer in EP! Gods forgive me!&lt;/p&gt;
&lt;p&gt;9:11 -- celeb obits continue: DrPauly is out in 52nd place. Come to
think of it, I haven't seen him late in a WWdN tourney for a long, long
time. (Karma notification: expect DrPauly to take me out with the hammer
whenever we sit at the same table)&lt;/p&gt;
&lt;p&gt;9:15 -- Too many windows open, at the same time as I'm clicking on one
dialog box my game window pops to the front and I inadvertently min-bet
J7o in EP. Stunningly, it folds around... cool.&lt;/p&gt;
&lt;p&gt;9:19 -- BB with AQo. SWhoBA calls, and SB (TheVenetian) goes all-in with
T650. I re-raise and SWhoBA folds, so I'm perfectly isolated.
TheVenetian shows K4o, and I'm happy -- except the flop carries a king
with it. However, the flop is also three hearts, matching my queen, and
I catch another heart on the turn to take the lead back irrevocably.
That's my move of the night.&lt;/p&gt;
&lt;p&gt;9:20 -- Pocket jacks. GScottW bets 350, and I reraise to 800. The flop
is junk -- 854 rainbow. My bet of 600 is enough to make GScottW fold.&lt;/p&gt;
&lt;p&gt;9:24 -- I end Jester9494's night when I call his all-in of 430 with my
pocket 8's. His A3o does not improve. All of my good cards must have
been saving up for the last five minutes... nice minirush has me sitting
at T4000, good for fifth place (momentarily).&lt;/p&gt;
&lt;p&gt;9:27 -- UTG with the hammer; I bet 3xBB and it folds around to GScottW
in the BB -- who raises to 800. Sadly, but wisely I think, I fold. I'm
hoping the poker gods see this as my penance.&lt;/p&gt;
&lt;p&gt;9:30 -- Standings at the break:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Boobie Lover - 6995&lt;/li&gt;
&lt;li&gt;SoxLover - 5595&lt;/li&gt;
&lt;li&gt;rmd1023 - 5077&lt;/li&gt;
&lt;li&gt;poldytow - 4110&lt;/li&gt;
&lt;li&gt;MiamiDon - 3930&lt;/li&gt;
&lt;li&gt;denials - 3720&lt;/li&gt;
&lt;li&gt;doubleas - 3680&lt;/li&gt;
&lt;li&gt;Obie34 - 3550&lt;/li&gt;
&lt;li&gt;FishyMcDonk - 3485&lt;/li&gt;
&lt;li&gt;KentAllard - 3020&lt;/li&gt;
&lt;li&gt;hoyazo - 2850&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Wil is currently in 26th place with 1880... early on he had 2560, so
people have been nibbling away at his chips.&lt;/p&gt;
&lt;p&gt;9:45 -- UTG with JJ, I bet 4xBB and get called by SWhoBA. That's cool.
The AK4 on the flop aren't so cool, though; sweating, I bet 4xBB. SWhoBA
immediately calls. Uh oh. I pause for a long time on the insignificant
turn (a 3), then chicken out and check. SWhoBA checks. Trap? The Q on
the river clinches it for me; I check, and SWhoBA checks, only to turn
over JQo. Ugh. That hurt my stack a bit. Guess I should have bet on the
turn after all!&lt;/p&gt;
&lt;p&gt;9:46 -- BB with 66. SWhoBA limps, MiamiDon bets 3xBB, and I go all-in (a
wee bit tilty). They fold, and I breathe a sigh of relief.&lt;/p&gt;
&lt;p&gt;9:52 -- SWhoBA, on maximum rush mode, is up to T7250 in chips (and
second place) after having hit a number of quality hands. Nice!&lt;/p&gt;
&lt;p&gt;9:54 -- I eliminate TransFish via suckout. Him, SB with T398; me, BB
with T3500. Him, all-in. Me, call. Him, A3 hearts; me, K3 unsuited.
Flop, K with two hearts. No more hearts, though. I feel dirty.&lt;/p&gt;
&lt;p&gt;9:56 -- Pocket sixes, I raise, SWhoBA calls. Rainbow J73 on the flop, I
bet, SWhoBA calls. 3 on the turn, I bet higher, SWhoBA calls. K on the
river, I think and check, SWhoBA checks. She paired up a filthy seven
with her 78o. Filthy! Needless to say, that wreaked havoc on my chip
total; I'm somewhere around T1800 now.&lt;/p&gt;
&lt;p&gt;10:00 -- Moved to a different table where Boobie Lover is a monster at &amp;gt;
10000 chips. First hand is pocket fives UTG, and I bet 5xBB for a
successful blind steal. Next hand is the suited big slick, which I push
all-in with against SoxLover (who has pocket queens). I pair up, though,
and I'm back in the swing with T3800.&lt;/p&gt;
&lt;p&gt;10:13 -- Not much to report here, I'm hanging in with T3300, Boobie
Lover is bullying the table (wisely), but we're down to the final two
tables. 23skidoo just joined the table with his T7000. Hmm, more big
stacks. Need more chips. Need better cards for more chips.&lt;/p&gt;
&lt;p&gt;10:15 -- Celeb obits: Wil Wheaton went out in 22nd place.&lt;/p&gt;
&lt;p&gt;10:22 -- I'm able to use position to my advantage for the first time in
a long time, pushing the ultra-short-stacked o-hole-ne around with my
bet in the SB. k3o here, but that's good enough.&lt;/p&gt;
&lt;p&gt;10:23 -- 23skidoo's rockets decimate wwonka's AQ, and the candy man is
out of the game.&lt;/p&gt;
&lt;p&gt;10:24 -- 23skidoo destroys ricoM when his big slick pairs up against
ricoM's pocket nines.&lt;/p&gt;
&lt;p&gt;10:25 -- I take damage in the BB when I call o-hole-ne's UTG all-in (700
more chips for me) and my K9 can't improve against impressive pocket
queens (that flop into a set).&lt;/p&gt;
&lt;p&gt;10:32 -- Pocket 6s, blinded down to T1400, it's go time... all in. Calls
from the lovers, both Sox and Boobie. Uh oh. QK on the flop. Double
uh-oh. Shockingly, though, I hold up. And even more shocking, Boobie
Lover has called with 48o! Crazy man let those chips go to his head
&lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;p&gt;10:38 -- Break. Here are the standings:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;23skidoo - 28318&lt;/li&gt;
&lt;li&gt;Boobie Lover - 15738&lt;/li&gt;
&lt;li&gt;SWhoBA - 11163&lt;/li&gt;
&lt;li&gt;FishyMcDonk - 9345&lt;/li&gt;
&lt;li&gt;denials - 8783&lt;/li&gt;
&lt;li&gt;hoyazo - 8225&lt;/li&gt;
&lt;li&gt;MiamiDon - 6915&lt;/li&gt;
&lt;li&gt;change100 - 5440&lt;/li&gt;
&lt;li&gt;Obie34 - 4393&lt;/li&gt;
&lt;li&gt;poldytow - 4120&lt;/li&gt;
&lt;li&gt;xkm1245 - 3955&lt;/li&gt;
&lt;li&gt;GScottW - 1080&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;10:42 -- beer time, if I can escape this table. hoyazo min-bet UTG, I
passed with KQo, xkm1245 pushed all in, and hoyazo called after thinking
a long time. xkm1245 showed pocket tens, and hoyazo showed 89h -- and
claimed to have meant to fold. Poor bastard. He doesn't improve.&lt;/p&gt;
&lt;p&gt;10:46 -- hoyazo has been on a tear since that hand, almost recouping his
losses, and raises heavily again. This time, though, I have AQo, and I
reraise to 10xBB. We have even stacks. Hoyazo thinks, then pushes
all-in; it's a quick call for me, and Hoyazo shows AQo as well. It's an
old-fashioned circle jerk as we divvy up the antes &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;p&gt;10:59 -- I've made one move with A6 suited (hey, it's a table of six),
and that crippled me badly when 23skidoo called, then bet at the flop.
Nothing matched up, so I had to fold and surrender half my stack. T4500
ain't much fun when the blinds are at 600.&lt;/p&gt;
&lt;p&gt;11:15 -- We're in the money! Final table shot:&lt;/p&gt;
&lt;div class="serendipity_imageComment_center"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;img alt="image1" src="/uploads/pics/final_table1.jpg" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Final table in 2006/04/11 WWdN invitational...&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;p&gt;SWhoBA blinded out first, followed by a monster match-up between
hoyazo(AT) and 23skidoo(KJ) that saw 23skidoo pair up the jacks. We
battled on for another five minutes or so before I woke up with pocket
queens UTG. A nice raise was followed by Boobie Lover pushing all-in; I
quickly called and he showed pocket jacks. But it was not to be; the
turn brought another jack and I left the table in seventh position. Not
a bad showing, I'm happy with the play, and I had a great time tonight.
Shout-outs to the railbirds (drewspop, Frankl66, Rookette22) -- I hope
to see you next week!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 12 Apr 2006 00:31:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-04-12:/live-blogging-wwdn-presdlee-invitational.html</guid><category>Gaming</category><category>Poker</category></item><item><title>Walk to work with me</title><link>https://coffeecode.net/walk-to-work-with-me.html</link><description>&lt;p&gt;I took these photos about a week ago to document my walk to work. I
skipped the first half, which takes me through residential
neighbourhoods, because heck, you've all seen houses and pavement
before. But for those of you who are still wondering why we would pull
up stakes and move from the heart of the city to Sudbury, I thought that
walking a mile (or two!) in my boots might help you understand.&lt;/p&gt;
&lt;div class="serendipity_imageComment"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;img alt="Three mallard ducks in a pond" src="/uploads/pics/walk2work/ducks.JPG" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;This little pond, complete with ducks as of the end of March, is the
first real feature that I encounter on the path. I look forward to it
every day.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="serendipity_imageComment"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;img alt="Path to Laurentian" src="/uploads/pics/walk2work/path.JPG" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;There are lots of other people who enjoy this nice, gravel path through
the woods: dog walkers, cyclists, joggers, parents with their children
all share this space.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="serendipity_imageComment"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;img alt="Lake Nepahwin" src="/uploads/pics/walk2work/nepahwin.JPG" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Lake Nepahwin is a feature on the left-hand side of the path on my way
to work. There's a quiet little beach that we can go to in the summer.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="serendipity_imageComment"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;img alt="Long path" src="/uploads/pics/walk2work/path2.JPG" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;As you can see, I get a decent workout on my way to work; this is the
second half of the path which is now leading away from Lake Nepahwin.
You can also see that my photography slows me down a bit, as my fellow
walker is well ahead of me now.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="serendipity_imageComment"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;img alt="Uphill climb" src="/uploads/pics/walk2work/climb.JPG" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;There's a good climb between the main path and Laurentian campus,
well-worn by the feet of students, staff, and faculty who take the same
route as me.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="serendipity_imageComment"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;img alt="Laurentian campus" src="/uploads/pics/walk2work/campus.JPG" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="serendipity_imageComment_txt"&gt;&lt;p&gt;Laurentian campus: my office is just around the red brick bulge on the
left.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 10 Apr 2006 08:17:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-04-10:/walk-to-work-with-me.html</guid><category>misc</category><category>Personal</category></item><item><title>Theatre of the macabre</title><link>https://coffeecode.net/theatre-of-the-macabre.html</link><description>&lt;p&gt;Lynn and I went to see &lt;a class="reference external" href="http://www.carnivaldiablo.com/"&gt;Carnival
Diablo&lt;/a&gt; last night at the Mine Mill
Navy League Hall. Most of Sudbury's goth teen population was there --
probably about 150 attendees in all -- but I think our quasi-yuppie
style mixed with Lynn's big baby belly at a late-night carny revival
show was more genuinely freaky/weird than anything the goths pulled off.&lt;/p&gt;
&lt;p&gt;The show started off with promise: Nikolai Diablo, the &amp;quot;Ringmonster&amp;quot;,
asked if there were any skeptics in the audience and I duly raised my
hand, along with a couple of other brash young men. Nikolai held out 4
marked envelopes and asked us to each pick an envelope and display the
contents to the audience. All of us showed a piece of paper marked
&lt;strong&gt;YOURS&lt;/strong&gt;, and Nikolai opened the remaining envelope to reveal a piece
of paper marked &lt;strong&gt;MINE&lt;/strong&gt;. It was classic vaudevillian style, and it was
exactly what we had come to see.&lt;/p&gt;
&lt;p&gt;The rest of the show had other classics: Nikolai hammering a nail into
his nose, various demonstrations of mind-reading, guillotines and
electric chairs, insect-eating and a bed of nails, liberally mixed with
arch humour.&lt;/p&gt;
&lt;p&gt;Verdict: &lt;strong&gt;*recommended*&lt;/strong&gt;.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sat, 01 Apr 2006 22:40:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-04-01:/theatre-of-the-macabre.html</guid><category>misc</category><category>Personal</category></item><item><title>Semi-live-blogging WWdN #21, jg-2323 invitational</title><link>https://coffeecode.net/semi-live-blogging-wwdn-21-jg-2323-invitational.html</link><description>&lt;p&gt;&lt;a class="reference external" href="/archives/49-Live-blogging-WWdN-something,-pink-floyd-in-the-house.html"&gt;Last time
around&lt;/a&gt;,
I ended up taking third place in this damn tourney (incurring the wrath
of &lt;a class="reference external" href="http://sirfwalgman.blogspot.com"&gt;SirFWALGman&lt;/a&gt; when I dared to
call his all-in, representing 40% of my chips, from my position in the
big blind with A8o and ended up sucking out against his ATs. Ah well...
we both made it to the final table of the &lt;strong&gt;Wil Freakin' Wheaton&lt;/strong&gt;
tourney, and walked away with money, so hopefully blogger bygones can be
blogger bygones.&lt;/p&gt;
&lt;p&gt;I call it &lt;em&gt;semi-live&lt;/em&gt; this time around because there's a horrendous
possibility that I might not be able to make it in time for the start of
this event, due to some real-life not-in-front-of-the-computer-screen
interactions going down at our local Timmy Ho's. So, I apologize in
advance if I'm at your table sitting out and screwing up the flow of the
game; rest assured that I will be back in time to check my hand history
and discover that a long string of AA, KK, QQ have passed me by &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;
Feel free to make this a collaborative effort by posting comments with
updates to the live action in my absence!&lt;/p&gt;
&lt;p&gt;And just a quick shout-out to Rookette22,
&lt;a class="reference external" href="http://poker4peace.blogspot.com"&gt;Slimeface&lt;/a&gt;, and
&lt;a class="reference external" href="http://hometownpoker.blogspot.com/"&gt;drewspop&lt;/a&gt; -- hope I get to see
you folks at the table tonight!&lt;/p&gt;
&lt;div class="section" id="update"&gt;
&lt;h2&gt;Update&lt;/h2&gt;
&lt;p&gt;I arrived around a half an hour late, but still had about T1200 in my
stack. Seated at the table was drewspop, L Fudpill, albHammer, SoxLover,
kaellinn18, farmboy03, and mowenumdown -- quite the crew! On my first
hand back, kaellinn18's flopped set of jacks gave way to SoxLover's set
of kings, knocking Matt out of the tourney.&lt;/p&gt;
&lt;p&gt;A few hands later, with K6s in the small blind, I raised it up against
farmboy03. He called, I caught a king on the flop, and after extracting
a bit more cash from him after the flop farmboy03 folded at the turn.
But he took my number with that fold, as you'll see.&lt;/p&gt;
&lt;p&gt;About two hands later, I wound up with pocket aces in late position.
Sweet. farmboy03, with a crippled stack of T475, moved all-in in EP. The
table folded around to me, and I gladly called. He flipped over a pair
of fives, and I was happy. Until his five dropped on the flop, and no
aces turned up for me. Sigh. That left me with T855 in chips, still
plenty to work with, and I quickly popped back up over a thousand.&lt;/p&gt;
&lt;p&gt;Plenty, that is, until I went card-dead for the next fifteen minutes and
began slowly getting blinded down. I was at T705 when GarthMeister, with
T455, pushed all-in. I had pocket fours and thought, well, I'm not sure
what I thought. I think the problem with this hand was that I had
already determined that I had to take my shot with the low pocket pair,
hadn't anticipated somebody else making a move, and fell back on pushing
my chips in anyways. We were isolated, and I guess I was expecting a
race against something like AKo or AQo... instead, Garth had pocket
kings and he handily took my chips (despite the suckout straight that
almost materialized).&lt;/p&gt;
&lt;p&gt;There was no miracle comeback from T250 for me that night. On the next
hand I pushed in from EP with TJo and lost out to hoyazo's paired-up
ace. It was a good night; I was happy that I got the chance to play with
only a slightly weakened stack after having to miss the start of the
tourney, I got a couple of good starting hands (even if they ended up as
bad beats) and I did get to see some familiar, friendly
[STRIKEOUT:faces]icons out there. Until next time, folks!&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 28 Mar 2006 23:23:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-03-28:/semi-live-blogging-wwdn-21-jg-2323-invitational.html</guid><category>Gaming</category><category>Poker</category></item><item><title>Baby shower from Jamie's point of view</title><link>https://coffeecode.net/baby-shower-from-jamies-point-of-view.html</link><description>&lt;p&gt;Courtesy of Jamie Roberts, here is an awesome (and completely unsorted)
set of photos from this past weekend's baby shower! Click on the
thumbnail to see a bigger version of any given photo.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8807.jpg"&gt;&lt;img alt="image0" src="/uploads/pics/shower/_I1J8807.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8808.jpg"&gt;&lt;img alt="image1" src="/uploads/pics/shower/_I1J8808.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8809.jpg"&gt;&lt;img alt="image2" src="/uploads/pics/shower/_I1J8809.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8812.jpg"&gt;&lt;img alt="image3" src="/uploads/pics/shower/_I1J8812.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8813.jpg"&gt;&lt;img alt="image4" src="/uploads/pics/shower/_I1J8813.serendipityThumb.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;That's just a teaser, there are many more below if you click the
&amp;quot;Continue reading&amp;quot; link...&lt;/p&gt;
&lt;p&gt;Thanks Jamie!&lt;/p&gt;
&lt;p&gt;` &amp;lt;&amp;gt;`__&lt;/p&gt;
&lt;div&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8814.jpg"&gt;&lt;img alt="image5" src="/uploads/pics/shower/_I1J8814.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8815.jpg"&gt;&lt;img alt="image6" src="/uploads/pics/shower/_I1J8815.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8816.jpg"&gt;&lt;img alt="image7" src="/uploads/pics/shower/_I1J8816.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8817.jpg"&gt;&lt;img alt="image8" src="/uploads/pics/shower/_I1J8817.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8818.jpg"&gt;&lt;img alt="image9" src="/uploads/pics/shower/_I1J8818.serendipityThumb.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8819.jpg"&gt;&lt;img alt="image10" src="/uploads/pics/shower/_I1J8819.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8820.jpg"&gt;&lt;img alt="image11" src="/uploads/pics/shower/_I1J8820.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8821.jpg"&gt;&lt;img alt="image12" src="/uploads/pics/shower/_I1J8821.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8824.jpg"&gt;&lt;img alt="image13" src="/uploads/pics/shower/_I1J8824.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8825.jpg"&gt;&lt;img alt="image14" src="/uploads/pics/shower/_I1J8825.serendipityThumb.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8828.jpg"&gt;&lt;img alt="image15" src="/uploads/pics/shower/_I1J8828.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8829.jpg"&gt;&lt;img alt="image16" src="/uploads/pics/shower/_I1J8829.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8831.jpg"&gt;&lt;img alt="image17" src="/uploads/pics/shower/_I1J8831.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8832.jpg"&gt;&lt;img alt="image18" src="/uploads/pics/shower/_I1J8832.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8834.jpg"&gt;&lt;img alt="image19" src="/uploads/pics/shower/_I1J8834.serendipityThumb.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8839.jpg"&gt;&lt;img alt="image20" src="/uploads/pics/shower/_I1J8839.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8842.jpg"&gt;&lt;img alt="image21" src="/uploads/pics/shower/_I1J8842.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8843.jpg"&gt;&lt;img alt="image22" src="/uploads/pics/shower/_I1J8843.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8844.jpg"&gt;&lt;img alt="image23" src="/uploads/pics/shower/_I1J8844.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8845.jpg"&gt;&lt;img alt="image24" src="/uploads/pics/shower/_I1J8845.serendipityThumb.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8846.jpg"&gt;&lt;img alt="image25" src="/uploads/pics/shower/_I1J8846.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8847.jpg"&gt;&lt;img alt="image26" src="/uploads/pics/shower/_I1J8847.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8850.jpg"&gt;&lt;img alt="image27" src="/uploads/pics/shower/_I1J8850.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8851.jpg"&gt;&lt;img alt="image28" src="/uploads/pics/shower/_I1J8851.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8852.jpg"&gt;&lt;img alt="image29" src="/uploads/pics/shower/_I1J8852.serendipityThumb.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8853.jpg"&gt;&lt;img alt="image30" src="/uploads/pics/shower/_I1J8853.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8854.jpg"&gt;&lt;img alt="image31" src="/uploads/pics/shower/_I1J8854.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8855.jpg"&gt;&lt;img alt="image32" src="/uploads/pics/shower/_I1J8855.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8856.jpg"&gt;&lt;img alt="image33" src="/uploads/pics/shower/_I1J8856.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8858.jpg"&gt;&lt;img alt="image34" src="/uploads/pics/shower/_I1J8858.serendipityThumb.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8860.jpg"&gt;&lt;img alt="image35" src="/uploads/pics/shower/_I1J8860.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8861.jpg"&gt;&lt;img alt="image36" src="/uploads/pics/shower/_I1J8861.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8862.jpg"&gt;&lt;img alt="image37" src="/uploads/pics/shower/_I1J8862.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8863.jpg"&gt;&lt;img alt="image38" src="/uploads/pics/shower/_I1J8863.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8864.jpg"&gt;&lt;img alt="image39" src="/uploads/pics/shower/_I1J8864.serendipityThumb.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8865.jpg"&gt;&lt;img alt="image40" src="/uploads/pics/shower/_I1J8865.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8866.jpg"&gt;&lt;img alt="image41" src="/uploads/pics/shower/_I1J8866.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8867.jpg"&gt;&lt;img alt="image42" src="/uploads/pics/shower/_I1J8867.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8870.jpg"&gt;&lt;img alt="image43" src="/uploads/pics/shower/_I1J8870.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8871.jpg"&gt;&lt;img alt="image44" src="/uploads/pics/shower/_I1J8871.serendipityThumb.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8872.jpg"&gt;&lt;img alt="image45" src="/uploads/pics/shower/_I1J8872.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8874.jpg"&gt;&lt;img alt="image46" src="/uploads/pics/shower/_I1J8874.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8876.jpg"&gt;&lt;img alt="image47" src="/uploads/pics/shower/_I1J8876.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8878.jpg"&gt;&lt;img alt="image48" src="/uploads/pics/shower/_I1J8878.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8882.jpg"&gt;&lt;img alt="image49" src="/uploads/pics/shower/_I1J8882.serendipityThumb.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8883.jpg"&gt;&lt;img alt="image50" src="/uploads/pics/shower/_I1J8883.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8884.jpg"&gt;&lt;img alt="image51" src="/uploads/pics/shower/_I1J8884.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8885.jpg"&gt;&lt;img alt="image52" src="/uploads/pics/shower/_I1J8885.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8887.jpg"&gt;&lt;img alt="image53" src="/uploads/pics/shower/_I1J8887.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8889.jpg"&gt;&lt;img alt="image54" src="/uploads/pics/shower/_I1J8889.serendipityThumb.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8891.jpg"&gt;&lt;img alt="image55" src="/uploads/pics/shower/_I1J8891.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8895.jpg"&gt;&lt;img alt="image56" src="/uploads/pics/shower/_I1J8895.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8896.jpg"&gt;&lt;img alt="image57" src="/uploads/pics/shower/_I1J8896.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8897.jpg"&gt;&lt;img alt="image58" src="/uploads/pics/shower/_I1J8897.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8898.jpg"&gt;&lt;img alt="image59" src="/uploads/pics/shower/_I1J8898.serendipityThumb.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8899.jpg"&gt;&lt;img alt="image60" src="/uploads/pics/shower/_I1J8899.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8900.jpg"&gt;&lt;img alt="image61" src="/uploads/pics/shower/_I1J8900.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8901.jpg"&gt;&lt;img alt="image62" src="/uploads/pics/shower/_I1J8901.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8902.jpg"&gt;&lt;img alt="image63" src="/uploads/pics/shower/_I1J8902.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8904.jpg"&gt;&lt;img alt="image64" src="/uploads/pics/shower/_I1J8904.serendipityThumb.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8907.jpg"&gt;&lt;img alt="image65" src="/uploads/pics/shower/_I1J8907.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8909.jpg"&gt;&lt;img alt="image66" src="/uploads/pics/shower/_I1J8909.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8910.jpg"&gt;&lt;img alt="image67" src="/uploads/pics/shower/_I1J8910.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8914.jpg"&gt;&lt;img alt="image68" src="/uploads/pics/shower/_I1J8914.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8916.jpg"&gt;&lt;img alt="image69" src="/uploads/pics/shower/_I1J8916.serendipityThumb.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8917.jpg"&gt;&lt;img alt="image70" src="/uploads/pics/shower/_I1J8917.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8924.jpg"&gt;&lt;img alt="image71" src="/uploads/pics/shower/_I1J8924.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8925.jpg"&gt;&lt;img alt="image72" src="/uploads/pics/shower/_I1J8925.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8926.jpg"&gt;&lt;img alt="image73" src="/uploads/pics/shower/_I1J8926.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8927.jpg"&gt;&lt;img alt="image74" src="/uploads/pics/shower/_I1J8927.serendipityThumb.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8928.jpg"&gt;&lt;img alt="image75" src="/uploads/pics/shower/_I1J8928.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8929.jpg"&gt;&lt;img alt="image76" src="/uploads/pics/shower/_I1J8929.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8930.jpg"&gt;&lt;img alt="image77" src="/uploads/pics/shower/_I1J8930.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8934.jpg"&gt;&lt;img alt="image78" src="/uploads/pics/shower/_I1J8934.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8935.jpg"&gt;&lt;img alt="image79" src="/uploads/pics/shower/_I1J8935.serendipityThumb.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8936.jpg"&gt;&lt;img alt="image80" src="/uploads/pics/shower/_I1J8936.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8938.jpg"&gt;&lt;img alt="image81" src="/uploads/pics/shower/_I1J8938.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8940.jpg"&gt;&lt;img alt="image82" src="/uploads/pics/shower/_I1J8940.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8941.jpg"&gt;&lt;img alt="image83" src="/uploads/pics/shower/_I1J8941.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8946.jpg"&gt;&lt;img alt="image84" src="/uploads/pics/shower/_I1J8946.serendipityThumb.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8947.jpg"&gt;&lt;img alt="image85" src="/uploads/pics/shower/_I1J8947.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8949.jpg"&gt;&lt;img alt="image86" src="/uploads/pics/shower/_I1J8949.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8950.jpg"&gt;&lt;img alt="image87" src="/uploads/pics/shower/_I1J8950.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8952.jpg"&gt;&lt;img alt="image88" src="/uploads/pics/shower/_I1J8952.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8954.jpg"&gt;&lt;img alt="image89" src="/uploads/pics/shower/_I1J8954.serendipityThumb.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8955.jpg"&gt;&lt;img alt="image90" src="/uploads/pics/shower/_I1J8955.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8956.jpg"&gt;&lt;img alt="image91" src="/uploads/pics/shower/_I1J8956.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8957.jpg"&gt;&lt;img alt="image92" src="/uploads/pics/shower/_I1J8957.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8959.jpg"&gt;&lt;img alt="image93" src="/uploads/pics/shower/_I1J8959.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8960.jpg"&gt;&lt;img alt="image94" src="/uploads/pics/shower/_I1J8960.serendipityThumb.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8964.jpg"&gt;&lt;img alt="image95" src="/uploads/pics/shower/_I1J8964.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8966.jpg"&gt;&lt;img alt="image96" src="/uploads/pics/shower/_I1J8966.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8967.jpg"&gt;&lt;img alt="image97" src="/uploads/pics/shower/_I1J8967.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8969.jpg"&gt;&lt;img alt="image98" src="/uploads/pics/shower/_I1J8969.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8971.jpg"&gt;&lt;img alt="image99" src="/uploads/pics/shower/_I1J8971.serendipityThumb.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8979.jpg"&gt;&lt;img alt="image100" src="/uploads/pics/shower/_I1J8979.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8980.jpg"&gt;&lt;img alt="image101" src="/uploads/pics/shower/_I1J8980.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8981.jpg"&gt;&lt;img alt="image102" src="/uploads/pics/shower/_I1J8981.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8982.jpg"&gt;&lt;img alt="image103" src="/uploads/pics/shower/_I1J8982.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8983.jpg"&gt;&lt;img alt="image104" src="/uploads/pics/shower/_I1J8983.serendipityThumb.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8984.jpg"&gt;&lt;img alt="image105" src="/uploads/pics/shower/_I1J8984.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8985.jpg"&gt;&lt;img alt="image106" src="/uploads/pics/shower/_I1J8985.serendipityThumb.jpg" /&gt;&lt;/a&gt; &lt;a class="reference external image-reference" href="/uploads/pics/shower/_I1J8986.jpg"&gt;&lt;img alt="image107" src="/uploads/pics/shower/_I1J8986.serendipityThumb.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 22 Mar 2006 13:46:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-03-22:/baby-shower-from-jamies-point-of-view.html</guid><category>Family</category><category>Personal</category></item><item><title>Live-blogging WWdN #-something, pink floyd in the house</title><link>https://coffeecode.net/live-blogging-wwdn-something-pink-floyd-in-the-house.html</link><description>&lt;p&gt;Ugh, I'm twin-tabling (thanks to deciding to play a warm-up sit'n'go)
and trying to live blog, this should be ugly!&lt;/p&gt;
&lt;p&gt;8:30 - farmboy03, hacker59, SirFWALGman, denials, smalldog, cailin deas,
Rogue23 are at my table. Tough sledding ahead!&lt;/p&gt;
&lt;p&gt;8:35 - I try to limp in and am chided (after a raise) that there shall
be no limping tonight. I counter by confiding that my new strategy is to
play weak tonight. Waffles sounds surprised as he asks &amp;quot;just tonight?&amp;quot;.
I fold.&lt;/p&gt;
&lt;p&gt;8:43 - On the other (non-WWdN) table, I'm down to 1000 after folding
every hand. I pick up A-T and raise to 3xBB. One guy calls, another
raises all-in, and as they're both pretty low on chips I figure it's
probably my best shot at fixing my short-stacked situation. I call and
they flip over pocket 4's and pocket 5's. My ace comes on the flop and
I'm suddenly doing all right.&lt;/p&gt;
&lt;p&gt;8:48 - Waffles takes damage when yestbay1 takes Waffles' hammer to the
bank. SirWAFLGMan is down to 315 and cackles gleefully &amp;quot;Now I can play
super aggressive!&amp;quot;. It's scary and true.&lt;/p&gt;
&lt;p&gt;8:54 - I'm out of the other game, after my JQo bet in early position met
up with a re-raise that pushed me all in. Looking at the possibility of
being down to T1000 with BB at 400, hmm, maybe I shouldn't have been in
on that hand after all... now I had to call, and found AKo staring at
me. The miracle did not happen, and I went home in 15th place.&lt;/p&gt;
&lt;p&gt;8:57 - Kc-Jh, for some reason I feel it necessary to call hacker59's
raise to 90 (3xBB). I catch top pair on the flop (Td-3c-Jc) and reraise
hacker59's 150 bet to 300. He calls, checks when the turn comes up Ac,
and I bet the mysterious 222. He thinks, raises me all-in, and I go into
the tank before calling. Not sure why, but that nut flush draw looks
pretty tempting. I was also thinking, hmm, he has me covered for chips,
perhaps he's trying to feed on my weakness. So when I call and see that,
no, in fact the ace enabled him to hit his straight, I'm feeling pretty
foolish. Of course, a club falls on the river and I feel pretty bad,
chanting &amp;quot;u-g-l-y I ain't got no alibi&amp;quot; to soothe myself. But I do have
a lot of chips now.&lt;/p&gt;
&lt;p&gt;9:06 - That's probably why, when I raise 222 preflop with AQo and cailin
deas calls, I'm pretty happy when the flop comes down 7h-Kh-As. I bet
222, and apparently cailin deas is happy too, as he reraises me to 450.
I call, and the turn is a 6s. I bet 386 -- about half of cailin deas's
remaining stack -- and he calls. The river is a 9c, taking away flush
possibilities, and I bet 377 to push cailin deas all in (after he says
&amp;quot;well, I could use an early night&amp;quot;). He turns over Ah-5h, and I find
myself sitting in second place.&lt;/p&gt;
&lt;p&gt;9:11 - Hammer! I raise 226, and SirWAFLGMan calls (the bastard). Flop is
334, and I bet 224... Waffles folds, and for the first time in my life I
get to drop the hammer without getting knocked out of the game &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;p&gt;9:20 - SirWAFLGMan asks me how I got into second; I tell him &amp;quot;sucking
hard&amp;quot;. He promptly makes a set from the turn on his pocket 7s to usurp
jandel from first place and take first place himself.&lt;/p&gt;
&lt;p&gt;9:21 - I respond by scaring people off with my 333 post-flop bet to take
first place away from Waffles. The race is on...&lt;/p&gt;
&lt;p&gt;9:23 - yestbay1 doubles up when his ace proves to be a better kicker
than jandel's king. You have to hate AQ vs. KQ when you hit top pair
with that queen.&lt;/p&gt;
&lt;p&gt;9:30 - At the break, I am no longer #1 (sigh). On the last pre-break
hand, I gave away around 700 in chips to smalldog, who had pocket tens
that made a set on the river. The standings are as follows:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;presdlee - 5445&lt;/li&gt;
&lt;li&gt;denials - 4906&lt;/li&gt;
&lt;li&gt;CawtBluffin - 4610&lt;/li&gt;
&lt;li&gt;yestbay1 - 4330&lt;/li&gt;
&lt;li&gt;BulletJoe34 - 4205&lt;/li&gt;
&lt;li&gt;SirFWALGMan - 4199&lt;/li&gt;
&lt;li&gt;HighOnPokr - 3880&lt;/li&gt;
&lt;li&gt;L0K1 - 3721&lt;/li&gt;
&lt;li&gt;ig-2323 - 3635&lt;/li&gt;
&lt;li&gt;S.t.B - 3260&lt;/li&gt;
&lt;li&gt;23skidoo - 3150&lt;/li&gt;
&lt;li&gt;Boobie Lover - 2990&lt;/li&gt;
&lt;li&gt;Sox Lover - 2845&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Note that I went to the top 12 tonight, as I just loved those last nicks
so much.&lt;/p&gt;
&lt;p&gt;9:40 - mowenumdown doubles up against SirFWALGman when A9o makes a flush
against Waffle's AJo. Not sure how they got to betting 2000 pre-flop,
but there you have it &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;p&gt;10:00 - Hmm, just folded when my Kc-Qc found a three-diamond flop and an
all-in from jandel, who kindly showed me two more diamonds. That knocked
me back down to T3300 and about 18th place out of the remaining 28
players.&lt;/p&gt;
&lt;p&gt;10:09 - Poor godard. UTG I felt confident in my AQo and bet out to 4xBB.
godard went all-in (around 11xBB), but as a new arrival little did he
know that this had been the table of many a suckout. He was called by
jandel with almost an identical stack, and I completed the madness.
godard had pocket 3s, jandel had ATo, and the community brought down two
pair (7s and Js) to knock out godard and split the pot between jandel
and I. I suspect having Rookette22 rail-birding for me helped me out a
bit there. Thanks Rookette22!&lt;/p&gt;
&lt;p&gt;10:21 - After a long, valiant, short-stacked fight, GScottW goes down
with great honour as he goes all-in with his 767 pre-flop. mowenumdown
calls, and it's his Ad-Jd versus GScottW's hammer! They both catch a
piece of the flop, but GScottW can't overcome his hammer and goes out in
style.&lt;/p&gt;
&lt;p&gt;10:26 - SirWAFLGMan (back at the table, now directly to my left) doubles
up with the big slick against astin's pocket threes when the flop brings
an ace to bear. SirWAFLGman is up to T6200, and astin is out of the
tourney.&lt;/p&gt;
&lt;p&gt;10:29 - We're down to 14 players, I'm at T4000 in chips with the BB at
400. I can live a while longer.&lt;/p&gt;
&lt;p&gt;10:35 - Well, last hand pre-break, UTG I bet half my chips on ATo. I
really wouldn't mind just stealing the blinds, but mowenumdown comes
over the top to push me all in. I call, rather resigned, and see his KK
to confirm the deal. But the poker gods have other ideas and double me
up with 2-3-4-5 in the community. Crazy! mowenumdown is quite graceful
about my rather evil suckout, perhaps because he was in the last 30 of
some 1000-player tourney on PartyPoker a few minutes ago... That has to
help salve the wounds &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;p&gt;10:41 - First hand post-break I'm in the BB (at 600) and fold to
yestbay1's 2xBB bet. Second hand, I have AJo and call S.t.B.'s all in of
T2200. His pocket 7s are good until the river, when the jack comes down
and gives me another improbable set of chips. I'm thinking I don't
deserve to be here at the moment, as luck has been my route to the final
10 of this tourney. Oh the shame!&lt;/p&gt;
&lt;p&gt;10:46 - L0K1's turn to suck out a bit as, in the big blind, his 553
chips automatically push him all in. I call, SirFWALGMan calls, but
BulletJoe34 raises to 2400 and Waffles and I grumble and fold. Turns out
that BulletJoe34 has pocket 7s versus L0K1's 7s-9s, but L0K1 catches a
straight to quadruple up and catch a second wind!&lt;/p&gt;
&lt;p&gt;10:49 - I steal the blinds and drop the hammer (to utter silence --
WTF?)&lt;/p&gt;
&lt;p&gt;10:51 - My first final nine in a WWdN tourney! Here are the players and
seating positions:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;SirFWALGMan - 9058&lt;/li&gt;
&lt;li&gt;wigginx - 9144&lt;/li&gt;
&lt;li&gt;BulletJoe34 - 12836&lt;/li&gt;
&lt;li&gt;presdlee - 30108 (SB)&lt;/li&gt;
&lt;li&gt;HighOnPokr - 2853 (BB)&lt;/li&gt;
&lt;li&gt;denials - 10824&lt;/li&gt;
&lt;li&gt;yestbay1 - 8422&lt;/li&gt;
&lt;li&gt;Sweet79Chuck - 4500&lt;/li&gt;
&lt;li&gt;Maudie - 6755&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;10:52 - Final eight. Sweet79Chuck, with T4450, bets 2200 pre-flop. With
A8o I reraise him to 4000. He calls, and the flop is Jc-5d-7c. I push
him all in, and he shows KTo. He doesn't improve, and I'm up to T15000.&lt;/p&gt;
&lt;div class="serendipity_imageComment_left" style="width: 110px"&gt;&lt;div class="serendipity_imageComment_img"&gt;&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/pics/denials2.jpg"&gt;&lt;img alt="Yes, the final five in WWdN some pink floyd thing!" src="/uploads/pics/denials2.serendipityThumb.jpg" style="width: 110px; height: 80px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;p&gt;10:58 - Final five. In the big blind, I find Ad-8h. What's that they say
about ace-anything being good with six or fewer players? SirFWALGMan
raises all-in, and although I have a huge amount of respect for his
play, it seems quite out of character for him to go all-in pre-flop.
Suspecting weakness, and having him covered, I call him, and he turns
over As-Ts. I guess he was pretty serious. The flop brings three
diamonds with it, though, and I am embarassed to complete the flush on
the turn. But knowing that I know have a good chance of lasting longer
helps balance out the embarassment.
&lt;a class="reference external image-reference" href="/uploads/pics/denials4.jpg"&gt;&lt;img alt="Final three!" src="/uploads/pics/denials4.serendipityThumb.jpg" style="width: 110px; height: 80px;" /&gt;&lt;/a&gt;11:09 - In the final three, we trade button raises
around for a while. Everything is going swimmingly; BulletJoe34 and I
are about even with T24000 each, while the fetching presdlee has bout
T44000. I raise to 3200 with JQo, but this time presdlee in the BB
reraises to T110000. Hmm. I suspect that it's a semi-bluff, and really
should fold, but since I just polished off my first beer of the night
over the last ten minutes I'm not thinking too straight and push all-in.
He calls, and shows KQo -- barring a high pair, one of the worst hands I
could see. Two kings on the flop seal the deal, and I'm out in third
place.&lt;/p&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 22 Mar 2006 01:33:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-03-22:/live-blogging-wwdn-something-pink-floyd-in-the-house.html</guid><category>Gaming</category><category>Poker</category></item><item><title>No "Hot Coffee", please, I'm Canadian</title><link>https://coffeecode.net/no-hot-coffee-please-im-canadian.html</link><description>&lt;p&gt;I took a peek at the stats for Coffee|Code today, and was a wee bit
surprised to see that &lt;strong&gt;Hot Coffee code&lt;/strong&gt; was the top search string that
brought people to my site. Jeez, and here I was thinking that all these
people were enthralled by my tales of losing at online poker...&lt;/p&gt;
&lt;p&gt;For those not in the know, &lt;strong&gt;Hot Coffee&lt;/strong&gt; was the name of a patch for
&lt;em&gt;Grand Theft Auto: San Andreas&lt;/em&gt; that unleashed the offensive-to-some
mini-games of a sexual nature and which led to all kinds of notoriety
for the game. Well, even more notoriety than it already had attained for
its in-game violence, all of which led to lawsuits and financial
troubles for the creator (Take Two Interactive).&lt;/p&gt;
&lt;p&gt;If you're one of those hot-n-horny youngsters looking for the &lt;strong&gt;Hot
Coffee&lt;/strong&gt; patch (and ironically due to this post it's now even more
likely that you've landed here): I have had the game for quite a while,
but I don't have the patch (sorry!) and can't offer any insight as to
the quality of the resulting mini-games. But look here, kids: this is
the Internet. If you're frustrated in your search for the patch, I'm
sure you can find much higher quality content of a sexual nature with a
simple search on one of those big seach engines (just make sure you turn
the &amp;quot;Family Friendly&amp;quot; filter off). Consider that a tip from Uncle Dan.&lt;/p&gt;
&lt;p&gt;Heck, I'll even get you slacker kids started. Here's a link to &lt;a class="reference external" href="http://www.asciibabes.com/asciibabesangelinajolie09.html"&gt;Angelina
Jolie&lt;/a&gt;
rendered in old-school erotic ASCII art, just like I would have
painstakingly downloaded at 300 baud from a BBS (although Angelina would
have been disturbingly young at the time--let's not think about that,
ok?). Most amazing of all, that site is actually a commercial site.
Sheesh. You can make money on anything.&lt;/p&gt;
&lt;p&gt;Thanks to
&lt;a class="reference external" href="http://www.boingboing.net/2004/12/02/pornospammers_eterna.html"&gt;BoingBoing&lt;/a&gt;
for the ASCII art link.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 17 Mar 2006 02:51:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-03-17:/no-hot-coffee-please-im-canadian.html</guid><category>misc</category><category>Coffee</category></item><item><title>Stop me if you've heard this one before</title><link>https://coffeecode.net/stop-me-if-youve-heard-this-one-before.html</link><description>&lt;p&gt;Yup, tonight I'm live blogging &lt;strong&gt;WWdN #18: Fishy McDonk Invitational
Part Deux&lt;/strong&gt;, which is just like &lt;a class="reference external" href="http://www.coffeecode.net/archives/46-Live-blogging-WWdN-17-Fishy-McDonk-Invitational.html"&gt;last
week's&lt;/a&gt;
live blog, only this time it's personal. Or something like that.&lt;/p&gt;
&lt;p&gt;Last week, for the second week in a row, I bowed out of the tournament
due to a short-stacked hammer. To plug that hole in my game-dike, this
week I pledge to acquire a large, threatening stack prior to wielding
the hammer in a confused, shuffling-down-the-street-mumbling-to-myself
manner.&lt;/p&gt;
&lt;p&gt;I'll also accept any spare change you might have. It's been a b-a-d
month &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;p&gt;Live blogging will commence below!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Oh yeah, the other thing about this tourney that's kind of
different from last week is that there's no Wil and no Fishy McDonk
tonight. That should make for rampant speculation about WWdN #19 -- if
nobody eliminates Wil, can a tourney have a name?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8:29&lt;/strong&gt; I'm seated at the table with the following players, starting at
the dealer button: Rookette22, yestbay1, me, Mourn, sparkyedge,
BobRespert, lakaris. I think Rookette22 made the money last week and ask
her; she confirms. Damn. Experience &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt; She raises to 4xBB on the
first hand, easily scaring my 58o off the big blind.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8:33&lt;/strong&gt; My first pot of the game comes when my AK catches nothing in
the community (Td-3c-2c-6d-Tc), but apparently sparkyedge caught nothing
either as my 3xBB raise on the river makes him lose interest in the
hand. Woohoo: T1540 in chips. It's hammer time!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8:37&lt;/strong&gt; I realize that 23skidoo joined our table at some point when he
bets 80 preflop and gets called by Rookette22. His bet of 250 on the
turn does not get called, and he shows AQ to reveal that he flopped a
pair o' queens. Nice.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8:40&lt;/strong&gt; Villainiss, the second-place finisher last week, is first out
of the tourney this week. I hope a hammer took her out &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8:44&lt;/strong&gt; UTG, I get the SOOTED HAMMER -- but yestbay bets 5xBB, and I'm
not &lt;em&gt;that&lt;/em&gt; dumb. Yet. I get a beer at the break.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:08&lt;/strong&gt; A thriller, after a few circuits of preflop bets of 4xBB
resulting in folds all the way around. rmgustaf bets 3xBB, 23skidoo in
the BB calls, and the flop is K9T. 23skidoo bets 100, rmgustaf reraises
to 300, and 23skidoo calls.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:20&lt;/strong&gt; Lost half of my stack when my EP bet of 400 (with AJ) was
called by mowenumdown and raised to 700 by lazaris... I called,
mowenumdown called, and the flop came down with no goodness for me.
mowenmdown bet my remaining stack, so I folded, and he flipped over
pocket queens. lazaris exited the game and I live on with 715. Sigh.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:25&lt;/strong&gt; Blinds have taken me down to 565.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:28&lt;/strong&gt; I pick up AK in the BB; yestbay1 limps in and I raise him
all-in. He folds. Ah well, it's probably best. At the break, I have
T615--not exactly a king's ransom.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:30&lt;/strong&gt; Break standings:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;BrainMC: 6523&lt;/li&gt;
&lt;li&gt;sparkyedge: 5175&lt;/li&gt;
&lt;li&gt;dsheep: 5070&lt;/li&gt;
&lt;li&gt;mowenumdown: 4465&lt;/li&gt;
&lt;li&gt;ig-2323: 4220&lt;/li&gt;
&lt;li&gt;randomjustin: 4205&lt;/li&gt;
&lt;li&gt;RandomSam: 4075&lt;/li&gt;
&lt;li&gt;OrangeFloyd: 3835&lt;/li&gt;
&lt;li&gt;cfinn: 3620&lt;/li&gt;
&lt;li&gt;Columbo777: 3575&lt;/li&gt;
&lt;li&gt;resetdave: 3432&lt;/li&gt;
&lt;li&gt;Mourn: 3395&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;9:36&lt;/strong&gt; Despite my predictions, I do not go out on the first post-break
hand. Not enough beer yet. Instead, cfinn doubles up when his pocket 3's
flop a set against Ingoal's mucked hand.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:42&lt;/strong&gt; Wondering where Wil is, I ponder &amp;quot;Maybe he's still on the
casting couch&amp;quot;. That gets a few chuckles from the crowd...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:44&lt;/strong&gt; Down to 390 in chips, I call the all-in with pocket tens
against jg-2323's preflop bet of 450. Sadly, his KJo catches a K on the
flop and I don't pick up another ten. I'm gone in 39th place. Is it the
beer? Or the luck (bad)? Or just playing overly tight (like, just a few
hands before I had the hammer in the BB and elected &lt;em&gt;not&lt;/em&gt; to push in
against yestbay1's raise in the small blind--that's gotta be bad karma)?
I dunno, but like I said at the top of the post, it's been a b-a-d
month.&lt;/p&gt;
&lt;p&gt;Mind you, I've certainly enjoyed the WWdN tourneys. I just wouldn't
mind, you know, picking up a few bucks here or there again. Oh the glory
of filthy lucre!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 15 Mar 2006 01:19:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-03-15:/stop-me-if-youve-heard-this-one-before.html</guid><category>misc</category><category>Poker</category></item><item><title>Live blogging WWdN #17: Fishy McDonk Invitational</title><link>https://coffeecode.net/live-blogging-wwdn-17-fishy-mcdonk-invitational.html</link><description>&lt;p&gt;Hmm, so &lt;a class="reference external" href="/archives/45-Live-blogging-WWdN-16-Robbie-Robb-Invitational.html"&gt;last
week&lt;/a&gt;
my filthy goal of finishing in the money came up a bit short (about 30
places short) when my short-stacked pocket eights met pocket jacks and
came out the worse for wear. I've noticed a little pattern in the last
two weeks of my play: when the pressure starts to ramp up, I have a wee
bit of trouble letting go of a good starting hand even if the flop and
turn don't give me any love. So, &lt;strong&gt;hot tip here&lt;/strong&gt;, if you're up against
me after the break and I'm going all in, it's probably because I have a
crappy hand and I'm just trying to scare you off.&lt;/p&gt;
&lt;p&gt;Of course, I also might have flopped a set. You'll get no warranties or
guarantees from me, my friends. ANd I'll make no guarantees of
live-blogging all the way to the finish, despite
&lt;a class="reference external" href="http://www.sirfwalgman.blogspot.com/"&gt;SirFWALGman's&lt;/a&gt; admonitions in
the last couple of weeks for bailing out early. I figure two hours is a
good enough investment over here in the Eastern Standard Time zone,
especially last week when I was starting a brand new job the next
morning...&lt;/p&gt;
&lt;p&gt;Let's see how things go tonight.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8:28&lt;/strong&gt; My starting table is studded with stars: L0K1, Up4Poker, Astin,
sellthekids, HighOnPokr, and Maudie.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8:30&lt;/strong&gt; Up4Poker steals the blinds with a modest raise, and cries out
&amp;quot;chip leader!&amp;quot;. You go, CJ!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8:31&lt;/strong&gt; L0K1 tangles with Astin; turns out the low-key one has pocket
queens and flopped a set. Astin escapes with T1120 after flopping two
pair (jacks and queens). Smart player!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8:35&lt;/strong&gt; sellthekids wakes up to HighOnPokr's preflop 400 bet, says &amp;quot;I'm
not going to war with pocket 9's -- nice AK&amp;quot;, and folds -- and
HighOnPokr yells BOOYA and drops the hammer. Nice!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8:36&lt;/strong&gt; Wil arrived at the table bearing T3490 in chips. This really is
a star-studded table!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8:46&lt;/strong&gt; We ponder whether soul-crushing or ball-crushing is worse.
Getting all metaphysical, I ponder aloud whether a soul has balls, and
Wil responds definitively that a soul has red shiny balls.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8:54&lt;/strong&gt; Chat box is going crazy; at one point many many
self-referential arrows are flying, my only contribution is &amp;lt;----- Steve
Martin -----. Yes, I'm a lame ASCII joker.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8:56&lt;/strong&gt; Back to back hammers as first CJ, then louddwnunder drop
winning hammers. This table is in fine spirits!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:02&lt;/strong&gt; Ax suited, first hand in ages UTG, I raise to 150 (3xBB).
louddwnunder calls, and Maudie raises to 250. I call, and louddwnunder
calls. Flop comes Jx9 rainbow... troublesome. Maudie bets 650, I think
about it but (shockingly) fold, and louddwnunder pushes all-in. Maudie
shows AJ to louddwnunder's KJ... but of course louddwnunder picks up the
runner-runner flush to (somewhat embarassingly) take the pot.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:28&lt;/strong&gt; I peek down at pocket queens. L0K1 bets 300, I raise to 800.
sellthekids says &amp;quot;what's that term - fold equity?&amp;quot;. L0K1 calls. Flop
brings a QJ2; I check, L0K1 goes all in, and I quickly call. He's got a
pair of jacks, but my set holds up, so I'm sitting at T3000 chips. One
hand makes a big difference!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:29&lt;/strong&gt; Wil is magically sucked away from our table.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:30&lt;/strong&gt; We're on break.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:42&lt;/strong&gt; Some live blogger I am -- no chip counts for you tonight! L0K1
and I have been moved to a new table, featuring Garthmeister, bdr1968,
and Villainiss (with T5500, s/he's the big stack of the table).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:45&lt;/strong&gt; Big damage for me when I turn up pocket nines UTG. I bet 450,
but with T1200, L0K1 goes all in, and Garthmeister increases the damage
by going all-in himself. It's just another 1300 for me, so I call, and
see that Garthmeister has cowboys vs. L0K1's big slick. Of course, an
improbable king drops on the flop taking away what little hope I might
have had for a suckout &lt;img alt=":-)" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:47&lt;/strong&gt; With AK and T1200 I push all-in, going over top of
randomjustin's 450 pre-flop bet. He folds. I breathe a little easier,
although my stack is still pretty marginal.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:51&lt;/strong&gt; UTG again, I open with pocket tens and a bet of 600. SoxLover
goes all-in (with his 810). I call and the tens hold up. This is just
like that birth meditation script I was reading last night; breathing
deeper, breathing slower.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:00&lt;/strong&gt; With T3000 I'm 20th out of 30 remaining players... #1 (L
Fudpill) has T11500. I'm feeling good, folding like a fiend. But I'm
almost through my post-break beer. This could be trouble.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:02&lt;/strong&gt; Pocket Rockets! I bet a nice, safe 600 (3xBB), and hacker59 in
the big blind pushes all-in with his remaining 1000 chips. I call, he
shows pocket fives, and the aces stand up... phew. For a second my
beer-addled brain thinks the river 4 is a 5. Maybe I shouldn't drink and
play poker? Perish the thought.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:04&lt;/strong&gt; Garthmeister is evvvvilll for raising me in the big blind, all
the time. He &lt;em&gt;claims&lt;/em&gt; to keep getting hands, but I know the truth. He's
evil.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:08&lt;/strong&gt; See? I limped in UTG with my suited Jx, and only Garth (in the
BB) stuck around. With a flop of AQJ I've got bottom pair, but of course
I disbelieve that Garth could have had anything and wind up giving him,
oh, about 2200 chips to leave me with 1800 when he reveals a Q.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:09&lt;/strong&gt; Poor Garth just went all-in with the hammer and Villainiss
called... no luck for Garth tonight and he's out of the tourney in 30th
place.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:13&lt;/strong&gt; CJ successfully throws another hammer; that makes about ten on
the night &lt;strong&gt;and&lt;/strong&gt; he has T3600! Scary. But good scary.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:20&lt;/strong&gt; With T985 in the BB, I need a good hand and get one: AJ
suited. But everyone folds around. Boooo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:22&lt;/strong&gt; Maudie pushes all-in with pocket 8's against CJ's AQ, but CJ
picks up river-river queens to make a set and send Maudie packing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:23&lt;/strong&gt; HAMMER in early position! I push all in with my 1000 chips,
but Villainiss calls me and shows AK. Hmm. The king on the flop is the
cement on my ankles and once again I am knocked out of this tourney
(22nd place this time) due to a hammer. I think Villainiss, by the way,
has taken out at least three hammers tonight--nasty wench!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:34&lt;/strong&gt; On the button, louddwnunder bets 1000 (2.5xBB), and the
short-stacked Systems2005 pushes all-in in the big blind with an extra
1000. louddwnunder calls, showing suited J9(?!) and Systems2005 shows
A5. Flop brings a 5, but the turn brings a 9 and Systems2005 is the
15th-last person to leave the tournament.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:35&lt;/strong&gt; Second break, the chip totals are:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Villainiss: 25769&lt;/li&gt;
&lt;li&gt;L Fudpill:21013&lt;/li&gt;
&lt;li&gt;Troublecat: 17233&lt;/li&gt;
&lt;li&gt;Up4Poker: 9375&lt;/li&gt;
&lt;li&gt;FishyMcDonk: 9219&lt;/li&gt;
&lt;li&gt;louddwnunder: 8362&lt;/li&gt;
&lt;li&gt;S.t. B: 7520&lt;/li&gt;
&lt;li&gt;farmboy03: 6985&lt;/li&gt;
&lt;li&gt;FatTabbyMama: 6505&lt;/li&gt;
&lt;li&gt;Rookette22: 5585&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;And that's all for me tonight (I can hear SirFWALGman booing from here).
My post-game analysis suggests that either I have to stop attempting to
play the hammer in critical situations, or I should stop drinking beer
during these tourneys, and maybe I'll actually make some better
judgement calls so I have a chance of landing in the money. Ah well...
until next week folks, may all your pockets be rockets.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Guerilla update at 11:23&lt;/strong&gt; L Fudpill, with a T25,000 chip count,
managed to sit out for the last fifteen minutes of the game and landed
in third place. Then, after starting headsup play with a dominating
T100,000 chip count, Villainiss slipped to T8000 after a disastrous
low-pair gambit failed against S.t.B.'s flopped pair of kings... and a
few hands later, despite crawling back to T24,000, Villianiss is out
when her flopped pair of aces cannot improve against S.t.B.'s flopped
two pair (8's and 9's). Good game all!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 08 Mar 2006 01:18:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-03-08:/live-blogging-wwdn-17-fishy-mcdonk-invitational.html</guid><category>Gaming</category><category>Poker</category></item><item><title>Live blogging WWdN #16: Robbie Robb Invitational</title><link>https://coffeecode.net/live-blogging-wwdn-16-robbie-robb-invitational.html</link><description>&lt;p&gt;&lt;a class="reference external" href="/archives/42-Live-blogging-WWdN15-KentAllard-Invitational.html"&gt;Last
week&lt;/a&gt;
at the WWdN#15 I exceeded my original goals, but failed to make it to
the cash after a couple of my hammer bluffs were called (to ruinous
effect) by [STRIKEOUT:evil]wise, astute players.&lt;/p&gt;
&lt;p&gt;This week, I have a new goal: I want a piece of that money, baby, that
sweet sweet WWdN cash. Dare to dream. I'm going to rub it all over my
chest, slide it around between my thighs, and lick it from end to end.
Oh yeah... Mmm, that got me going, so I've kind of made a mess of this
week's entry fee. You don't mind, do you? Oh? Hmm. Sorry. The reason for
my new focus on cash is that I had a bit of a nasty weekend, you see,
where I dropped about $150 in a continuous string of bad beats in SNGs.
Overall, I'm still up about $350 since starting this whole sordid affair
in October... but $500 is such a nice, round number, I would like to get
back to it.&lt;/p&gt;
&lt;p&gt;I learned last week that &lt;strong&gt;Tactix&lt;/strong&gt; is brother to &lt;strong&gt;Joane1111&lt;/strong&gt;, and
also that &lt;strong&gt;elcee&lt;/strong&gt; (&lt;em&gt;not&lt;/em&gt; &lt;strong&gt;bluegillchow&lt;/strong&gt;, what was I thinking) is
Joanne1111's father. In the interest of full disclosure and honesty, I
have to reveal that &lt;strong&gt;dsheep&lt;/strong&gt; is my brother and &lt;strong&gt;NHL 200X&lt;/strong&gt; is my
cousin. Interestingly, both of them have been, are now, and will once
again be my lovers. So, for all of you people wandering through my blog
for the first time shaking your head at my little poker addiction--it's
nothing compared to good clean incestuous fun. Whooo!&lt;/p&gt;
&lt;p&gt;The live-blogging didn't seem to hurt my game too much last week, so
I'll give it a shot again this time around. While you might not get live
blogs, you can probably get a much better post-game account from the far
more interesting blogs of
&lt;a class="reference external" href="http://www.sirfwalgman.blogspot.com/"&gt;SirFWALGman&lt;/a&gt; and
&lt;a class="reference external" href="http://poker4peace.blogspot.com/"&gt;slimeface&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A final note for you slack-jawed cretins who fail to enter the
tournament until mere moments before the tourney starts: you can
register a few hours ahead of time, turn off your Pokerstars client, and
join the game at any time. This leaves you free to have a relaxing
dinner with your spouse, teach your nephew some new and obscure
profanity, and get half-way through a house repair job before you have
to join the game. If you don't register in advance, and you're late,
then you miss out on all the fun, period.&lt;/p&gt;
&lt;p&gt;So, in your Pokerstars client, go to Tourney -&amp;gt; Private -&amp;gt; WWdN #16 and
enter the password &lt;em&gt;monkey&lt;/em&gt;. It's a shot at fame, glory, and sweet sweet
cash (albeit cash smeared against my body). And it's the best damn fun
on the whole dang Intuhnaht!&lt;/p&gt;
&lt;p&gt;Next hand: 67 unsuited. Thrown away.&lt;/p&gt;
&lt;p&gt;Next hand: KK. Hmm, cowboys! I raise 60, it folds around to DavidK in
the big blind. Flop comes 2d-8h-Tc. Looks good to me, DavidK checks, I
bet 80, DavidK calls. Turn: Jc. I don't like the potential straight /
flush chances, and DavidK opens with a bet of 200. I reraise to 420
figuring this is just his attempt to push me out, and he goes all in.
Oddly enough, I completely missed that stop sign, officer... I call, and
all I see is DavidK's deuce making a set. Hmm. Awesome, I finished first
/ last in a tourney I've been looking forward to since last week. Can I
change my icon to a donkey? Heh...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8:50 PM&lt;/strong&gt;: DavidK has frittered away my donation to $2580. Hey man!
Invest wisely! &lt;img alt=":-)" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8:54&lt;/strong&gt;: SERNE has been way down, then come way back to $2160. Mad
skills!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8:55&lt;/strong&gt;: smalldog takes his 705 stack and doubles up when his cowboys
defeat A-7 unsuited from SoxLover&amp;lt;./p&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8:58&lt;/strong&gt;: maigrey's queens take Lcsd114 out of the tournament when his
89 unsuited fail to catch anything... Lcsd114 was down to $50 in chips
after DakotaKen kicked him in the crud with a J kicker.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:01&lt;/strong&gt;: dsheep makes his first move of the night, betting 715 after
the 4-2-9 flop to scare everyone else off. He's up to $2085 as a result.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:03&lt;/strong&gt;: Bloody P goes all in with 715 stack to double up when his AJ
catches not just one ace, but two aces, to beat sellthekids pocket 5's.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:07&lt;/strong&gt;: dsheep playing the bully, reraising at will and forcing
maigrey to back down. dsheep is at $2560.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:08&lt;/strong&gt;: Did I actually play in this tournament? It's all such a
blur... I can guarantee you that live-blogging didn't affect my game at
all. No excuses for me.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:12&lt;/strong&gt;: kaelinn18 shows up at Pauly's table and turns into a wrecking
ball when his/her(?) pocket rockets slam into the pair of queens DrPauly
caught on the flop. Exit DrPauly. kaelinn18 is over $5000 in chips and
sits in first place in the tourney.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:16&lt;/strong&gt;: sellthekids goes down in 75th when his stone-cold 4-3 suited
semi-bluff runs into Bloody P's AJ and the community gives him no help.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:20&lt;/strong&gt;: kaelinn18 continues to do damage when smalldog's A-3 unsuited
withers against kaelinn18's K-T diamonds, which eventually catches two
more kings to give her a solid set.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:32&lt;/strong&gt;: At the break, we have:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;kaelinn18 with 7060&lt;/li&gt;
&lt;li&gt;CautionESPN with 6095&lt;/li&gt;
&lt;li&gt;Arcon with 6030&lt;/li&gt;
&lt;li&gt;heffmike with 5080&lt;/li&gt;
&lt;li&gt;peacecorn with 5050&lt;/li&gt;
&lt;li&gt;tylerdavis45 with 4805&lt;/li&gt;
&lt;li&gt;maigrey with 4760&lt;/li&gt;
&lt;li&gt;ricoM with 4050&lt;/li&gt;
&lt;li&gt;Trekgal with 3740&lt;/li&gt;
&lt;li&gt;brd1968 with 3675&lt;/li&gt;
&lt;li&gt;GRobman with 3372&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;9:45&lt;/strong&gt;: thebrux reraises Sweet79Chuck's preflop raise all-in --
Sweet79Chuck thinks, calls, and goes down in flames (54th place) when
his AQ can't catch up to thebrux's AK.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:47&lt;/strong&gt;: WHOA! SERNE smokes Gilain when his pocket kings catch two more
kings on the flop, leaving SERNE woefully behind with pocket Q's. SERNE
rockets up to $8400 and sites in second place behind CautionESPN.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:51&lt;/strong&gt;: A rollercoaster for maigrey when his big slick catches an A on
the turn to overtake L0K1's tens -- but of course another ten falls on
the river to send maigrey to sleep for the night.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:53&lt;/strong&gt;: Trekgal (sporting a nice Dr. Crusher icon) goes all-in to take
down a 7130 pot from thebrux when her pocket queens make the set on the
flop against thebrux's big slick. Poor thebrux is down to $2530 in
chips, while Trekgal moves up to fourth.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:56&lt;/strong&gt;: Trekgal takes out pennerii when he goes all-in after the 4-6-K
flop; Trekgal calls, showing KQ to pennerii's pocket tens. The kings
hold up and Trekgal is up to $7930 in chips.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:58&lt;/strong&gt;: BrainMC takes down phluxer's big slick with pocket 7's, making
the set on the river for extra burn. BrainMC has $6075 in chips, phluxer
goes out in 38th place.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:00&lt;/strong&gt;: TSN turning point for L0K1 and heffmike. After a J-K-2
rainbow flop, heffmike responds to L0K1's checkraise by going all-in
(raising 5600 to 7400); L0K1 defends hhis pride by calling. L0K1 shows
QK, while heffmike shows big slick. L0K1 catches a Q on the river and
takes down an $11840 pot, putting him comfortably in first place.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:04&lt;/strong&gt;: L0K1 and heffmike are at it again with heffmike's pre-flop
all-in; heffmike's pocket 9's go down when L0K1 catches a Q on the flop
to pair up his AQ. heffmike is out and L0K1 is even more solidly in
first place with the $4560 pot.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:07&lt;/strong&gt;: SERNE doubles up against DakotaTen with the classic match-up:
pocket aces against cowboys. SERNE's aces hold up leaving DakotaTen with
$2020 and giving SERNE $12025 in chips.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:09&lt;/strong&gt;: Arcon feels the [STRIKEOUT:Crusher]Trekgal magic when he
goes all-in preflop with suited AJ; Trekgal calls with AQ and it holds
up for her and a $6520 pot, pushing her over $10000 in chips.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:19&lt;/strong&gt;: Joanne1111 on the tightwire with 345, doubles up when she
catches a Q on the river to make a pair... then goes all-in preflop to
raise 23skidoo, who calls her for the extra $240 bones. 23skidoo has A-T
vs. Joanne1111's A-Q, but a T comes down in the flop. Breath is held,
then released audibly as Q hits on the turn, followed by another Q on
the river -- and Joanne1111 is very much alive in this tourney now,
ladies and gentlemen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:21&lt;/strong&gt;: 23skidoo, trying to cling to life after the beat by Joanne,
goes all-in preflop with A4 vs. Colombo777's 9-T; a ten hits on the
flop, but an ace comes down on the turn to let 23siddo double up.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:22&lt;/strong&gt;: dsheep bets his entire pitiful $1400 preflop, called by ricoM
-- dsheep shows pocket 7's, ricoM shows pocket 6's, and that's how
things stay.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:25&lt;/strong&gt;: U-G-L-Y you ain't got no alibi: cfinn calls Bloody P's $2775
all-in and shows Ah-Td to Bloody P's 7's. Four diamonds drop down and
Bloody P leaves the game in in 20th place.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:29&lt;/strong&gt;: We reach the final 18 when dsheep's rockets decimate ricoM's
A9d.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:30&lt;/strong&gt;: Trekgal crushes cfinn after the 5-6-2 flop when cfinn decides
his big slick is good to go; Trekgal has rockets and sends him on his
way.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:33&lt;/strong&gt;: Guiness bets 7090 pre-flop, scaring everyone away, and
proudly unveils &lt;strong&gt;the HAMMER&lt;/strong&gt;! Awesome.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:35&lt;/strong&gt;: Break time, we have:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;SERNE: 23555&lt;/li&gt;
&lt;li&gt;Trekgal: 17627&lt;/li&gt;
&lt;li&gt;GRobman: 14914&lt;/li&gt;
&lt;li&gt;brd1968: 13262&lt;/li&gt;
&lt;li&gt;RandomSam: 12605&lt;/li&gt;
&lt;li&gt;Guinness: 9615&lt;/li&gt;
&lt;li&gt;SirFWALGman: 9324&lt;/li&gt;
&lt;li&gt;CautionESPN: 9021&lt;/li&gt;
&lt;li&gt;TiprJax: 8450&lt;/li&gt;
&lt;li&gt;L0K1: 7970&lt;/li&gt;
&lt;li&gt;kaelinn18: 7370&lt;/li&gt;
&lt;li&gt;dsheep: 6667&lt;/li&gt;
&lt;li&gt;peacecorn: 5250&lt;/li&gt;
&lt;li&gt;Frank66: 2870&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Good time for a break too... your narrator is wearing down quickly. My
cat, Spook, has decided to make his displeasure with the lack of
attention accorded to him known by sitting on my forearms, limiting my
motion and aggravating the building case of tendinitis. Oh the
sacrifices I make...
&lt;strong&gt;10:41&lt;/strong&gt;: Break over, Frankl66 goes right to work taking his short
stack all in preflp. Guiness calls, shows QQ, and Frankl66 groans as he
displays AQ. No aces come down, no straights appear, and Frankl66 exits
stage left.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:44&lt;/strong&gt;: TripJax goes all in at the 4-K-8 flop with 7050, CautionESPN
goes into the think tank before finally calling and revealing K9.
TripJax has the rockets and CautionESPN is down to $1100. TripJax is at
the 18000 mark.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:46&lt;/strong&gt;: More TripJax action as his pocket queens eliminate Guinness
and his A-T. That brings TripJax to the $30000 mark... wow.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:49&lt;/strong&gt;: L0K1 and CautionESPN split a pot, giving CautionESPN a bit
more life (with $583 in chips).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:50&lt;/strong&gt;: down to 3500 in chips, dsheep pulls the trigger and goes over
the top of SERNE's 3xBB raise with an all-in. SERNE calls, revealing the
almighty 58h to dsheep's KJ... and promptly picks up two more fives to
make a set, knocking dsheep out in 10th place. Alas, only 9 places paid
tonight...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:51&lt;/strong&gt;: Trekgal is the first out of the final table.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:54&lt;/strong&gt;: GRobman puts the hurt on RandomSam when his jacks knock down
cowboys by making the set on the flop. GRobman $30828, RandomSam $14896.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:59&lt;/strong&gt;: Hammer flop -- 277! TripJax raises 3000, SERNE calls. Checks
through the turn (5). SERNE raises 6400 on the river (J) and TripJax
folds with a few moments of thought. The crowd sighs in disappointment
that no hammer was revealed...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:51&lt;/strong&gt;: GRobman's powerhouse KJ busts bdr1968's JJ with a K on the
turn. The $44530 pot goes to GRobman and bdr1968 is out in 7th place.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;11:04&lt;/strong&gt;: High drama on the random seas as RandomSam goes all-in with
big slick versus SERNEs JJ... flop is 54A, but the turn is a J, and the
river is another A, giving RandomSam the best possible losing hand &lt;img alt=":-)" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;11:25&lt;/strong&gt;: TripJax (AK) takes out GRobman (TJ suited). Final four are:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;SERNE: 41945&lt;/li&gt;
&lt;li&gt;SirFWALGman: 39073&lt;/li&gt;
&lt;li&gt;kaellinn18: 34668&lt;/li&gt;
&lt;li&gt;TripJax: 29514&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;... and I think it's good night for me.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 01 Mar 2006 00:48:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-03-01:/live-blogging-wwdn-16-robbie-robb-invitational.html</guid><category>Gaming</category><category>Poker</category></item><item><title>Some apologies, some reassurances</title><link>https://coffeecode.net/some-apologies-some-reassurances.html</link><description>&lt;p&gt;As I mentioned in a &lt;a class="reference external" href="/archives/43-ibm_db2-close.html"&gt;previous
post&lt;/a&gt;, I'm
leaving IBM for a new opportunity at Laurentian University. Over the
past year and a half a lot of my personal and professional effort has
gone into the PHP community: contributing documentation, acting as the
release lead for the ibm_db2 and PDO_INFORMIX extensions, giving
conference sessions, and writing the occasional article.&lt;/p&gt;
&lt;p&gt;When I made the decision to leave IBM, I also had to back down from some
related commitments that I had made (formally and informally) to a few
different people and groups. I want to apologize publically for letting
you down, and hope that you'll forgive me:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://oscms-summit.org"&gt;Open Source Content Management Summit
(OSCMS)&lt;/a&gt;: I was going to give a nice
update on my database portability talk, focusing on the experiences
I've had in trying to port &lt;a class="reference external" href="http://s9y.org"&gt;Serendipity&lt;/a&gt; to run on
DB2. Unfortunately, once I decided to leave IBM I couldn't justify
sticking Big Blue with the travel and accomodations costs for flying
out to Vancouver, so I had to back out of OSCMS with just a few
weeks' notice. I felt really, really bad about that.&lt;/li&gt;
&lt;li&gt;Speaking of &lt;a class="reference external" href="http://s9y.org"&gt;Serendipity&lt;/a&gt;, I still owe Gavin &lt;a class="reference external" href="http://sourceforge.net/mailarchive/forum.php?thread_id=9555380&amp;amp;forum_id=31275"&gt;that
patch&lt;/a&gt;
for enabling DB2... I'll find the time one of these evenings!&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://conf.phpquebec.org"&gt;PHP Quebec&lt;/a&gt;: I was going to give a
couple of talks at PHP Quebec in March, and was really looking
forward to the conference given the trip reports and pictorial
evidence from the last couple of years. However, it falls in the
middle of the week. Worse, for me, it will be the third week at my
new job, and while I expect Laurentian University to be a very
understanding employer, my focus for the first few months has to be
on learning the culture and challenges of my new position.&lt;/li&gt;
&lt;li&gt;An article here or there on DB2 and PHP: it made more sense to help
get other IBMers involved and visible in the community, which meant
handing off plans for an article to a different writer (and
consequently blowing at least one publication schedule). I apologized
in private for this at the time, but want to apologize publically as
well. You know who you are...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, a few of you have wondered on IRC whether this means the end of my
contributions to the PHP community... the answer is an emphatic *heck
no*! First of all, my new position will give me some latitude in
deciding upon the technologies we use to solve the problems we face, and
the Library is already using PHP... so we're likely to continue to use
it. And on a personal level, there are a number of projects that I want
to continue to be involved with:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;PHP Data Objects (PDO): the basic
&lt;a class="reference external" href="http://php.net/pdo"&gt;documentation&lt;/a&gt; is in decent shape, but I have
some catching up to do on new features, some examples to add, and
some driver-specific documentation to add. I'll actually be in a
better position to document it in my new role.&lt;/li&gt;
&lt;li&gt;PDO_ODBC: I noticed some significant regressions in the PDO_ODBC
driver between the 5.1.0 and 5.1.1 releases that the 5.1.2 release
did not address. Given that the &lt;a class="reference external" href="http://php.net/ibm_db2"&gt;ibm_db2&lt;/a&gt;
driver is written in DB2 CLI, a very close cousin to ODBC, I'm sure
that with a few hours of investigation I can submit some patches for
PDO_ODBC that will get the 5.1.3 release back on track. Oh yeah, and
I have motivation to make sure this works because that &lt;a class="reference external" href="/archives/26-Apache-Derby-Off-to-the-Races-in-the-paper-flesh!.html"&gt;book I
co-authored&lt;/a&gt;
contains a chapter on PDO_ODBC...&lt;/li&gt;
&lt;li&gt;Documentation in general: I still need some outlets for technical
writing, so I plan to keep an eye on the phpdoc project and
contribute to the tools and docs where it makes the most sense.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So I'll still be around; you just won't see me at the conferences this
year, and I'll probably be even less productive over the next few months
than normal as I adjust to the new role at the University. Oh, not to
mention my new role as a father, which I am also expected to take on in
a few months. But over time, I'm sure you'll hear more from me, and
you'll start seeing submissions for conferences and articles grounded in
my experiences at the library.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 27 Feb 2006 17:18:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-02-27:/some-apologies-some-reassurances.html</guid><category>misc</category><category>PHP</category></item><item><title>ibm_db2-&gt;close()</title><link>https://coffeecode.net/ibm_db2-close.html</link><description>&lt;p&gt;After almost eight years, today is my penultimate day at IBM.&lt;/p&gt;
&lt;p&gt;I've done a lot of interesting work for IBM in that time. From learning
about Linux back in 1998 by testing the pre-release DB2 Version 5.2 beta
for Linux, to writing the original &lt;a class="reference external" href="http://tldp.org/HOWTO/DB2-HOWTO/"&gt;DB2 for Linux
HOWTO&lt;/a&gt; for the Linux Documentation
Project, to helping realize the &lt;a class="reference external" href="http://publib.boulder.ibm.com/infocenter/db2help/"&gt;DB2 Information
Center&lt;/a&gt; (setting
the standard for the entire IBM corporation along the way), to helping
give &lt;a class="reference external" href="http://php.net/ibm_db2"&gt;PHP solid support for DB2&lt;/a&gt;... it's a
pretty amazing set of accomplishments for a person whose previous jobs
include such well-respected positions as an inventory clerk and a night
clerk at a convenience store.&lt;/p&gt;
&lt;p&gt;The funny thing is, my real professional training is as an information
professional. Ahem. More specifically, I have a Master's of Information
Studies from the University of Toronto. Still doesn't mean anything to
you? Okay... I'm a professionally accredited librarian.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;No, not this:&lt;/div&gt;
&lt;div class="line"&gt;&lt;img alt="Dan as shushing librarian" src="/uploads/pics/shush.jpeg" /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;More like this...&lt;/div&gt;
&lt;div class="line"&gt;&lt;img alt="A button with text: Radical Militant Librarian - Defending Access, Defending Privacy, Defending Freedom" src="http://www.ala.org/Images/OIF/radicalbutton.jpg" /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;After our move to the frozen wastelands of the North, I was given the
opportunity to exercise those long-neglected information professional
muscles in an academic environment. I hemmed and hawed over it for a
very long time, but on Wednesday, I'll be starting my new career as the
Systems Librarian for &lt;a class="reference external" href="http://laurentian.ca"&gt;Laurentian University&lt;/a&gt;.
It is very difficult to leave IBM behind, as the people I have worked
with have been pretty amazing, and much of the personal and professional
growth that I have undergone has been due to the nurturing environment
of Big Blue... but Laurentian is giving me a fabulous opportunity that I
don't want to miss.&lt;/p&gt;
&lt;p&gt;So -- farewell to IBM, and hello Laurentian! Between the new home, the
new job, and the new baby on the way, it is going to be a very
interesting year &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 27 Feb 2006 12:44:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-02-27:/ibm_db2-close.html</guid><category>Databases</category><category>Personal</category></item><item><title>Live blogging WWdN#15: KentAllard Invitational</title><link>https://coffeecode.net/live-blogging-wwdn15-kentallard-invitational.html</link><description>&lt;p&gt;&lt;a class="reference external" href="/archives/36-Live-blogging-the-WWdN-Sabboth-Invitational.html"&gt;Last
time&lt;/a&gt;
I tried this live-blogging thing, I reached my goal of placing in the
top 100. Of course, there were only 99 registered players, and I placed
99th, so that was the wrong kind of outstanding finish.&lt;/p&gt;
&lt;p&gt;This time, I'm aiming a bit higher:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Not be the first person knocked out of the tournament (hee-haw!)&lt;/li&gt;
&lt;li&gt;Make it to the break.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I had a great Sunday of poker, ringing up $150 net, so this means that
the poker gods will probably send in a golden shower for me. Ah well,
stay tuned for the exciting story of the &lt;a class="reference external" href="http://www.cardsquad.com/2006/02/21/wwdn-kentallard-invitational-tonight/"&gt;WWdN#15: KentAllard
Invitational&lt;/a&gt;...&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="/archives/42-Live-blogging-WWdN15-KentAllard-Invitational.html#extended"&gt;Continue reading &amp;quot;Live blogging WWdN#15: KentAllard
Invitational&amp;quot;&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 21 Feb 2006 22:57:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-02-21:/live-blogging-wwdn15-kentallard-invitational.html</guid><category>Gaming</category><category>Poker</category></item><item><title>Simple wonder</title><link>https://coffeecode.net/simple-wonder.html</link><description>&lt;p&gt;Last weekend I was assigned the task of priming and painting our
bedrooms. The previous owners had decided to use bold, garish colours,
which meant that I was doomed to prime and reprime before I would even
have the chance of adding some of our own &amp;quot;style&amp;quot; to the house.
Somewhere between coats one and three I ran out of primer and had to go
to the nearby Canadian Tire to pick up a fourth gallon of the stuff. i
decided to treat myself to a mental break and picked up a bird feeder
for our backyard.&lt;/p&gt;
&lt;p&gt;Now, here's where my foolish notions kicked in: I thought it would be a
delightful surprise for Lynn, because we've only been living in this
house for a couple of months and so far we haven't even looked at the
backyard. It's just a pile of snow, with a stand of birch trees off in
the distance. Not much to look at, and certainly no wildlife. I imagined
sitting at the dining room table, drinking freshly brewed coffee, and
watching the birds (chickadees, finches, cardinals, and jays) gratefully
cluster around the feeder.&lt;/p&gt;
&lt;p&gt;I also imagined Lynn holding our yet-to-arrive baby by the patio doors,
pointing out the birds and beaming as s/he gurgles in response. And of
course our poor neglected cat Spook would find some comfort in pressing
himself against the window, switching his tail as each tantalizing
feathered treat flits past. Yes, this bird feeder was going to be an
excellent addition to our family, one of the touchstones of our
day-to-day experience.&lt;/p&gt;
&lt;p&gt;After hanging the feeder in a relatively safe and visible location, I
scattered some seeds on the ground to attract the birds' notice and
waited with great anticipation.&lt;/p&gt;
&lt;p&gt;And waited some more.&lt;/p&gt;
&lt;p&gt;By the time Lynn returned, three days later, not one bird had shown up.
Not a single seed had been taken. My offerings had been spurned; my
surprise for Lynn was not the hub of winged life, but simply a hunk of
plastic and metal swinging in the wind. Spook noticed nothing. I turned
my mind to other things, ignoring the slight disappointment and
accepting that any birds that had survived the winter so far had
probably already located sufficient food supplies.&lt;/p&gt;
&lt;p&gt;Fast forward to this weekend; I'm painting once again (albeit with
actual coloured paint, not merely primer), and casting a defeated eye
upon our bird feeder when... lo -- in the birch trees in the background
I see birds darting from tree to tree. Can they see this source of
sustenance only 75 feet away? Yes! A black-capped chickadee flits by and
lands on the feeder! My heart leaps, and I hope that this is not a
secretive bird, but one that will sing his song of found food to all his
brethren. After taking a single seed, he departs, and I am left to
wonder whether this is just a chance visit. Will the seed be to his
liking? Will he return?&lt;/p&gt;
&lt;p&gt;For the rest of the day, every time I wander past the window I look
hopefully at the feeder. To my delight, two and sometimes three birds
visit at a time; all chickadees, but all welcome. I try to show Spook,
but he seems more interested in the window frame; he does not develop an
awareness of life on this side of the house.&lt;/p&gt;
&lt;p&gt;Not until this morning, when, sitting at the breakfast table with a
fresh cup of coffee, I spy a visiting bird at the feeder. Scooping up
Spook, I hold him towards the window -- and as the chickadee flits from
stem to stem, his body stiffens and he moves smoothly onto the sill. His
tail twitches, and the picture in my mind acquires a little more colour.
Now, all that it needs for completion is the return of Lynn and the
arrival of our baby. I can't wait.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 20 Feb 2006 14:12:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-02-20:/simple-wonder.html</guid><category>misc</category><category>Personal</category></item><item><title>Time travelling</title><link>https://coffeecode.net/time-travelling.html</link><description>&lt;div class="section" id="february-14th-2006"&gt;
&lt;h2&gt;February 14th, 2006&lt;/h2&gt;
&lt;p&gt;It's 6:15 am on a Tuesday morning. I am sleep deprived and half
hung-over from the paint fumes I have filtered through my lungs in
preparing the baby's room this weekend. Despite this, I'm anxiously
awaiting your arrival at the bus station. It has been days since I last
saw you, and although the phone has brought our voices together, I want
to wrap my arms around you, feel you bury your head into my chest, and
look into your eyes before giving you a kiss. We're home again, in
Sudbury, on a snowy day, after nine years of romance and fourteen years
of friendship. Everything is right.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="april-1-2002"&gt;
&lt;h2&gt;April 1, 2002&lt;/h2&gt;
&lt;p&gt;We wander through our house. 80 years have passed since this house was
built, and many families have made it a home. Now it is our home. Our
baby cat runs from room to room, up and down the stairs that he has
never before experienced. Our voices mix with Jason and Kelly's and echo
through the emptiness -- the emptiness that we will displace with love.
Jason opens a bottle of wine and we drink a toast to a new home and old
friends.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="february-1997"&gt;
&lt;h2&gt;February, 1997&lt;/h2&gt;
&lt;p&gt;I call your number and say hello. It has been years since we last
talked. Everything has changed, and everything soon changes for the
better.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="september-1992"&gt;
&lt;h2&gt;September, 1992&lt;/h2&gt;
&lt;p&gt;You walk into the room, and amidst the madness of university residence
during the first day of frosh week, we are introduced to each other.
Something primal in each of us recognizes that we are meant to be. The
wait is well worth it.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 14 Feb 2006 11:15:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-02-14:/time-travelling.html</guid><category>misc</category><category>Personal</category></item><item><title>Blogs of substance</title><link>https://coffeecode.net/blogs-of-substance.html</link><description>&lt;p&gt;Hmm... for a good break from my drivel about poker and databases (and,
somewhere in the distance, my coffee -- oh my coffee!), try &lt;a class="reference external" href="http://goytalk.blogspot.com/"&gt;Distant
Ramblings&lt;/a&gt;. For one thing, the writer
is talented. For another, she lives in an extremely interesting place in
an extremely interesting time: try Israel, now. She's a Brit, living in
Israel, sharing her observations about what's really going on at ground
level. For some reason I think of Tom Robbins novels when I'm readying
Distant Ramblings. That's a good thing.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sun, 12 Feb 2006 05:27:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-02-12:/blogs-of-substance.html</guid><category>misc</category><category>Personal</category></item><item><title>Bankroll is replenished</title><link>https://coffeecode.net/bankroll-is-replenished.html</link><description>&lt;p&gt;I sent the following email to my beloved cousin Jason, and thought that
it might be interesting fare for anyone checking out my poker action. By
way of explanation, I've cashed out from Pokerstars a couple of times
now; once after I cleared my last deposit bonus, and once recently
after, in a fit of madness, I entered an $11/45-player sit-and-go (SNG)
and (to my disbelief) ended up taking second place (worth $104).&lt;/p&gt;
&lt;p&gt;After playing in a couple of the WWdN invitation tourneys ($10+1 entry
fees) and &lt;a class="reference external" href="/archives/36-Live-blogging-the-WWdN-Sabboth-Invitational.html"&gt;flaming out
brilliantly&lt;/a&gt;,
my account was sitting pretty low (at least, lower than my liking:
around $70). So I resolved to go back to playing the
$1.50+0.25/18-player SNGs that I had used to learn the game of online
poker in the first place: players tend to be less capable at that level,
and it was good therapy for me to take it slow in the midst of
questionable madness all around me. I promptly took second place in the
next three tourneys I played, which meant that I was slowly crawling
back towards the psychologically important $100 mark.&lt;/p&gt;
&lt;p&gt;After diving back into the $6/18-player game with Jason (and losing
before the final table: my QQ ran into AA), I played another
$6/45-player SNG and got knocked out in 10th place when my top pair ran
into a full house created by the original caller's decision to limp in
with 2c-6c; urgh!&lt;/p&gt;
&lt;p&gt;These unfortunate losses put a dent in my account, of course, but I was
quite happy with my play and was confident that sticking to my guns
would pay off... well, here's the tale of the tape:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Played two $6/45-player SNGs today.&lt;/p&gt;
&lt;/p&gt;&lt;p&gt;Came in fifth in the first one, basically holding on for dear life
and&lt;/p&gt;
&lt;p&gt;hoping for fools to go out before I crashed and burned -- that was
good&lt;/p&gt;
&lt;p&gt;for $24.&lt;/p&gt;
&lt;/p&gt;&lt;p&gt;Then came in first in the second one, playing a tight/aggressive
game&lt;/p&gt;
&lt;p&gt;that was well-complemented by some timely pockets. I became the chip&lt;/p&gt;
&lt;p&gt;leader relatively early and stayed there until the last three
players...&lt;/p&gt;
&lt;p&gt;That was good for $80. Yeah!&lt;/p&gt;
&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Interesting stat:&lt;/strong&gt; I had a total of 13 showdowns in the entire&lt;/p&gt;
&lt;p&gt;tournament. I established respect fairly early on by only playing
very&lt;/p&gt;
&lt;p&gt;solid hands, and busted out a few people. Then I just concentrated
on&lt;/p&gt;
&lt;p&gt;taking the short stacks' money. It seemed to work quite nicely.&lt;/p&gt;
&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Outstanding suckout moment:&lt;/strong&gt; I'm chip leader with $8700, dealt
A9o in&lt;/p&gt;
&lt;p&gt;late position. BB is at $600, somebody before me with 2600 in chips&lt;/p&gt;
&lt;p&gt;raises to 1200, I reraise him to 2400, and to my surprise the BB
goes&lt;/p&gt;
&lt;p&gt;all-in with his $2700. The initial raiser calls, I call, and the
cards&lt;/p&gt;
&lt;p&gt;are flipped to reveal that the initial caller has pocket 10s and the
BB&lt;/p&gt;
&lt;p&gt;has Qc-Jc. I'm praying for an ace, but I catch a 9 on the flop, and&lt;/p&gt;
&lt;p&gt;another 9 on the river to make my set and wipe out both players.
That&lt;/p&gt;
&lt;p&gt;put me in an extremely solid position for the end game.&lt;/p&gt;
&lt;/p&gt;&lt;p class="entrytitle rubric" id="best-trap-heads-up"&gt;Best trap (heads-up):&lt;/p&gt;
&lt;/p&gt;&lt;p&gt;About halfway through our heads-up action, I looked down to see
pocket aces. I had been playing quite aggressively, raising all-in
to force the big stack to commit to either risking a large chunk of
his chips, or to let me nibble on his blinds, and the big stack had
been content (or timid) enough to fold pretty consistently. On
occasion he reciprocated, and I happily folded, because he was doing
it infrequently enough that I was making headway. But with aces, I
wanted more than just his blinds, so I tried feigning weakness; I
knew that limping in would be so out of character that my opponent
would suspect something fishy was going on, so I settled for a raise
to 2XBB. If worst came to worst, he would fold and I would pick up
the blinds; in the best scenario, he would have a decent hand and
immediately raise me all-in preflop. Instead, he called -- which
told me that he had a hand with some potential. I checked on the
flop (rainbow 8KJ), hoping that he would interpret that as a sign
that I had A-something and had failed to hit my hoped-for ace. He
bit, raising me all-in... and while I was nervous that he just might
be holding onto something like pocket J's (making his set), I
figured that he would have reraised me pre-flop if that were the
case. I called, he flipped over 98o, and he never improved beyond
his pair of 8s.&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;So now, since Wil convinced me to play online poker in October (no, he
didn't sit me down and talk to me one-on-one; I read about his &lt;a class="reference external" href="http://www.wilwheaton.net/mt/archives/2005/09/#a003370"&gt;Katrina
charity
tournament&lt;/a&gt;
and it sounded like a fun way to contribute to a cause), my return on
online poker has been approximately $230. Given that my goal has been
simply to bankroll this poker hobby without causing Lynn to frown too
deeply, I'm quite happy about the results. Baby needs a new pair of
shoes, indeed!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sun, 12 Feb 2006 04:18:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-02-12:/bankroll-is-replenished.html</guid><category>Gaming</category><category>Poker</category></item><item><title>ADOdb: getting good support for IBM DB2, Cloudscape, and Apache Derby</title><link>https://coffeecode.net/adodb-getting-good-support-for-ibm-db2-cloudscape-and-apache-derby.html</link><description>&lt;p&gt;The stable release of the &lt;a class="reference external" href="http://php.net/ibm_db2"&gt;ibm_db2&lt;/a&gt; PECL
extension for IBM DB2, Cloudscape, and Apache Derby brought a high
performing, highly functional database connectivity alternative to
Unified ODBC for PHP 4 and 5 users. However, in and of itself a database
extension does not enable you to use the many PHP applications that you
might want to use. You either have to add a specific driver for each
application that implements its own portability layer (such as
&lt;a class="reference external" href="http://phpmyfaq.de"&gt;phpMyFAQ&lt;/a&gt;), or if the application relies on one
of the standard database abstraction layers (&lt;a class="reference external" href="http://pear.php.net/package/DB"&gt;PEAR
DB&lt;/a&gt;,
&lt;a class="reference external" href="http://pear.php.net/package/MDB2"&gt;MDB2&lt;/a&gt;, or
&lt;a class="reference external" href="http://adodb.sourceforge.net/"&gt;ADOdb&lt;/a&gt;), then a driver needs to be
added to the corresponding database abstraction layer.&lt;/p&gt;
&lt;p&gt;To date, the standard database abstraction layers have offered support
for DB2 only through the Unified ODBC extension (and despite substantial
overlap in names, MDB2 does not offer support for DB2 at all). Due to
some limitations of the Unified ODBC extension, access to DB2 would seem
slow and buggy -- and access to Apache Derby or Cloudscape would be
frought with minefields, as Unified ODBC does not provide a way of
differentiating between the databases to which you are connected and
their corresponding features. The ibm_db2 extension offers the
&lt;a class="reference external" href="http://php.net/db2-server-info"&gt;db2_server_info()&lt;/a&gt; function which
can tell you whether you are connected to DB2 on Linux, DB2 on a zSeries
machine, or an Apache Derby database, and let your application or
database abstraction layer perform the appropriate workarounds.&lt;/p&gt;
&lt;p&gt;Now, however, as part of Larry Menard's efforts to enable &lt;a class="reference external" href="http://gallery.menalto.com"&gt;Gallery
2&lt;/a&gt;, an &lt;a class="reference external" href="http://phplens.com/lens/lensforum/msgs.php?id=14602"&gt;ADOdb driver built on top of the
ibm_db2
extension&lt;/a&gt; will,
in all probability, be made available as part of a future ADOdb release.
Undoubtedly there will be further testing to do, and tweaks and
performance optimizations in the future code--for example,
differentiating between the capabilities of Apache Derby and DB2--but
this is a huge first step! Thanks to Larry and the Gallery 2 team for
making this contribution.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 10 Feb 2006 14:36:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-02-10:/adodb-getting-good-support-for-ibm-db2-cloudscape-and-apache-derby.html</guid><category>Databases</category><category>DB2</category><category>PHP</category></item><item><title>Live blogging the WWdN Sabboth Invitational</title><link>https://coffeecode.net/live-blogging-the-wwdn-sabboth-invitational.html</link><description>&lt;p&gt;Wil's hosting his &lt;a class="reference external" href="http://www.cardsquad.com/2006/02/07/reminder-wwdn-tourney-at-pokerstars-tonight/"&gt;usual Tuesday night
game&lt;/a&gt;
tonight at 8:30 PM EST: I got knocked out 53rd out of 118 players last
week... this time around I'm hoping to get closer to the bubble. But how
the hell am I going to concentrate on my game if I'm live blogging? I
dunno, but lots of &lt;a class="reference external" href="http://www.upforanything.net/poker/"&gt;other&lt;/a&gt;
&lt;a class="reference external" href="http://cardsquad.com/bloggers/joanne-lutynec/"&gt;respectable&lt;/a&gt; players
manage to do it, so I'm giving it a shot.&lt;/p&gt;
&lt;p&gt;Watch this space, ladies and gentleman, for some hot poker action later
tonight. SSSSSsssss....&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8:29 PM EST&lt;/strong&gt;: I'm seated at a table with CawtBluffin, KayoteGuy,
penner42, Chaswell, L0K1, LenardCole, and DavidK. I quickly fold my Q6s.
Let's hope this isn't setting the tone for the match...&lt;/p&gt;
&lt;p&gt;Next hand: 67 unsuited. Thrown away.&lt;/p&gt;
&lt;p&gt;Next hand: KK. Hmm, cowboys! I raise 60, it folds around to DavidK in
the big blind. Flop comes 2d-8h-Tc. Looks good to me, DavidK checks, I
bet 80, DavidK calls. Turn: Jc. I don't like the potential straight /
flush chances, and DavidK opens with a bet of 200. I reraise to 420
figuring this is just his attempt to push me out, and he goes all in.
Oddly enough, I completely missed that stop sign, officer... I call, and
all I see is DavidK's deuce making a set. Hmm. Awesome, I finished first
/ last in a tourney I've been looking forward to since last week. Can I
change my icon to a donkey? Heh...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8:50 PM&lt;/strong&gt;: DavidK has frittered away my donation to $2580. Hey man!
Invest wisely! &lt;img alt=":-)" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8:54&lt;/strong&gt;: SERNE has been way down, then come way back to $2160. Mad
skills!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8:55&lt;/strong&gt;: smalldog takes his 705 stack and doubles up when his cowboys
defeat A-7 unsuited from SoxLover&amp;lt;./p&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8:58&lt;/strong&gt;: maigrey's queens take Lcsd114 out of the tournament when his
89 unsuited fail to catch anything... Lcsd114 was down to $50 in chips
after DakotaKen kicked him in the crud with a J kicker.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:01&lt;/strong&gt;: dsheep makes his first move of the night, betting 715 after
the 4-2-9 flop to scare everyone else off. He's up to $2085 as a result.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:03&lt;/strong&gt;: Bloody P goes all in with 715 stack to double up when his AJ
catches not just one ace, but two aces, to beat sellthekids pocket 5's.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:07&lt;/strong&gt;: dsheep playing the bully, reraising at will and forcing
maigrey to back down. dsheep is at $2560.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:08&lt;/strong&gt;: Did I actually play in this tournament? It's all such a
blur... I can guarantee you that live-blogging didn't affect my game at
all. No excuses for me.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:12&lt;/strong&gt;: kaelinn18 shows up at Pauly's table and turns into a wrecking
ball when his/her(?) pocket rockets slam into the pair of queens DrPauly
caught on the flop. Exit DrPauly. kaelinn18 is over $5000 in chips and
sits in first place in the tourney.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:16&lt;/strong&gt;: sellthekids goes down in 75th when his stone-cold 4-3 suited
semi-bluff runs into Bloody P's AJ and the community gives him no help.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:20&lt;/strong&gt;: kaelinn18 continues to do damage when smalldog's A-3 unsuited
withers against kaelinn18's K-T diamonds, which eventually catches two
more kings to give her a solid set.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:32&lt;/strong&gt;: At the break, we have:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;kaelinn18 with 7060&lt;/li&gt;
&lt;li&gt;CautionESPN with 6095&lt;/li&gt;
&lt;li&gt;Arcon with 6030&lt;/li&gt;
&lt;li&gt;heffmike with 5080&lt;/li&gt;
&lt;li&gt;peacecorn with 5050&lt;/li&gt;
&lt;li&gt;tylerdavis45 with 4805&lt;/li&gt;
&lt;li&gt;maigrey with 4760&lt;/li&gt;
&lt;li&gt;ricoM with 4050&lt;/li&gt;
&lt;li&gt;Trekgal with 3740&lt;/li&gt;
&lt;li&gt;brd1968 with 3675&lt;/li&gt;
&lt;li&gt;GRobman with 3372&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;9:45&lt;/strong&gt;: thebrux reraises Sweet79Chuck's preflop raise all-in --
Sweet79Chuck thinks, calls, and goes down in flames (54th place) when
his AQ can't catch up to thebrux's AK.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:47&lt;/strong&gt;: WHOA! SERNE smokes Gilain when his pocket kings catch two more
kings on the flop, leaving SERNE woefully behind with pocket Q's. SERNE
rockets up to $8400 and sites in second place behind CautionESPN.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:51&lt;/strong&gt;: A rollercoaster for maigrey when his big slick catches an A on
the turn to overtake L0K1's tens -- but of course another ten falls on
the river to send maigrey to sleep for the night.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:53&lt;/strong&gt;: Trekgal (sporting a nice Dr. Crusher icon) goes all-in to take
down a 7130 pot from thebrux when her pocket queens make the set on the
flop against thebrux's big slick. Poor thebrux is down to $2530 in
chips, while Trekgal moves up to fourth.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:56&lt;/strong&gt;: Trekgal takes out pennerii when he goes all-in after the 4-6-K
flop; Trekgal calls, showing KQ to pennerii's pocket tens. The kings
hold up and Trekgal is up to $7930 in chips.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:58&lt;/strong&gt;: BrainMC takes down phluxer's big slick with pocket 7's, making
the set on the river for extra burn. BrainMC has $6075 in chips, phluxer
goes out in 38th place.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:00&lt;/strong&gt;: TSN turning point for L0K1 and heffmike. After a J-K-2
rainbow flop, heffmike responds to L0K1's checkraise by going all-in
(raising 5600 to 7400); L0K1 defends hhis pride by calling. L0K1 shows
QK, while heffmike shows big slick. L0K1 catches a Q on the river and
takes down an $11840 pot, putting him comfortably in first place.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:04&lt;/strong&gt;: L0K1 and heffmike are at it again with heffmike's pre-flop
all-in; heffmike's pocket 9's go down when L0K1 catches a Q on the flop
to pair up his AQ. heffmike is out and L0K1 is even more solidly in
first place with the $4560 pot.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:07&lt;/strong&gt;: SERNE doubles up against DakotaTen with the classic match-up:
pocket aces against cowboys. SERNE's aces hold up leaving DakotaTen with
$2020 and giving SERNE $12025 in chips.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:09&lt;/strong&gt;: Arcon feels the [STRIKEOUT:Crusher]Trekgal magic when he
goes all-in preflop with suited AJ; Trekgal calls with AQ and it holds
up for her and a $6520 pot, pushing her over $10000 in chips.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:19&lt;/strong&gt;: Joanne1111 on the tightwire with 345, doubles up when she
catches a Q on the river to make a pair... then goes all-in preflop to
raise 23skidoo, who calls her for the extra $240 bones. 23skidoo has A-T
vs. Joanne1111's A-Q, but a T comes down in the flop. Breath is held,
then released audibly as Q hits on the turn, followed by another Q on
the river -- and Joanne1111 is very much alive in this tourney now,
ladies and gentlemen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:21&lt;/strong&gt;: 23skidoo, trying to cling to life after the beat by Joanne,
goes all-in preflop with A4 vs. Colombo777's 9-T; a ten hits on the
flop, but an ace comes down on the turn to let 23siddo double up.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:22&lt;/strong&gt;: dsheep bets his entire pitiful $1400 preflop, called by ricoM
-- dsheep shows pocket 7's, ricoM shows pocket 6's, and that's how
things stay.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:25&lt;/strong&gt;: U-G-L-Y you ain't got no alibi: cfinn calls Bloody P's $2775
all-in and shows Ah-Td to Bloody P's 7's. Four diamonds drop down and
Bloody P leaves the game in in 20th place.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:29&lt;/strong&gt;: We reach the final 18 when dsheep's rockets decimate ricoM's
A9d.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:30&lt;/strong&gt;: Trekgal crushes cfinn after the 5-6-2 flop when cfinn decides
his big slick is good to go; Trekgal has rockets and sends him on his
way.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:33&lt;/strong&gt;: Guiness bets 7090 pre-flop, scaring everyone away, and
proudly unveils &lt;strong&gt;the HAMMER&lt;/strong&gt;! Awesome.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:35&lt;/strong&gt;: Break time, we have:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;SERNE: 23555&lt;/li&gt;
&lt;li&gt;Trekgal: 17627&lt;/li&gt;
&lt;li&gt;GRobman: 14914&lt;/li&gt;
&lt;li&gt;brd1968: 13262&lt;/li&gt;
&lt;li&gt;RandomSam: 12605&lt;/li&gt;
&lt;li&gt;Guinness: 9615&lt;/li&gt;
&lt;li&gt;SirFWALGman: 9324&lt;/li&gt;
&lt;li&gt;CautionESPN: 9021&lt;/li&gt;
&lt;li&gt;TiprJax: 8450&lt;/li&gt;
&lt;li&gt;L0K1: 7970&lt;/li&gt;
&lt;li&gt;kaelinn18: 7370&lt;/li&gt;
&lt;li&gt;dsheep: 6667&lt;/li&gt;
&lt;li&gt;peacecorn: 5250&lt;/li&gt;
&lt;li&gt;Frank66: 2870&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Good time for a break too... your narrator is wearing down quickly. My
cat, Spook, has decided to make his displeasure with the lack of
attention accorded to him known by sitting on my forearms, limiting my
motion and aggravating the building case of tendinitis. Oh the
sacrifices I make...
&lt;strong&gt;10:41&lt;/strong&gt;: Break over, Frankl66 goes right to work taking his short
stack all in preflp. Guiness calls, shows QQ, and Frankl66 groans as he
displays AQ. No aces come down, no straights appear, and Frankl66 exits
stage left.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:44&lt;/strong&gt;: TripJax goes all in at the 4-K-8 flop with 7050, CautionESPN
goes into the think tank before finally calling and revealing K9.
TripJax has the rockets and CautionESPN is down to $1100. TripJax is at
the 18000 mark.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:46&lt;/strong&gt;: More TripJax action as his pocket queens eliminate Guinness
and his A-T. That brings TripJax to the $30000 mark... wow.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:49&lt;/strong&gt;: L0K1 and CautionESPN split a pot, giving CautionESPN a bit
more life (with $583 in chips).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:50&lt;/strong&gt;: down to 3500 in chips, dsheep pulls the trigger and goes over
the top of SERNE's 3xBB raise with an all-in. SERNE calls, revealing the
almighty 58h to dsheep's KJ... and promptly picks up two more fives to
make a set, knocking dsheep out in 10th place. Alas, only 9 places paid
tonight...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:51&lt;/strong&gt;: Trekgal is the first out of the final table.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:54&lt;/strong&gt;: GRobman puts the hurt on RandomSam when his jacks knock down
cowboys by making the set on the flop. GRobman $30828, RandomSam $14896.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:59&lt;/strong&gt;: Hammer flop -- 277! TripJax raises 3000, SERNE calls. Checks
through the turn (5). SERNE raises 6400 on the river (J) and TripJax
folds with a few moments of thought. The crowd sighs in disappointment
that no hammer was revealed...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:51&lt;/strong&gt;: GRobman's powerhouse KJ busts bdr1968's JJ with a K on the
turn. The $44530 pot goes to GRobman and bdr1968 is out in 7th place.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;11:04&lt;/strong&gt;: High drama on the random seas as RandomSam goes all-in with
big slick versus SERNEs JJ... flop is 54A, but the turn is a J, and the
river is another A, giving RandomSam the best possible losing hand &lt;img alt=":-)" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;11:25&lt;/strong&gt;: TripJax (AK) takes out GRobman (TJ suited). Final four are:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;SERNE: 41945&lt;/li&gt;
&lt;li&gt;SirFWALGman: 39073&lt;/li&gt;
&lt;li&gt;kaellinn18: 34668&lt;/li&gt;
&lt;li&gt;TripJax: 29514&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;... and I think it's good night for me.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 07 Feb 2006 22:41:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-02-07:/live-blogging-the-wwdn-sabboth-invitational.html</guid><category>Gaming</category><category>Poker</category></item><item><title>Brilliance on display (no, really)</title><link>https://coffeecode.net/brilliance-on-display-no-really.html</link><description>&lt;p&gt;Poor &lt;a class="reference external" href="http://www.zend.com/person.php?handle=sfox"&gt;Steph&lt;/a&gt; -- the
author of the &lt;a class="reference external" href="http://www.zend.com/zend/week"&gt;Zend Weekly Summaries&lt;/a&gt;
of the action on the php-internals mailing lists hardly ever hears
praise for her efforts, but suffers a barrage of &lt;strong&gt;weeklies!&lt;/strong&gt; cries on
IRC if she happens to be a few weeks behind. Suffice to say that her
weeklies don' t just gather together the threads, but weave together a
fabric that binds the PHP development community together around a common
narrative. Unfortunately not everyone is aware of the weeklies... Steph
must have mixed feelings of wrath and impishness when she
&lt;a class="reference external" href="http://www.zend.com/zend/week/week264.php"&gt;wrote&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;/p&gt;&lt;p&gt;Roman Ivanov suggested that there should be some kind of design
digest to explain why things are as they are and how or why they
will change; 'right now the only way to get such information is to
read everything on the internals list'. He felt that having the
information presented in this kind of way would prevent repeat
questions and discussions. (Note: it doesn't.)&lt;/p&gt;
&lt;p&gt;&lt;/blockquote&gt;
&lt;p&gt;Now, for a superb example of her writing skill and wit, check out her
deft treatment of the &lt;em&gt;PHP 5.1.0 Date controversy as Greek tragedy&lt;/em&gt; in
&lt;a class="reference external" href="http://www.zend.com/zend/week/week264.php#Heading4"&gt;weekly# 264&lt;/a&gt;.
Bravo! Nothing like a little catharsis (and humour) to salve the wounds
of what was a fairly dramatic altercation for PHP. Writing the ongoing
history of PHP development with unflinching honesty is hard enough when
you are a part of that community on a day-to-day basis and work directly
with the subjects of your stories; making that history entertaining at
the same time elevates you to a very special tier. We're lucky to have
Steph.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 07 Feb 2006 15:55:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-02-07:/brilliance-on-display-no-really.html</guid><category>misc</category><category>PHP</category></item><item><title>(Un)common but potentially mind-twisting DB2 issues</title><link>https://coffeecode.net/uncommon-but-potentially-mind-twisting-db2-issues.html</link><description>&lt;p&gt;It is perhaps a sad reflection on my life that I'm using a personal blog
to offer technical information about a product that I work on, rather
than telling you about what I ate last night (spinach and goat cheese
salad with a raspberry vinaigrette dressing, quinoa, and a rather
tomatoey coq au vin), how the weather is (freezing rain and snow last
night), or the last time we got together with friends (Peter and Deb
came over last night for a lovely visit over wine and dinner).&lt;/p&gt;
&lt;p&gt;Instead, here are a few gotchas for DB2 on Linux that might otherwise
take you a few hours to figure out.&lt;/p&gt;
&lt;div class="section" id="shiny-new-db2-for-linux-2-6-kernel-requires-compat-rpms"&gt;
&lt;h2&gt;Shiny new DB2 for Linux (2.6 kernel) requires compat RPMs?&lt;/h2&gt;
&lt;p&gt;DB2 for Linux Version 8.2 (aka Version 8.1 FixPak 7) has been
&lt;a class="reference external" href="http://ibm.com/db2/linux/validate"&gt;validated&lt;/a&gt; on distributions
running both 2.4 and 2.6 Linux kernels. However, starting with FixPak 9
(aka Version 8.2.2, which has replaced Version 8.2 if you order a brand
new copy of DB2 with physical media today), you have to choose a 2.4 or
2.6 kernel-specific version of DB2 on the x86 and x86-64 architectures.&lt;/p&gt;
&lt;p&gt;If you're unlucky, you might find that once you install this newer
version of DB2 meant for a shiny new distribution running a 2.6 Linux
kernel, DB2 suddenly stops running and complains that it can't find the
libstdc++.so.5 library. The reason is because the new versions of DB2
are built for compatibility with the first enterprise Linux distribution
that offered the 2.6 kernel -- SLES 9 -- and guess what level of
libstdc++ SLES 9 comes with? Yeah, you guessed right. And the reason the
older versions of DB2 don't need libstdc++ is because they shipped with
their own copy of the Intel C++ libraries.&lt;/p&gt;
&lt;p&gt;Fun stuff eh? The moral of the story is: install your compat-libstdc++
libraries (or whatever they're called), and you won't get hurt when you
upgrade DB2.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="db2-for-linux-on-power-aka-ppc64-aka-pseries-searching-for-libibmc"&gt;
&lt;h2&gt;DB2 for Linux on POWER aka PPC64 aka pSeries: searching for libibmc++&lt;/h2&gt;
&lt;p&gt;Here's another missing library problem for which Google turned up no
help... After installing DB2 for Linux on POWER, the user tried to run
any DB2 command and received the following error message:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
db2: error while loading shared libraries: libibmc++.so.1:   cannot open shared object file: No such file or directory
&lt;/pre&gt;
&lt;p&gt;The problem occurs because DB2 for Linux on POWER is compiled against
the IBM XL C++ libraries. This means that you have to install the IBM XL
C/C++ Advanced Edition V7.0 for Linux Runtime Environment as described
in a &lt;a class="reference external" href="http://www-1.ibm.com/support/docview.wss?uid=swg24007906"&gt;DB2
technote&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 18 Jan 2006 14:03:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-01-18:/uncommon-but-potentially-mind-twisting-db2-issues.html</guid><category>Databases</category><category>DB2</category></item><item><title>Review: No Nonsense XML Web Development With PHP by Thomas Myer</title><link>https://coffeecode.net/review-no-nonsense-xml-web-development-with-php-by-thomas-myer.html</link><description>&lt;p&gt;At the end of November, I received a copy of &lt;strong&gt;`No Nonsense XML Web
Development With
PHP &amp;lt;http://www.amazon.com/exec/obidos/ASIN/097524020X/coffeecode-20?creative=327641&amp;amp;camp=14573&amp;amp;link_code=as1&amp;gt;`__&lt;/strong&gt;,
written by Thomas Myer, from &lt;a class="reference external" href="http://sitepoint.com"&gt;Sitepoint Press&lt;/a&gt;.
With our move to the &lt;a class="reference external" href="http://www.greatersudbury.ca/"&gt;Great White
North&lt;/a&gt; in December and the recent
holidays, I hadn't had a chance to crack the spine of the book... until
my laptop died this weekend. While waiting for a new motherboard (sigh),
I had a fine opprtunity to sit down and spend some quality time with the
book today.&lt;/p&gt;
&lt;div class="section" id="in-a-nutshell"&gt;
&lt;h2&gt;In a nutshell...&lt;/h2&gt;
&lt;p&gt;This is an excellent little book if you know your way around PHP but
need to start working with XML and need some hands-on examples to
complement theory. This book will give you a choice of tools:
client-side XML manipulation with browser-based XSLT and EcmaScript DOM,
or server-side XML manipulation with PHP extensions for SAX, DOM,
SimpleXML, and XML-RPC, along with some criteria for determining which
approach to use for different aspects of your project. Myer is an
excellent, enjoyable writer, and the short, clear examples solidify his
lessons. For the past few years my bible for XML reference material has
been Elliot Rusty Harold's &lt;strong&gt;`XML in a
Nutshell &amp;lt;http://www.amazon.com/exec/obidos/ASIN/0596007647/coffeecode-20/103-2990794-9250255?%5Fencoding=UTF8&amp;amp;camp=1789&amp;amp;link%5Fcode=xm2&amp;gt;`__&lt;/strong&gt;,
but &lt;strong&gt;`No Nonsense XML Web Development With
PHP &amp;lt;http://www.amazon.com/exec/obidos/ASIN/097524020X/coffeecode-20?creative=327641&amp;amp;camp=14573&amp;amp;link_code=as1&amp;gt;`__&lt;/strong&gt;
complements any reference book with its task-oriented introduction to a
broad array of XML Web development technologies.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="update-2006-01-10"&gt;
&lt;h2&gt;Update 2006-01-10&lt;/h2&gt;
&lt;p&gt;As a promotional offer, if you buy &lt;strong&gt;No Nonsense XML Web Development
With PHP&lt;/strong&gt; though
&lt;a class="reference external" href="http://www.sitepoint.com/books/xml1/"&gt;sitepoint.com&lt;/a&gt; you'll get a
PHP quick reference poster along with your order. That's cool.&lt;/p&gt;
&lt;p&gt;I also updated the title of the book to remove &lt;strong&gt;(Build Your
Own)&lt;/strong&gt;—that's the name of the series, not the subtitle. Amazon led me
astray there... thanks to the nice Sitepoint person who pointed that out
to me today.&lt;/p&gt;
&lt;p class="entrytitle rubric" id="first-impressions"&gt;First impressions&lt;/p&gt;
&lt;p&gt;XML Web development with PHP is a very ambitious scope, and browsing the
table of contents reveals that the book tackles (&lt;em&gt;Dan takes a deep
breath&lt;/em&gt;):&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;XML standards: XML, XHTML, XPath, XSLT, DTDs, and DOM&lt;/li&gt;
&lt;li&gt;Client-side XML manipulation: JavaScript DOM manipulation&lt;/li&gt;
&lt;li&gt;PHP extensions: SAX, DOM, and SimpleXML&lt;/li&gt;
&lt;li&gt;Syndication: RSS 0.91 and 1.0&lt;/li&gt;
&lt;li&gt;Web services: XML-RPC&lt;/li&gt;
&lt;li&gt;Databases and XML: storing XML in databases and converting relational
data to XML&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Whew! That's a huge list for a 360-page book, so you know right away
that you're not going to get in-depth coverage of each of these topics.
However, what you do get is an overview of the core concepts behind each
of these topics (the &lt;em&gt;why&lt;/em&gt;) with the critical information required to
make practical use of the subject technology (the &lt;em&gt;how&lt;/em&gt;). Myer then
solidifies each topic with a clearly explained example that contributes
towards a basic content management system.&lt;/p&gt;
&lt;p&gt;I found this &amp;quot;building block&amp;quot; structure worked very well in practice.
Each example makes sense in the context of the overall content
management system, and the clarity of the short examples makes the XML
Web technology under discussion very approachable for the reader.&lt;/p&gt;
&lt;p class="entrytitle rubric" id="intended-audience"&gt;Intended audience&lt;/p&gt;
&lt;p&gt;This book is aimed at an intermediate PHP developer who does not have
much knowledge about or experience with XML technologies. It is not
padded with basic introductory information about PHP. For example, Myer
assumes that you understand what the &amp;#64; symbol does when you use it to
prefix a PHP function, and in describing how to enable PHP extensions
that are not enabled in a default PHP install, Myer simply offers the
configure option for UNIX users and the DLL name for Windows users.&lt;/p&gt;
&lt;p&gt;In fact, despite its title, the bulk of the book is not really about
PHP; it is about XML Web application development. But that's cool,
because this helps the reader avoid &amp;quot;every problem is a nail, and PHP is
my hammer&amp;quot; tunnel vision. Also unusual for a technology-focused book on
application development, Myer spends a full chapter urging the reader to
invest some time in analyzing the application's requirements before
diving into code. I consider this a reflection of the author's own
experience as a consultant, and a completely sane topic to spend
precious space on.&lt;/p&gt;
&lt;p class="entrytitle rubric" id="writing-style"&gt;Writing style&lt;/p&gt;
&lt;p&gt;Thomas Myer writes in a very personable, approachable, informal, and
occasionally irreverent tone that I truly enjoyed. (Really. This is a
way-technical book, and I had fun reading it, including the occasional
giggle. Honestly.) I'm totally jealous! The natural explanatory style
seems effortless, but I know damn well how hard Myer must have worked to
achieve that result. Check out how he takes the piss out of Resource
Description Framework (RDF):&lt;/p&gt;
&lt;blockquote&gt;
In a hand-wavy sort of way, RDF is a standard for describing
&lt;em&gt;anything&lt;/em&gt; and what it has to do with &lt;em&gt;anything else&lt;/em&gt;. Vague enough
for you?&lt;/blockquote&gt;
&lt;p&gt;I love it.&lt;/p&gt;
&lt;p class="entrytitle rubric" id="book-layout"&gt;Book layout&lt;/p&gt;
&lt;p&gt;This is the first &amp;quot;No Nonsense&amp;quot; Sitepoint book that I have read, and I
quickly came to respect the basic, clean layout. Sample code is always
labelled with the appropriate file name; reference URLs appear as
footnotes, and the occasional tip is well integrated into the text with
a modest icon drawing your eye. Based on this experience, I would
definitely buy another Sitepoint book.&lt;/p&gt;
&lt;p class="entrytitle rubric" id="depth-of-coverage"&gt;Depth of coverage&lt;/p&gt;
&lt;p&gt;You can get a lot done with the content of this book. While 360 pages
probably isn't enough to explore all of the ins and outs of just one of
the subject technologies like XPath or XSLT, 20 pages is enough to cover
the most common use cases and offer tips on avoiding common problems.
For example: I wrote my first XSLT-based application in 1999, and have
used it on and off ever since, so I had assumed that I wouldn't learn
anything new. But Myer is a damn good writer, and that starts with his
choice about what not to write about. In his XSLT discussion, he
clarified some points that I had stumbled over in the past (and would be
likely to stumble over again in the future).&lt;/p&gt;
&lt;p&gt;Kudos to Myer for including basic coverage of output-escaping with
htmlentities() and input-filtering with regular expressions. It's nice
to see more emphasis on security in XML application development.&lt;/p&gt;
&lt;p class="entrytitle rubric" id="inaccuracies-and-typos"&gt;Inaccuracies and typos&lt;/p&gt;
&lt;p&gt;Minimal; I found a couple of minor typos.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Page 173: a reference to DOMDocument-&amp;gt;createElement() is written as
&amp;quot;create_element&amp;quot;&lt;/li&gt;
&lt;li&gt;Page 178: a grammatical error: &amp;quot;However, PHP can't compare apples to
oranges—in this case, objects to a string&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That's just me being incredibly nitpicky. Overall, the book has been
well edited.&lt;/p&gt;
&lt;p class="entrytitle rubric" id="the-verdict"&gt;The verdict&lt;/p&gt;
&lt;p&gt;In summary: this is a fine book, and I would recommend it if you want a
different perspective on XML Web development than you'll get from most
other books. &lt;a class="reference external" href="http://www.amazon.com/exec/obidos/ASIN/097524020X/coffeecode-20?creative=327641&amp;amp;camp=14573&amp;amp;link_code=as1"&gt;Buy this book from
Amazon&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 10 Jan 2006 03:58:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-01-10:/review-no-nonsense-xml-web-development-with-php-by-thomas-myer.html</guid><category>PHP</category><category>PHP</category></item><item><title>Coffee|Code tweaks</title><link>https://coffeecode.net/coffeecode-tweaks.html</link><description>&lt;p&gt;I use &lt;a class="reference external" href="http://www.s9y.org"&gt;Serendipity&lt;/a&gt; for my blog software. Other
Serendipity users will note that I'm pretty much using the default
template for the site. Boring! For the most part, that's because I'm
more focused on generating content (slim pickings though they may be)
versus putting time into design. Substance versus style, you know? Not
to mention that my sense of style is, well, rather questionable. Ask
Lynn about the sessions we've had trying to pick paint schemes for the
rooms in our new house...&lt;/p&gt;
&lt;p&gt;Anyways, last night I finally hit my limits of design frustration with
Serendipity's defaults in a couple of areas:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Default markup: I found that Serendipity accepted a mix of XHTML plus
whitespace, which led to either jamming&amp;lt;tags&amp;gt; &amp;lt;together&amp;gt; &amp;lt;all&amp;gt; &amp;lt;on&amp;gt;
&amp;lt;the&amp;gt; &amp;lt;same&amp;gt; &amp;lt;line&amp;gt; to avoid linefeeds turning into extraneous &amp;lt;br /&amp;gt;
tags or leaving off the closing tags and using linefeeds so that I
could make sense of the blog entry source. The result of the former
was a hard-to-edit blob of text, albeit with valid XHTML; the result
of the latter was XHTML that was rather horrendously formed. Until
now, I had sucked up the invalid XHTML (despite all of my objections
to propagating such horrors on the Web) because...&lt;/li&gt;
&lt;li&gt;Default style: the default style.css file for Serendipity, for some
reason, removes all of the normal whitespace before and after
elements like &amp;lt;p&amp;gt; and &amp;lt;h3&amp;gt;. This meant that going the well-formed
XHTML route resulted in blog entries in which the paragraphs were
smashed together. I love standards, but I love legibility even more,
and I didn't have time to delve into Serendipity to figure out what
was going on, so I imposed this mess of broken XHTML on the Web for 8
months. Oh the shame!&lt;/li&gt;
&lt;li&gt;Sidebar template: I had wanted to add a link to my book (and token
Zend certification) to the sidebar for a while, but had been
modifying the sidebar.tpl template to add the required HTML directly
to the template. Use the source, right? Well, no... while reading the
source was enjoyable, despite my best efforts all I was able to do
was to add the entries to the right-hand side of the page, which was
getting cumberously long.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As it turned out, the solutions to these problems were pretty trivial:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;The culprit for the mix of XHTML and significant whitespace turned
out the be the NL2BR markup plugin that is enabled in the default
Serendipity configuration. Turning this plugin off through the very
convenient plugin interface stopped Serendipity from adding &amp;lt;br /&amp;gt;
for every linefeed and meant that I could have cleanly formatted
XHTML source for my blog entries.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;As a quick-fix for the missing whitespace around &amp;lt;p&amp;gt; tags, I
customized style.css by adding&lt;/p&gt;
&lt;pre class="literal-block"&gt;
p {  margin-top: 1em;  padding-top: 1em;}
&lt;/pre&gt;
&lt;p&gt;. This reintroduced the whitespace I needed; the right fix would be
to go back to the CSS and figure out why it was gone in the first
place, but this works well enough for my needs now.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Going to the source to add XHTML to the sidebar was a red herring, in
this case. In fact, in the default sidebar plugins for Serendipity,
there's something called the &lt;strong&gt;HTML Nugget&lt;/strong&gt; plug-in that enables you
to add arbitrary HTML to your sidebar. You can add multiple &lt;strong&gt;HTML
Nugget&lt;/strong&gt; entries, and, most importantly, you can select which side of
the page you want each sidebar plug-in to appear on. Serendipity
stores the side and order metadata for the plug-ins in the database,
so there is no need to customize the source templates. Very cool. I
love database-driven applications.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyways, I hope you enjoy the changes. As a result of the modified
markup conventions, I had to go back and clean up the markup for all of
my previous entries -- but I'm happy to say that at least the first page
of entries now satisfies the &lt;a class="reference external" href="http://w3.org"&gt;W3C&lt;/a&gt; standards for
XHTML. I certainly feel better about that... &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 04 Jan 2006 16:45:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2006-01-04:/coffeecode-tweaks.html</guid><category>misc</category><category>Personal</category></item><item><title>Podcasts suck</title><link>https://coffeecode.net/podcasts-suck.html</link><description>&lt;p&gt;As a means of conveying information,
&lt;a class="reference external" href="http://en.wikipedia.org/wiki/Podcast"&gt;podcasts&lt;/a&gt; suck.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;There's no good way of searching the content of an aggregate of
podcasts through the likes of Google or Yahoo!.&lt;/li&gt;
&lt;li&gt;There's no good way of rapidly scanning through a single podcast for
a particular keyword: the equivalent of CTRL-F or &amp;quot;/&amp;quot; in your
browser.&lt;/li&gt;
&lt;li&gt;There's no good way of linking to a section in the middle of a
podcast.&lt;/li&gt;
&lt;li&gt;If you're a half-way competent reader, you can ingest the same
information in half the time it takes for someone to speak the same
words.&lt;/li&gt;
&lt;li&gt;There is no way to automatically translate the content of a podcast
into a different language (no matter how bad / funny automatic
translations from things like
&lt;a class="reference external" href="http://babelfish.altavista.com"&gt;Babelfish&lt;/a&gt; may be).&lt;/li&gt;
&lt;li&gt;If you're trapped in the middle of a boring meeting, it's really hard
to browse through a podcast at the same time. Or to find the
supporting statement for an argument that you're advancing at a more
exciting meeting.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Give me a podcast if there's a really good reason for audio content;
say, for example, if you're discussing your favourite new bands and
playing clips of songs. Or if your VOIP is really screwed up and you end
up sounding like &lt;a class="reference external" href="http://www.pro-php.com/index.php?post_id=3"&gt;Darth
Wez&lt;/a&gt;. Or maybe if your
content is of an adult nature and your vocal performance really adds to
the effect. &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt; But otherwise--death to podcasts!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 22 Dec 2005 17:15:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2005-12-22:/podcasts-suck.html</guid><category>misc</category><category>Personal</category></item><item><title>MVC: It's all about the data model!</title><link>https://coffeecode.net/mvc-its-all-about-the-data-model.html</link><description>&lt;p&gt;Harry Fuecks made some interesting observations on the
Model-View-Controller (MVC) pattern of application development as it
applies to Web applications in a very long post called &lt;a class="reference external" href="http://www.sitepoint.com/blogs/2005/12/22/mvc-and-web-apps-oil-and-water/"&gt;MVC and web
apps: oil and
water&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
What I'm really trying to say here is I think the desire for MVC on
the server side is a result of obsessions with forms, limitations of
Javascript, the desire to compete with desktop apps and that form
method=&amp;quot;DELETE&amp;quot; never happened (so it was necessary to bundle this
as another action via POST the action).&lt;/blockquote&gt;
&lt;p&gt;Davey responded with &lt;a class="reference external" href="http://pixelated-dreams.com/archives/204-Why-MVC-works-for-Web-Applications.html"&gt;Why MVC works for Web
Applications&lt;/a&gt;,
in which he wrote:&lt;/p&gt;
&lt;blockquote&gt;
Adding support for these [new views, such as SOAP2] should not
impact any other &amp;quot;View&amp;quot; of your application)&lt;/blockquote&gt;
&lt;p&gt;Hallelujah, brother!&lt;/p&gt;
&lt;p&gt;And adding support for a different database (or flat file, or XML
repository) in the &amp;quot;Model&amp;quot; layer of your application should not impact
any &amp;quot;View&amp;quot; either... that turned out to be the central message in my
&lt;a class="reference external" href="/archives/22-Investigating-portability-of-PHP-applications-developed-with-MySQL.html"&gt;presentation at php|works
2005&lt;/a&gt;.
The message emerged as I was putting the presentation together, it
wasn't what I had originally planned. But, when you look at the effort
required to port an application to a different database... the value of
separating your data model in any significant application becomes very
apparent.&lt;/p&gt;
&lt;p&gt;Quick and dirty apps that thoroughly mix SQL and presentation do have
their place, but if you ever want to take advantage of a different
database's features (ability to scale, or alternative licensing /
support offerings, or integration with a third-party application, or
whatever), MVC makes a whole lot of sense. Well, at least thoroughly
separating your data model from the rest of your application makes
sense.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 22 Dec 2005 16:11:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2005-12-22:/mvc-its-all-about-the-data-model.html</guid><category>misc</category><category>PHP</category></item><item><title>Wez Furlong, Oracle's PHP developer of the year</title><link>https://coffeecode.net/wez-furlong-oracles-php-developer-of-the-year.html</link><description>&lt;p&gt;Wez &lt;a class="reference external" href="http://netevil.org/node.php?nid=685"&gt;beat me to it&lt;/a&gt;: I noticed
this weekend that Oracle had named him as the &lt;a class="reference external" href="http://www.oracle.com/technology/oramag/oracle/05-nov/o65awards.html#furlong"&gt;PHP Developer of the
Year&lt;/a&gt;.
Part of this is undoubtedly due to the work Wez put into improving the
OCI driver and creating the PDO_OCI driver for Oracle -- and that's
good for Oracle -- but Wez has put much, much more into the PHP project
that I hope the wider community is aware of.&lt;/p&gt;
&lt;p&gt;A few things off the top of my head:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Newsgroups / mailing lists: earlier this year the server that runs
the PHP newsgroups and mailing lists was starting to choke. Wez
worked tirelessly to clear the queues and get things moving again.
Over time, he helped improve the spam detection and filtering as
well. As the PHP development process relies heavily on the lists,
this was a critical piece of work -- and I suspect that, sadly, most
of the thanks Wez got came from a decrease in the amount of
complaints. So consider this a formal &amp;quot;thank you&amp;quot;!&lt;/li&gt;
&lt;li&gt;PECL: Wez is the &amp;quot;King of PECL&amp;quot;, and he wears the crown well. He has
helped many a developer (including me) get up and running with PECL
projects, setting up accounts, answering all kinds of questions, and
debugging problems at the speed of light. PECL is a big reason for
the innovation that enables PHP to stay up to date with the latest
technology. So thanks, Wez, for playing your part in fostering this
community.&lt;/li&gt;
&lt;li&gt;PDO_ODBC driver -- Wez wrote the PDO_ODBC driver from scratch
starting late last year. I was able to &amp;quot;help&amp;quot; with some of the
implementation for DB2 by pointing him at the relevant DB2
documentation and samples, giving him an account on my home server so
he could easily test his work, and writing basic unit tests for some
of the functionality, but this pales in comparison to the effort he
put into designing and implementing PDO_ODBC and PDO in general.
Along the way, he has weathered
&lt;a class="reference external" href="http://phplens.com/phpeverywhere/?q=node/view/217"&gt;all&lt;/a&gt;
&lt;a class="reference external" href="http://phplens.com/phpeverywhere/?q=archive/2005/05/31"&gt;kinds&lt;/a&gt; of
&lt;a class="reference external" href="http://news.php.net/php.pecl.dev/1488"&gt;criticism&lt;/a&gt; -- designing a
neutral database access API is a thankless task. But thanks! And
thanks especially for tirelessly answering my questions when I was
trying to pull together the PDO documentation. In the end, Wez added
an overview section to the &lt;a class="reference external" href="http://php.net/pdo"&gt;PDO docs&lt;/a&gt; that
explains the core set of tasks that most developers will need to know
-- this should greatly help improve the adoption of PDO. If it ain't
easy, it won't happen.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I've known Wez for over a year now, and am glad that I can consider him
a friend of mine. I've had the chance to meet up with him at a number of
conferences and from the very beginning, when I was completely new to
the PHP development process, he treated me well and helped me get
started with the group. So congratulations Wez -- it's a distinction
that was well deserved!&lt;/p&gt;
&lt;pre class="literal-block"&gt;
[Edited 2006-01-03 for markup and typo]
&lt;/pre&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 21 Nov 2005 17:17:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2005-11-21:/wez-furlong-oracles-php-developer-of-the-year.html</guid><category>PHP</category><category>PHP</category></item><item><title>DB2 validated for use on Ubuntu</title><link>https://coffeecode.net/db2-validated-for-use-on-ubuntu.html</link><description>&lt;p&gt;Good news for all you DB2 for Linux people who love Ubuntu -- IBM just
&lt;a class="reference external" href="http://ibm.com/db2/linux/validate"&gt;validated&lt;/a&gt; Ubuntu as a Linux
distribution on which IBM is willing to offer its enterprise level
support. You can see that Ubuntu was excited in their &lt;a class="reference external" href="http://www.ubuntu.com/include/UbuntuReadyForDB2.pdf"&gt;press
release&lt;/a&gt; about
the accomplishment. And rightully so: no other database server has
announced production-level support for Ubuntu. Cool.&lt;/p&gt;
&lt;p&gt;I've issued some updates to the &lt;a class="reference external" href="http://tldp.org/HOWTO/DB2-HOWTO/index.html"&gt;DB2 for Linux
HOWTO&lt;/a&gt; that will
hopefully be published soon; I had based the original Ubuntu install
instructions on my Gentoo experiences and there were a few embarassing
references to that that I hadn't cleaned up (and which were painfully
evident now that I'm running Ubuntu 5.10 &amp;quot;Breezy Badger&amp;quot; on the
dual-boot side of my laptop).&lt;/p&gt;
&lt;p&gt;In a future update to the HOWTO, I plan to offer a little more
fine-grained installation advice; the current instructions install
everything under the sun, including support for 29 different languages,
warehouse agents, and assorted other features that probably aren't
required for most developers or users. But at least you can get up and
running relatively easily &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;p&gt;So if you want to try Ubuntu, go to &lt;a class="reference external" href="http://ubuntulinux.org"&gt;http://ubuntulinux.org&lt;/a&gt;. It has
replaced SuSE Workstation 9.2 on my laptop -- and I'm even using Gnome
again, which I had given up on a few years ago.&lt;/p&gt;
&lt;p&gt;If you want to try DB2, you can download a &lt;a class="reference external" href="http://www14.software.ibm.com/webapp/download/search.jsp?go=y&amp;amp;rs=dm-db2express"&gt;90-day
trial&lt;/a&gt;
of DB2 Express.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 09 Nov 2005 02:17:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2005-11-09:/db2-validated-for-use-on-ubuntu.html</guid><category>Databases</category><category>DB2</category></item><item><title>Apache Derby: Off to the Races in the (paper) flesh!</title><link>https://coffeecode.net/apache-derby-off-to-the-races-in-the-paper-flesh.html</link><description>&lt;p&gt;Just got back from a gruelling Paris - Amsterdam - Berlin - Paris -
Toronto series of flights (don't ask) to wrap up my European October
getaway and found this sitting on my doorstep.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Apache Derby: Off to the Races book cover" src="uploads/pics/apachederby-bookcover.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Yes, sirs and madams, it is the official hard-bound 500+ page book known
as &lt;em&gt;Apache Derby: Off to the Races&lt;/em&gt; -- the book that gives you
everything you need to know to develop applications with this
scrupulously standards-compliant little database (and even do a little
administration of this normally zero-administration beastie).&lt;/p&gt;
&lt;p&gt;As you &lt;a class="reference external" href="http://www.coffeecode.net/archives/7-Im-an-author!-Apache-Derby-Off-to-the-Races.html"&gt;may already
know&lt;/a&gt;,
I wrote a good chunk of this book: chapters on PHP, Perl, Python, ODBC
network communication, maintenance, and tuning. It was written during a
time that was pretty gruelling for me, personally and professionally,
and at times it felt like it would never end -- but now that I can hold
the thing in my hands, it seems worthwhile. (I hope Lynn thinks so as
well!) And the experience of working with Paul and George was something
that I'm glad to have had as well; I've learned a lot from them.&lt;/p&gt;
&lt;p&gt;So: if you don't have your own copy yet, it's time to &lt;a class="reference external" href="http://www.amazon.com/exec/obidos/redirect?link_code=ur2&amp;amp;camp=1789&amp;amp;tag=coffeecode-20&amp;amp;creative=9325&amp;amp;path=ASIN/0131855255/qid=1118973020/sr=2-1/ref=pd_bbs_b_2_1"&gt;buy a
copy&lt;/a&gt;
(yep, and if you use that link you'll even contribute an extra couple of
pennies to my pocket).&lt;/p&gt;
&lt;div class="section" id="glitches"&gt;
&lt;h2&gt;Glitches&lt;/h2&gt;
&lt;p&gt;Ah yes, I have found a glitch already. Actually I had half suspected
this was coming, due to the last-minute change I requested to keep pace
with the rapid pace of PHP Data Objects (PDO) development and
evolution... a &lt;a class="reference external" href="http://www.netevil.org/node.php?nid=629"&gt;global change to using class constants in
PDO&lt;/a&gt; (from PDO_ATTR_BLAH
to PDO::ATTR_BLAH) happened about a day before our final proofs were
being sent off to the printer. I asked for the corresponding global
change, and, of course, the name of the PDO_ODBC module now reads
PDO::ODBC. It's not the end of the world, but it's a tiny bit
embarassing.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 01 Nov 2005 23:09:00 -0500</pubDate><guid isPermaLink="false">tag:coffeecode.net,2005-11-01:/apache-derby-off-to-the-races-in-the-paper-flesh.html</guid><category>Databases</category><category>Apache Derby</category></item><item><title>SQLEUCCM error message for DB2</title><link>https://coffeecode.net/sqleuccm-error-message-for-db2.html</link><description>&lt;p&gt;Hopefully this proves useful to someone else in the same position in the
future... I have been working on a simple PHP application that connects
to DB2 using the &lt;a class="reference external" href="http://php.net/ibm_db2"&gt;ibm_db2&lt;/a&gt; extension.
Recently I decided to try scaling it up to test the application with a
more realistic (10GB) database.&lt;/p&gt;
&lt;p&gt;I created a new test database on a partition that had enough room, but
then encountered a very strange error message just trying to connect to
the database:&lt;/p&gt;
&lt;blockquote&gt;
[IBM][CLI Driver] SQL0969N There is no message text corresponding to
SQL error &amp;quot;-2079391743&amp;quot; in the message file on this workstation. The
error was returned from module &amp;quot;SQLEUCCM&amp;quot; with original tokens &amp;quot;&amp;quot;.
SQLCODE=-2079391743&lt;/blockquote&gt;
&lt;p&gt;Needless to say, this message really didn't help me much. Googling and
Yahooing for the terms also gave me no useful results (there was a
thread on the International DB2 User Group mailing list, but the site
requires a user ID and login and I just wanted to get on with my day).
The &lt;a class="reference external" href="http://ibm.com/db2/udb/support/"&gt;DB2 support site&lt;/a&gt; didn't
provide any hits, and neither did the &lt;a class="reference external" href="http://publib.boulder.ibm.com/infocenter/db2help"&gt;DB2 Information
Center&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It took me a while to figure this out, but apparently the ownership and
permissions on the directory that contains your tablespaces (if you're
using filesystem-based, or &amp;quot;system managed&amp;quot; tablespaces) have to be
&amp;quot;just so&amp;quot;. DB2, for the uninitiated, uses operating system accounts and
groups for database authentication and privileges. My DB2 instance user
was &amp;quot;db2inst1&amp;quot;, belonging to the &amp;quot;db2iadm1&amp;quot; group -- default values --
however, the directory in which I created the tablespaces belonged to
user &amp;quot;dan&amp;quot; and group &amp;quot;db2iadm1&amp;quot;.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
localhost php4 # ls -l /opt/photos/db2base -ddrwxrwxrwx  3 dan db2iadm1 72 Oct 18 10:35 /opt/photos/db2base
&lt;/pre&gt;
&lt;p&gt;Okay, so even though the db2inst1 user is a member of the db2iadm1
group, DB2 apparently also wants it to own the directory in which the
tablespaces live. By issuing a &amp;quot;chown db2inst1 /opt/photos/db2base&amp;quot;
command, DB2 was satisfied and my PHP scripts started working again. And
maybe, just maybe, the next user that runs into this problem will find
this post in a search engine and save themselves an hour or two of
befuddlement...&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 18 Oct 2005 15:26:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2005-10-18:/sqleuccm-error-message-for-db2.html</guid><category>Databases</category><category>DB2</category></item><item><title>My online poker habit</title><link>https://coffeecode.net/my-online-poker-habit.html</link><description>&lt;p&gt;Well, I seem to have caught a bit of the online poker bug. I started
playing poker a few years ago on a monthly basis with friends from work,
and had a lot of fun, but the frequency died down when the host's first
child arrived and I found myself itching to play.&lt;/p&gt;
&lt;p&gt;Obtuse as I am, even though I had helped out a customer who was running
an online poker site two years ago, I never really thought about playing
online... until about two months ago. I'm a regular reader of &lt;a class="reference external" href="http://wilwheaton.net"&gt;Wil
Wheaton&lt;/a&gt;'s blog, so after he wrote about an
online charity tournament for Katrina relief that he had set up,
something clicked in my brain (YES! a synapse fired!), and I signed up.
I found that it was a very enjoyable way of spending some time for very
little money, and started playing the occasional online game after that.
The way I look at it, if I buy into a 27-player tournament for $1.50, I
can usually get an hour's worth of solid entertainment--way better than
going to a movie, say.&lt;/p&gt;
&lt;p&gt;Last night I entered into a $2 tournament that had 1400 players. Five
hours later, at 3:00 am, I found myself finally knocked out in 16th
place. Fun? Yes. Financially rewarding? Well, considering that #1 took
home $600, my $22 reward seemed small in comparison. But then, I don't
really expect to win when I play, so that was just a nice bonus.&lt;/p&gt;
&lt;p&gt;So... I play online poker. That's it, the truth is out there. I enjoy it
-- 99% of the people are good-natured, at least in the ultra-low stakes
games that I play, and it's good for a laugh more often than not. As a
form of recreation, well, it's a little bit sedentary, but it does offer
pure escapism, and sometimes you need that. In the last few months, we
bought a new house, sold our current house, and have been preparing for
a new life in a new city. I won't apologize for desiring an occasional
vacation of the mind!&lt;/p&gt;
&lt;p&gt;As a result, the volume of my contributions to the open-source community
has dwindled a bit recently. Not that it was ever massive--mostly bits
and pieces of documentation for the PHP Manual over the past year--but
it is very satisfying, and I look forward to getting back to it... after
I sucker this next clown into calling my all-in nut flush &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sat, 15 Oct 2005 04:31:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2005-10-15:/my-online-poker-habit.html</guid><category>Gaming</category><category>Personal</category></item><item><title>Investigating portability of PHP applications developed with MySQL</title><link>https://coffeecode.net/investigating-portability-of-php-applications-developed-with-mysql.html</link><description>&lt;p&gt;The slides for my php|works 2005 presentation, &lt;a class="reference external" href="http://www.coffeecode.net/talks/show.php/mysql-limits/0"&gt;LIMIT
Yourself to MySQL No
More&lt;/a&gt;, are
now online. I'll update this entry once I actually get through talking
through the slides &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;div class="section" id="update-2005-09-17"&gt;
&lt;h2&gt;Update 2005-09-17&lt;/h2&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;The talk went really well, despite my initial fears that I was running
over much of the same ground as Lukas Smith's &lt;em&gt;`Database
Portability &amp;lt;http://pooteeweet.org/files/phpworks05/fast_portable_SQL.pdf&amp;gt;`__&lt;/em&gt;
talk and Wez Furlong's &lt;em&gt;`PHP Data
Objects &amp;lt;http://netevil.org/talks/PHP-Data-Objects.pdf&amp;gt;`__&lt;/em&gt; talk.
Grounding the material in examples taken from a single, real application
in the wild helped make the points more concrete.&lt;/p&gt;
&lt;p&gt;Most of the attendees were genuinely interested in exploring the
application design choices that accompany designing an application to
allow for the possibility of running on multiple databases instead of
tightly coupling the application to a single database. Attendees had
experience with PostgreSQL, Oracle, and even OpenVMS systems and were
able to contribute their own experiences with designing applications for
database independence to a discussion that continued after my &amp;quot;official&amp;quot;
material had run out. I was happy that it was a very positive session,
over all -- there was no mean-spirited &amp;quot;this database sucks, that
database rules&amp;quot; jingoism on display.&lt;/p&gt;
&lt;p&gt;I did find it quite funny that Daniel Udey, the speaker for the session
before mine, explained to me that he had decided not to attend my
session because he was a self-described MySQL fanatic who was very happy
with MySQL, even though he sometimes had to do torturous things to make
it do what he wanted, and that he didn't want to learn more about how
other databases do things. Heh -- to each their own &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;p&gt;After the session, Brian Ashe and &lt;a class="reference external" href="http://shiflett.org"&gt;Chris
Shiflett&lt;/a&gt; both gave me some very positive
feedback. I hadn't been able to prepare quite as thoroughly as I would
have liked, because I have spent the last month getting our house ready
to go on the market, so hearing warm words from speakers whom I respect
meant a lot to me. Note to self: next time, do not try to sell house in
the same week as you are presenting at a conference.&lt;/p&gt;
&lt;p&gt;Thanks to Marco for giving me the chance to speak at php|works 2005,
and to everyone else (you know who you are) who makes these events so
enjoyable and rewarding to attend.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sat, 17 Sep 2005 20:50:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2005-09-17:/investigating-portability-of-php-applications-developed-with-mysql.html</guid><category>PHP</category><category>PHP</category></item><item><title>Buy a PHP Pocket Reference, donate to Katrina aid (php|arch)</title><link>https://coffeecode.net/buy-a-php-pocket-reference-donate-to-katrina-aid-phparch.html</link><description>&lt;p&gt;&lt;a class="reference external" href="http://phparch.com"&gt;php|arch&lt;/a&gt; is donating the profits from the sale
of their new &lt;a class="reference external" href="http://www.phparch.com/rcrs"&gt;Pocket PHP Reference&lt;/a&gt;
(would that be &lt;strong&gt;&amp;amp;Pocket&lt;/strong&gt; then?) to the Canadian Red Cross fund for
Hurricane Katrina relief. Buy early, and you may get one of the 50
copies autographed by Rasmus himself. I suppose there's even a chance
that something I wrote is in there...&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external image-reference" href="http://www.phparch.com/rcrs"&gt;&lt;img alt="Amount of money raised by this effort" src="http://www.phparch.com/redcross.php" /&gt;&lt;/a&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 08 Sep 2005 14:28:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2005-09-08:/buy-a-php-pocket-reference-donate-to-katrina-aid-phparch.html</guid><category>PHP</category><category>PHP</category></item><item><title>Mmmp3 player, new toy</title><link>https://coffeecode.net/mmmp3-player-new-toy.html</link><description>&lt;div class="section" id="the-background"&gt;
&lt;h2&gt;The Background&lt;/h2&gt;
&lt;p&gt;A few years ago I had a Neuros 20GB audio player. It met my two primary
requirements: Linux-friendly and capable of playing OGG Vorbis files. I
have ripped most of my CD collection to Vorbis format, and the files all
sit on Linux at home because that's what Lynn and I use 95% of the time.
The Neuros had other cool features, like its built-in FM broadcasting
capabilities (a good match for our Mazda 3, which like seemingly every
other car in the world does not come with a line-in jack for the stereo
and compounds that limitation by not offering a casssette deck as the
last hope of audio input), and stereo recording (from line-in, FM radio,
or built-in mike). It was very hefty, and its interface was roughly
hewn, but it made me happy -- until I flipped my bike and landed on my
back, with the Neuros breaking my fall. For the last year and a half I
have been salivating over audio players, looking for something that
would meet the requirements of the Neuros in a smaller package with a
better interface. And for the last year and a half, I have watched audio
players add more useless features (like colour screens and stupid games)
without a corresponding drop in price and with continually challenged
interfaces.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="the-setup"&gt;
&lt;h2&gt;The Setup&lt;/h2&gt;
&lt;p&gt;With a week at a cottage coming up, I was pressed into action. Well,
actually Lynn was pressed into action and picked up a Samsung YH-925 GS
as an early birthday present for me at my direction. Sadly, after going
through the mandated full charge it refused to communicate with its
fatter, older brethren (my server and my laptop).&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Linux recognized that some sort of USB device had been attached, but
didn't know how to talk to the YH-925. Apparently it uses a
proprietary protocol of some kind, rather than standard USB Mass
Storage. That sucks.&lt;/li&gt;
&lt;li&gt;Windows XP didn't even recognize that a new USB device had been
attached. That sucks even more.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Because step one of &amp;quot;getting to know your new MP3 player&amp;quot; failed
utterly, I started packing up the Samsung and noticed the note in the
box that pleaded &amp;quot;STOP -- IF YOU EXPERIENCE DIFFICULTIES WITH THIS
DEVICE DO NOT RETURN IT TO THE RETAIL STORE: CALL 1-800-SAMSUNG&amp;quot;. I
would have called, too, if I hadn't already called earlier in the day to
try and find out more about the player. Apparently they keep regular
Monday-Friday business hours; of course, most people playing with their
new toys are going to be playing in the evenings or on weekends.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="the-saviour"&gt;
&lt;h2&gt;The Saviour&lt;/h2&gt;
&lt;p&gt;Having lost faith in the Samsung, I returned it for the &lt;a class="reference external" href="http://iriveramerica.com/prod/hd/h10_20gb.aspx"&gt;iRiver
H10&lt;/a&gt; 20 GB MP3
player. The salesman didn't give me a hassle, confided that this was the
third or fourth time someone had returned that Samsung model, and gave a
thumbs-up to the iRiver as a player that customers seemed to be happy
with. I suppose the combination of the Samsung's relatively new presence
on the market, as well as the number of people who have returned their
Samsung YH-925 players, might account for the lack of reviews or forum
posts on the Web.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="the-rationale"&gt;
&lt;h2&gt;The Rationale&lt;/h2&gt;
&lt;p&gt;I had done enough research on the iRiver to know that 1) contact through
Linux was possible, although it requires a bit of a hack to force the
player to start up in USB Mass Storage mode, and 2) that it was never
going to play OGG Vorbis files. Because the cottage trip is coming up
fast, I've been reduced to converting all of my OGG files to MP3 format
through a nice, lossy OGG -&amp;gt; WAV -&amp;gt; MP3 path. Looks like I have a nice
project when I get back from vacation: re-ripping all of my CDs, but
this time they're going to FLAC format. Now given that I have a player
that does not play MP3 files, which does not talk to Linux by design,
and which costs as much as an iPod, you might ask why didn't I just get
an iPod?&lt;/p&gt;
&lt;p&gt;Well, the store didn't have an iPod in stock. Besides, this thing has an
FM tuner and recording capabilities, so I can listen to the CBC and tape
my friend's university radio show Educating Ourselves (which I always
miss because it airs right in the middle of my commute). And the
interface to the iRiver is pretty good, for the minute or two that I've
played with it so far. Give me a break, would ya? I've been busy
converting and copying files.&lt;/p&gt;
&lt;p&gt;And it's a wonderful, wonderful birthday present. Thanks Lynn!&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Sun, 14 Aug 2005 05:21:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2005-08-14:/mmmp3-player-new-toy.html</guid><category>misc</category><category>Personal</category></item><item><title>PDO driver docs - the split begins</title><link>https://coffeecode.net/pdo-driver-docs-the-split-begins.html</link><description>&lt;p&gt;Until very recently, the entire set of &lt;a class="reference external" href="http://www.php.net/pdo"&gt;PDO&lt;/a&gt;
documentation, including the docs for seven different database drivers,
was contained within the PDO documentation. While this was fine in the
early days of PDO when there were only a handful of users, as PHP 5.1
starts entering the era of release candidates having crystal clear
documentation for the peculiarites of each database driver is going to
be much more important.&lt;/p&gt;
&lt;p&gt;Tonight, as a first step towards that goal, I committed a phpdoc patch
that moves the DSN (data source name, or connection string) syntax out
of the generic PDO constructor documentation and into driver-specific
sections of the manual. As part of that patch, I also implemented a fix
for the &lt;strong&gt;Functions Reference&lt;/strong&gt; section of the manual to ensure that the
table of contents is organized by the descriptive name of the module,
and not simply by the module directory name.&lt;/p&gt;
&lt;p&gt;Without that fix, the table of contents for the manual would
have grouped all of the PDO drivers together next to the general PDO
interface documentation, while the legacy database drivers would be
spread throughout the table of contents by database name. That may not
sound too bad, but it was: without the patch, the results looked
something like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;strong&gt;Firebird/Interbase Functions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;...&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microsoft SQL Server Functions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;...&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Oracle 8 Functions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;...&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Firebird/Interbase Functions (PDO_FIREBIRD)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microsoft SQL Server Functions (PDO_DBLIB)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ODBC and DB2 Functions (PDO_ODBC)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Oracle Functions (PDO_OCI)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SQLite Functions (PDO_SQLITE)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PDO Functions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;...&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SQLite Functions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;...&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ODBC Functions (Unified)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After the fix, the table of contents looks like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;strong&gt;Firebird/Interbase Functions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Firebird/Interbase Functions (PDO_FIREBIRD)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;...&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microsoft SQL Server Functions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microsoft SQL Server Functions (PDO_DBLIB)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;...&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ODBC and DB2 Functions (PDO_ODBC)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ODBC Functions (Unified)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;...&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Oracle 8 Functions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Oracle Functions (PDO_OCI)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;...&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PDO Functions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;...&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SQLite Functions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SQLite Functions (PDO_SQLITE)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I hope you'll agree that the latter structure makes much more sense. If
you don't agree, then I'm going to send the men in the white suits after
you. &lt;em&gt;Note: I used to call myself an information architect, and although
I'm feeling much better these days, I still get pretty passionate about
the subject of information retrieval optimization.&lt;/em&gt;
Now that our manual has the basic stubs for driver-specific sections, I
hope to follow that up with more information about each driver: for
example:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Installation information for both PHP 5.0.x (PECL) and 5.1 (core)&lt;/li&gt;
&lt;li&gt;Driver behavior differences (for example, PDO_PGSQL returns data as
PHP native types rather than plain strings)&lt;/li&gt;
&lt;li&gt;Driver-specific constants, attributes, and ini-file entries (for
example, PDO_ODBC connection pooling)&lt;/li&gt;
&lt;li&gt;Additional methods (for example, PDO_SQLITE's
SqliteCreateAggregate() and SqliteCreateFunction() methods)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I have my limits, however: as an IBM DB2 employee, most of my day-to-day
experience is with the PDO_ODBC driver. I hope that other writers will
be able to pitch in and help document the quirks and extensions of the
other PDO drivers.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 12 Aug 2005 03:52:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2005-08-12:/pdo-driver-docs-the-split-begins.html</guid><category>misc</category><category>PHP</category></item><item><title>OSCON highlight numero uno</title><link>https://coffeecode.net/oscon-highlight-numero-uno.html</link><description>&lt;p&gt;One quick highlight from OSCON: on Tuesday night, right after my
tutorial, I was lucky enough to attend the &lt;a class="reference external" href="http://pdxphp.org"&gt;Portland PHP User's
Group&lt;/a&gt;, where they had arranged an all-star PHP
line up, including Rasmus, Andrei, Wez, Marcus, Ilia, George, Laura,
Adam, Ben, Luke, Shane, John, Stefan, Terry, and Chris-- well-documented
by &lt;a class="reference external" href="http://www.flickr.com/photos/tychay/sets/691711/"&gt;Terry's
photos&lt;/a&gt;. Oddly
enough, a good third of the ensuing discussion actually focused more on
JavaScript and AJAX than it did on PHP... ah well, that's what's
interesting these days, I suppose, and of course when you have that
group of people to talk to you're mining a wealth of information beyond
just PHP.&lt;/p&gt;
&lt;p&gt;A special moment for me: during the round of introductions of this group
of PHP luminaries, a few of the real forces behind PHP (Wez, Ilia,
Marcus, Andrei) insisted I introduce myself as well. I was very
surprised, very honoured, and managed to mumble something about my early
work with PHP at IBM with DB2, writing most of the PDO docs, and saying
how much I enjoyed hanging out / working with this great group of
people. All very true, but I certainly hope to be able to contribute
more to the community in the future.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 08 Aug 2005 05:37:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2005-08-08:/oscon-highlight-numero-uno.html</guid><category>misc</category><category>PHP</category></item><item><title>Dan, meet Zak. Zak, meet Kees.</title><link>https://coffeecode.net/dan-meet-zak-zak-meet-kees.html</link><description>&lt;p&gt;While at OSCON, I finally met &lt;a class="reference external" href="http://zak.greant.com"&gt;Zak Greant&lt;/a&gt;,
the EZ Systems developer and former MySQL Community Advocate from
Vancouver who &lt;a class="reference external" href="http://shiflett.com"&gt;Chris Shiflett&lt;/a&gt; had mistaken me
for at php|tropics. In an apparent attempt to forge his own identity,
Zak had shaved his goatee and grown his hair, making him look a lot less
like &lt;a class="reference external" href="http://photos22.flickr.com/30961214_2de8b49729_s.jpg"&gt;me&lt;/a&gt;.
However, he ended up looking &lt;a class="reference external" href="http://outflux.net/blog/archives/2005/08/04/oscon-2005-doppelganger/"&gt;exactly like
Kees&lt;/a&gt;,
glasses included. Kees ended up having the honour of being called Zak
for the duration of the conference &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;p&gt;*UPDATED*: &lt;a class="reference external" href="http://laurat.blogs.com/"&gt;Laura Thompson&lt;/a&gt; posted a
&lt;a class="reference external" href="http://www.flickr.com/photos/68995515&amp;#64;N00/32572805/"&gt;photo&lt;/a&gt; of the
three of us together.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 08 Aug 2005 05:26:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2005-08-08:/dan-meet-zak-zak-meet-kees.html</guid><category>Software Freedom</category><category>Personal</category></item><item><title>Apache Derby tutorial (OSCON 2005) materials</title><link>https://coffeecode.net/apache-derby-tutorial-oscon-2005-materials.html</link><description>&lt;p&gt;The presentations, handouts, and solutions for the &amp;quot;Deep Dive with
Apache Derby: Perl, PHP, and Python&amp;quot; tutorial I gave at OSCON 2005 are
finally online, including a couple of last-minute corrections:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="/talks/index.php"&gt;Presentations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="/uploads/talks/2005/derby_tutorial_oscon_2005.zip"&gt;Handouts and
solutions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The tutorial (my first solo 3.5 hour teaching session) went reasonably
well, although my expectations of what comprises a tutorial apparently
differs from the OSCON standard. I had structured the tutorial to be
hands-on: after a brief lecture, the attendees were expected to perform
exercises like installing Apache Derby, creating a database, setting up
a connection through PHP, and the like. I was there to help them through
the hurdles.&lt;/p&gt;
&lt;p&gt;In contrast, most of the other tutorials were apparently three-hour
lectures. I sat in on the end of Larry Rosen's *Law for Geeks*, which
appeared to be a great discussion forum -- good format, important
subject, great speaker. I followed that up with Monday morning's
*Introduction to PostgreSQL*, which, at the one-hour mark, was going
painfully slowly... so I slipped out at the break to do a last-minute
run through of my own tutorial instead, and fixed a couple of bugs in
the presentation materials just in time &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;p&gt;My tutorial had about 20 attendees at the start, but I knew it was going
to be trouble when less than half of them actually had laptops. Of the
laptops, about three had Linux (hurrah -- that matched my tutorial
assumptions), a couple had Windows (I had tested everything on Windows,
so I knew I could help them through), and one had Mac OSX (completely
untested and foreign to me). That ratio was actually rather kind to me;
in the rest of the OSCON audience, it seemed about half of the attendees
were carrying Mac laptops.&lt;/p&gt;
&lt;p&gt;After the break, I was down to about seven hard-core attendees. The
attrition didn't surprise or dismay me -- if I was stuck in a hands-on
tutorial without being able to get my hands on anything, I would
probably leave too. Now, I had asked people to buddy up, but apparently
overcoming the fear of strangers was too much to ask (and I admittedly
didn't break the ice enough). The other rather frustrating factor was
the rather sluggish wireless connectivity and ibm.com's sadistic
time-outs playing hell with the 200 MB download required for the DB2
Application Development Client. I ended up copying all of the software
onto a USB drive and distributing it manually to the attendees. Despite
the frustrations with technology, though, I really felt positive vibes
from the audience -- and nobody laid a beating on me in a dark corner
after the session &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Updated 2005-08-11&lt;/strong&gt;: Fixed the link to the presentations. Apparently
not many people have tried to look at them, or didn't bother to tell me
that they were not found &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Updated 2007-11-20&lt;/strong&gt;: Apparently my host dropped one of the libraries
required by the PHP presentation system, so the link to my presentation
stopped working. Fixed - thanks to Gordon Agress for bringing this to my
attention.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 08 Aug 2005 04:45:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2005-08-08:/apache-derby-tutorial-oscon-2005-materials.html</guid><category>Databases</category><category>Apache Derby</category></item><item><title>Apache Derby graduates, Derby 10.1 has been released!</title><link>https://coffeecode.net/apache-derby-graduates-derby-101-has-been-released.html</link><description>&lt;p&gt;Heh -- one day after my OSCON tutorial on &lt;strong&gt;Apache Derby: Perl, PHP, and
Python&lt;/strong&gt;, where I focused on the 10.1-alpha release from back in May,
the Derby team &lt;a class="reference external" href="http://db.apache.org/derby/releases/release-10.1.1.0.html"&gt;announced the first Derby 10.1
release&lt;/a&gt;.
Figures that there would be a flurry of activity &lt;em&gt;after&lt;/em&gt; my talk &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;p&gt;I also noticed that, following the announcement of Derby's graduation
from an Apache incubator project into a full-fledged Apache sub-project,
the migration of Apache Derby from &lt;a class="reference external" href="http://incubator.apache.org/derby"&gt;http://incubator.apache.org/derby&lt;/a&gt; to
&lt;a class="reference external" href="http://db.apache.org/derby"&gt;http://db.apache.org/derby&lt;/a&gt; is closer to completion. Great stuff!&lt;/p&gt;
&lt;p&gt;I think I'll have to talk with the Derby team about having a bit more of
an open and more traditional release process; most open source projects
that I've been involved with go with more than one alpha release, and
they don't usually wait two months before suddenly declaring the
official release. I have to assume that timing for OSCON and the Derby
graduation into a full-fledged Apache sub-project played some part in
the move, but it would be nice to see a more public discussion of the
release cycle for future releases.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Wed, 03 Aug 2005 21:55:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2005-08-03:/apache-derby-graduates-derby-101-has-been-released.html</guid><category>Databases</category><category>Apache Derby</category></item><item><title>Zend Core for IBM: now generally available</title><link>https://coffeecode.net/zend-core-for-ibm-now-generally-available.html</link><description>&lt;p&gt;Just wanted to point out that &lt;a class="reference external" href="http://www.zend.com/core/ibm"&gt;Zend Core for
IBM&lt;/a&gt; is now generally available. If you
need to get up and running with PHP and DB2 for Linux, UNIX, and
Windows, this is a pretty cool free package that will make your life
pretty easy on Linux (x86, x86-64, POWER) and AIX.&lt;/p&gt;
&lt;p&gt;This less than 100MB package includes a precompiled set of PHP 5.0.4
binaries, including the &lt;a class="reference external" href="http://pecl.php.net/ibm_db2"&gt;ibm_db2&lt;/a&gt;
extension and a small DB2 client. You also get IBM Cloudscape 10.0 and
the IBM JRE so that you can develop and deploy against a very small
footprint database.&lt;/p&gt;
&lt;p&gt;Finally, Zend Core for IBM includes a nice Web interface for configuring
PHP, including enabling and disabling various extensions.&lt;/p&gt;
&lt;p&gt;If you're comfortable compiling PHP and extensions from scratch, and you
don't mind downloading and installing your own DB2 client, then Zend
Core for IBM may not be for you.&lt;/p&gt;
&lt;p&gt;But it will save a lot of people a lot of time. Like I said -- the whole
package is free, it never times out, and it's an easy way to get up and
running with PHP and DB2 (or Derby, or Cloudscape) on Linux or AIX. And
if you decide you want support, you can get it from Zend (for the PHP
bits) or IBM (for the Cloudscape bit).&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 21 Jul 2005 16:13:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2005-07-21:/zend-core-for-ibm-now-generally-available.html</guid><category>Databases</category><category>PHP</category></item><item><title>A cascade of technical glitches and mental errors</title><link>https://coffeecode.net/a-cascade-of-technical-glitches-and-mental-errors.html</link><description>&lt;p&gt;This must be a very familiar tale, yet I feel the urge to tell it
again... about two weeks ago my hard drive started making that horrible
'click' noise that indicates that it is about time for it to shuffle off
its all too mortal coil (and spindle, and platter, and bits).&lt;/p&gt;
&lt;p&gt;Your author/hero, being the diligently paranoid sort, ran his weekly
backup and continued working away. The occasional pause and drive seek
error did not deter him from pushing onwards in his quest to deliver the
goods for his employer; no, nothing was going to prevent him from making
his dates -- and with regular backups, he had no fear of the inevitable
crash.&lt;/p&gt;
&lt;p&gt;Surprisingly, the crash never came. However, the moment the hard drive
started making a sound exactly like heavy, horror-show static, he put in
a call to his local technicians for support: specifically, a request for
a new hard drive and a drive image copy to rectify the damage with
minimal downtime. The trusty technician happened to have a hard drive of
just the right sort on hand, and within three hours the laptop was
returned to your author in almost fully working condition. There were
two unexpected events that set the stage for today's stress-filled
adventure:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Lab guy noted that &amp;quot;I was surprised that you had some Linux
partitions, but it looks like Ghost copied them over without any
problems. I did have to &lt;tt class="docutils literal"&gt;fdisk /mbr&lt;/tt&gt; though, so you might have to
reinstall your bootloader.&amp;quot; Okay, fair enough... that kind of thing
is old hat, even though you would expect the lab support guys to run
into more dual-boot machines by now.&lt;/li&gt;
&lt;li&gt;Lab guy mentioned &amp;quot;I also updated some of your drivers for you.&amp;quot;
&lt;em&gt;Oh&lt;/em&gt;, I thought, &lt;em&gt;I really didn't want you to do that,&lt;/em&gt; but I didn't
say anything other than &amp;quot;Thanks!&amp;quot; because, after all, he had saved my
laptop from a nasty death with minimal interruption to my work.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unfortunately, the updated drivers were a problem... you see, when I got
my laptop, I had major problems getting the internal wireless card
working with our Cisco LEAP access points, so I had to resort to our
support guys -- and that support guy said &amp;quot;Heh, these cards don't work
very well, let me replace the internal card with a Cisco mini-PCI.&amp;quot; I
acquiesced, he replaced the internal cared, and I suddenly had a
non-standard laptop. Now, the &amp;quot;updated&amp;quot; drivers turned out to be drivers
for non-existing equipment in my laptop, plus our company's
whiz-bang-location-aware network profile management software... which
never really worked for me, and which I had laboriously replaced with
standard Windows XP utilities. You can tell I wasn't really pleased
about their return to my system.&lt;/p&gt;
&lt;p&gt;I quickly uninstalled the drivers for the non-existent hardware in my
laptop without any problem, then got down to work on resolving this
double stack of networking drivers. Giving our internal software the
benefit of the doubt, I decided to rip out the stuff that was known to
work (MISTAKE #1) for the stuff our company preferred. That was carried
off without too much of a problem, but I was now left with the need to
configure my work wireless profile. As it turned out, there was a
template profile that I could use simply by reinstalling this access
connection software. I saw that the version listed in our internal docs
was much older than the version the support guy installed on my laptop,
but the docs said / claimed / stated that the installer would detect
newer versions of the software and only install the template profiles.
Great!&lt;/p&gt;
&lt;p&gt;Imagine my horror when the installer happily went on an uninstalling
binge. We're not just talking about uninstalling its newer self; this
devilspawn installer rolled back a whole set of Windows updates! Well,
to be fair, it didn't quite roll them all back; one Windows update
happened to be uninstalled, but the installer was unable to reinstall
the older version of the DLLs. It just so happened that the buggered DLL
was dhcpcsvc.dll -- the DHCP client that was at the root of anything
useful in my network interactions. And yes, I was suddenly without
network access.&lt;/p&gt;
&lt;p&gt;So I panicked, a little bit; it wouldn't be so bad if we ran our mail /
calendars on plain old POP and iCal, but we rely on Lotus Notes, and
there are ID files that you have to copy to enable a different client to
connect to your mail, and all of this good and complex stuff. &lt;em&gt;Hmm&lt;/em&gt;,
thinks I again, my Linux partition had Notes running under Wine a few
months back. Maybe I could rely on that until I can get the tech support
guys to un-screw my laptop?&lt;/p&gt;
&lt;p&gt;But of course, here's where the tech guy's &lt;tt class="docutils literal"&gt;fdisk /mbr&lt;/tt&gt; command
destroyed my GRUB bootloader, forcing me to boot up with a Linux rescue
CD and reinstall the bootloader. Here's basically what I did:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;bash# mount /dev/hda8 /mnt/restore&lt;/li&gt;
&lt;li&gt;bash# mount /dev/hda7 /mnt/restore/boot&lt;/li&gt;
&lt;li&gt;bash# chroot /mnt/restore&lt;/li&gt;
&lt;li&gt;bash# grub-install /dev/hda1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyone catch the mistake? Oh go ahead, call it a blunder. In my haste to
get back to work, I installed the bootloader directly on the first
partition of the hard drive, typically (and sadly in this case) the C:
NTFS drive. The correct approach, by the way, is to install the
bootloader on the master boot record (MBR) at /dev/hda0. I have done
this, oh, a couple of hundred times, but was so focused on the messed up
C: drive that I messed it up even more.&lt;/p&gt;
&lt;p&gt;At least Linux was happy to boot, and I was able to run Notes under
Wine, and host my most important meeting of the week. Goody. (That was
after about two hours of trying to get my Notes ID file, which comically
required me to return to our Notes administrator multiple times as he
first gave me &lt;em&gt;his&lt;/em&gt; ID file, then gave me my ancient, no-longer-valid ID
file, then finally gave me the right file).&lt;/p&gt;
&lt;p&gt;All that I had to do was figure out how to correct this little matter of
the corrupted C: NTFS partition on my laptop so I could continue working
on my OSCON tutorial. My support ticket showed that it would be a day
before I was going to get any love, so I figured I was on my own for
tonight; I was determined to get this going, at least so I could copy
the latest versions of the files to my home desktop so I could continue
working there. Searches on Google for 'corrupted NTFS drive' or 'NTFS
boot partition' etc all turned up lots of useful advice for Windows NT
and Windows 2000, which seemed close enough to XP that I was willing to
try it out -- but unfortunately they all required a boot floppy, and my
laptop has no floppy. Boot CD maybe? Grr...&lt;/p&gt;
&lt;p&gt;Finally (truly, finally, this is it), I decided to trust in Microsoft's
good hearts and rebooted the laptop with my legitimate copy of Windows
XP Professional. I skipped the &amp;quot;Automatic System Restore&amp;quot; boot option --
I don't have that much trust, thank you -- then let it load its scads of
drivers, before I had the choice of a Manual Restore console. I took
that, scanned the list of DOS commands that were available, and gave
FIXBOOT a shot. And the dang thing worked -- it recognized that the
partition was NTFS, restored the Windows MBR, and let me reboot. Cool! I
also copied DHCPCSVC.DLL to the C:\windows\system32 directory using
the handy &lt;tt class="docutils literal"&gt;expand &lt;span class="pre"&gt;F:\i386\DHCPCSVC.DL_&lt;/span&gt; DHCPCSVC.DLL&lt;/tt&gt; command and got
some level of networking functionality back.&lt;/p&gt;
&lt;p&gt;So I'm in the game, again, and maybe, just maybe, this experience will
help someone else who winds up in the same sad position as me.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 19 Jul 2005 00:12:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2005-07-19:/a-cascade-of-technical-glitches-and-mental-errors.html</guid><category>misc</category><category>Personal</category></item><item><title>P* deluge</title><link>https://coffeecode.net/p-deluge.html</link><description>&lt;p&gt;I'm going a little nutty at the moment with a stack overflow of P*
programming languages.&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;strong&gt;Perl&lt;/strong&gt;: I have been attending Yet Another Perl Conference::North
America (&lt;a class="reference external" href="http://www.yapc.org/America/"&gt;YAPC::NA&lt;/a&gt;) in my lovely
hometown of Toronto. YAPCs are a little out of the ordinary, as far
as conferences that I've attended--for one thing, the cost for a
three-day conference is about $100 CDN. Do you get what you pay for?
Well, $100 goes a long, long way in a true community built on a
volunteerism spirit. Oddly enough, Larry Wall gave a very thoughtful
opening keynote/meditation on community building... anyways, I've
been immersed in Perl today.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PHP&lt;/strong&gt;: But then I picked up this email when I got home, with the
subject &lt;strong&gt;Zend Certified Engineer Exam - Results!&lt;/strong&gt;. I had taken
advantage of the free certification exam when I was at php|tropics,
on a lark, when &lt;a class="reference external" href="http://blog.casey-sweat.us/index.php?p=58"&gt;Jason
Sweat&lt;/a&gt; walked past me
at 8:00 in the morning and I asked him where he was headed so early.
I followed in his wake and wrote the test without studying diligently
beforehand. When I tried to open the email, to find out just what my
&lt;strong&gt;Results!&lt;/strong&gt; were, the combination of an ongoing virus scan + Lotus
Notes' turgidness made for a (no kidding) 10-second delay of pure
anticipation before the email opened. I had enough time to think &amp;quot;I
really hope Zend doesn't use exclamation marks on the notices that
inform people that they have failed their exam -- that would be
funny, but cruel&amp;quot;. It turns out that I passed, so I'm now a &amp;quot;&lt;a class="reference external" href="http://www.zend.com/store/education/certification/authenticate.php?ClientCandidateID=ZEND001227&amp;amp;RegistrationID=0502023"&gt;Zend
Certified
Engineer&lt;/a&gt;&amp;quot;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Python&lt;/strong&gt;: For the aforementioned &lt;a class="reference external" href="http://conferences.oreillynet.com/cs/os2005/view/e_sess/6555"&gt;Deep Dive with Apache
Derby&lt;/a&gt;
tutorial for OSCON, I have been wrapping up my summary of Python and
using the pyDB2 module to connect to Apache Derby from Python
applications. I've got wayyy too much material on Python, geez, maybe
I should write a book or something. Oh wait, &lt;a class="reference external" href="http://www.amazon.com/exec/obidos/redirect?link_code=ur2&amp;amp;camp=1789&amp;amp;tag=coffeecode-20&amp;amp;creative=9325&amp;amp;path=ASIN/0131855255/qid=1118973020/sr=2-1/ref=pd_bbs_b_2_1"&gt;done
that&lt;/a&gt;
&lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Despite the perils of varying sigils and whitespace, I think I've
managed to keep the languages straight today. Tomorrow should be a
little simpler, as it will be a day of pure Perl at YAPC::NA capped off
by a Perl cruise around Toronto Harbour. Those Perl folk know how to
live it up!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 28 Jun 2005 02:46:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2005-06-28:/p-deluge.html</guid><category>misc</category><category>Programming languages</category></item><item><title>OSCON top ten tutorials</title><link>https://coffeecode.net/oscon-top-ten-tutorials.html</link><description>&lt;p&gt;Take a look at the &lt;a class="reference external" href="http://radar.oreilly.com/archives/2005/06/oscon_top_tutor.html"&gt;OSCON Top Ten
Tutorials&lt;/a&gt;
-- although it's not in the top ten,
&lt;a class="reference external" href="http://radar.oreilly.com/nat/"&gt;nat&lt;/a&gt; does put in a plug for my own
&lt;a class="reference external" href="http://conferences.oreillynet.com/cs/os2005/view/e_sess/6555"&gt;Deep Dive with Apache
Derby&lt;/a&gt;
tutorial.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Gulp&lt;/em&gt;, no pressure!&lt;/p&gt;
&lt;p&gt;Congrats to &lt;a class="reference external" href="http://shiflett.org"&gt;Chris&lt;/a&gt; for hitting the top ten with
&lt;a class="reference external" href="http://conferences.oreillynet.com/cs/os2005/view/e_sess/6502"&gt;PHP
Security&lt;/a&gt;
-- I know that's going to be a good session, having attended a precursor
at php|tropics.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 27 Jun 2005 13:07:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2005-06-27:/oscon-top-ten-tutorials.html</guid><category>Databases</category></item><item><title>Happy Father's Day, Dad</title><link>https://coffeecode.net/happy-fathers-day-dad.html</link><description>&lt;p&gt;Dad -- I know we've had our differences, sometimes for years at a time.
Funny how I wound up with a lot of the same traits as you --
self-assuredness, stubbornness, independence, extreme rationality -- and
when we butted heads those qualities made for some pretty intense
disagreements. But you did pass on many other aspects of my character
too: a love of reading and literature, an appreciation for hard work,
and a closeness to nature.&lt;/p&gt;
&lt;p&gt;Heck, you even instilled in me the discerning and argumentative nature
that, while now occasionally infuriating to Lynn, carried me through my
English and philosophy degree and stands me in good stead today in my
career.&lt;/p&gt;
&lt;p&gt;And as I have become a husband to Lynn and a father (of sorts) to our
cat Spook, I have a much better understanding of the pressures and
stresses that face any man -- and a better understanding of you, an
understanding that I was never able to achieve as a child, teenager, or
student. So, as your third and final son, I say, thank you, Dad. I love
you.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 20 Jun 2005 01:30:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2005-06-20:/happy-fathers-day-dad.html</guid><category>Family</category><category>Personal</category></item><item><title>Hot new coffee toy</title><link>https://coffeecode.net/hot-new-coffee-toy.html</link><description>&lt;p&gt;This place isn't called Coffee|Code for nothing. I'm quite serious
about my coffee, to the point of roasting my own. I started a year and a
half ago with a Freshroast Plus roaster that was included with a
year-long subscription (of two pounds per month) of &lt;a class="reference external" href="http://www.merchantsofgreencoffee.com/"&gt;Merchants of Green
Coffee&lt;/a&gt;, borrowed my friend
Jamie's Hearthware classic hot air roaster last winter after the
Freshroast got cracked and started letting coffee chaff fly around the
kitchen, and was hoping that Santa-Lynn would bring me a brand new
Swissmar Alpenrost drum roaster for Christmas.&lt;/p&gt;
&lt;p&gt;So how did I end up with a brand new Hearthware iRoast this week? And
why am I so giggly happy?&lt;/p&gt;
&lt;p&gt;Well, to begin with, Swissmar announced in late 2004 that they
were going to revamp the well-received Alpenrost with a new model, and
production of the old model was stopped. Originally the new model was
slated for Christmas, then 1Q2005, then, finally, it showed up on
several sites for pre-ordering.&lt;/p&gt;
&lt;p&gt;But, shockingly, the revisions to the
model came with a brand new price tag as well -- $600 CDN, almost 50%
more than the old model. That, dear readers, is just a bit too rich for
this coffee afficianado. You can buy a &lt;em&gt;lot&lt;/em&gt; of green coffee for $200!&lt;/p&gt;
&lt;p&gt;Having flipped the bird in the general direction of the Swissmar Bravi,
I looked around and found the Hearthware iRoast at &lt;a class="reference external" href="http://www.birdsandbeans.ca"&gt;Birds and
Beans&lt;/a&gt; for just over $200. It's a hot
air roaster that has received many good reviews, the price was right,
and to top it all off I have had a warm spot in my heart for Birds and
Beans ever since Jamie and I split an order of 100 pounds of green
coffee for about $6 a pound. Think about that -- from Starbucks or
Second Cup you would be paying about $12 a pound for coffee they've
roasted, vs. coffee that is organic, fair trade, shade-grown,
bird-friendly (or some combination thereof), and which you can roast to
your own preferences. Oh yeah, and you know exactly how long it's been
sitting, so if you have stale coffee it's all on your head &lt;img alt=":-)" src="/images/smile.png" /&gt; I
placed the order on Monday, requesting delivery. On Wednesday I received
a note from the courier service stating that they had tried to deliver
my parcel! That's incredible turnaround time, and one of the reasons I'm
giggly happy.&lt;/p&gt;
&lt;p&gt;But the second reason I'm so happy is that they packed the
roaster in biodegradable cornstarch peanuts. They looked exactly like
foam, and Lynn thought they were foam until I let one start dissolving
on my tongue. Kudos Birds and Beans for that nice environmental touch!
They went straight into our compost bin where some day they will help
feed a new generation of plants.&lt;/p&gt;
&lt;p&gt;The final reason I'm happy is the
iRoast itself -- it's a slick unit in glossy understated black. Unlike
the Freshroast and old Hearthware, that just blasted hot air at a
constant temperature at your beans, the iRoast has a three-stage
programmable profile so you can adjust the length &amp;amp; temperature of each
stage. Coffee geekdom, here I come! The only drawback is that the
profile lasts only as long as the roaster is plugged in, so I'll be
taking careful notes... but I've roasted one batch of Peruvian using the
dark preset profile and am delighted with the results. It looks like my
home-brewed coffee intake is going to rise to new levels; good for me,
bad news for Timmies and friends &lt;img alt=":-)" src="/images/smile.png" /&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Fri, 17 Jun 2005 01:06:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2005-06-17:/hot-new-coffee-toy.html</guid><category>Coffee</category><category>Coffee</category></item><item><title>I'm an author! "Apache Derby: Off to the Races"</title><link>https://coffeecode.net/im-an-author-apache-derby-off-to-the-races.html</link><description>&lt;p&gt;If you're looking for a book that covers Apache Derby / IBM Cloudscape
top-to-bottom, and you want a gentle introduction to programming
database applications with PHP, Perl, Python, JDBC, or .NET, &lt;a class="reference external" href="http://www.amazon.com/exec/obidos/redirect?link_code=ur2&amp;amp;camp=1789&amp;amp;tag=coffeecode-20&amp;amp;creative=9325&amp;amp;path=ASIN/0131855255/qid=1118973020/sr=2-1/ref=pd_bbs_b_2_1"&gt;Apache
Derby: Off to the
Races&lt;/a&gt;&lt;img alt="image0" src="http://www.assoc-amazon.com/e/ir?t=coffeecode-20&amp;amp;l=ur2&amp;amp;o=1" style="width: 1px; height: 1px;" /&gt;
is the book for you!&lt;/p&gt;
&lt;p&gt;No, really... I'm a co-author, responsible for the chapters on managing
Apache Derby (hey, it's a zero-admin database, so that wasn't too hard),
setting up Apache Derby as a Network Server for ODBC / Call Level
Interface (CLI) applications, and writing Perl, PHP, and Python database
applications with Derby with both Web interfaces and GUI interfaces.
&lt;a class="reference external" href="http://netevil.org/"&gt;Wez Furlong&lt;/a&gt;, the king of PECL and PDO himself,
reviewed the PHP chapter, so you know that, at least, is going to be
good &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;p&gt;My co-authors are Paul Zikopoulos and George Baklarz, who have written a
ton of other commercial books. Me, this is my first time out in the real
world (I've written technical manuals for IBM before), and I'm pretty
excited. I just sent the last, corrected copy of my chapters back to the
publisher yesterday, and while I'm sure there are parts that I could
improve on (if I thought about it for a really really long time), I'm
pretty damn proud of what's going in there and I think it will stand the
reader in good stead.&lt;/p&gt;
&lt;p&gt;Of course, it's not going to be published until the fall, but why wait
-- order your copy now at &lt;a class="reference external" href="http://www.amazon.com/exec/obidos/redirect?link_code=ur2&amp;amp;camp=1789&amp;amp;tag=coffeecode-20&amp;amp;creative=9325&amp;amp;path=ASIN/0131855255/qid=1118973020/sr=2-1/ref=pd_bbs_b_2_1"&gt;Apache Derby: Off to the
Races&lt;/a&gt;&lt;img alt="image2" src="http://www.assoc-amazon.com/e/ir?t=coffeecode-20&amp;amp;l=ur2&amp;amp;o=1" style="width: 1px; height: 1px;" /&gt;!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 16 Jun 2005 02:48:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2005-06-16:/im-an-author-apache-derby-off-to-the-races.html</guid><category>Databases</category><category>Apache Derby</category></item><item><title>"Inside the PHP Documentation" presentation</title><link>https://coffeecode.net/inside-the-php-documentation-presentation.html</link><description>&lt;p&gt;A day or two late, but here are the slides for the &lt;a class="reference external" href="/uploads/talks/phptropics-docs.pdf"&gt;&amp;quot;Inside the PHP
Documentation&amp;quot;
presentation&lt;/a&gt;
I gave at php|tropics 2005 in sunny Cancun, Mexico.&lt;/p&gt;
&lt;p&gt;A total of three &amp;quot;real people&amp;quot; attended; Derick and Andrei don't count
because they were driven back into the conference room by the blazing
sun. So it wasn't a big crowd, but:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;It was the last talk of the conference -- and come on, it's Cancun
for heaven's sakes!&lt;/li&gt;
&lt;li&gt;The comments and questions from the attendees demonstrated more than
just polite interest, so I &lt;em&gt;think&lt;/em&gt; it went over pretty well.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After the presentation, I nudged Derick to figure out why the Livedocs
server at &lt;a class="reference external" href="http://docs.php.net"&gt;docs.php.net&lt;/a&gt; wasn't updating, and he
quickly figured out that there were &amp;gt; 4096 files in each directory, and
the GNU utils were choking on the massive set of arguments. So hopefully
it will become a nice, totally up to date Livedocs server in the next
couple of days, thanks to the power of rm -fr &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Mon, 16 May 2005 16:29:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2005-05-16:/inside-the-php-documentation-presentation.html</guid><category>PHP</category><category>PHP</category></item><item><title>php|tropics talk on using PHP with DB2, Cloudscape, and Derby</title><link>https://coffeecode.net/phptropics-talk-on-using-php-with-db2-cloudscape-and-derby.html</link><description>&lt;p&gt;Today, I gave a &lt;a class="reference external" href="/uploads/talks/phptropics-ibm_db2.pdf"&gt;talk on using PHP with DB2, Cloudscape, and Apache
Derby&lt;/a&gt;
at &lt;a class="reference external" href="http://phparch.com/tropics/"&gt;php|tropics&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;My talk was the second talk of the day, immediately following
&lt;a class="reference external" href="http://netevil.org/"&gt;Wez Furlong's&lt;/a&gt; excellent and well-attended
presentation on PDO. The strong lead-in may have contributed to the
record turnout at my talk -- about 15 people. Part of it, of course, may
have to do with the interest stoked by the Zend Core for IBM
announcement (now &lt;a class="reference external" href="http://www.ibm.com/software/data/info/zendcore/"&gt;available in
beta&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;I was very happy to have Wez and &lt;a class="reference external" href="http://blog.casey-sweat.us/"&gt;Jason Sweat&lt;/a&gt;
on hand to help stimulate discussion. Wez's PDO presentation covered a lot of
the basic database compatibility and optimization principles of PDO and the
challenges of designing interfaces for databases beyond MySQL, so I was able to
focus more on the specifics about DB2 and Derby. I &lt;em&gt;think&lt;/em&gt; the talk went well,
although I failed to mention that:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Windows support is still forthcoming -- I really have to figure out
the config.w32 stuff&lt;/li&gt;
&lt;li&gt;The availability of the Zend Core for IBM beta -- although to be
fair, I think that was just released today &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 12 May 2005 20:02:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2005-05-12:/phptropics-talk-on-using-php-with-db2-cloudscape-and-derby.html</guid><category>Databases</category><category>PHP</category></item><item><title>Miguel deIcaza addresses MySQL User Conference</title><link>https://coffeecode.net/miguel-deicaza-addresses-mysql-user-conference.html</link><description>&lt;p&gt;Miguel gave a high-energy, high-enthusiasm, but rather scattered keynote
address to the MySQL User Conference this morning:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Mentions of Apache Derby in context of Mono.Net Java interpreter: 2&lt;/li&gt;
&lt;li&gt;Mentions of SQLite as embedded database for Fspot application: 2&lt;/li&gt;
&lt;li&gt;Mentions of DB2 as supported database in Mono ADO.Net connector: 1&lt;/li&gt;
&lt;li&gt;Mentions of MySQL as supported database in Mono ADO.Net connector: 1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Probably not what the MySQL folks had in mind &lt;img alt=":-)" class="emoticon" src="/images/smile.png" /&gt;&lt;/p&gt;
&lt;p&gt;It was great to see him leap about demonstrating the Mono.GTK#
binding superiority to the Windows.Forms bindings for internationalized
GUI applications, to 30 GB of photos he took in Beirut in the midst of a
pro-Hezbollah demonstration, to the Fspot photo organizer, and a lot of
fun to make those leaps with him. Of note:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Ximian's original delivery plan for Evolution after acquiring venture
capital was four months; ended up taking 2.5 years (due to native C
source memory allocation / freeing issues)&lt;/li&gt;
&lt;li&gt;IronPython now runs at 90% of the speed of CPython&lt;/li&gt;
&lt;li&gt;the acquisition of Ximian by Novell forced the stabilization and
delivery of Mono (as Novell plans to deliver applications built with
Mono)&lt;/li&gt;
&lt;/ul&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Thu, 21 Apr 2005 17:34:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2005-04-21:/miguel-deicaza-addresses-mysql-user-conference.html</guid><category>Databases</category><category>MySQL</category></item><item><title>Welcome to Santa Clara, Mr. Scott</title><link>https://coffeecode.net/welcome-to-santa-clara-mr-scott.html</link><description>&lt;p&gt;I arrived at San Jose International airport last night. I'm in town to
attend the &lt;a class="reference external" href="http://mysqluc.com"&gt;MySQL User Conference&lt;/a&gt;, but of course
I'm also in town to experience a new location.&lt;/p&gt;
&lt;p&gt;The first half hour or so was relatively benign; while I knew
the hotel I was staying at offered complimentary shuttle to / from the
airport, the idea of calling and actually arranging for the shuttle
didn't occur to me until I was already standing at the courtesy shuttle
waiting area. The hotel front desk warned me that it would be a bit of a
wait (hinting, I think, that I should consider alternate modes of
transportation). but I had my latest issue of the Harper's magazine so I
didn't mind the wait. Even though California has a reputation as a
liberal state, I still felt rather conspicuous-yet-provocative reading
the flagship journal of liberal thought. Article of the moment:
something exploring the relationship between evangelical Christianity
and economics (political economics, to be somewhat more precise, with a
focus on capitalism of course).&lt;/p&gt;
&lt;p&gt;So I was thinking about this a little bit as my ride arrived, and trying not to
be just rational man in town for a conference living on the mass-produced
experience offered by the efficient profit-sucking corporations that have
developed Santa Clara, I asked the driver a few questions:&lt;/p&gt;
&lt;p&gt;Q: &lt;em&gt;So what's the history of Santa Clara? Why is Santa Clara here?&lt;/em&gt; A: &lt;em&gt;I
really don't know, I don't know history.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Q: &lt;em&gt;Hmm, okay. So what sort of things should I do around here?&lt;/em&gt; A: &lt;em&gt;There's a
Bennigan's (restaurant), San Francisco is about an hour away... Do you like
sushi?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;and so on... it wasn't what I was looking for, really -- I do need to eat --
but normally people who live in an area have some interesting suggestions for
local attractions or cultural experiences. Instead, it seems that outside of
attending a conference, Santa Clara gives me the option of eating; otherwise I
should go to some place that will satisfy my needs.&lt;/p&gt;
&lt;p&gt;Hmm. So, bad start -- but I did go out for a run on the Great America
Parkway. Massive amounts of greenery (trees and shrubs) dominates this strip of
land housing a mix of hotels, conference centers, and technology company
offices. It's a green, car-friendly industrial park sprawling along a single
road. Pretty nice, actually, in the early morning, but not a place I want to
spend a lot of time. By the way, I do know that I'm within a mile or two of the
Intel Museum and some amusement park. I might go and pay homage to the dusty
silicon gods that have provided the platform for many of my interests and most
of my career thus far...&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">dan@coffeecode.net (Dan Scott)</dc:creator><pubDate>Tue, 19 Apr 2005 16:31:00 -0400</pubDate><guid isPermaLink="false">tag:coffeecode.net,2005-04-19:/welcome-to-santa-clara-mr-scott.html</guid><category>misc</category><category>Travel</category></item></channel></rss>