<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://assela.pathirana.net/index.php?action=history&amp;feed=atom&amp;title=Library_Software</id>
	<title>Library Software - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://assela.pathirana.net/index.php?action=history&amp;feed=atom&amp;title=Library_Software"/>
	<link rel="alternate" type="text/html" href="https://assela.pathirana.net/index.php?title=Library_Software&amp;action=history"/>
	<updated>2026-05-13T20:02:22Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.37.0</generator>
	<entry>
		<id>https://assela.pathirana.net/index.php?title=Library_Software&amp;diff=4312&amp;oldid=prev</id>
		<title>Root at 19:07, 16 June 2011</title>
		<link rel="alternate" type="text/html" href="https://assela.pathirana.net/index.php?title=Library_Software&amp;diff=4312&amp;oldid=prev"/>
		<updated>2011-06-16T19:07:52Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 19:07, 16 June 2011&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l350&quot;&gt;Line 350:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 350:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;===Errata==&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* The following sites in the above script fail frequently: &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt; portage.library.ubc.ca:7090 (instead ils.library.ubc.ca:7090 work!)&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt; ipac.lib.uchicago.edu:210&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://assela.pathirana.net/index.php?title=Library_Software&amp;diff=4311&amp;oldid=prev</id>
		<title>Root at 18:45, 16 June 2011</title>
		<link rel="alternate" type="text/html" href="https://assela.pathirana.net/index.php?title=Library_Software&amp;diff=4311&amp;oldid=prev"/>
		<updated>2011-06-16T18:45:17Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 18:45, 16 June 2011&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l339&quot;&gt;Line 339:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 339:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Essential ruby installation:  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Essential ruby installation:  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;shell&lt;/del&gt;&amp;gt;  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;bash&lt;/ins&gt;&amp;gt;  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;wget http://rubyforge.org/frs/download.php/38646/rubygems-1.2.0.tgz&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;tar -xzvf rubygems-1.2.0.tgz &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;cd rubygems-1.2.0/&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;sudo ruby setup.rb&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;sudo gem update --system&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;sudo apt-get install libyaz-dev&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;sudo gem install zoom&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;sudo gem install marc&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://assela.pathirana.net/index.php?title=Library_Software&amp;diff=4310&amp;oldid=prev</id>
		<title>Root: Created page with &#039;==ISBN2MARC== * Original source code [http://www.miskatonic.org/src/isbn2marc/isbn2marc here]. Following is provided for consistency only. (Full credit should go to William Dento…&#039;</title>
		<link rel="alternate" type="text/html" href="https://assela.pathirana.net/index.php?title=Library_Software&amp;diff=4310&amp;oldid=prev"/>
		<updated>2011-06-16T18:43:32Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;#039;==ISBN2MARC== * Original source code [http://www.miskatonic.org/src/isbn2marc/isbn2marc here]. Following is provided for consistency only. (Full credit should go to William Dento…&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==ISBN2MARC==&lt;br /&gt;
