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

<channel>
	<title>LORLS &#187; LORLS</title>
	<atom:link href="http://blog.lboro.ac.uk/lorls/category/lorls/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.lboro.ac.uk/lorls</link>
	<description>Loughborough Online Reading List System</description>
	<lastBuildDate>Mon, 08 Apr 2013 10:10:16 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Purchasing Prediction</title>
		<link>http://blog.lboro.ac.uk/lorls/lorls/purchasing-prediction?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=purchasing-prediction</link>
		<comments>http://blog.lboro.ac.uk/lorls/lorls/purchasing-prediction#comments</comments>
		<pubDate>Mon, 25 Mar 2013 17:29:55 +0000</pubDate>
		<dc:creator>Jon Knight</dc:creator>
				<category><![CDATA[LORLS]]></category>
		<category><![CDATA[dLib]]></category>
		<category><![CDATA[LORLS v7]]></category>
		<category><![CDATA[purchase prediction]]></category>

		<guid isPermaLink="false">http://blog.lboro.ac.uk/lorls/?p=1652</guid>
		<description><![CDATA[For a while now we&#8217;ve been feverishly coding away at the top secret LORLS bunker on a new library management tool attached to LORLS: a system to help predict which books a library should buy and roughly how many will be required.  The idea behind this was that library staff at Loughborough were spending a [...]]]></description>
				<content:encoded><![CDATA[<p>For a while now we&#8217;ve been feverishly coding away at the top secret LORLS bunker on a new library management tool attached to LORLS: a system to help predict which books a library should buy and roughly how many will be required.  The idea behind this was that library staff at Loughborough were spending a lot of time trying to work out what books needed to be bought, mostly based on trawling through lots of data from systems such as the LORLS reading list management system and the main Library Management System (Aleph in our case).  We realised that all of this work was suitable for &#8220;mechanization&#8221; and we could extract some rules from the librarians about how to select works for purchase and then do a lot of the drudgery for them.</p>
<p>We wrote the initial hack-it-up-and-see-if-the-idea-works-at-all prototype about a year ago.  It was pretty successful and was used in Summer 2012 to help the librarians decide how to spend a bulk book purchasing budget windfall from the University.  We wrote up our experiences with this code as a <a href="http://www.dlib.org/dlib/march13/knight/03knight.html" target="_blank">Dlib article</a> which was published recently.  That article explains the process behind the system, so if you&#8217;re interested in the basis behind this idea its probably worth a quick read (or to put it in other terms, I&#8217;m too lazy to repeat it here! <img src='http://blog.lboro.ac.uk/lorls/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  ).</p>
<p>Since then we&#8217;ve stepped back from the initial proof of concept code and spent some time re-writing it to be more maintainable and extensible.  The original hacked together prototype was just a single monolithic Perl script that evolved and grew as we tried ideas out and added features.  It has to call out to external systems to find loan information and book pricing estimates with bodges stuffed on top of bodges.  We always intended it to be the &#8220;one we threw away&#8221; and after the summer tests it became clear that the purchase prediction could be useful to the Library staff and it was time to do version 2.  And do it properly this time round.</p>
<p>The new version is modular&#8230; using good old Perl modules! Hoorah! But we&#8217;ve been a bit sneaky: we&#8217;ve a single Perl module that encompasses the purchase prediction process but doesn&#8217;t actually <em>do</em> any of it.  This is effectively a &#8220;wrapper&#8221; module that a script can call and which knows about what other purchase prediction modules are available and what order to run them in.  The calling script just sets up the environment (parsing CGI parameters, command line options, hardcoded values or whatever is required), instantiates a new <strong>PurchasePrediction</strong> object and repeatedly calls that object&#8217;s DoNextStep() method with a set of input state (options, etc) until the object returns an untrue state.  At that point the prediction has been made and suggestions have, hopefully, been output.  Each call to DoNextStep() runs the next Perl module in the purchase prediction workflow.</p>
<p>The <strong>PurchasePrediction</strong> object comes with sane default state stored within it that provides standard workflow for the process and some handy information that we use regularly (for example ratios of books to students in different departments and with different levels of academic recommendation in LORLS.  You tend to want more essential books than you do optional ones obviously, whilst English students may require use of individual copies longer than Engineering students do).  This data isn&#8217;t private to the <strong>PurchasePredictor</strong> module  though &#8211; the calling script could if it wished alter any of it (maybe change the ratio of essential books per student for the Physics department or even alter the workflow of the purchase prediction process).</p>
<p>The workflow that we currently follow by default is:</p>
<ol>
<li><span style="line-height: 12.796875px;">Acquire ISBNs to investigate,</span></li>
<li>Validate those ISBNs,</li>
<li>Make an initial estimate of the number of copies required for each work we have an ISBN for,</li>
<li>Find the cost associated with buying a copy of each work,</li>
<li>Find the loan history of each work,</li>
<li>Actually do the purchasing algorithm itself,</li>
<li>Output the purchasing suggestions in some form.</li>
</ol>
<p><span style="line-height: 19px;">Each of those steps is broken down into one or more (mostly more!) separate operations, with each operation then having its own Perl module to instantiate it.  For example to acquire ISBNs we&#8217;ve a number of options:</span></p>
<ol>
<li><span style="line-height: 12.796875px;">Have an explicit list of ISBNs given to us,</span></li>
<li>Find the ISBNs of works on a set of reading list modules,</li>
<li>Find the ISBNs of works on reading lists run by a particular department (and optionally stage within that department &#8211; ie First Year Mech Eng)</li>
<li>Find ISBNs from reading list works that have been edited within a set number of days,</li>
<li>Find all the ISBNs of books in the entire reading list database</li>
<li>Find ISBNs of works related to works that we already have ISBNs for (eg using LibraryThing&#8217;s FRBR code to find alternate editions, etc).</li>
</ol>
<p><span style="line-height: 19px;">Which of these will do anything depends on the input state passed into the <strong>PurchasePredictor&#8217;</strong>s DoNextStep() method by the calling script &#8211; they all get called but some will just return the state unchanged whilst others will add new works to be looked at later by subsequent Perl modules.</span></p>
<p>Now this might all sound horribly confusing at first but it has big advantages for development and maintenance. When we have a new idea for something to add to the workflow we can generate a new module for it, slip it into the list in the <strong>PurchasePredictor</strong> module&#8217;s data structure (either by altering this on the fly in a test script or, once the new code is debugged, altering the default workflow data held in the <strong>PurchasePredictor</strong> module code) and then pass some input to the <strong>PurchasePredictor</strong> module&#8217;s DoNextStep() method that includes flags to trigger this new workflow.</p>
<p>For example until today the workflow shown in the second list above did not include the step &#8220;Find ISBNs from reading list works that have been edited within a set number of days&#8221;; that got added as a new module written from scratch to a working state in a little over two hours.  And here&#8217;s the result, rendered as an HTML table:</p>
<div id="attachment_1656" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.lboro.ac.uk/lorls/wp-content/uploads/2013/03/pp-screenshot.png"><img class="size-medium wp-image-1656" alt="Purchase Predictor pp2 HTML showing suggested purchases for works in LORLS edited in the last day." src="http://blog.lboro.ac.uk/lorls/wp-content/uploads/2013/03/pp-screenshot-300x225.png" width="300" height="225" /></a><p class="wp-caption-text">Purchase Predictor pp2 HTML showing suggested purchases for works in LORLS edited in the last day.</p></div>
<p>As you can see the purchase predictor HTML output in this case tries to fit in with Jason&#8217;s new user interface, which it can do easily as that&#8217;s all encompassed in Perl modules as well!</p>
<p>There&#8217;s still lots more work we&#8217;ve can do with purchase prediction.  As one example, the next thing on my &#8216;To Do&#8217; list is to make an output module that generates emails for librarians so that it can be run as batch job by cron every night.  The librarians can then sip their early morning coffee whilst pondering which book purchasing suggestions to follow up.  The extensible modular scheme also means we&#8217;re free to plug in different actual purchasing algorthims&#8230; maybe even incorporating some machine learning, with feedback provided by the actual purchases approved by the librarians against the original suggestions that the system made.</p>
<p>I knew those undergraduate CompSci Artificial Intelligence lectures would come in handy eventually&#8230; <img src='http://blog.lboro.ac.uk/lorls/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lboro.ac.uk/lorls/lorls/purchasing-prediction/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Exporting to a Word document</title>
		<link>http://blog.lboro.ac.uk/lorls/lorls/exporting-to-word-document?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=exporting-to-word-document</link>
		<comments>http://blog.lboro.ac.uk/lorls/lorls/exporting-to-word-document#comments</comments>
		<pubDate>Fri, 08 Mar 2013 12:36:22 +0000</pubDate>
		<dc:creator>Jason Cooper</dc:creator>
				<category><![CDATA[CLUMP]]></category>
		<category><![CDATA[LORLS]]></category>
		<category><![CDATA[export]]></category>
		<category><![CDATA[Word documents]]></category>

		<guid isPermaLink="false">http://blog.lboro.ac.uk/lorls/?p=1600</guid>
		<description><![CDATA[A new feature we have been working on in our development version of CLUMP, is the option for a list editor to export their reading list as a word document (specifically in a docx format).  This will be particularly beneficial for academics extract a copy of their list in a suitable format for inclusion into [...]]]></description>
				<content:encoded><![CDATA[<p>A new feature we have been working on in our development version of CLUMP, is the option for a list editor to export their reading list as a word document (specifically in a docx format).  This will be particularly beneficial for academics extract a copy of their list in a suitable format for inclusion into a course/module handbook. A key requirement we had when developing it was that it should be easy to alter the styles used for headings, citations, notes, etc.</p>
<p>As <a title="Extracting Harvard citations from Word documents" href="http://blog.lboro.ac.uk/lorls/lorls/extracting-harvard-citations-from-word-documents">previously mentioned by Jon</a> the docx format is actually a zip file containing a group of XML files.  The text content of a document is stored within the &#8220;w:body&#8221; element in the document.xml file.  The style details are stored in another of the xml files.  Styles and content being stored in separate files allows us to create a template.docx file in word, in which we define our styles.  The export script then takes this template and populates it with the actual content.</p>
<p>When generating an export the script takes a copy of the template file, treats it as a zip file and extracts the document.xml file.  Then it replaces the contents of the w:body element in that extracted file with our own xml before overwriting the old document.xml with our new one.  Finally we then pass this docx file from the servers memory to the user.  All of this process is done in memory which avoids the overheads associated with generating and handling temporary files.</p>
<p><a href="http://blog.lboro.ac.uk/lorls/wp-content/uploads/2013/03/wordExport.png"><img class="aligncenter size-large wp-image-1638" alt="wordExport" src="http://blog.lboro.ac.uk/lorls/wp-content/uploads/2013/03/wordExport-1024x448.png" width="640" height="280" /></a></p>
<p>To adjust the formatting of the styles in the template it can simply be loaded into Word, where the desired changes to the styles can be made.  After it has been saved it can be uploaded to the server to replace its existing template.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lboro.ac.uk/lorls/lorls/exporting-to-word-document/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Meeting the Reading List Challenge 2013 announced</title>
		<link>http://blog.lboro.ac.uk/lorls/lorls/meeting-the-reading-list-challenge-2013-announced?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=meeting-the-reading-list-challenge-2013-announced</link>
		<comments>http://blog.lboro.ac.uk/lorls/lorls/meeting-the-reading-list-challenge-2013-announced#comments</comments>
		<pubDate>Mon, 18 Feb 2013 11:45:46 +0000</pubDate>
		<dc:creator>Jason Cooper</dc:creator>
				<category><![CDATA[LORLS]]></category>
		<category><![CDATA[Workshop]]></category>

		<guid isPermaLink="false">http://blog.lboro.ac.uk/lorls/?p=1588</guid>
		<description><![CDATA[The annual Meeting the Reading List Challenge event will be taking place at Loughborough again. The announcement about the free event can be seen below. Meeting the Reading List Challenge Keith Green Building, Loughborough University Thursday 4th April 2013, 10:30am – 3:30pm This free showcase event will highlight experiences from a number of institutions in [...]]]></description>
				<content:encoded><![CDATA[<p>The annual Meeting the Reading List Challenge event will be taking place at Loughborough again. The announcement about the free event can be seen below.</p>
<blockquote><p>Meeting the Reading List Challenge<br />
Keith Green Building, Loughborough University<br />
Thursday 4th April 2013, 10:30am – 3:30pm</p>
<p>This free showcase event will highlight experiences from a number of institutions in their use and development of resource/reading list management systems.  There will be five presentations (further details to follow) throughout the day.  In addition there will be a buffet lunch provided during which there will be a suppliers&#8217; exhibition.</p>
<p>This is a free event.  If you would like to attend please email Gary Brewerton (<a href="mailto:g.p.brewerton@lboro.ac.uk">g.p.brewerton@lboro.ac.uk</a>) to reserve a place stating your name, institution and any specific dietary requirements.</p></blockquote>
<p>More details of this year&#8217;s event and the results of previous years&#8217; events can be seen on the <a href="http://blog.lboro.ac.uk/mtrlc/" target="_blank">Meeting the Reading List Challenge</a> website.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lboro.ac.uk/lorls/lorls/meeting-the-reading-list-challenge-2013-announced/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LORLS v7 now available</title>
		<link>http://blog.lboro.ac.uk/lorls/lorls/lorls-v7?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=lorls-v7</link>
		<comments>http://blog.lboro.ac.uk/lorls/lorls/lorls-v7#comments</comments>
		<pubDate>Mon, 26 Nov 2012 12:28:34 +0000</pubDate>
		<dc:creator>Gary Brewerton</dc:creator>
				<category><![CDATA[LORLS]]></category>
		<category><![CDATA[LORLS v7]]></category>
		<category><![CDATA[New release]]></category>
		<category><![CDATA[open source]]></category>

		<guid isPermaLink="false">http://blog.lboro.ac.uk/lorls/?p=1311</guid>
		<description><![CDATA[With great pleasure (trumpet fanfare not included) I can now announce the release of LORLS version 7. Key features include: Import of Harvard citations from docx documents Academic dashboard displaying usage data and other key metrics (see image to right) Collapsible sections on reading lists Improved support for diacritics Allow students to like/dislike items on a [...]]]></description>
				<content:encoded><![CDATA[<p>With great pleasure (trumpet fanfare not included) I can now announce the release of LORLS version 7. Key features include:</p>
<table>
<tbody>
<tr>
<td>
<ul>
<li>Import of Harvard citations from docx documents</li>
<li>Academic dashboard displaying usage data and other key metrics (see image to right)</li>
<li>Collapsible sections on reading lists</li>
<li>Improved support for diacritics</li>
<li>Allow students to like/dislike items on a list</li>
</ul>
</td>
<td><a href="http://blog.lboro.ac.uk/lorls/wp-content/uploads/2012/11/dashboard.jpg"><img class="alignnone size-medium wp-image-1319" title="dashboard" src="http://blog.lboro.ac.uk/lorls/wp-content/uploads/2012/11/dashboard-300x228.jpg" alt="View of the new academic dashboard" width="200" height="152" /></a></td>
</tr>
</tbody>
</table>
<p>LORLS v7 is <a title="Downloads" href="http://blog.lboro.ac.uk/lorls/downloads">available for download</a> from this website and our <a href="http://sandbox.lboro.ac.uk" target="_blank">online demo</a> has been updated to this release.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lboro.ac.uk/lorls/lorls/lorls-v7/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Trouble installing?  Disable SELinux</title>
		<link>http://blog.lboro.ac.uk/lorls/lorls/trouble-installing-disable-selinux?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=trouble-installing-disable-selinux</link>
		<comments>http://blog.lboro.ac.uk/lorls/lorls/trouble-installing-disable-selinux#comments</comments>
		<pubDate>Tue, 13 Nov 2012 15:00:13 +0000</pubDate>
		<dc:creator>Jason Cooper</dc:creator>
				<category><![CDATA[BibGrab]]></category>
		<category><![CDATA[CLUMP]]></category>
		<category><![CDATA[LORLS]]></category>
		<category><![CDATA[LUMP]]></category>
		<category><![CDATA[installer]]></category>
		<category><![CDATA[LORLS v6]]></category>
		<category><![CDATA[selinux]]></category>

		<guid isPermaLink="false">http://blog.lboro.ac.uk/lorls/?p=1286</guid>
		<description><![CDATA[We are currently working on a new distribution of LORLS (That&#8217;s right version 7 is coming soon) and to test the installer&#8217;s ability to update an existing installation we needed a fresh v6 install to test on.   So I dropped into a fresh virtual machine we have dedicated specifically to this kind of activity, downloaded [...]]]></description>
				<content:encoded><![CDATA[<p>We are currently working on a new distribution of LORLS (That&#8217;s right version 7 is coming soon) and to test the installer&#8217;s ability to update an existing installation we needed a fresh v6 install to test on.   So I dropped into a fresh virtual machine we have dedicated specifically to this kind of activity, downloaded the version 6 installer and ran through the installation only to find that, while it had created the database and loaded the initial test data just fine, it hadn&#8217;t installed any of the system files.</p>
<p>So for the next 3 hours I was scouring apache&#8217;s logs, checking the usual culprits for these sort of issues and debugging the code.  One of the first things I did was check the SELinux configuration and it was set to permissive, which means that it doesn&#8217;t actually block anything just warns the user.  This lead me to discount SELinux as the cause of the problem.</p>
<p>After 3 hours of debugging I finally reached the stage of having a test script that would work when run by a user but not when run by apache.  The moment that I had this output I realised that while SELinux may be configured to be permissive, it will only pick up this change when the machine is restarted.  So I manually tried disabling SELinunx (as root use the command &#8216;echo 0 &gt; /selinux/enforce&#8217;) and then tried the installer again.</p>
<p>Needless to say the installer worked fine after this, so if you are installing LORLS and find that it doesn&#8217;t install the files check that SELinux is disabled.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lboro.ac.uk/lorls/lorls/trouble-installing-disable-selinux/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Free workshop at Loughborough</title>
		<link>http://blog.lboro.ac.uk/lorls/lorls/free-workshop-at-loughborough?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=free-workshop-at-loughborough</link>
		<comments>http://blog.lboro.ac.uk/lorls/lorls/free-workshop-at-loughborough#comments</comments>
		<pubDate>Thu, 12 Jul 2012 10:16:26 +0000</pubDate>
		<dc:creator>Gary Brewerton</dc:creator>
				<category><![CDATA[LORLS]]></category>
		<category><![CDATA[Other Systems]]></category>
		<category><![CDATA[Workshop]]></category>

		<guid isPermaLink="false">http://blog.lboro.ac.uk/lorls/?p=1235</guid>
		<description><![CDATA[For the second year running were holding a free workshop at Loughborough to discuss reading list management. The announcement about the event can be seen below. Meeting the reading list challenge 2012: A workshop Keith Green Building, Loughborough University Thursday 16th August 2012, 10:00am – 3:30pm How do you get stakeholders interested in online reading [...]]]></description>
				<content:encoded><![CDATA[<p>For the second year running were holding a free workshop at Loughborough to discuss reading list management. The announcement about the event can be seen below.</p>
<p style="padding-left: 30px;"><strong>Meeting the reading list challenge 2012: A workshop</strong><br />
Keith Green Building, Loughborough University<br />
Thursday 16th August 2012, 10:00am – 3:30pm</p>
<p style="padding-left: 30px;">How do you get stakeholders interested in online reading lists? And how does<br />
a reading list management system relate to other systems?</p>
<p style="padding-left: 30px;">These issues, and many others, will be discussed at this forthcoming workshop.</p>
<p style="padding-left: 30px;">The morning session will explore academic engagement with reading lists whilst<br />
the afternoon will focus on how a reading lists management system (RLMS) could<br />
interact with other systems. Both sessions will include presentations and group<br />
discussions.</p>
<p style="padding-left: 30px;">There will be a buffet lunch provided during which there will be a poster session.<br />
All attendees are encouraged to submit a poster highlighting what they expect<br />
from a RLMS, what their experiences of a RLMS are, or what interesting things<br />
they&#8217;ve done with an RLMS?</p>
<p style="padding-left: 30px;">This is a free event. If you would like to attend please email Gary Brewerton<br />
(<a href="mailto:g.p.brewerton@lboro.ac.uk">g.p.brewerton@lboro.ac.uk</a>) to reserve a place stating your name, institution<br />
and any specific dietary requirements.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lboro.ac.uk/lorls/lorls/free-workshop-at-loughborough/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Academic dashboard in beta</title>
		<link>http://blog.lboro.ac.uk/lorls/lorls/academic-dashboarb?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=academic-dashboarb</link>
		<comments>http://blog.lboro.ac.uk/lorls/lorls/academic-dashboarb#comments</comments>
		<pubDate>Fri, 22 Jun 2012 16:11:12 +0000</pubDate>
		<dc:creator>Jason Cooper</dc:creator>
				<category><![CDATA[CLUMP]]></category>
		<category><![CDATA[LORLS]]></category>
		<category><![CDATA[dashboard]]></category>
		<category><![CDATA[statistics]]></category>

		<guid isPermaLink="false">http://blog.lboro.ac.uk/lorls/?p=1196</guid>
		<description><![CDATA[One area of discussion at last year&#8217;s Meeting the reading list challenge workshop was around the sort of statistics that academics would like about their reading lists.  Since then we have put the code in to log views of reading lists and other bits of information. 2 months ago, having collected 10 months of statistics we [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://blog.lboro.ac.uk/lorls/wp-content/uploads/2012/06/dashboard.png"><img class="alignright size-medium wp-image-1197" title="dashboard" src="http://blog.lboro.ac.uk/lorls/wp-content/uploads/2012/06/dashboard-300x204.png" alt="" width="300" height="204" /></a>One area of discussion at last year&#8217;s <a title="Meeting the reading list challenge" href="http://blog.lboro.ac.uk/mtrlc/">Meeting the reading list challenge workshop</a> was around the sort of statistics that academics would like about their reading lists.  Since then we have put the code in to log views of reading lists and other bits of information.</p>
<p>2 months ago, having collected 10 months of statistics we decided to put together a dashboard for owners of reading lists.  The current beta version of the dashboard contains the following information</p>
<ul>
<li>Summary &#8211; a quick summary of the list and the type of content on it</li>
<li>Views of the reading list - how many people have viewed the list</li>
<li>URLs &#8211; Details of the number of items on the list with a URL, and details of any URLs that appear to be broken (with a option to highlight those items with broken URLs on the reading list)</li>
<li>Best rated items &#8211; the top user rated item on the list (again with an option to highlight those items on the reading list)</li>
<li>Worst rated items &#8211; the lowest user rated items on the list (yet again with an option to highlight those items on the reading list)</li>
<li>Item Composition &#8211; a graphical representation of the types of items on the reading list</li>
<li>Item Loans &#8211; a graph showing the number of items from the reading list loaned out by the Library over the past year.</li>
</ul>
<p><a href="http://blog.lboro.ac.uk/lorls/wp-content/uploads/2012/06/dashboard2.png"><img class="aligncenter size-medium wp-image-1198" title="dashboard2" src="http://blog.lboro.ac.uk/lorls/wp-content/uploads/2012/06/dashboard2-300x209.png" alt="" width="300" height="209" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lboro.ac.uk/lorls/lorls/academic-dashboarb/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Big changes under the hood and a couple of minor ones above</title>
		<link>http://blog.lboro.ac.uk/lorls/lorls/big-changes-under-the-hood-and-a-couple-of-minor-ones-above?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=big-changes-under-the-hood-and-a-couple-of-minor-ones-above</link>
		<comments>http://blog.lboro.ac.uk/lorls/lorls/big-changes-under-the-hood-and-a-couple-of-minor-ones-above#comments</comments>
		<pubDate>Tue, 22 May 2012 13:20:18 +0000</pubDate>
		<dc:creator>Jason Cooper</dc:creator>
				<category><![CDATA[CLUMP]]></category>
		<category><![CDATA[LORLS]]></category>
		<category><![CDATA[LUMP]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[JSONP]]></category>

		<guid isPermaLink="false">http://blog.lboro.ac.uk/lorls/?p=1175</guid>
		<description><![CDATA[A few weeks ago we pushed out an update to our APIs on our live instance of LORLS and this morning we switched over to a new version of our front end (CLUMP).  The changes introduced in this new version are the following Collapsible sub-headings Improved performance Better support for diacritics Collapsible sub-headings Following a [...]]]></description>
				<content:encoded><![CDATA[<p>A few weeks ago we pushed out an update to our APIs on our live instance of LORLS and this morning we switched over to a new version of our front end (CLUMP).  The changes introduced in this new version are the following</p>
<ul>
<li>Collapsible sub-headings</li>
<li>Improved performance</li>
<li>Better support for diacritics</li>
</ul>
<h3>Collapsible sub-headings</h3>
<p>Following a suggestion from an academic we have added a new feature for sub-headings.  Clicking on a sub-heading will now collapse all the entries beneath it.  To expand the section out again the user simple needs to click on the sub heading again.  This will be beneficial to both academics maintaining large lists and students trying to navigate them.</p>
<h3>Improved performance</h3>
<p>In our ever present quest to improve the performance, both actual and perceptual, we decided to see if using JSON instead of XML would help.  After a bit of experimentation we discovered that using JSON and JSONP would both reduced the quantity of JavaScript code in CLUMP&#8217;s routines and significantly improved the performance.</p>
<p>Adjusting Jon&#8217;s APIs in the back end (LUMP) to return in either XML, JSON or JSONP format was quite easy once the initial code had been inserted in the LUMP module&#8217;s respond routine.  Then it was simply a matter of adding 4 lines of code to each API script.</p>
<p>Switching CLUMP to using JSONP was a lot more time consuming.  Firstly every call had to have all it&#8217;s XML parsing code removed and then the rest of the code in the routine needed to be altered to use the JavaScript object received from the API.  This resulted in both nicer to code/read JavaScript and smaller functions.</p>
<p>Secondly a number of start up calls had been synchronous, so the JavaScript wouldn&#8217;t continue executing until the response from the server had been received and processed.  JSONP calls don&#8217;t have a synchronous option.  The solution in the end was to use a callback from the function that processes the JSONP response from the server and with a clever bit of coding this actually enabled us to make a number of calls in parallel and continue only after all of them had completed.  Previously the calls were made one after the other, each having to wait for the preceding call to have been completed before it could start.  While this only saved about half a second on the start up of CLUMP, it made a big difference to the user perception of the systems performance.</p>
<h3>Better support for diacritics</h3>
<p>This was actually another beneficial side-effect of switching to JSONP over XML for most of our API calls.  In Internet Explorer it was discovered that some UTF-8 diacritic characters in the data would break its XML parser, but because JSONP doesn&#8217;t use XML these UTF-8 characters are passed through and displayed fine by the browser.  Of course we do sometimes find some legacy entries in a reading list, created many years ago in a previous version of LORLS, which are in the Latin-1 character set rather than UTF-8, but even these don&#8217;t break the JavaScript engine (though they don&#8217;t necessarily display the character that they should).</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lboro.ac.uk/lorls/lorls/big-changes-under-the-hood-and-a-couple-of-minor-ones-above/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Item Ratings</title>
		<link>http://blog.lboro.ac.uk/lorls/lorls/item-ratings?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=item-ratings</link>
		<comments>http://blog.lboro.ac.uk/lorls/lorls/item-ratings#comments</comments>
		<pubDate>Mon, 30 Apr 2012 16:35:28 +0000</pubDate>
		<dc:creator>Jon Knight</dc:creator>
				<category><![CDATA[CLUMP]]></category>
		<category><![CDATA[LORLS]]></category>
		<category><![CDATA[LUMP]]></category>
		<category><![CDATA[dashboard]]></category>
		<category><![CDATA[student feedback]]></category>

		<guid isPermaLink="false">http://blog.lboro.ac.uk/lorls/?p=1159</guid>
		<description><![CDATA[One of the things on the LORLS &#8220;to do&#8221; list from last summer&#8217;s Meeting the Reading Lists Challenge workshop was to have ratings on lists and/or items. Gary and I had a chat about this earlier today and decided that if we&#8217;re going to do it, it would probably be better just on items rather than lists. That [...]]]></description>
				<content:encoded><![CDATA[<p>One of the things on the LORLS &#8220;to do&#8221; list from last summer&#8217;s <a title="Meeting the Reading List Challenge workshop" href="http://blog.lboro.ac.uk/lorls/lorls/meeting-the-reading-list-challenge-workshop">Meeting the Reading Lists Challenge workshop</a> was to have ratings on lists and/or items. Gary and I had a chat about this earlier today and decided that if we&#8217;re going to do it, it would probably be better just on items rather than lists. That way students are commenting on how useful they found individual books, articles, etc rather than the academics reading list as a whole, so there would probably be more acceptance from academics.</p>
<p>I&#8217;ve thus produced two new API calls to support this:</p>
<ul>
<li><em>GetSURating</em> &#8211; get the ratings for particular structural units and/or users. If you give it a &#8220;suid&#8221; parameter with a comma separated list of structural unit IDs it will try to find ratings for those. You can also ask for rating set by one or more users by specifying the &#8220;user_id&#8221; parameter with a comma separate list of user IDs (the latter mostly because I thought we might want to allow folk in the future to see which books they&#8217;d rated, a bit like LibraryThing does). The script normally returns some XML with the ratings for each matched SUID (good and bad). You can give it a &#8220;details&#8221; parameter set to &#8216;Y&#8217; in which case it will just splurge out XML with all the matching records in (including creation/modification times, etc so we could do fancy time based rating analysis).</li>
<li><em>Editing/EditSURating</em> &#8211; create/edit a rating. Needs to have the structural unit ID send in via the &#8220;suid&#8221; parameter and the rating itself (either &#8221;Good&#8221; or &#8220;Bad&#8221;) via the &#8220;rating&#8221; parameter. No user_id parameter as it takes the logged in user as the person to create the rating from. It returns a summary of the current ratings for the structural unit after updating for this user. If you&#8217;re not logged in it does nothing.</li>
</ul>
<p>Each user can click on ratings for a particular structural unit as many times as they like, but they&#8217;ll only have one active record. That means that you can rate something as &#8220;Bad&#8221; at first, then re-read it later and decide that you were wrong and its actually &#8220;Good&#8221; and re-rate it. Your old &#8221;Bad&#8221; rating is replaced by the &#8220;Good&#8221; rating.</p>
<p>We&#8217;ve already been talking about how we can make use of the data once the students start rating items. For example we could have a graph or scatter chart in the academic&#8217;s dashboard showing them four quadrants: rarely borrowed items that aren&#8217;t liked, rarely borrowed items that are liked, heavily borrowed items that aren&#8217;t liked and heavily borrowed items that are liked.  This would provide some feedback to academics on how useful the students found the material on their reading lists, and would also potentially supply some useful information to library staff.  You could imagine that a very expensive book that the library has put off buying a copy of but which is heavily liked by people who&#8217;ve acquired/seen copies elsewhere might persuade library staff to order a copy for instance.</p>
<p>I&#8217;ve got a proof of concept up and running now on our test/dev server.  This shows thumbs up/down on the bibiographic details popup in CLUMP for leaf items (books, journals, etc). As it requires a change to the LUMP database schema (in fact a whole new user_item_rating table), this isn&#8217;t going to be a LORLS v6.x thing but instead a LORLS v7 feature.</p>
<p>Oh crumbs, I&#8217;ve started working on the next version of LORLS already! <img src='http://blog.lboro.ac.uk/lorls/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lboro.ac.uk/lorls/lorls/item-ratings/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Extracting Harvard citations from Word documents</title>
		<link>http://blog.lboro.ac.uk/lorls/lorls/extracting-harvard-citations-from-word-documents?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=extracting-harvard-citations-from-word-documents</link>
		<comments>http://blog.lboro.ac.uk/lorls/lorls/extracting-harvard-citations-from-word-documents#comments</comments>
		<pubDate>Mon, 13 Feb 2012 13:46:35 +0000</pubDate>
		<dc:creator>Jon Knight</dc:creator>
				<category><![CDATA[LORLS]]></category>
		<category><![CDATA[LUMP]]></category>
		<category><![CDATA[Harvard format]]></category>
		<category><![CDATA[Word documents]]></category>

		<guid isPermaLink="false">http://blog.lboro.ac.uk/lorls/?p=1151</guid>
		<description><![CDATA[Over the years, one question that we&#8217;ve had pop up occasionally from academics and library staff is whether we could import reading lists from existing Microsoft Word documents. Many academics have produced course handouts including reading material in Word format and some still do, even though we&#8217;ve had a web based reading list system at [...]]]></description>
				<content:encoded><![CDATA[<p>Over the years, one question that we&#8217;ve had pop up occasionally from academics and library staff is whether we could import reading lists from existing Microsoft Word documents. Many academics have produced course handouts including reading material in Word format and some still do, even though we&#8217;ve had a web based reading list system at Loughborough for over a decade now, and a VLE for a roughly similar period.</p>
<p>We&#8217;ve always had to say no in the past, because Microsoft Word&#8217;s proprietary binary format was very difficult to process (especially on the non-Microsoft platforms we use to host our systems) and we had other, more important development tasks.  Also we thought that extracting the variety of citation/bibliography formats that different academics use would be a nightmare.</p>
<p>However with the new LUMP based LORLS now well bedded in at Loughborough and Microsoft basing the document format of newer versions of Word on XML, we thought we&#8217;d revisit the idea and spend a bit of time to see what we could do.</p>
<p>Microsoft Office Word 2007 was introduced as part of the Office 2007 suite using a default file format based on XML, called Office Open XML Format, or OpenXML for short.  A Word 2007 document is really a compressed ZIP archive containing a directory structure populated with a set of XML documents conforming to Microsoft&#8217;s published XML schemas, as well as any media files required for the documents (images, movies, etc).  Most academics are now using versions of Microsoft Word that generate files in this format, which can be identified easily by looking for the &#8220;.docx&#8221; filename extension.</p>
<p>The XML documents inside the ZIPed .docx archive contain both the text of the document, styling information and properties about the document (ie who created it and when).  There&#8217;s actually quite a lot of structural information stored as well, which<span style="color: #888888;"> <a href="http://msdn.microsoft.com/en-us/library/aa338205(v=office.12).aspx#office2007WordFileFormat">Microsoft explain how to process</a></span> in order to work out how different parts of the document are related to each other.  Some of this is rather complex, but for a simple &#8220;proof of concept&#8221; what we needed was the actual document text structure.  By default this lives in a file called &#8220;word/document.xml&#8221; inside the ZIP archive.</p>
<p>The document.xml file contains an XML element called &lt;w:body&gt;&lt;/w:body&gt; that encapsulates the actual document text.  Individual paragraphs are then themselves held in &lt;w:p&gt;&lt;/w:p&gt; elements and these are then further broken down based on styling applied, whether there are embedded hyperlinks in the paragraph, etc, etc.  Looking through a few sample reading lists in .docx format gave us a good feel for what sort of structures we&#8217;d find.  Processing the .docx OpenXML using Perl would be possible using the Archive::Any module to unpack the ZIP archive and then the XML::Simple module to process the XML data held within into Perl data structures.</p>
<p>The next issue was how do we find the citations held inside the Word documents and turn them into Structural Units in LORLS?  We decided to aim to import Harvard style citations and this is where we hit the first major problem: not everyone seems to agree on what a Harvard style bibliographic reference should look like.  For example some Harvard referencing texts say that author names in books should be capitalised, publication dates should follow in brackets and titles underlined like this:</p>
<p>WILLS, H., (1985), <span style="text-decoration: underline;">Pillboxes: A Study Of U.K. Defences 1940</span>, Leo Cooper, London.</p>
<p>whereas other sources don&#8217;t say anything about author capitalisation or surname/firstname/initial ordering but want the title in italics, and no brackets round the publication date:</p>
<p>Henry Willis, 1985, <em>Pillboxes: A Study Of U.K. Defences 1940</em>, Leo Cooper, London.</p>
<p>When you start to look at real lists of citations from academics it becomes clear that many aren&#8217;t even consistent within a single document, which makes things even more tricky.  Some of the differences may be down to simple mistakes, but others may be due to cutting and pasting between other documents with similar, but not quite the same, Harvard citation styles.</p>
<p>The end result of this is that we need to do a lot of pattern matching and also accept that we aren&#8217;t going to get a 100% hit rate (at least not straight away!).  Luckily the LORLS back end is written in Perl and that is a language just dripping with pattern matching abilities &#8211; especially its powerful regular expression processor. So for our proof of concept we took some representative OpenXML format Word .docx files from one of our academic departments and then used them to refine a set of regular expressions designed to extract Harvard-esque citations in paragraph, trying to work out what type of work it is (book, article, etc) based on the ordering of parts of the citation and the use of italics and/or underlining.</p>
<p>The initial proof of concept was a command line script that was given the name of a .docx document and would then spit out a stream of document text interspersed with extracted citations.  Once we&#8217;d got the regular expressions tweaked to the point where our test set of documents were generating 80-90% hit rates, we took this code and turned it into a CGI script that could then be used as an API call to extract citations from an uploaded document and return a list of potential hits in JSONP format.</p>
<p>One thing to note about file uploading to an API is that browser security models don&#8217;t necessarily make this terribly easy &#8211; a simple HTML FORM  file upload will try to refresh the page rather than do an AJAX style client-server transaction.  The trick, as used by a wide variety of web sites now, is to use a hidden IFRAME as the target of the file upload output or some XHR scripting.  Luckily packages such as jQuery now come with support for this, so we don&#8217;t need to do too much heavy lifting to make it work from the Javascript front end client.  Using JSONP makes this a bit easier as well, as its much easier to handle the JSON format in Javascript that if we returned XML.</p>
<p>The JSONP results returned from our OpenXML processing CGI script provide structures containing the details extracted from each work.  This script does NOT actually generate LUMP Structural Units; instead we just return what type we think each work is (book, etc) and then some extracted citation information relevant to that type of work.</p>
<p>The reasons for not inserting Structural Units immediately are three fold.  Firstly because we can&#8217;t be sure we&#8217;ve got the pattern matching working 100% it makes sense to allow the user to see what we think the matched citations are and allow them to select the ones they want to import into LORLS.  Secondly, we already have API calls to allow Structural Units to be created and edited, so we probably shouldn&#8217;t reinvent the wheel here &#8211; the client already knows how to talk to those to make new works appear in reading lists.  Lastly by not actually dealing with LUMP Structural Units, we&#8217;ve got a more general purpose CGI script &#8211; it could be used in systems that have nothing to with LORLS or LUMP for example.</p>
<p>So that&#8217;s the current state of play.  We&#8217;re gathering together more Word documents from academics with Harvard style bibliographies in them so that we can test our regular expressions against them, and Jason will be looking at integrating our test Javascript .docx uploader into CLUMP.  Hopefully the result will be something the academics and library staff will be happy to see at last!</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lboro.ac.uk/lorls/lorls/extracting-harvard-citations-from-word-documents/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
