Archive for the ‘Horizon’ Category


A pig in a toga


Pig in a togaI’ve been working on improving HIP 3.x for a while now.  Roy Tennant applied a folksy metaphor to this process: “After all, you can put lipstick on a pig, but it’s still very much a pig.

Today, just as I’d managed to hold onto the pig and the lipstick at the same time, SirsiDynix announced that they’re replacing the pig.  Sure, we can stay on Horizon 7.x for a while, but we were figuring we’d migrate to Horizon 8.x eventually.

Horizon 8.0 now joins the vaporware list.  Back in April 2005, it was scheduled for release “later this year” (pdf).  Almost two years later, the company is admitting that Horizon 8.0 was a non-starter, except for the unfortunate early adopters who installed it before general release.

The new pig is called “Rome”, and apparently this switcheroo has been in the works for a while.  Australian users saw a prophecy PowerPoint presentation in 2005 that showed a product called Rome; it was supposed to use Horizon 8.0’s client and HIP (Horizon Information Portal), among other technologies.

Well, it won’t.  It’s going to be based on Unicorn.  And the technical details?  We just don’t know yet.  It’s pretty certain, though, that the work I’m doing to improve our HIP catalog is going to be left by the side of the road.  It probably won’t translate.  All roads may lead to Rome, but once you get there, you’d better be speaking Latin.

Illustration adapted from the Atinlay Igpay card in Unhinged.
“Vanitas vanitatum, omnia vanitas”: Ecclesiastes (q.v. re: Horizon).


Anyone want to try making an AjaxHIP?


It occurred to me that, since HIP can return XML data (add &GetXML=true to the URL), it wouldn’t be terribly hard to make an Ajax interface.

Why bother? Well, the interface would become extremely flexible; you could get a compact list of titles and click one to expand a list of locations/items, or switch from a traditional list of results to a “wall of covers” or a “subject cloud”.  Certainly it’d be easier to find overdue books with a “wall of covers” to remind you what the overdue book looks like.  Heck, maybe you could drag and drop a book cover to add it to a booklist or request it.  I don’t know yet which design ideas SHOULD be pursued, but Ajax offers a lot more than the standard Web 1.0 model.

I’ve just started to experiment with Ajax, and what I’ve done so far uses HTML responses.  I haven’t parsed ResponseXML objects yet.  But it seems to me that a simple version could submit a keyword search and look in the following path:


From here, isbn is the ISBN, key is the bib number, and is “Title of book / by Name of author”.  When the user drills down, we can make another request using “uri=” + and parse those results to show a complete list of items.

So who’s going to be the first to develop a simple prototype?  It should be able to do at least one kind of search, display summarized results, and bring in more information when the user wants it.


A useful modification to SirsiDynix HIP


We have about a dozen autonomous libraries sharing a HIP server and a Horizon datasource.  The standard behavior for Horizon Information Portal is to say “You’re searching: Tampa Bay Library Consortium“, since our datasource is called ‘Tampa Bay Library Consortium’.

But most patrons don’t really know what the Tampa Bay Library Consortium is.  They know that they’re at the Safety Harbor Public Library (or wherever they are).

So the libraries wanted to have their own names on the catalog, rather than ours.  Fair enough.

Here’s a modified template from toolbar2.xsl (HIP 3.0.6A):

<xsl:template name="find_source_label_by_id">
<xsl:param name="source_id"/>
    <xsl:when test="/searchresponse/profile = 'fyb'">
      <xsl:text>Easter Library at Clearwater Christian College</xsl:text>
    <xsl:when test="/searchresponse/profile = 'fybr'">
      <xsl:text>Easter Library at Clearwater Christian College (RESERVES)</xsl:text>
    <xsl:when test="/searchresponse/profile = 'fdl'">
      <xsl:text>Dunedin Public Library</xsl:text>
    <xsl:when test="/searchresponse/profile = 'fsc'">
      <xsl:text>Roux Library at Florida Southern College</xsl:text>
    <xsl:when test="/searchresponse/profile = 'fscr'">
      <xsl:text>Roux Library at Florida Southern College (RESERVES)</xsl:text>
    <xsl:when test="/searchresponse/profile = 'fla'">
      <xsl:text>Largo Public Library</xsl:text>
    <xsl:when test="/searchresponse/profile = 'fyi'">
      <xsl:text>New Port Richey Public Library</xsl:text>
    <xsl:when test="/searchresponse/profile = 'fvu'">
      <xsl:text>Oldsmar Public Library</xsl:text>
    <xsl:when test="/searchresponse/profile = 'sm'">
      <xsl:text>Pinellas Public Library Cooperative</xsl:text>
    <xsl:when test="/searchresponse/profile = 'fyh'">
      <xsl:text>Remington College</xsl:text>
    <xsl:when test="/searchresponse/profile = 'fyhr'">
      <xsl:text>Remington College (RESERVES)</xsl:text>
    <xsl:when test="/searchresponse/profile = 'fyr'">
      <xsl:text>Safety Harbor Public Library</xsl:text>
    <xsl:when test="/searchresponse/profile = 'fyq'">
      <xsl:text>Steelman Media Center at Southeastern University</xsl:text>
    <xsl:when test="/searchresponse/profile = 'fyqr'">
      <xsl:text>Steelman Media Center at Southeastern University (RESERVES)</xsl:text>
    <xsl:when test="/searchresponse/profile = 'ftp'">
      <xsl:text>Tarpon Springs Public Library</xsl:text>
        <xsl:when test="boolean(normalize-space($source_id))">
          <xsl:for-each select="/searchresponse/group/pools/datapool">
            <xsl:if test="$source_id = source/id">
              <xsl:value-of select="source/sourcelabel"/>
          <xsl:value-of select="/searchresponse/group/pools/datapool/source/sourcelabel"/>

