Friday, December 19, 2008

New releases of Biblio and OAI-PMH module for Drupal 6

The Biblio and OAI-PMH modules mantained by rjerome at have been updated with new releases.

This is exciting because there was no version of these modules for Drupal 6; they were already available for Drupal 5 but Drupal 6 has been out for almost a year now and is the best option for building new websites.

Biblio handles mantaining, displaying and exporting of bibliographic items that can be exposed via the OAI-PMH module. If you also throw in my Millennium Integration module, then you could import items from a library catalog straight into Biblio items. I say "could" because the current Drupal 6 version of Millennium Integration is stand-alone, that is, isn't tied to the Biblio module.

I will now start work on again integrating with Biblio to make Millennium Integration better.

Isn't Open Source great?

Friday, November 28, 2008

Best commercial for a TV yet


Tasha Saecker on Social Libraries

This Webinar sounds interesting; it´s part of the "Library Open Source Webinars" from WiLS. It will be held next tuesday (december 2nd) from 2:00-3:00 pm Central Time.

Getting Social with Tasha Saecker

Get you and your library hooked up with the latest in social networking software online. Learn how to use Twitter, Delicious and FriendFeed both personally and professionally to create your own personal brand online.

Tasha Saecker is the director of the Menasha Public Library, Wisconsin Library of the Year for 2008. She has been blogging for over five years at both: Sites & Soundbytes and Kids Lit.

In 2007, the Menasha Public Library won a Webby Award in Wisconsin for its Drupal-based website. Part of their site links to their extensive collection of websites on Delicious. The library will soon be contributing to Twitter too. You can follow Tasha on Twitter as TashRow.

Friday, November 14, 2008

Building a Thematic Library with Drupal presentation

Here is a link to a presentation we did on how we built a special site for library health resources--an OPAC built on Drupal, Solr, the Millennium integration module and Google Custom Search Engine.

You can visit the working site here:

This was part of the University of Maryland/Tecnológico de Monterrey sister libraries conference, "Working Together".

Drupal 6 version of Millennium Module available for testing

I just created and released a new version (2.0-dev) of the Millennium Integration module for Drupal. The earlier version worked with Drupal 5 and required the Biblio module. This new version is for Drupal 6, and removes the requirement for the Biblio module.

The module currently outputs bibliographic in a themeable table (meaning that with a little PHP, you can completely change the layout). For the final 2.0 version I plan to include other import and/or presentation options, like putting the fields into CCK or import into the Biblio module (when that module is available).

I still insist trying to integrate with Biblio because it already does a lot of cool things like provide a bibliographic citation (APA) view, provide CoINs (embedded machine-readable metadata in pages), export to bibliographic management software and more. For now, releasing this version will (I hope) kickstart a new round of testing by libraries who want to try out options to make their catalog better.

To get more information, download and installation instructions, go to the project page:

Tuesday, October 14, 2008

The ugly, ugly results from my Vista voice recognition test

I tried to make Vista transcribe a presenter's speech during her presentation into Word using Vista's Voice Recognition, which I have barely used. I knew it would turn out ugly.


Thursday, September 25, 2008

SOPAC 2 released

John Blyberg released, a site that hosts downloads, instructions and forums for SOPAC2, the "social opac" platform that powers Darien Library, and runs on Drupal. It uses Sphinx for fast searching.

The Social OPAC™

At first glance, the install procedure seems a bit lengthy! I guess I could come up with smaller startup instructions for a similar setup using the Millennium module and "just" Drupal, but then I would still have to narrate how to install all of the modules to really get some great functionality. I guess I'll just have to install it myself and see how it works.

Congratulations, John!

Wednesday, September 24, 2008

What I found in my switch to Mac, Drupal-wise

The last 7 days I've *had* to work on a MacBook pro, due to me switching jobs, and this being the only available laptop.

It's a beautiful machine, but making the switch was... well... interesting =)

