Archive for the ‘HIP’ Category


Break my code—I’m going to Atlanta for a week


I’ll be in Atlanta for the next week, looking for a place to live while my wife goes to graduate school.

Meanwhile, my reworked HIP-based catalog, SunCat 2.0, is at a fairly good place for a first look.  Please check it out and tell me what you think; it’s an ambitious project and I know there’s still quite a lot to do.  The comments link at the bottom of each page will send me your browser/referer info, so please use it.

And if you’re in Atlanta and would like to meet while we’re in town, email me!


Improving DaveyP’s HIP link tracker


DaveyP came up with a nice way of logging outgoing links from 856 tags.

I’ve improved it, at least as far as our needs are concerned:

  • If the user is behind a proxy that sends the HTTP X-Forwarded-For header, we record the user’s real IP address.
  • Since we have more than one HIP server, we record the name of the HIP server.
  • Since our profiles represent individual autonomous libraries who are much more interested in their own users, we record the profile code.
  • Timestamps are now in ISO 8601 format.

You can get what I’m audaciously calling version 1.10 here:

Creative Commons LicenseUnder the terms of DaveyP’s license, hiplink 1.10 is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 2.5 License.


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).


Make that “…a GREASED pig”.


I’ve managed to wrestle several XSLT stylesheets into — well, not submission exactly, but grudging respect.  I’m starting to make visible structural changes to the HTML components of HIP.

OK, so the SunCat 2.0 development server isn’t nearly as pretty as the mockup, but this time the lipstick, smeared as it may be, is on a real pig and not just a piggy bank.

And, yes, I’m aware that the UN Commission on Eliminating the Torture of Metaphors has been trying to reach me all day.  But I’ve been coding, darn it.  They can wait.


CODI 2006: Shelly Neville’s presentation on Information Portal 8.x


I’m posting this in Atlanta, having forgotten to post earlier. (Uploading 500MB of photos to Flickr takes a while, especially since the Little America hasn’t got an OC-48, and Flock kept losing its connection until about 1:30am. For all the wonders of Web 2.0, I’d have loved to be able to just use ssh, ftp, or even Xmodem-CRC.

There was a question about library-supplied images in combination with Syndetics images; Shelly pointed out that it would be rare to have both kinds of images for the same record, but that you could check boxes on a config screen to modify the layout. I said that you could also use XSLT to display the Syndetics image only if there’s no locally-provided image — just change the stylesheet.

Shelly laughed and said: “Any time a technical person says ‘you can just change the stylesheet’, I worry. I can *spell* XSL and that’s about it.”

You can use location groups to show “local copies”, “other libraries within 20 miles”, “other libraries further away”, etc.; the user would see the first group’s holdings and use a drop-down menu (or a similar control) to choose a different view.

(I hope there’ll be a way to use checkboxes to do something similar — perhaps “just change the stylesheet” to introduce some code that would display each group in a div and then show or hide the divs as the user toggles ‘public libraries’, ‘Pinellas County’, and so on. Heck, there’s an AJAX way to use a slider to say how far away you’re willing to go, but that might not actually be *useful*, just cool.)

Speaking of stylesheets, CSS will be used for layout, so there’s a good chance that the layout could be radically improved without messing around in XSLT.

Language translations will be stored in customer-accessible resource bundles, so we can create a Greek translation, or tweak a Spanish translation to reflect local usage. (Or even make the PAC say ‘your mailing address needs updated’, if that’s how normal people talk in your area.)


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…