Author: Ross

  • Metasearch Metadata Metaphor

    SRW/U is to Yngwie J. Malmsteen as OpenSearch is to Keith Richards.

    Yngwie Malmsteen is technically superior, however aesthetically unlistenable (unimplementable, in the case of SRW/U).

    Keith Richards is sloppy, unsophisticated and writes timeless melodies that resonate with the masses (OpenSearch is sloppy, unsophisticated — while time will tell if OpenSearch becomes “timeless” [seems doubtful, honestly], but there are certainly a lot of OpenSearch targets).

    Mike Taylor wrote a very insightful reaction to Dan’s worklog posting (and incredibly objective, given his investment and relationship to SRW/U). And he’s right.

    And I’m right. Unless SRW/U can capture some of the mojo that OpenSearch has, it might as well be Yngwie J. Malmsteen.

  • Implementing COinS in the SFX Menu

    Since Andrew asked:

    This should go in your banner.tmpl file. I am not bothering with BANNER_TYPE_3, since I am not really sure how I would represent that in a COinS format, anyway.

    Thanks to David Walker for showing me how this would work.

    <TMPL_IF BANNER_TYPE_1>
    <TMPL_IF ATITLE>
    <TR valign="top">
    <TD class="LabelBold">Title:</TD>
    <TD class="Label"><TMPL_VAR NAME="ATITLE" ESCAPE='HTML'>
    </TD>
    </TR>
    </TMPL_IF>
    <TR valign="top">
    <TD class="LabelBold">Source:</TD>
    <TD class="Label">
    <TMPL_IF BTITLE>
    <TMPL_VAR NAME="BTITLE" ESCAPE='HTML'>
    </TMPL_IF>
    <TMPL_IF ISBN>
    [<TMPL_VAR NAME="ISBN" ESCAPE='HTML'>]
    </TMPL_IF>
    <TMPL_IF AULAST>
    <TMPL_VAR NAME="AULAST" ESCAPE='HTML'>
    </TMPL_IF>
    <span class="Z3988" title="ctx_ver=Z39.88-2004&rft_val_fmt=info:ofi/fmt:kev:mtx:book<TMPL_IF ATITLE>&rft.atitle=<TMPL_VAR NAME="ATITLE" ESCAPE='URL'></TMPL_IF><TMPL_IF BTITLE>&rft.title=<TMPL_VAR NAME="BTITLE" ESCAPE='URL'></TMPL_IF><TMPL_IF ISBN>&rft.isbn=<TMPL_VAR NAME="ISBN" ESCAPE='URL'></TMPL_IF><TMPL_IF AULAST>&rft.aulast=<TMPL_VAR NAME="AULAST" ESCAPE='URL'></TMPL_IF><TMPL_IF INST>&rft.inst=<TMPL_VAR NAME='INST' ESCAPE='URL'></TMPL_IF><TMPL_IF YEAR>&rft.date=<TMPL_VAR NAME='YEAR' ESCAPE='URL'></TMPL_IF><TMPL_IF SPAGE>&rft.spage=<TMPL_VAR NAME='SPAGE' ESCAPE='URL'></TMPL_IF><TMPL_IF EPAGE>&rft.epage=<TMPL_VAR NAME='EPAGE' ESCAPE='URL'></TMPL_IF>"></span>
    </TD>
    </TR>
    <TR>
    <TD>
    <TMPL_IF INST>
    <TMPL_VAR NAME='INST' ESCAPE='HTML'>
    </TMPL_IF>
    <TMPL_IF YEAR>
    yr:<TMPL_VAR NAME='YEAR' ESCAPE='HTML'>
    </TMPL_IF>
    <TMPL_IF SPAGE>
    pg:<TMPL_VAR NAME='SPAGE' ESCAPE='HTML'>
    </TMPL_IF>
    <TMPL_IF EPAGE>
    -<TMPL_VAR NAME='EPAGE' ESCAPE='HTML'>
    </TMPL_IF>
    </TD>
    </TR>
    </TMPL_IF>
    
    <TMPL_IF BANNER_TYPE_2>
    <TMPL_IF ATITLE>
    <TR valign="top">
    <TD class="LabelBold">Title:</TD>
    <TD class="Label"><TMPL_VAR NAME="ATITLE" ESCAPE='HTML'></TD>
    </TR>
    </TMPL_IF>
    <TR valign="top">
    <TD class="LabelBold">Source:</TD>
    <TD class="Label">
    <TMPL_IF JTITLE>
    <TMPL_VAR NAME="JTITLE" ESCAPE='HTML'>
    </TMPL_IF>
    <TMPL_IF ISSN>
    [<TMPL_VAR NAME="ISSN" ESCAPE='HTML'>]
    </TMPL_IF>
    <TMPL_IF AULAST>
    <TMPL_VAR NAME="AULAST" ESCAPE='HTML'>
    </TMPL_IF>
    <TMPL_IF YEAR >
    yr:<TMPL_VAR NAME='YEAR' ESCAPE='HTML'>
    </TMPL_IF>
    <TMPL_IF VOLUME >
    vol:<TMPL_VAR NAME='VOLUME' ESCAPE='HTML'>
    </TMPL_IF>
    <TMPL_IF ISSUE >
    iss:<TMPL_VAR NAME='ISSUE' ESCAPE='HTML'>
    </TMPL_IF>
    <TMPL_IF SPAGE>
    pg:<TMPL_VAR NAME='SPAGE' ESCAPE='HTML'>
    </TMPL_IF>
    <TMPL_IF EPAGE >
    -<TMPL_VAR NAME='EPAGE' ESCAPE='HTML'>
    </TMPL_IF>
    <span class="Z3988" title="ctx_ver=Z39.88-2004&rft_val_fmt=info:ofi/fmt:kev:mtx:journal<TMPL_IF ATITLE>&rft.atitle=<TMPL_VAR NAME="ATITLE" ESCAPE='URL'></TMPL_IF><TMPL_IF JTITLE>&rft.jtitle=<TMPL_VAR NAME="JTITLE" ESCAPE='URL'></TMPL_IF><TMPL_IF ISSN>&rft.issn=<TMPL_VAR NAME="ISSN" ESCAPE='URL'></TMPL_IF><TMPL_IF AULAST>&rft.aulast=<TMPL_VAR NAME="AULAST" ESCAPE='URL'></TMPL_IF><TMPL_IF INST>&rft.inst=<TMPL_VAR NAME='INST' ESCAPE='URL'></TMPL_IF><TMPL_IF YEAR>&rft.date=<TMPL_VAR NAME='YEAR' ESCAPE='URL'></TMPL_IF><TMPL_IF SPAGE>&rft.spage=<TMPL_VAR NAME='SPAGE' ESCAPE='URL'></TMPL_IF><TMPL_IF EPAGE>&rft.epage=<TMPL_VAR NAME='EPAGE' ESCAPE='URL'></TMPL_IF><TMPL_IF VOLUME >&rft.volume=<TMPL_VAR NAME='VOLUME' ESCAPE='URL'></TMPL_IF><TMPL_IF ISSUE >&rft.issue=<TMPL_VAR NAME='ISSUE' ESCAPE='URL'></TMPL_IF>"></span>
    </TD>
    </TR>
    </TMPL_IF>
    
    <TMPL_IF BANNER_TYPE_3>
    <TR valign="top">
    <TD class="LabelBold">Source:</TD>
    <TD class="Label">
    <TMPL_IF TITLE>
    <TMPL_VAR NAME="TITLE" ESCAPE='HTML'>
    </TMPL_IF>
    <TMPL_IF NUMBER>
    [<TMPL_VAR NAME="NUMBER" ESCAPE='HTML'>]
    </TMPL_IF>
    <TMPL_IF INVLAST >
    <TMPL_VAR NAME='INVLAST' ESCAPE='HTML'>
    </TMPL_IF>
    <TMPL_IF YEAR >
    yr:<TMPL_VAR NAME='YEAR' ESCAPE='HTML'>
    </TMPL_IF>
    </TD>
    </TR>
    </TMPL_IF>
  • All the cool kids are implementing COinS

    A little while ago, I added COinS (ContextObjects in Spans) to our SFX menu pages. I have been asked by several people about the motivation of this, since it would seem that the user would know if fulltext was available to them at this stage.

    Dan Chudnov posted to his worklog one of the advantages to putting COinS in the SFX menu.

    So, imagine one of our users is at an SFX menu for another institution. Normally, they’d be, well, screwed. If COinS are enabled in the menu, however (and now we’ve proven this is pretty darn simple), they could use WAG the Dog or Dan’s bookmarklet or Greasemonkey extension (he has them for GT) and get to our fulltext subscription.

    Another use case is GT Library’s web designer. Heather is a GT employee (of course), so she access to all of our resources. Being an FSU student, she also has access to their collection. Imagine Heather getting a GT SFX menu for an article that we don’t have available in fulltext. By using her bookmarklet, she could then see if that article is available from FSU, without having to manually look for it herself. If FSU implemented COinS in their menus, then it would work both ways. With GALILEO opening up SFX for the entire state, one has to assume that all of our users could potentially belong to more than one library community (GT and ATL/Fulton Public Library, for example), each with their own subscriptions.

    Anyway, it’s quite cool to see (quasi-)real world examples of how COinS would work.

  • Geek Chic

    I just caught the end of Dark City. I love this movie, despite its cheesiness, and I think it speak volumes of you, as a nerd, as to where you stand on this flick.

    In general, I see the computer geek community as comprised of two camps: the slashdot community, made up of the engineering (and engineering aspirant) type; efficiency, economy, practicality rule above aesthetics. Things that kick ass are valued more than objects of elegance. Principle carries more weight than pragmatism.

    Then there is the other group. This is a nerd set that values form, as well as function. Perfection gives way to pragmatism. Strong coding skills aren’t necessary (they help, of course), because “rules” are an “impediment to creativity”. “Innovation” is the watchword above “propriety”. Thankfully, I would place a vast majority of #code4lib in this arena.

    “Thankfully”, for two reasons:

    • It shows hope for the library development community
    • I hang out there all day, and I tend to dislike the former group

    Another way to look at this schism is “The Matrix” vs. “Dark City”. Both movies are based on the same premise: Cartesian logic. They both center around thinking things that cannot be certain that anything exists besides themselves. The difference is that one is a kick ass blockbuster smash and the other is a low budget cult classic.

    You can enjoy both movies (I certainly do), but if you laugh more at “I know kung-fu” than seeing the wires attached to Rupert Sewell as he fights with the bad guy who looks like Reducto from “Harvey Birdman: Attorney at Law“, you squarely fall in the innovator more than engineer camp. What is your Keanu tolerance? It says a lot.

    Although I’m not sure why, the world does need both “The Matrix” and “Dark City” fans. They serve different purposes.

    But when you’re recruiting a geek, it’s good to know what you’re getting. Try “The Matrix” vs. “Dark City” question and evaluate from there.

  • Abstract Artunit

    I’ve mentioned several times in this space the OPAC redesign project that Art and I are working on. There hasn’t really been anything to show, to date, because it’s taken a very long time to get actually get the data out of Voyager. There are easier and faster ways we could have done this, probably, but we’ve been a little bogged down trying to get this to work in Art’s webdav environment. This has required sucking the data out of Oracle according to LCC and that’s been no easy task. GovDocs are in a different hierarchy, based on SUDOC (CODOC, for Art).

    In the meantime, I get emails from Art at 12:30 at night, 7:30 in the morning that say things like:

    I am woefully weak on python but I know you have been working with python lately and I wondered if the approach I am using makes sense. I am persisting date modified information with a python shelve. So it looks like:

    shelf[url] = last_modified

    This seems to work wonderfully, but I needed to add:

    import dumbdbm

    for the shelf to have somewhere to put the info. What I think is supposed to happen is that the shelf command looks for some sort of database option and cycles through them all looking for storage. The “import dumbdbm” seems to be a way to add an option if no other is found. Have you ever tried anything like this? I wanted to use pickle/cpickle but a million links would probably throttle it.

    … I, of course, have no idea what he’s talking about, but it’s flattering nonetheless that he thinks I might.

    Anyway, last week I started actually working with PyLucene and our metadata mirror files (Art, meanwhile, is doing similar work with Cocoon/Lucene) and I came across what is possibly the most useful byproduct of this project. While I was preparing the logic to frbrize the mirror data, it struck me that it doesn’t have to be perfect, at first.

    By separating the data from the ILS, we can create any kind of interface we want, indeed several, should we choose, without worrying about affecting the backend system at all. We can combine records, add metadata as necessary, remove it if it doesn’t work properly, tweak our search algorithms, and incorporate it into any sort of system we want, because it would have absolutely no effect on the ILS itself. We’ll still have the original “authority” should we mess anything up too badly and we’ll have all kinds of value that couldn’t (and probably shouldn’t) go in a “conventional opac”.

    This sort of abstraction from the “inventory control system” is such a basic programming principle that I have to wonder why no vendors implement it (even I, as an untrained hacker understand the importance of this). It also abstracts the user interface from the catalogers a bit — added bonus. Catalogers are great for many things, but designing user interfaces generally isn’t one of them.

  • Librarians are arrogant asses

    Despite our waning patronage (both physically and virtually), librarians never cease their criticism of the barbarism of the unwashed masses for not adopting their love of rich metadata.

    “Dumbing down the catalog”
    “I don’t think it’s too much to ask a student to learn what the library catalog is”
    “Thousands of hits”
    “Did A9 even bother to look at SRW/U?”

    Let’s take the first (widely used) statement. A system that is able to take a natural language query and present to the user a list that contains many of the things they are looking for early in the result set is not dumb. Hemingway, Ernest is dumb. Not understanding what I, the user, mean when I type “Ernest Hemingway” is dumb. This standard is applied to librarians, why not the catalog? A librarian doesn’t explicitly require the patron to know they’re looking for before they will help them with a reference question, but we expect them to form a perfect boolean query to isolate that rare manuscript (acquired in 1963 and widely unheard of) that would be the “perfect compliment to their term paper”.

    Number two: I don’t expect a student to learn how to use a sliderule, either. It’s not necessary for them to know what double clutching is. It wouldn’t be the end of the world if they never have seen a typewriter’s correction ribbon. Technology makes awkward systems obsolete.

    In regards to the “thousands of hits” meme (which Alane Wilson argued against quite convincingly), how many hits would a user get if all of our databases were searched simultaneously? What if they are getting a sufficiently smaller set of results, but it’s because they’re looking in the wrong place? I am seldomly unhappy with my Google results as a starting place.

    Should A9 have? Does SRW/U really make any sense whatsoever to 95% of the world outside of libraries? Why doesn’t the SRW/U crowd try to work with the OpenSearch community? Why? Because we say ours is better, so the other shouldn’t be trifled with. To be clear, it’s possible to layer OpenSearch on top of SRU; Georgia Tech does it. Is one superior to the other? SRW/U is certainly more sophisticated. Despite what you will read to the contrary, however, OpenSearch is much, much easier to implement. If you know the metadata schema of the SRW/U server, simple SRU clients are possible, but, like Z39.50 before it, there are no constraints on what you might get from an SRW/U server. OpenSearch, while limited and limiting (for certain), has a somewhat different purpose than SRW/U. SRW/U is a protocol for searching for and retrieving metadata. OpenSearch is a spec for searching for and retrieving search results. This may sound redundant, but there is a nuanced difference. No matter the OpenSearch source, the results will always look the same, so it is very simple to integrate into a display (yet not so simple to actually do anything else with the result). While SRW/U is definitely more versatile, transforming your results to OpenSearch has its advantages. But this is a hard sell to the library world, because the “metadata isn’t rich enough”.

    It’s time we stopped scorning and ignoring the outside world, because they are doing fine without us. Aaron Krowne notes that a huge amount of scholarly content is freely available, further making our position in society weaker, making it all the more important that we co-opt popular culture, rather than ridicule it. Our standards are great… now let’s see how they can interface with the real world.