No, it’s not elegant, but it seems to work…




With #code4lib's help, I've now got an XSLT stylesheet that lets browsers turn the existing RSS feed into something resembling HTML. This is a big step for all of the work I'm planning to do, since it means I can apply that knowledge to all the rest of the XSLT stuff.

Huzzah! I really need to cacheize the script so I can share the URL with everyone. I've gotten a lot done today and I'm proud of it.

From an email to the stakeholders (hey guys, put those stakes down, I haven't even got my game face on):

Here's what I did today:

http://%5Bserver name deleted]/cgi-bin/

Yes, it looks very much like the old version.

What's noteworthy about this version:

  • It's actually an RSS feed, meaning that you can paste the URL into bloglines or any other RSS aggregator. (But please don't; I need to make the script cache its results or else we'll have loads of SQL queries bogging down Sunline.)
  • It also has an XSLT stylesheet attached, which lets us skin it so that it looks just like any other TBLC page or SunCat page. (Theoretically. But then, this was all theoretical to me last week!)
  • It takes input directly from the web ("location=fyh"), strips it of all potentially dangerous code, and uses that input to affect the presentation ("at Remington College") as well as the results of the SQL query.

I can apply this knowledge to make this much more useful, and allow users to get exactly what they want from SunCat. My to-do list for this script follows. (Some of it is notes to myself.)

  • Cache the result so we don't query Sybase every time an aggregator requests the feed.
  • Cache images and don't display images that don't exist.
  • Find a way to pass the image URL without using the RSS 'description' attribute.
  • Fix the SQL query to remove duplicates.
  • Fix the SQL query to retrieve title, author, etc.
  • Fix the SQL query to limit to the most recent N items.
  • Add the option to turn off images. (Don't do this in, but pass images=yes or images=no to the XSLT stylesheet.)
  • Add the option to see only checked-in items.
  • Add the option to see new items at all libraries (or at some of them? multiple location params?)
  • Add the option to restrict the search to a given author authority or subject authority.

If none of the above makes sense, you can loosely translate it as "Ben has been getting his hack on and has learned a lot that will help us do a lot of impressive stuff."


Technorati tags: , , , , ,




My Perl script returns valid RSS for items added in the last 7 days at any given SunCat library. I need to make it cache results and use the cache, or else I can’t share the URL without getting our database slammed by broken RSS aggregators querying once per minute. But I’ve got valid RSS, which is a good start. Next parts of the project:

  1. Get a scratch PAC working so we can monkey around with it.
  2. Cache-ize the RSS script.
  3. Add more useful information; currently it’s only displaying an ISBN and an image.

Technorati tags: , , , ,


Programming the Falcon PT40


This is extraordinary. In just one day, I appear to have been able to learn to program the PSC Falcon PT40 barcode scanner and write a program that gathers barcodes in the very peculiar format required by Horizon.

They’ve got a very good tutorial file, but I’m still surprised I caught on so quickly because I’ve never programmed like this before. It was all done in a GUI that looked like Visio, only every object had a properties sheet with various tabs.

I take it that what I did was some sort of object-oriented programming, only I’m used to having to learn a syntax and then type stuff in order to create a program. If anyone knows common terminology for this sort of programming, I’d like to learn what it is.

Anyway, tomorrow (if possible), I’m going out to a library to actually test this with real barcodes and real call numbers, and see if it can handle various peculiarities of input.

The best thing about this is that I can release my code under the GPL, once it’s working well enough to not disgrace me, and other Horizon libraries will then be able to buy these scanners cheaply and load my program. They won’t have to shell out for the official software package.

UPDATE: Since I wrote this, I’ve announced the software’s availability at