* Original source code [http://www.miskatonic.org/src/isbn2marc/isbn2marc here]. Following is provided for consistency only. (Full credit should go to William Denton).&lt;br /&gt;
&amp;lt;source lang=ruby&amp;gt;&lt;br /&gt;
#!/usr/local/bin/ruby -w&lt;br /&gt;
&lt;br /&gt;
# isbn2marc - find MARC records for one or more ISBNs&lt;br /&gt;
&lt;br /&gt;
# William Denton &amp;lt;wtd@pobox.com&amp;gt;&lt;br /&gt;
# April 2007 - October 2008&lt;br /&gt;
# Released under the MIT License.&lt;br /&gt;
&lt;br /&gt;
# Copyright (c) 2008 William Denton&lt;br /&gt;
#&lt;br /&gt;
# Permission is hereby granted, free of charge, to any person&lt;br /&gt;
# obtaining a copy of this software and associated documentation&lt;br /&gt;
# files (the &amp;quot;Software&amp;quot;), to deal in the Software without&lt;br /&gt;
# restriction, including without limitation the rights to use,&lt;br /&gt;
# copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;
# copies of the Software, and to permit persons to whom the&lt;br /&gt;
# Software is furnished to do so, subject to the following&lt;br /&gt;
# conditions:&lt;br /&gt;
#&lt;br /&gt;
# The above copyright notice and this permission notice shall be&lt;br /&gt;
# included in all copies or substantial portions of the Software.&lt;br /&gt;
#&lt;br /&gt;
# THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND,&lt;br /&gt;
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES&lt;br /&gt;
# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND&lt;br /&gt;
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT&lt;br /&gt;
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,&lt;br /&gt;
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING&lt;br /&gt;
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR&lt;br /&gt;
# OTHER DEALINGS IN THE SOFTWARE.&lt;br /&gt;
&lt;br /&gt;
# INSTALLATION NOTES&lt;br /&gt;
#&lt;br /&gt;
# Requires the ruby-zoom package (which requires YAZ) and the marc gem.&lt;br /&gt;
#&lt;br /&gt;
# ruby-zoom: http://ruby-zoom.rubyforge.org/&lt;br /&gt;
# See the installation instructions there&lt;br /&gt;
#&lt;br /&gt;
# marc gem: http://rubyforge.org/projects/marc/&lt;br /&gt;
# $ sudo gem install marc&lt;br /&gt;
#&lt;br /&gt;
# NOTE ruby-zoom installs its own marc.rb file that will conflict with&lt;br /&gt;
# marc! You will need to delete ruby-zoom&amp;#039;s marc.rb or rename it &lt;br /&gt;
# for the marc gem to work.&lt;br /&gt;
# &lt;br /&gt;
# On my system it was installed in&lt;br /&gt;
#   /usr/local/lib/ruby/site_ruby/1.8/marc.rb&lt;br /&gt;
# but you&amp;#039;ll have to look for it wherever your system put it.&lt;br /&gt;
&lt;br /&gt;
# USAGE&lt;br /&gt;
#&lt;br /&gt;
# isbn2marc [-q] [-d marcfile] [-x xmlfile] ISBN&lt;br /&gt;
#&lt;br /&gt;
# -q          Run quietly, don&amp;#039;t list servers queried and don&amp;#039;t &lt;br /&gt;
# --quiet     dump MARC to STDOUT&lt;br /&gt;
#             By default isbn2marc tells STDERR what it&amp;#039;s doing&lt;br /&gt;
#&lt;br /&gt;
# -d marcfile Dump MARC record to file&lt;br /&gt;
# --dump&lt;br /&gt;
#&lt;br /&gt;
# -x xmlfile  Dump MARCXML record to file&lt;br /&gt;
# --dumpxml&lt;br /&gt;
#&lt;br /&gt;
# -w apikey   Query WorldCat using API key&lt;br /&gt;
# --worldcat&lt;br /&gt;
#&lt;br /&gt;
# -l level    WorldCat service level (default or full)&lt;br /&gt;
# --worldcatlevel Default is default&lt;br /&gt;
&lt;br /&gt;
# EXAMPLES&lt;br /&gt;
#&lt;br /&gt;
# Find a MARC record for the first volume of Casanova&amp;#039;s HISTORY OF&lt;br /&gt;
# MY LIFE and pretty print it:&lt;br /&gt;
#&lt;br /&gt;
# $ isbn2marc 0801856620 &lt;br /&gt;
#&lt;br /&gt;
# Find a MARC record for Terry Pratchett&amp;#039;s THIEF OF TIME and write&lt;br /&gt;
# a binary MARC file to disk as well as pretty printing it:&lt;br /&gt;
#&lt;br /&gt;
# $ isbn2marc -d thief.marc 0552148407&lt;br /&gt;
#&lt;br /&gt;
# Find a MARC record for the first omnibus volume of the University of&lt;br /&gt;
# Chicago Press&amp;#039;s edition of Anthony Powell&amp;#039;s A DANCE TO THE MUSIC OF TIME,&lt;br /&gt;
# but don&amp;#039;t show the record on the screen:&lt;br /&gt;
#&lt;br /&gt;
# $ isbn2marc -q -d stringham.marc -x templer.xml 0226677141&lt;br /&gt;
#&lt;br /&gt;
# Find MARC records for all ISBNs in a file and save them on disk:&lt;br /&gt;
#&lt;br /&gt;
# $ cat isbns.txt&lt;br /&gt;
# 0439064864&lt;br /&gt;
# 0439064872&lt;br /&gt;
# 0439136350&lt;br /&gt;
# 0439136369&lt;br /&gt;
# 0439139600&lt;br /&gt;
# 059035342X&lt;br /&gt;
# 0736646736&lt;br /&gt;
# $ isbn2marc -f isbns.txt -d harry-potter.marc&lt;br /&gt;
#&lt;br /&gt;
# Try WorldCat first, which will speed things up, and get a full record:&lt;br /&gt;
#&lt;br /&gt;
# $isbn2marc --worldcat yourAPIkeyhere --worldcatlevel full 1551922460&lt;br /&gt;
#&lt;br /&gt;
# Find a MARC record but don&amp;#039;t display it or save it:&lt;br /&gt;
#&lt;br /&gt;
# $ isbn2marc -q 0195024028&lt;br /&gt;
#&lt;br /&gt;
# You&amp;#039;d be a bit silly to run that often.&lt;br /&gt;
&lt;br /&gt;
# TO DO&lt;br /&gt;
#&lt;br /&gt;
# Proper ISBN validity check.&lt;br /&gt;
&lt;br /&gt;
require &amp;#039;net/http&amp;#039;&lt;br /&gt;
require &amp;#039;optparse&amp;#039;&lt;br /&gt;
require &amp;quot;rexml/document&amp;quot;&lt;br /&gt;
include REXML&lt;br /&gt;
&lt;br /&gt;
require &amp;#039;rubygems&amp;#039;&lt;br /&gt;
require &amp;#039;marc&amp;#039;&lt;br /&gt;
require &amp;#039;zoom&amp;#039;&lt;br /&gt;
&lt;br /&gt;
# I don&amp;#039;t know if it&amp;#039;s cool to use global variables for these&lt;br /&gt;
# options, or for the MARC writer and xmlwriter thingies, but&lt;br /&gt;
# I am because of the write_record function.  Comments welcome.&lt;br /&gt;
$options = {}&lt;br /&gt;
$options[:quiet] = false&lt;br /&gt;
$options[:file]  = nil&lt;br /&gt;
$options[:dump] = nil&lt;br /&gt;
$options[:dumpxml] = nil&lt;br /&gt;
&lt;br /&gt;
# Enter your WorldCat API key here.&lt;br /&gt;
# It can also be specified on the command line but that&amp;#039;s tiresome.&lt;br /&gt;
# To get a key, see&lt;br /&gt;
#  http://worldcat.org/devnet/wiki/SearchAPIWhoCanUse&lt;br /&gt;
# For WorldCat API details see&lt;br /&gt;
#    http://worldcat.org/devnet/wiki/SearchAPIDetails&lt;br /&gt;
$options[:worldcat] = &amp;#039;&amp;#039;&lt;br /&gt;
$options[:worldcatlevel]= &amp;#039;default&amp;#039; # Or full&lt;br /&gt;
&lt;br /&gt;
OptionParser.new do |opts|&lt;br /&gt;
  opts.banner = &amp;quot;Usage: isbn2marc [-q] [-d marcfile] [-x xmlfile] isbn&amp;quot;&lt;br /&gt;
  opts.on(&amp;quot;-q&amp;quot;, &amp;quot;--quiet&amp;quot;, &amp;quot;Run silently&amp;quot;) { $options[:quiet] = true }&lt;br /&gt;
  opts.on(&amp;quot;-d&amp;quot;, &amp;quot;--dump d&amp;quot;, &amp;quot;Dump MARC to file d&amp;quot;) do |d|&lt;br /&gt;
    $options[:dump]  = d&lt;br /&gt;
  end&lt;br /&gt;
  opts.on(&amp;quot;-x&amp;quot;, &amp;quot;--dumpxml x&amp;quot;, &amp;quot;Dump MARCXML to file x&amp;quot;) do |x| &lt;br /&gt;
    $options[:dumpxml] = x&lt;br /&gt;
  end&lt;br /&gt;
  opts.on(&amp;quot;-f&amp;quot;, &amp;quot;--file f&amp;quot;,  String, &amp;quot;Read ISBNs from file f (one per line)&amp;quot;) do |f|&lt;br /&gt;
    $options[:file] = f &lt;br /&gt;
  end&lt;br /&gt;
  opts.on(&amp;quot;-w&amp;quot;, &amp;quot;--worldcat apikey&amp;quot;, String, &amp;quot;WorldCat API key&amp;quot;) do |w|&lt;br /&gt;
    $options[:worldcat] = w&lt;br /&gt;
  end&lt;br /&gt;
  opts.on(&amp;quot;-l&amp;quot;, &amp;quot;--worldcatlevel level&amp;quot;, String, &amp;quot;WorldCat service level (default or full)&amp;quot;) do |wl|&lt;br /&gt;
    $options[:worldcatlevel] = wl&lt;br /&gt;
  end&lt;br /&gt;
end.parse!&lt;br /&gt;
&lt;br /&gt;
# Probably won&amp;#039;t change, but one never knows.&lt;br /&gt;
worldcatAPIURL = &amp;quot;http://www.worldcat.org/webservices/catalog/content/isbn/::ISBN::?servicelevel=::LEVEL::&amp;amp;wskey=::KEY::&amp;quot;&lt;br /&gt;
&lt;br /&gt;
isbns = []&lt;br /&gt;
&lt;br /&gt;
if $options[:file].nil?&lt;br /&gt;
  if ARGV.empty?&lt;br /&gt;
    STDERR.puts &amp;quot;No ISBN specified&amp;quot;&lt;br /&gt;
    exit 0&lt;br /&gt;
  end&lt;br /&gt;
else&lt;br /&gt;
  begin&lt;br /&gt;
    file = File.open($options[:file], &amp;quot;r&amp;quot;)&lt;br /&gt;
    while (line = file.gets)&lt;br /&gt;
      line.chomp!&lt;br /&gt;
      # TODO Proper ISBN validity check&lt;br /&gt;
      next unless /(978)*\d{9}[0-9X]/.match(line)&lt;br /&gt;
      # puts &amp;quot;&amp;#039;#{line}&amp;#039;&amp;quot;&lt;br /&gt;
      isbns &amp;lt;&amp;lt; line.gsub(/[^0-9X]/, &amp;#039;&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
    file.close&lt;br /&gt;
  rescue Exception =&amp;gt; e&lt;br /&gt;
    STDERR.puts &amp;quot;ERROR &amp;#039;#{e}&amp;#039;&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
if ! ARGV.empty?&lt;br /&gt;
  isbns &amp;lt;&amp;lt; ARGV[0].to_s.gsub(/[^0-9X]/, &amp;#039;&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
if $options[:dump]&lt;br /&gt;
  begin&lt;br /&gt;
    $writer = MARC::Writer.new($options[:dump])&lt;br /&gt;
  rescue Exception =&amp;gt; e&lt;br /&gt;
    STDERR.puts &amp;quot;ERROR Cannot write to #{$options[:dump]}: &amp;#039;#{e}&amp;#039;&amp;quot;&lt;br /&gt;
    exit 0&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
if $options[:dumpxml]&lt;br /&gt;
  begin&lt;br /&gt;
    $xmlwriter = MARC::XMLWriter.new($options[:dumpxml])&lt;br /&gt;
  rescue Exception =&amp;gt; e&lt;br /&gt;
    STDERR.puts &amp;quot;ERROR Cannot write to #{$options[:dumpxml]}: &amp;#039;#{e}&amp;#039;&amp;quot;&lt;br /&gt;
    exit 0&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Two lists of open Z39.50 servers:&lt;br /&gt;
#   http://targettest.indexdata.com/&lt;br /&gt;
#   http://staff.library.mun.ca/staff/toolbox/z3950hosts.htm&lt;br /&gt;
# Could also look at the list in Terry Reese&amp;#039;s MarcEdit:&lt;br /&gt;
#   http://oregonstate.edu/~reeset/marcedit/html/downloads.html&lt;br /&gt;
&lt;br /&gt;
servers = [&lt;br /&gt;
  # Reorder these so that your preferred servers are first&lt;br /&gt;
  # North America&lt;br /&gt;
  [&amp;#039;theta.library.yorku.ca&amp;#039;,     2200, &amp;#039;unicorn&amp;#039;     ], # York&lt;br /&gt;
  [&amp;#039;sirsi.library.utoronto.ca&amp;#039;,  2200, &amp;#039;unicorn&amp;#039;     ], # U Toronto&lt;br /&gt;
  [&amp;#039;amicus.collectionscanada.gc.ca&amp;#039;, 210, &amp;#039;NL&amp;#039;       ], # Lib &amp;amp; Archives Canada&lt;br /&gt;
  [&amp;#039;z3950.loc.gov&amp;#039;,              7090, &amp;#039;Voyager&amp;#039;     ], # Library of Congress&lt;br /&gt;
  [&amp;#039;aleph.mcgill.ca&amp;#039;,             210, &amp;#039;MUSE&amp;#039;        ], # McGill&lt;br /&gt;
# [&amp;#039;ualapp.library.ualberta.ca&amp;#039;, 2200, &amp;#039;unicorn&amp;#039;,    ], # U Alberta&lt;br /&gt;
  [&amp;#039;portage.library.ubc.ca&amp;#039;,     7090, &amp;#039;voyager&amp;#039;     ], # UBC&lt;br /&gt;
  [&amp;#039;catnyp.nypl.org&amp;#039;,             210, &amp;#039;INNOPAC&amp;#039;     ], # New York Pub Lib&lt;br /&gt;
  [&amp;#039;library.mit.edu&amp;#039;,            9909, &amp;#039;mit01pub&amp;#039;    ], # MIT&lt;br /&gt;
  [&amp;#039;prodorbis.library.yale.edu&amp;#039;, 7090, &amp;#039;voyager&amp;#039;     ], # Yale&lt;br /&gt;
  [&amp;#039;catalog.princeton.edu&amp;#039;,      7090, &amp;#039;voyager&amp;#039;     ], # Princeton&lt;br /&gt;
  [&amp;#039;ipac.lib.uchicago.edu&amp;#039;,       210, &amp;#039;usmarc&amp;#039;      ], # Chicago&lt;br /&gt;
  [&amp;#039;www.saclibrarycatalog.org&amp;#039;,   210, &amp;#039;INNOPAC&amp;#039;     ], # Sacramento Pub Lib&lt;br /&gt;
  [&amp;#039;library.bu.edu&amp;#039;,              210, &amp;#039;INNOPAC&amp;#039;     ], # Boston U&lt;br /&gt;
  [&amp;#039;voyager.wrlc.org&amp;#039;,           7090, &amp;#039;voyager&amp;#039;     ], # Wash Res Lib Consor&lt;br /&gt;
  [&amp;#039;catalog.lib.jhu.edu&amp;#039;,         210, &amp;#039;horizon&amp;#039;     ], # Johns Hopkins&lt;br /&gt;
  [&amp;#039;z3950.lib.umich.edu&amp;#039;,         210, &amp;#039;miu01_pub&amp;#039;   ], # U Michigan&lt;br /&gt;
  [&amp;#039;catalog.library.cornell.edu&amp;#039;,7090, &amp;#039;voyager&amp;#039;     ], # Cornell&lt;br /&gt;
  # UK and Ireland&lt;br /&gt;
  [&amp;#039;library.ucc.ie&amp;#039;,              210, &amp;#039;INNOPAC&amp;#039;     ], # U College Cork&lt;br /&gt;
  [&amp;#039;library.ox.ac.uk&amp;#039;,            210, &amp;#039;MAIN*BIBMAST&amp;#039;], # Oxford&lt;br /&gt;
  [&amp;#039;z3950.nls.uk&amp;#039;,               7290, &amp;#039;voyager&amp;#039;     ], # Scottish Nat Lib&lt;br /&gt;
  [&amp;#039;lib-15.lse.ac.uk&amp;#039;,           7090, &amp;#039;voyager&amp;#039;     ], # LSE&lt;br /&gt;
  [&amp;#039;libsys.lib.hull.ac.uk&amp;#039;,       210, &amp;#039;INNOPAC&amp;#039;     ], # Hull&lt;br /&gt;
  # Europe (non-English)&lt;br /&gt;
  [&amp;#039;sigma.nkp.cz&amp;#039;,               9909, &amp;#039;NKC&amp;#039;         ], # Nat Lib Czech R&lt;br /&gt;
  [&amp;#039;lib.mpib-berlin.mpg.de&amp;#039;,     2020, &amp;#039;opac&amp;#039;        ], # Max Planck Inst&lt;br /&gt;
  [&amp;#039;ubsun02.biblio.etc.tu-bs.de&amp;#039;,2020, &amp;#039;bac&amp;#039;         ], # Bibliotheken Berlins&lt;br /&gt;
  [&amp;#039;z3950.kb.dk&amp;#039;,                2100, &amp;#039;KGL01&amp;#039;       ], # Kongelige Bibliothek&lt;br /&gt;
  [&amp;#039;roble.unizar.es&amp;#039;,             210, &amp;#039;INNOPAC&amp;#039;     ], # U Zaragoza&lt;br /&gt;
  [&amp;#039;www.helmet.fi&amp;#039;,               210, &amp;#039;INNOPAC&amp;#039;     ], # Helsinki Lib&lt;br /&gt;
  [&amp;#039;carmin.sudoc.abes.fr&amp;#039;,        210, &amp;#039;ABES-Z39-PUBLIC&amp;#039; ], # France&lt;br /&gt;
  [&amp;#039;gofor.bibli.ens-cachan.fr&amp;#039;, 21210, &amp;#039;ADVANCE&amp;#039;     ], # French school&lt;br /&gt;
  [&amp;#039;gofor.bibli.ens-cachan.fr&amp;#039;, 21210, &amp;#039;MAIN*BIBMAST&amp;#039;], # French school&lt;br /&gt;
  [&amp;#039;isis.cilea.it&amp;#039;,              2100, &amp;#039;usmarc&amp;#039;      ], # U Brescia&lt;br /&gt;
  [&amp;#039;z3950.bibsys.no&amp;#039;,            2100, &amp;#039;BIBSYS&amp;#039;      ], # Nat Lib Norway&lt;br /&gt;
  [&amp;#039;z3950.nb.no&amp;#039;,                2100, &amp;#039;norbok&amp;#039;      ], # Nat Lib Norway&lt;br /&gt;
  [&amp;#039;alpha.bn.org.pl&amp;#039;,             210, &amp;#039;INNOPAC&amp;#039;     ], # Nat Lib Poland&lt;br /&gt;
  [&amp;#039;z3950.btj.se&amp;#039;,                210, &amp;#039;BURK&amp;#039;        ], # Sweden&lt;br /&gt;
  # Australia and New Zealand&lt;br /&gt;
  [&amp;#039;catalogue.nla.gov.au&amp;#039;,       7090, &amp;#039;voyager&amp;#039;     ], # Nat Lib Australia&lt;br /&gt;
  [&amp;#039;nlnzcat.natlib.govt.nz&amp;#039;,     7190, &amp;#039;voyager&amp;#039;     ], # Nat Lib New Zealand&lt;br /&gt;
  # Asia&lt;br /&gt;
  [&amp;#039;library.cuhk.edu.hk&amp;#039;,         210, &amp;#039;INNOPAC&amp;#039;     ], # Chinesse U HK&lt;br /&gt;
  [&amp;#039;linc.nus.edu.sg&amp;#039;,             210, &amp;#039;INNOPAC&amp;#039;     ], # Nat U Singapore&lt;br /&gt;
  [&amp;#039;nbinet.ncl.edu.tw&amp;#039;,           210, &amp;#039;INNOPAC&amp;#039;     ], # Nat Cent Lib Taiwan&lt;br /&gt;
  # Africa&lt;br /&gt;
  [&amp;#039;explore.up.ac.za&amp;#039;,            210, &amp;#039;INNOPAC&amp;#039;     ], # U Pretoria  &lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
# Given an ISBN and some Z39.50 server information, return MARCXML.&lt;br /&gt;
# Why MARCXML?  Because (now) the ruby-zoom module can&amp;#039;t return a&lt;br /&gt;
# marc MARC object. It can, however, return MARCXML, which marc can&lt;br /&gt;
# grok.&lt;br /&gt;
def z3950query (isbn, host, port, db)&lt;br /&gt;
  begin&lt;br /&gt;
    ZOOM::Connection.open(host, port) do |conn|&lt;br /&gt;
      conn.database_name = db&lt;br /&gt;
      conn.preferred_record_syntax = &amp;#039;MARC21&amp;#039;&lt;br /&gt;
      rset = conn.search(&amp;quot;@attr 1=7 #{isbn}&amp;quot;)&lt;br /&gt;
      return rset[0].xml &lt;br /&gt;
    end&lt;br /&gt;
  rescue Exception =&amp;gt; e&lt;br /&gt;
    STDERR.puts &amp;quot;\nERROR Z39.50 query: &amp;#039;#{e}&amp;#039;&amp;quot; if /failed/.match(e)&lt;br /&gt;
    return nil&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Given a MARC reader object, write out the records therein, to&lt;br /&gt;
# STDOUT or disk, in the desired format.&lt;br /&gt;
# TODO Write out only the *first* one. (Why?)&lt;br /&gt;
def write_record (marcxml)&lt;br /&gt;
  reader = MARC::XMLReader.new(StringIO.new(marcxml))&lt;br /&gt;
  begin&lt;br /&gt;
    reader.each do |record|&lt;br /&gt;
      puts; puts record unless $options[:quiet] == true&lt;br /&gt;
      $writer.write(record) if $options[:dump]&lt;br /&gt;
      $xmlwriter.write(record) if $options[:dumpxml]&lt;br /&gt;
    end&lt;br /&gt;
  rescue Exception =&amp;gt; e&lt;br /&gt;
    STDERR.puts &amp;quot;\nERROR Record not read: &amp;#039;#{e}&amp;#039;&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Now the real business.  If we can check WorldCat, do so, because&lt;br /&gt;
# it&amp;#039;s the best source.  If we can&amp;#039;t, or if it fails, loop through all&lt;br /&gt;
# the servers listed above and ask about the ISBN(s).&lt;br /&gt;
&lt;br /&gt;
isbns.each do |isbn| &lt;br /&gt;
  if $options[:worldcat].length &amp;gt; 0&lt;br /&gt;
    STDERR.print &amp;quot;\r#{isbn} WorldCat&amp;quot; + &amp;quot; &amp;quot;*25 unless $options[:quiet] == true&lt;br /&gt;
    worldcatURL = worldcatAPIURL.gsub(/::ISBN::/, isbn)&lt;br /&gt;
    worldcatURL = worldcatURL.gsub(/::KEY::/, $options[:worldcat])&lt;br /&gt;
    worldcatURL = worldcatURL.gsub(/::LEVEL::/, $options[:worldcatlevel])&lt;br /&gt;
    # STDERR.print &amp;quot;\nGetting #{worldcatURL}&amp;quot;&lt;br /&gt;
    worldcat_xml = Net::HTTP.get_response(URI.parse(worldcatURL)).body&lt;br /&gt;
    doc = REXML::Document.new worldcat_xml&lt;br /&gt;
    error = doc.elements[&amp;#039;//diagnostics/diagnostic/message&amp;#039;].nil? ? nil : doc.elements[&amp;#039;//diagnostics/diagnostic/message&amp;#039;].text&lt;br /&gt;
    if error.nil? &lt;br /&gt;
      write_record(worldcat_xml)&lt;br /&gt;
      next&lt;br /&gt;
    else&lt;br /&gt;
      STDERR.puts &amp;quot;\nERROR from WorldCat: #{error}&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  servers.each do |server|&lt;br /&gt;
    STDERR.print &amp;quot;\r#{isbn} #{server[0]}&amp;quot; + &amp;quot; &amp;quot;*25 unless $options[:quiet] == true&lt;br /&gt;
    marcxml = z3950query(isbn, server[0], server[1], server[2])&lt;br /&gt;
    next if marcxml.nil?&lt;br /&gt;
    write_record(marcxml)&lt;br /&gt;
    break&lt;br /&gt;
  end  &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
$writer.close if $options[:dump]&lt;br /&gt;
$xmlwriter.close if $options[:dumpxml]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Essential ruby installation: &lt;br /&gt;
&amp;lt;source lang=shell&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
</feed>