Here are some of the things I found about switching to a Mac from Windows AND working with Drupal:
  • If you want to run apache/mysql in a Mac, best to install MAMP. It's dead simple! Large download though (then I found about universal binaries and architecture-specific dowloads--d'oh!)
  • For text editing, TextMate is great, but it's not free. It can sort-of upload stuff via FTP with an added bundle, but you have to type in a lot of information manually for each file. I found out you can use the Fetch FTP client (commercial, but free to educational institutions and other uses) to automatically FTP your files whenever you change them with any text editor (you have to download them via Fetch first!) So, now instead of TextMate I could get by with other editors like Smultron.
  • For screengrabbing, get Skitch! You'll love it.
  • Although the Mac does run under UNIX, it does not have CVS support by default. So you'll have to install a client of some sort. I haven't gotten this far, though (I use CVS from our test server); as I understand it, you can get it from the Development tools provided by Apple (but it's a huge download)--more about that here.

Friday, September 5, 2008

Using Google Analytics to track searches in Drupal

Updated: Added some PHP code to complete the example

Google Analytics needs you to specify part of a query string in order for you to get specialized "Site Search" reports. However in Drupal you might have nice Clean URLs like this:

instead of what GA wants, something like

You can still get Site Search reports for searches using Clean URLs, using the Google Analytics API.

You just need to:

  • Use the "new" GA handling code.
  • Add code like this at the end of your page; I recommend putting it inside a Block (be sure to mark the Input Format to be "PHP code"):

    if (arg(0) == 'apachesolr_search' || arg(0) == 'search') {
    $keys = search_get_keys();
    <script type="text/javascript">
    pageTracker._trackPageview('/site_search?query=<?php echo $keys; ?>');

You then tell your GA report's settings to activate Site Search reporting and to look for "query" as the search argument.

After a day of logging, your GA reports will include the report. See a site searching report sample.

Tuesday, September 2, 2008

Video Tour of OPAC Discovery Layer Tools

The Disruptive Library Technology Jester posted (a while back!) the video for this presentation which demos OPACs from different libraries which are either: OPAC enhancements, OPAC wrappers or OPAC replacements.

It's a good watch.

To me, some lessons are:
  • for user tags to be useful in an OPAC, you need critical mass, or seed the catalog with tags from an external source (LibraryThing?)
  • while there are a lot of similarities in the way the interfaces work, there are some things that *maybe* should be standardized; like the location of facets, labelling, etc. A research opportunity.
  • If I had to pick an [open source] discovery layer from those presented, I'd have to say Scriblio; it just seems solid, everything looks dead simple and keeps you clicking. One thing I'd change is the facet layout, as they seem rather "mashed together"--whitespace to the rescue?

Monday, September 1, 2008

Drupal + SOPAC + Community power Darien Library's new site and OPAC

Step by Darien Library's website, where you can see their new catalog powered by Drupal and SOPAC2, created by John Blyberg. John created the Ann Arbor District Library site, which uses an III system for its ILS, and was--according to Richard Wallis--"the poster child of Library 2.0" websites.

You can find out more about SOPAC:

From the interview, it seems that the code for SOPAC will be available in a week or two, and John stated that it will be GPL-licensed.


Drupal in the Cloud presentation from Drupalcon 2008

This presentation is not only interesting for Drupal developers; it's a great starting point for learning about what cloud computing is, the difference between platform-as-service and infrastructure-as-service, a list of companies offering these services, what some dangers and benefits are... and more. They detail what it takes to put Drupal into the Amazon EC2 service, and show a video of what a Firefox-based cloud administration tool looks like.


More Drupalcon videos here

P.S.: The sound isn't perfect, though =)

Tuesday, August 26, 2008

McGill U Library scanning books with Kirtas

Via Campus Technology:

McGill University Library in Montreal will be using a Kirtas Technologies APT BookScan 2400RA to digitize its collections. The company said that the 2400RA is capable of acquiring page images at the rate of 2,400 pages per hour. The library will be working with Ristech, a Canadian reseller, to implement the digitization solution.

The post says they will make scanned books available via print-on-demand services.

Monday, August 25, 2008

Drupal Rocks Libraries slideshow

I couldn't really track down the real author(s) of this slideshow; Acquia and the Libraries group @ are mentioned, but I'm not sure who made this =)

Our library's homepage is in there =)

View in

Via Acquia's blog.

Tuesday, August 19, 2008

SOPAC 2.0: a discovery layer for every library?

John Blyberg (creator of and now at Darien Library) posts about the new version of SOPAC-- a "Social Opac" discovery layer which, it seems, will be ILS-independent. SOPAC 1.0 works with III (or "Millennium") ILSs and Drupal, and apart from normal catalog searching, it adds features like tag clouds, reviews and more.

It seems to me that if SOPAC can have an abstraction layer so that you can plug in translators for different ILSs, it really opens the door to using all of the great modules we already have in Drupal and have the tools to "easily" build Library Catalogs Just The Way We Like.

This is our philosophy--and I guess John's--for picking Drupal: have a solid base (in code AND community) from which to build on, and... build!

I envy Darien Library, I'm sure they'll get a great new website to match their library =) Full steam ahead!

