<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wiki.code4lib.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=66.93.119.120</id>
		<title>Code4Lib - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.code4lib.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=66.93.119.120"/>
		<link rel="alternate" type="text/html" href="https://wiki.code4lib.org/Special:Contributions/66.93.119.120"/>
		<updated>2026-06-26T01:16:38Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.26.2</generator>

	<entry>
		<id>https://wiki.code4lib.org/index.php?title=Umlaut_wishlist&amp;diff=1053</id>
		<title>Umlaut wishlist</title>
		<link rel="alternate" type="text/html" href="https://wiki.code4lib.org/index.php?title=Umlaut_wishlist&amp;diff=1053"/>
				<updated>2008-08-02T17:43:59Z</updated>
		
		<summary type="html">&lt;p&gt;66.93.119.120: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Umlaut]]&lt;br /&gt;
&lt;br /&gt;
Desired or planned features. &lt;br /&gt;
&lt;br /&gt;
* Parsing of formatted references from an entry screen. Use http://wing.comp.nus.edu.sg/parsCit/ package. Very interesting!  Or a similar UCOP package: http://purl.net/net/egh/hmm-citation-extractor/&lt;br /&gt;
&lt;br /&gt;
* LibraryThing open knowledge API for more data. http://www.librarything.com/blog/2008/08/free-web-services-api-to-common.php&lt;br /&gt;
&lt;br /&gt;
* Add information about the conversation happening around an article with Scintilla if we have a URL, PMID or DOI:&lt;br /&gt;
     http://hublog.hubmed.org/archives/001609.html&lt;br /&gt;
     Unofficially it will return json:&lt;br /&gt;
     http://scintilla.nature.com/conversations?uri=info%3Adoi%2F10.1371%2Fjournal.pmed.0020124&amp;amp;format=json&lt;br /&gt;
&lt;br /&gt;
* Rochester “Getting Users Fulltext” style code to skip right to the full text, skipping content-provider metadata pages.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* UMich Mirlyn for metadata enrichment? &lt;br /&gt;
     http://webservices.itcs.umich.edu/mediawiki/MLibraryAPI/index.php/Mirlynapi:Home&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* xISBN/thingISBN use. (Some thought is required in how to integrate this while avoiding false positives). Bowker ISSN service for metadata enhancement. OCLC xISSN?  Integrate preceding/succeeding title information from OPAC or xISSN?&lt;br /&gt;
&lt;br /&gt;
* LibraryLookup: http://xisbn.worldcat.org/liblook/index.htm  At least until xISBN is baked in we could provide a link to this service. Increases the chances of finding a desired book in the catalog through work set grouping. Used by LibX.&lt;br /&gt;
      http://xisbn.worldcat.org/liblook/resolve.htm?res_id=http://www.iucat.iu.edu&amp;amp;rft.isbn=0451530942&amp;amp;url_ver=Z39.88-2004&amp;amp;rft_val_fmt=info:ofi/fmt:kev:mtx:book&lt;br /&gt;
&lt;br /&gt;
* Journal covers from Ulrich's via screen-scraping (or Ulrich's/sersol built in api?)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Connotea integration&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Fetch ToC from LC. Screen scrape, I guess? Or z3950? Any other content from LC?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Link to Books In Print ala Notre Dame. &lt;br /&gt;
http://www.library.nd.edu/eresources/findit/findit.cgi?doc_num=001939269&amp;amp;aleph_session=U5AVHRXD5QB1CGDFDSVJ9DSY2UA6QNCGVEU8EYRX9NNMIQ429Q-54668%22&lt;br /&gt;
example &lt;br /&gt;
&lt;br /&gt;
* bip search url? :&lt;br /&gt;
http://www.booksinprint.com/merge_shared/Search/advsearch.asp%3FdateState%3DY%26txtAction%3D%26BooleanSearch%3D%26SType%3Dadv%26collection%3DBIP%26QueryMode%3DSimple%26ResultCount%3D25%26ResultTemplate%3Dmbbookresult_fl.hts%26navPage%3D1%26SrchFrm%3DAdv%26ScoreThreshold%3D0%26Criteria1%3DISBN%26CriteriaText1%3D0838935370&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* SFX plugin:  Notice when first title given is non-roman, and look for roman title to enhance metadata with when so. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* HIP and other OPAC searchers should pull ToC from MARC 505 when present.  And 856's judged to be ToC in ToC, not full text. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Fix Umlaut Referent to more easily allow multiple authors. Architectural change neccessary to get a lot of this stuff working right. &lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Cited by&amp;quot; service. Scopus via screen scraping? (scopus javascript api? http://www.scopus.com/scsearchapi/ ) ISI Web of Science is too hard to even screen scrape the interface is such a mess, but Scopus looks do-able.  Google scholar?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Enhance metadata to have full metadata for a refworks etc export. Using: CrossRef?  Metalib?  Anything else?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* A general purpose responsecache. Schema: Date, service/source, key.  Use for caching image urls, ToC urls from LC, etc. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Fix Worldcat registry auto-discovery. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Add a Worldcat search that uses API, instead of screen scrape. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Switch OCA search to use OCA native APIs, instead of indexdata mirror index. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* fix unapi in umlaut. unapi to rsi?  For zotero. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Change background to use Spawn plugin instead of manual threading. Investigating using spawn with fork instead of thread (terry reese on limited pool of forks). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Crazy idea for an abstract interface/architecture to support querying web service apis that require client side javascript, like Google Books and Scopus. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Integrate my various local document delivery services into menu of options when full text isn’t available. More generally, a clear architecture for providing localized doc delivery services in addition to a single ILL link.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* SFX adaptor: Add a &amp;quot;rollup&amp;quot; feature that pays attention to dates to avoid eliminating coverage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== done or in progress ==&lt;br /&gt;
&lt;br /&gt;
* Google Books search to complement the OCA and Gutenberg searches I’ve got--may or may not be possible with no google books api. Screen scrape? Umich oai-pmh records?&lt;br /&gt;
&lt;br /&gt;
* UMich MBooks for fulltext (and search-inside)&lt;br /&gt;
     http://mirlyn.lib.umich.edu/cgi-bin/sdrsmd?id=1&amp;amp;oclc=16857172&lt;br /&gt;
     http://code.google.com/p/jquery-sdrsmd/&lt;br /&gt;
&lt;br /&gt;
* connection to OCLC Identities&lt;br /&gt;
     http://outgoing.typepad.com/outgoing/2008/06/linking-to-worl.html&lt;br /&gt;
&lt;br /&gt;
* Cover images from Open Library?  See http://johnmiedema.ca/openbook-wordpress-plugin/.&lt;/div&gt;</summary>
		<author><name>66.93.119.120</name></author>	</entry>

	<entry>
		<id>https://wiki.code4lib.org/index.php?title=Request_Setup_and_Environmental_Context&amp;diff=1051</id>
		<title>Request Setup and Environmental Context</title>
		<link rel="alternate" type="text/html" href="https://wiki.code4lib.org/index.php?title=Request_Setup_and_Environmental_Context&amp;diff=1051"/>
				<updated>2008-07-27T19:53:26Z</updated>
		
		<summary type="html">&lt;p&gt;66.93.119.120: /* OpenURL parsing and storing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Setting up the Request and it's context=&lt;br /&gt;
&lt;br /&gt;
Part of [[Umlaut Technical Overview]]&lt;br /&gt;
&lt;br /&gt;
==OpenURL parsing and storing==&lt;br /&gt;
&lt;br /&gt;
In understanding Umlaut, it's helpful to understand a bit about the nature of an OpenURL, including that an OpenURL is composed of several entities or groupings of metadata. Jeff Young's [http://q6.oclc.org/2006/08/welcome_1.html Q6 blog] includes one good explanation of the six OpenURL entities. &lt;br /&gt;
&lt;br /&gt;
Two sets of classes are involved in dealing with OpenURLs in Umlaut. The ropenurl library is generally used to parse OpenURLs. However, Umlaut serializes OpenURLs to it's own ActiveRecord classes--[http://umlaut.rubyforge.org/api/files/app/models/request_rb.html Request], to represent an incoming OpenURL request, and some constituent data in [http://umlaut.rubyforge.org/api/files/app/models/referent_rb.html Referrent], [http://umlaut.rubyforge.org/api/files/app/models/referent_value_rb.html Referent Value], and [http://umlaut.rubyforge.org/api/files/app/models/referrer_rb.html Referrer].&lt;br /&gt;
&lt;br /&gt;
Once the OpenURL is parsed with the ropenurl library, the data is stored in these internal Umlaut classes, which are generally used subsequently to deal with the request data. &lt;br /&gt;
&lt;br /&gt;
A bit confusingly, Umlaut's own Request (an ActiveRecord which represents a parsed OpenURL request, and other persistent state related to Umlaut's handling of that OpenURL request) should not be confused with the Rails ActionController::Request class (which represents the complete details of the current 'raw' HTTP request, and is not stored persistently in the db). &lt;br /&gt;
&lt;br /&gt;
So the first thing the resolve action does is pass the incoming HTTP request details to the Umlaut Request#new_request method, which will ''''either'''' create a new Request, or recover an already created Request from the db--in either case return a Request matching the OpenURL. &lt;br /&gt;
&lt;br /&gt;
===Request caching/re-use===&lt;br /&gt;
&lt;br /&gt;
The point of this re-use of Request objects is that if the user presses the browser reload button, the app should be connected with the same already created request--allowing the same already generated responses to be used, among other things.  This also allows the user to click on various Umlaut functions and keep re-using the same Request. Again, the main reason this is important is to re-use already generated responses instead of re-generating them. This is also important for background service processing. &lt;br /&gt;
&lt;br /&gt;
Cache matching for re-use is based on: Must be from the same session, must be from the same originating IP address, must have the same OpenURL elements (ie, same OpenURL parameters measured by a serialized version (Request#serialized_co_params)).&lt;br /&gt;
&lt;br /&gt;
Alternately, if the request ID is passed in (in query var &amp;quot;umlaut.request_id&amp;quot;), that is used instead of context object element matching. Umlaut often passes requestID internally, to make sure the same request is recovered. If request_id matches, sessions is not required to match--this is intentional to recover the request even if browser isn't returning cookies, thus not connecting to same session.&lt;br /&gt;
&lt;br /&gt;
==Building the service Collection: Institutions and Services==&lt;br /&gt;
&lt;br /&gt;
So we've got the request taken care of. What are we going to do with it?  &lt;br /&gt;
&lt;br /&gt;
===Services===&lt;br /&gt;
&lt;br /&gt;
The actions taken in response to a request (to 'resolve' it and provide information to the client or user) are taken in umlaut by Services. A Service is defined in your local configuration in $umlaut/config/umlaut_config/services.yml.  A sample services.yml file is included in $umlaut/config/umlaut_distribution/services.yml-dist.  &lt;br /&gt;
&lt;br /&gt;
Each service defined in services.yml has at minimum three properties: An unique identifier for that service, a priority level, and a &amp;quot;type&amp;quot;.  &lt;br /&gt;
&lt;br /&gt;
The &amp;quot;type&amp;quot; is the name of an 'adaptor' class implementing the logic for this service. Service adaptor classes are stored in $umlaut/lib/service_adaptors.  (We will extend this in the future to allow locally defined service_adaptors, perhaps in $umlaut/lib/service_adaptors/local ). So there's a service_adaptor for Amazon, for worldcat, etc.  Most importantly, there's one for SFX---SFX connectivity is achieved through defining a service that uses a 'type' that talks to an SFX server , just like other services. (At least for 'resolve' actions; 'search' actions are a bit different). &lt;br /&gt;
&lt;br /&gt;
Priority defines what order the services will be run in. 1-9 are foreground services ordinarily executed before a response is returned to the user.  a-z are background services run after a response is returned to the user. Two services sharing the same priority will be run concurrently (but see the config.app_config.threaded_services config param). &lt;br /&gt;
&lt;br /&gt;
Services defined in services.yml may have other service-specific parameters too, for instance commonly a password or api_key giving you access to the foreign web service.&lt;br /&gt;
&lt;br /&gt;
Note that a Service is not actually an ActiveRecord stored in the db. Instead, it is a definition in services.yml, which involves an adaptor class (which is not an active record). Service definitions are loaded in on demand--and their adaptor classes instantiated--by the ServiceList singleton class. &lt;br /&gt;
&lt;br /&gt;
For more on how to write service adaptor classes to implement new services, see.... TBD.&lt;br /&gt;
&lt;br /&gt;
===Institutions===&lt;br /&gt;
&lt;br /&gt;
Services are grouped together in Institutions. An Institution represents some particular class of user. It could be a particular location or affiliation, but it really could be any other class of user too. &lt;br /&gt;
&lt;br /&gt;
Institutions are defined in $umlaut/config/umlaut_config/institutions.yml (sample in config/umlaut_distribution/institutions.yml-dist ).  An Institution definition is basically a unique identifier and a list of services attached to that institution. &lt;br /&gt;
&lt;br /&gt;
While Institutions are defined in the institution.yml config file, certain attributes of the Institution are ALSO stored in the database for quicker lookup (This may or may not make sense, but is a legacy design). After editing the institution.yml file, a rake task should be run to sync the info to the db too: &lt;br /&gt;
:rake umlaut:sync_institutions &lt;br /&gt;
&lt;br /&gt;
The Insitution ActiveRecord automatically loads in properties stored in the institutions.yml, helped out by the InstitutionList store class. &lt;br /&gt;
&lt;br /&gt;
Hypothetically, there will be many ways for a given incoming request to get associated with an Institution: by IP range, by user preference, by attribute from an enterprise directory associated with a  user account, etc. An incoming user can be associated with one or more institutions. &lt;br /&gt;
&lt;br /&gt;
However, at present, pretty much the only way for a user to be associated with an Institution is if it's a default Institution! So the only Institutions are default Institutions at present (there can be more than one default institution). This architecture has room for expansion.&lt;br /&gt;
&lt;br /&gt;
===Collection===&lt;br /&gt;
&lt;br /&gt;
So there are Services, and they are grouped into Institutions. How do they actually get brought into play to respond to a resolve request? The [http://umlaut.rubyforge.org/api/classes/Collection.html Collection ] object. A Collection keeps track of a bunch of services to be used for a given session. &lt;br /&gt;
&lt;br /&gt;
The resolve index action creates a new Collection based on ip address and other session information. The new Collection will discover which Institutions apply to a user, and which Services belong to that Institution, and file them all by priority.  Other Services may be found that do not belong to an Institution, for instance Collection is supposed to identify SFX servers for a user's IP addr via the Worldcat Registry, create a Service pointing to that foreign SFX server, and include that in a Collection. Although this functionality may not be working at present. &lt;br /&gt;
&lt;br /&gt;
The Collection is stored in the Session. It is not actually an ActiveRecord, instead it is stored serialized in the Session--along with all it's Services.  One catch to this is if you change Service configuration in services.yml, users may still be getting the old configuration from their serialized Collection in their Session. Deleting all Sessions is a good idea to handle this. (Deleting sessions ought not to interfere with anyone's activity in progress, except to uncache certain things). &lt;br /&gt;
&lt;br /&gt;
The stored Collection will not be used if a user's IP address changes--even if they have the same session. For instance, bringing your laptop to a new location will still cause a Collection to be rebuilt. &lt;br /&gt;
&lt;br /&gt;
When the resolve action wants to actually execute services, it goes through each priority level, and asks the Collection for the Services at that priority level.&lt;/div&gt;</summary>
		<author><name>66.93.119.120</name></author>	</entry>

	<entry>
		<id>https://wiki.code4lib.org/index.php?title=Umlaut_Technical_Overview&amp;diff=1050</id>
		<title>Umlaut Technical Overview</title>
		<link rel="alternate" type="text/html" href="https://wiki.code4lib.org/index.php?title=Umlaut_Technical_Overview&amp;diff=1050"/>
				<updated>2008-07-27T19:51:29Z</updated>
		
		<summary type="html">&lt;p&gt;66.93.119.120: undo vandalism&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;To give you an overview of the technical architecture of umlaut, we will go through a typical Resolve request, identifying all the classes involved, and pointing to their api doc if possible. &lt;br /&gt;
&lt;br /&gt;
OpenURLs are sent to the default index action of the [http://umlaut.rubyforge.org/api/files/app/controllers/resolve_controller_rb.html resolve controller].&lt;br /&gt;
&lt;br /&gt;
In the resolve controller, a before filter method called init_processing is run to parse the OpenURL and set up the Umlaut request (or retrieve an existing request). &lt;br /&gt;
&lt;br /&gt;
==Technical Overview Sections==&lt;br /&gt;
&lt;br /&gt;
# [[Request Setup and Environmental Context]]&lt;br /&gt;
# [[ServiceResponse data structures and generation]] -- Includes guide to writing your own services. &lt;br /&gt;
# [[View architecture and control flow]]&lt;br /&gt;
# [[Background services]] -- control and view architectures for background services&lt;/div&gt;</summary>
		<author><name>66.93.119.120</name></author>	</entry>

	<entry>
		<id>https://wiki.code4lib.org/index.php?title=Umlaut&amp;diff=1049</id>
		<title>Umlaut</title>
		<link rel="alternate" type="text/html" href="https://wiki.code4lib.org/index.php?title=Umlaut&amp;diff=1049"/>
				<updated>2008-07-27T19:48:54Z</updated>
		
		<summary type="html">&lt;p&gt;66.93.119.120: /* More information */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Umlaut is OpenURL link resolving middleware that adds functions and services to commercial link resolving software such as SFX. &lt;br /&gt;
&lt;br /&gt;
[[Category:Umlaut]]&lt;br /&gt;
&lt;br /&gt;
==More information==&lt;br /&gt;
&lt;br /&gt;
[[About Umlaut]] - A gentle introduction to what Umlaut is and what it can do for you.&lt;br /&gt;
&lt;br /&gt;
[http://rubyforge.org/mail/?group_id=4382 Umlaut Listserv]&lt;br /&gt;
&lt;br /&gt;
[http://umlaut.rubyforge.org/ Rubyforge home page for developers]&lt;br /&gt;
&lt;br /&gt;
[[Umlaut wishlist]]&lt;br /&gt;
&lt;br /&gt;
==Installation and Configuration==&lt;br /&gt;
&lt;br /&gt;
[[Umlaut Installation]]&lt;br /&gt;
&lt;br /&gt;
[[Umlaut Setup]]&lt;br /&gt;
&lt;br /&gt;
==Documentation==&lt;br /&gt;
&lt;br /&gt;
[http://umlaut.rubyforge.org/api/ Umlaut API Documentation]&lt;br /&gt;
&lt;br /&gt;
[[Umlaut_Deployment]]&lt;br /&gt;
&lt;br /&gt;
[[Umlaut Local Configuration Architecture]]&lt;br /&gt;
&lt;br /&gt;
[[Umlaut Technical Overview]]&lt;/div&gt;</summary>
		<author><name>66.93.119.120</name></author>	</entry>

	</feed>