Friday, August 15, 2008

Two more libraries to go Drupal


Two libraries, U of M's and San Jose Library pciked Drupal as their next platform for their library web pages.

U of M's blog post details how they compared between several options like Joomla, Drupal, Plone, Typo3 and others.

It would be nice to know if they mean to only host their information pages, or if they were planning on building something more (like some OPAC functionality, or A-Z lists of journals, etc.)

Thursday, August 14, 2008

Yay! I contributed to core Drupal

Well, I only tested a patch for required field validation =) But still exiting!

Oh, by the way, this is part of the Drupal 5.10 security release... so scoot and go update your sites!

Wednesday, August 13, 2008

Drupal Millennium Module 1.4 released

This release mainly fixes some MARC import problems and adds a few new features.

You can try out our live implementation in PASTEUR, our thematic library oriented towards our Health, Chemistry and Biotechnology faculty and students. This site is also running Apache Solr for faceted search, a custom (not yet released) Millennium Authentication module and others.

From the project release page:

  • Fixed [#263310]
  • Fixes for [#253593]
  • Holdings ajax call now locale-aware
  • Fixed ids for coverimages; were incorrect if ISSN or ISBN inculded a dash.
  • Added missing "real names" for MARC language codes (e.g.: eng => English)
  • Cleanup of CSS file
New features:
  • Added more placeholders for book jacket image call (title, author)
  • Tries to get Call number from first item if not available in MARC bibliographic record
  • Adds all biblio information to Drupal's fulltext index.
  • [#260858] Added .pot file for translators
  • Dropped auto URL alias generation; should be handled by pathauto.module + biblio.module (see [#89038])

Tuesday, August 12, 2008

A million free covers from Library Thing

LibraryThing just opened access to around a million cover images uploaded by LT users; you can get to them just by signing up for an API key and grabbing them from a special URL.

Tim Spalding makes some disclaimers: Amazon has more and probably better cover images, and they impose no maximum limit. However Amazon requires you to backlink to them from each image. LT has no such limit, and in fact encourages you to locally store images in order to reduce load on LT's servers.

If you installed the Millennium Module for Drupal, you can take advantage of LT's cover images like this:
  • Sign up to LibraryThing if you haven't done so already
  • Get an API key from LT
  • Put this URL into your Millennium module's settings, replacing KEY with your actual LT API key:!id

    It will look like this:

Friday, August 8, 2008

Spelling suggestions in Drupal + Solr search

Apache Solr has the option to build a dictionary to suggest words to search for when a search returns zero hits. I suggested a patch to the Drupal Apache Solr module that adds support for that.

If you're running this module, please help try it!

You can see it live in our production site, PASTEUR.

Atiz Bookdrive DIY demo in an hour

Sales reps from Atiz installed this monster yesterday. Look at the size of it! We have a demo in a few... I hope to post my impressions afterward.

Stay tuned!

Tuesday, July 15, 2008

Nice Drupal theme: Marianelli

Marianelli is a nice configurable 3-column theme by Lioz. Try the live demo!

Exploring faculty experiences with e-books: a focus group

An interesting read. Here's the article.

"In spring of 2007, Arizona State University Libraries held a focus group of selected faculty to discover their perceptions and use of electronic books (e-books) in their research and teaching."

Friday, June 27, 2008

Scanner for patrons in Alaska

The University of Alaska Anchorage
Consortium library in Anchorage Alaska
has a KIC II Scanner for users to scan directly into their USB drives or email. Nifty, eh?

Check out the stats page showing how patrons are using them at the vendor's site.


Major ILS vendors not really interested in interoperating

From DLTJ:

...the authors interviewed the four major vendors of integrated library systems in higher education in the U.K.: Ex Libris, Innovative Interfaces, SirsiDynix and Talis. Among the “who are you” and “what do you do” questions were two that get to the heart of what many of us are clamoring for from our vendors:

* How do your products interoperate with products those from other LMS/ERM vendors?
* Do you have partnerships with other LMS/ERM vendors?

For example, one question asked Innovative:

Does Innovative have partnerships with other LMS/ERM vendors?

No. Our aim is to provide best of breed across the whole range of library needs. Of course we don’t stand in the way of libraries that wish for example to add Aquabrowser or Endeca. However we want to provide solutions that are better. To date, we haven’t seen a big groundswell for these types of products…for all of the press and interest it has gotten, products like Endeca haven’t made a major dent in the marketplace.

Here's a link to the study:

Monday, June 16, 2008

Thursday, May 22, 2008

Drupal Millennium Module 1.3 released

The Millennium module for Drupal is now at version 1.3. It fixes a number of bugs (mainly with MARC import) and has some new features:
  • added option to show Google Books links (thanks Tim Spalding!)
  • now shows a direct link to "Place hold" for current item. It only shows if this is really possible, by contacting Millennium when the node is generated.
  • provides a block which shows actions (comment, hold, favorites, etc) which normally show under the item. (This should probably go into another module, though, as it is not really Millennium-related!)
The Google Books links show like this. It only shows if the current item has a "Full view" or "Preview" available at Google Books.
The other nice feature is a more cosmetic one; I made a block to join all the actions that can be made on an item on a Drupal block, so you can more fully place and style it:
Now, the only link that's actually generated by the Millennium module is the "Place hold or request delivery" link; the others come from other modules (Add This Button, Views Bookmark, and the core Comment module).

Thanks to everyone contributing! See the project page for more info, or you can go see our live demo.

What to show when you have no book cover images?

Whipping up a new (test) face for our OPAC brings many things to the table: researching wanted functionality, usability in interface design, and of course--looking great. ("Look" impacts users' perception of site credibility and ease of use, here)

So, of course, trying to put cover images was a must. For our current OPAC, which we share amongst 30+ libraries, has lot of book covers, thanks to cover digitizing being done in several libraries. But, we don't have cover images for all books. Those books either didn't get the process done, or didn't have book jackets--just a plain-color hardcover.

So, our super-duper social-powered wall of books ends up looking like this:

...which is not super at all.

So, fishing around I found my answer: make book covers on the fly. Library Thing and Google Books are doing this, with different methods (it seems!)

Google Books' looks like this: [link]
and Library Thing's like this: [link]
So, how are these made?
  • a background image with a blank cover. I'm thinking it would be cool if, say, a book from 1950 had a worn-out cover, a classic novel with a stylized cover, etc.
  • overlaid text (html) with the title and author.
So my strategies will be:
  1. keep digitizing or getting book covers from our vendors
  2. add some code to provide blank-book images when we don't have a local image, and count views of books with no local image (so you can prioritize the first strategy).
The dirty tech aspects will be the subject of a future post =)

Wednesday, May 21, 2008

Firefox 3 RC 1 released

It's been out for a few days, but I wanted to try it out first.

I'm happy! It's solid, lightning fast, and worked with some extensions I really need like Firebug and Live HTTP Headers.

Go ahead and Get It Now!

Firebug for Firefox 3.0b+

Firefox 3 being so fast, it's painful to have to go back to Firefox 2 just for the great extensions like FireBug. However, I found out that the beta 1.1 of Firebug works great!
  1. Run Firefox 3
  2. Go to:
  3. Click the link under Firebug 1.1 Betas
  4. Confirm the XPI install in Firefox.
  5. Restart!
  6. Ta da!

Tuesday, May 20, 2008

2nd generation OLPC laptop an ebook

Nicholas Negroponte unveiled plans for the second generation of its OLPC (One laptop Per Child) project, which is now more an e-book than a laptop:
The book-like design of the device “comes from something we’ve learned over the past couple of years—that the book experience is key,” Negroponte said during his presentation this morning. “Some people have asked me why not just give kids cell phones? And in fact there will be 1.2 billion cell phones manufactured this year, and cell phones are of huge consequence in the developing world—but the cell phone is not a learning device. The next generation laptop should be a book.”
Via XConomy (read more)

Wednesday, May 7, 2008

Creating a Multilingual OPAC

Do you have students that speak different languages (say spanish, german, english) visiting your Library? Do you offer an OPAC in different language? Do you do keep subject headings in different languages in your MARC records?

As we are trying to build a new OPAC based on Drupal, and our users are coming more and more from other countries, what should we do?

It turns out that as Drupal has some great functionality for multilingual content, as well as doing some of that for categories. You can set up "automatic" translation for certain phrases (you tell Drupal to, say, always translate the english phrase "Chemical Engineering" for the spanish equivalent "Ingeniería Química"), and it just goes and translates wherever there´s a complete phrase (and case-sensitive) match. This is one way to do it for categories.

Just porting MARC into Drupal nodes has a whole set of pros and cons; now, doing something like automatic (well, semi-automatic) translation MUST have some pros and cons... guess I'm about to find out =)

I'll keep you posted.

Translating your home page in Drupal

Agaric Design, you made my day:

This works using the i18n module.

Thursday, April 24, 2008

Kudos to Scriblio and thoughts

Scriblio is a fantastic Wordpress module that makes it easy to build a discovery layer over your regular library catalog (or to make a completely new one). It is completely free and built by folks how care about libraries and users: Casey Bisson, Lichen Rancourt and Jessamyn West.

It seems to me that there are different people hacking away at OPACs--trying to mine & mash them and teach them new tricks. Efforts like Scriblio, LibraryThing for Libraries, John Blyberg's Drupal-based, Library Elf, and more.

I think we can reach some sort of synergy if we, at lease, share some code =)

Just counting the different implementations for "getting stuff out of a Millennium WebOpac record", I can count 3 (Scriblio's,'s and mine)... and they´re all PHP. And I can tell you I didn't use code from any of them (at the time I started I think Scriblio only had MARC import capabilities. Darn!)

With the Berkeley Accord, there might also be some standards, to boot. =)

Wednesday, April 23, 2008

Drupal Millennium module screenshots

Below are pics of the admin portion of the module; for a live demo you can try our implementation at

These are the general settings for the Drupal Millennium module, from where you can jumpstart your Next-Generation Library Catalog =)

Here's where you can manually queue items for import:

Apologies: Please download Millennium module v.1.2

I messed up; I did not thoroughly test version 1.1 of the module. However, you can now download 1.2 which also has some added niceties (thanks, roblivian!)

Drupal Millennium Integration now at 1.1

Added: Ajax loading of holdings information. Check it out.

Wednesday, April 16, 2008

Using ajax to load parts of a page in Drupal

I wanted to load some time-consuming content into Drupal nodes in the Millennium module, but didn't want the whole page to suffer for it. It looked rather hard at first, but I came across some code that made it clearer for me.

You will be putting funcionality in a module, so you'll need to know how to write a Drupal modules first.

First, you will need a DIV in your final page's HTML that will be updated via Ajax. It can be result of your module adding stuff to a node via the nodeapi hook, for example. I tagged mine like this:
<div class="millennium holdings load" id="nid-12345"> Text before loading goes here. </div>   
Also, you will need a backend portion that outputs HTML.

Now, remember your node or page can be listed along with others! (For example in search results showing teasers, Views, or the standard front page view in Drupal which shows teasers for all new published + promoted pages). So we will have to deal with multiple DIVs appearing from different pages, and write JS to deal with ALL of those.

You will have to write some JS to modify this div; I placed mine in the module's directory as millennium.js
// The following is Javascript

// Call millenniumUpdateNext() when page first loads.

* Looks for first div element with class "load" and updates it depending on its
id attribute. (DIVs should already have an id="nid-XXXX" attribute, where XXXX
* is the node's id.

function millenniumUpdateNext() {
// Get the first div element with the classes we are looking for
var div = $("div.load").get(0);
if (! div) return;
var id =;
if (! id || id.substr(0,4) != "nid-" ) return;

// Get the node id from the id attribute
var nid = id.substr(4); //nid-123456 --> 123456

* URL to get information from. If you go here in your browser you get plain HTML
* depending on the nid argument. This URL is defined in the module under
* millennium_menu()

var url = "/millennium_ajax?nid=" + nid;

// Show 'loading' message.
div.innerHTML = 'Loading...';

// Activate the ajax fetch from url. When done function(data) will get executed.
$.get(url, function(data) {
$("#"+id).hide(); // Hide
$("#"+id).html(data); // Replace 'loading' message with fetched HTML
$("#"+id).slideDown("slow"); // Un-hide it
// Now, "unmark" it so millenniumUpdateNext() skips this element
millenniumUpdateNext(); // Start over for another element
Back in your module, you should implement two things to handle the ajax calls: an item in the _menu hook, and the handler function itself.

First, the item in the menu hook:
function millennium_menu($may_cache) {
// cached menu items here...
if(! $may_cache) {
$items[] = array(
'path' => 'millennium_ajax',
'callback' => 'millennium_ajax_handler',
'type' => MENU_CALLBACK,
'access' => true
// ... more stuff
return ($items);
And now the handler function itself
* This function is the one that takes a long time to run...
* This is the whole point; to not delay the whole page load waiting for this
* to be put inline with all the other page elements.
function millennium_ajax_handler() {
$nid = intval($_GET['nid']);
$output = "<h2>You called
millennium_ajax with argument nid = $nid</h2>";
echo $output;
Now, you have the server-side code, and you have the client Javascript code, now you just need to tell Drupal to add the Ajax-able bits to nodes, and also load in the Javascript. Let's do this.

First, to output some custom portions into existing nodes, you use [modulename]_nodeapi(), like this:
function millennium_nodeapi(&$node, $op, $teaser, $page) {
switch($op) {
case 'view':
// Load JS file in an orderly fashion.
drupal_add_js( drupal_get_path('module','millennium') . '/millennium.js');
// You can also load a custom CSS file here with drupal_add_css()...

// Add the custom content
$node->content['millennium_whatever'] = array(
'#value' => "<div class='millennium load' id='nid-". $node->nid ."'>This will be updated sometime after the page finishes loading.</div>\n",
'#weight' => 0,
This will add a DIV inside every node, with the classes millennium and load, and also an id attribute of nid-xxxxx

That's it! See how it shows on my test site showcasing the Millennium module.

Friday, April 11, 2008

Beta release of Millennium integration module

I am proud to announce the newest version of the Millennium integration module, which crawls a Millennium WebOpac and converts MARC into Biblio nodes, adds taxonomy terms, and can show holdings information in real-time.

Check it out here:

For a demo, go to

Communicate with your ILS via SIP2 in PHP

That's a mouthful of acronyms right there =)

cap60552 posted some code over at Google Code that lets you communicate via SIP2 with your library system. Badly needed, very welcome!

Thanks amyq! Via: