<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Bibliographic Wilderness</title>
	<atom:link href="http://bibwild.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://bibwild.wordpress.com</link>
	<description>Gone to Croatoan</description>
	<lastBuildDate>Sun, 29 Jan 2012 05:33:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='bibwild.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Bibliographic Wilderness</title>
		<link>http://bibwild.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://bibwild.wordpress.com/osd.xml" title="Bibliographic Wilderness" />
	<atom:link rel='hub' href='http://bibwild.wordpress.com/?pushpress=hub'/>
		<item>
		<title>An inside scoop on harvard library reorg</title>
		<link>http://bibwild.wordpress.com/2012/01/23/an-inside-scoop-on-harvard-library-reorg/</link>
		<comments>http://bibwild.wordpress.com/2012/01/23/an-inside-scoop-on-harvard-library-reorg/#comments</comments>
		<pubDate>Mon, 23 Jan 2012 15:53:46 +0000</pubDate>
		<dc:creator>jrochkind</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://bibwild.wordpress.com/?p=1969</guid>
		<description><![CDATA[Dailykos published a useful short essay by a former harvard librarian, reflecting on the Harvard reorg/layoff news.  I see a couple interesting points here. Harvard has a famously byzantine library system comprising over forty libraries, and administratively divided into two &#8230; <a href="http://bibwild.wordpress.com/2012/01/23/an-inside-scoop-on-harvard-library-reorg/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1969&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Dailykos published a useful short essay by a <a href="http://www.dailykos.com/story/2012/01/20/1056635/-The-Great-Librarian-Massacre-of-2012:-a-cataloging-librarians-view">former harvard librarian, reflecting on the Harvard reorg/layoff news. </a></p>
<p>I see a couple interesting points here.</p>
<blockquote><p>Harvard has a famously byzantine library system comprising over forty libraries, and administratively divided into two separate library systems (confusingly called the Harvard University Library or HUL, and the Harvard College Library, or HCL) has changed very little in terms of organizational structure since the late 19th century.</p></blockquote>
<p>Harvard is not alone here. In fact, I&#8217;d suggest that the oldest academic libraries, and ironically <em>especially</em> the old ones that really <em>excelled</em> 80+ years ago, are most likely to have completely dysfunctional organizational structures and organizational behavior today.</p>
<p>Libraries today aren&#8217;t the same as libraries 80+ years ago, especially with regard to electronic content we purchase, which has different workflows to manage and different economies to purchase; and in terms of metadata maintenance as well, something which the blog author rightly points out libraries realized the benefits of cooperating/coordinating/sharing many years ago &#8212; but sharing cards (or data to print cards) through LC is a different beast than than modern metadata control needs.</p>
<p>I also generally agree with the blogger&#8217;s conclusion &#8212; but with less optimism:</p>
<blockquote><p>But second, the importance of catalogers, and more broadly speaking, librarians is not necessarily diminishing into nothingness.  The environment has changed radically, and there are sure to be plenty of future &#8220;massacre-like&#8221; events that will painfully remind us of these changes.  But librarians do have a future, and I think it may even be a bright one: they just need to accept that it won&#8217;t be quite the same as the past.</p></blockquote>
<p>I fully agree that there is still as much of a need for the tasks librarians have always done as ever &#8212; most definitely and even especially including cataloging/metadata control.</p>
<p>However, despite agreeing with that, I am actually not optimistic, like that blogger is.  We are <em>running out of time</em> to demonstrate that our profession, community, and industry is <em>capable</em> of meeting the metadata control needs of the 21st century.  We are not doing a good job of it. We do not seem to be capable of changing our priorities, expertise, organizational structures, and inter-organizational collaborative infrastructures, to deal with it.</p>
<p>The traditional goals of libraries have traditionally are still useful and needed just as much as ever, but with different ways of accomplishing them. There is still a great need for an organization specializing in information management on behalf of a user community, and without trying to make a profit off that user community.  But I am, sadly, no longer particularly optimistic that libraries as they are are actually capable of accomplishing those goals.  However, even in the best of cases, <em>trying</em> will result in some painful organization reorgs &#8212; nobody likes change. (It&#8217;s of course also possible for painful reorgs to end up entirely useless or even counter-productive, or simply admissions of defeat as libraries slowly die).</p>
<p><strong>Hint: </strong>If you or your organization thinks if we can just put all our metadata into RDF as quickly as possible and therefore be &#8220;doing linked data&#8221;, that this is necessary and sufficient to handle modern metadata control needs &#8212; you have not only missed the boat, you are on the <em>wrong</em> boat.   I have lately been seeing a worrying increase of people suggesting &#8220;oh, we just need linked data to solve that problem&#8221;, with &#8220;linked data&#8221; meaning &#8220;the data we&#8217;ve already got expressed in RDF&#8221;, with a worrying ignorance/disregard for what good data actually entails in the 21st century systems environment.</p>
<br />Filed under: <a href='http://bibwild.wordpress.com/category/general/'>General</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bibwild.wordpress.com/1969/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bibwild.wordpress.com/1969/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bibwild.wordpress.com/1969/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bibwild.wordpress.com/1969/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/bibwild.wordpress.com/1969/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bibwild.wordpress.com/1969/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/bibwild.wordpress.com/1969/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bibwild.wordpress.com/1969/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bibwild.wordpress.com/1969/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bibwild.wordpress.com/1969/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bibwild.wordpress.com/1969/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bibwild.wordpress.com/1969/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bibwild.wordpress.com/1969/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bibwild.wordpress.com/1969/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1969&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://bibwild.wordpress.com/2012/01/23/an-inside-scoop-on-harvard-library-reorg/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jrochkind</media:title>
		</media:content>
	</item>
		<item>
		<title>Popular press on ebooks on libraries</title>
		<link>http://bibwild.wordpress.com/2012/01/17/popular-press-on-ebooks-on-libraries/</link>
		<comments>http://bibwild.wordpress.com/2012/01/17/popular-press-on-ebooks-on-libraries/#comments</comments>
		<pubDate>Wed, 18 Jan 2012 01:13:22 +0000</pubDate>
		<dc:creator>jrochkind</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://bibwild.wordpress.com/?p=1966</guid>
		<description><![CDATA[I posted a few days ago about my worries that publisher unwillingness to allow library ebook lending (made possible by the fact that publishers have more legal right to block such activities than with print) imperils the future of public &#8230; <a href="http://bibwild.wordpress.com/2012/01/17/popular-press-on-ebooks-on-libraries/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1966&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I posted a few days ago about my worries that publisher unwillingness to allow library ebook lending (made possible by the fact that publishers have more legal right to block such activities than with print) <a href="http://bibwild.wordpress.com/2011/12/25/why-a-shift-to-ebooks-imperils-libraries/">imperils the future of public lending libraries. </a></p>
<p>I worry that there isn&#8217;t enough patron education on this issue. Patrons need to know that it&#8217;s publishers standing in the way, not library traditionalism or incompetence (well, there might be some of that too).</p>
<p>I was heartened to see a popular press article highlighting publisher resistance to library ebook lending, and the barriers publishers put in place. I hope this starts getting more coverage (and wish the ALA&#8217;s advocacy and popular education wings would work on it; what&#8217;s the ALA for, anyway?)</p>
<p><a href="http://www.washingtonpost.com/local/as-demand-for-e-books-soars-libraries-struggle-to-stock-their-virtual-shelves/2012/01/13/gIQAkIOXzP_story.html">As demand for e-books soars, libraries struggle to stock their virtual shelves. By Christian Davenport, Published: January 14 . Washington Post.</a></p>
<p>And in a very related topic, an Amazon press release (<a href="http://www.mediabistro.com/ebooknewser/kindle-authors-who-lend-books-in-library-see-26-higher-sales_b19377">blogged and analyzed here</a>) suggests that making a title available through the Kindle lending program increases ebook sales for that title compared to if it were not available for lending, as well as resulting in royalties from Amazon&#8217;s library program.  Perhaps the publishers don&#8217;t need to be scared of library lending?</p>
<p>Of course, Amazon (as well as perhaps the publishers), would like to see an Amazon-controlled platform take control with no intermediation by pesky non-profit public libraries.  And with a new per-use royalty payment model. (which the US First Sale Doctrine makes unenforceable for print, but not ebooks).  Remember, not-for-profit libraries (public, academic, and sometimes special use)  are pretty much the <em>only</em> institutions in the publishing chain/universe, whose only interest is the benefit of their patrons/customers, rather than squeezing as much profit as possible out of their customers.</p>
<br />Filed under: <a href='http://bibwild.wordpress.com/category/general/'>General</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bibwild.wordpress.com/1966/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bibwild.wordpress.com/1966/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bibwild.wordpress.com/1966/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bibwild.wordpress.com/1966/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/bibwild.wordpress.com/1966/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bibwild.wordpress.com/1966/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/bibwild.wordpress.com/1966/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bibwild.wordpress.com/1966/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bibwild.wordpress.com/1966/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bibwild.wordpress.com/1966/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bibwild.wordpress.com/1966/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bibwild.wordpress.com/1966/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bibwild.wordpress.com/1966/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bibwild.wordpress.com/1966/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1966&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://bibwild.wordpress.com/2012/01/17/popular-press-on-ebooks-on-libraries/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jrochkind</media:title>
		</media:content>
	</item>
		<item>
		<title>web app security</title>
		<link>http://bibwild.wordpress.com/2012/01/12/web-app-security/</link>
		<comments>http://bibwild.wordpress.com/2012/01/12/web-app-security/#comments</comments>
		<pubDate>Thu, 12 Jan 2012 17:58:50 +0000</pubDate>
		<dc:creator>jrochkind</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://bibwild.wordpress.com/?p=1963</guid>
		<description><![CDATA[I just discovered the Rails Security Guide, which is actually a pretty darn good intro text to web application security issues and attack vectors, whether you work in rails or not. (In fact, there are some places which don&#8217;t contain &#8230; <a href="http://bibwild.wordpress.com/2012/01/12/web-app-security/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1963&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I just discovered the <a href="http://guides.rubyonrails.org/security.html">Rails Security Guide</a>, which is actually a pretty darn good intro text to web application security issues and attack vectors, whether you work in rails or not.</p>
<p>(In fact, there are some places which don&#8217;t contain useful Rails content I&#8217;d expect it to, it seems to <em>mostly</em> be a general text!  The chapter on HTML Injection oddly doesn&#8217;t mention Rails 3.x auto-escaping in ERB &lt;%= %&gt;, and #html_escape, etc. )</p>
<p>But anyhow, recommended if you want to brush up on your knowledge of categories of attacks and types of defenses for web apps.</p>
<br />Filed under: <a href='http://bibwild.wordpress.com/category/general/'>General</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bibwild.wordpress.com/1963/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bibwild.wordpress.com/1963/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bibwild.wordpress.com/1963/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bibwild.wordpress.com/1963/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/bibwild.wordpress.com/1963/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bibwild.wordpress.com/1963/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/bibwild.wordpress.com/1963/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bibwild.wordpress.com/1963/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bibwild.wordpress.com/1963/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bibwild.wordpress.com/1963/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bibwild.wordpress.com/1963/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bibwild.wordpress.com/1963/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bibwild.wordpress.com/1963/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bibwild.wordpress.com/1963/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1963&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://bibwild.wordpress.com/2012/01/12/web-app-security/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jrochkind</media:title>
		</media:content>
	</item>
		<item>
		<title>mobile and control</title>
		<link>http://bibwild.wordpress.com/2012/01/12/mobile-and-control/</link>
		<comments>http://bibwild.wordpress.com/2012/01/12/mobile-and-control/#comments</comments>
		<pubDate>Thu, 12 Jan 2012 14:48:59 +0000</pubDate>
		<dc:creator>jrochkind</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://bibwild.wordpress.com/?p=1961</guid>
		<description><![CDATA[The nytimes allows you to read only 20 articles a month by direct browsing (unlimited for articles you follow from links from another site, presumably implemented by checking the http referer). It is quite easy for a user to get &#8230; <a href="http://bibwild.wordpress.com/2012/01/12/mobile-and-control/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1961&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>The nytimes allows you to read only 20 articles a month by direct browsing (unlimited for articles you follow from links from another site, presumably implemented by checking the http referer).</p>
<p>It is quite easy for a user to get around this. For instance, with a simple javascript bookmarklet that deletes or modifies the cookies the site uses to track how many views you&#8217;ve had.</p>
<p>Being a programmer, I started thinking of ways the nytimes site could try defend against this. Right now it has no defenses at all. I thought of possible defenses that would at least require much more complicated javascript, and possibly ways that would require an actual browser plugin (say, to modify an spoof the Referer header) to defeat.</p>
<p>The nytimes doesn&#8217;t seem too interested in this game of cat and mouse, their defenses haven&#8217;t changed much since it was deployed. Perhaps because it&#8217;s enough that many/most users are &#8216;honest&#8217;, and because they realize that unless they change their usage policies to be much more locked down (perhaps requiring a login to view any articles at all, if not ending the lack of limits from external referrers), it will always be possible to defeat.</p>
<h3>Mobile lockdown</h3>
<p>But then I also thought of iOS.  I haven&#8217;t checked to see if the bookmarklet approach to delete cookies works on iOS. It is possible to install clickable js bookmarklets on iOS (iPhone or iPad) Mobile Safari, although it&#8217;s a pain, requiring either <a href="http://www.stone.com/___?javascript:window.location=%27twit://%27+window.location">manual copy-paste/editing of JS code</a>, or <a href="http://helpdesk.lastpass.com/bookmarklets/#Installing+Bookmarklets">syncing with your desktop safari bookmarks</a>.  It&#8217;s accessible to many fewer users than saving a bookmarklet on a desktop device.</p>
<p>It is <strong>not</strong> possible to spoof Referer headers on an iPad or an iPhone.</p>
<p>Unlike a desktop computer where you can install any software you want (including, say,  an open source browser with a feature to spoof referers, or a browser that takes plugins, and a plugin that does this), on iOS you can only install software approved by Apple.</p>
<p>[Unless you 'jailbreak' your device, which at least <a href="http://www.wired.com/threatlevel/2010/07/feds-ok-iphone-jailbreaking/">temporarily for the moment is not actually illegal</a> (Apple would surely like it to be, does it surprise you that it quite likely would be without the special exemption from the Librarian of Congress?), but is something that typical users won't want to do, for various reasons.]</p>
<p>The App Store rules prohibit any alternate non-Safari/built-in-Webkit browsers.  Apple <a href="http://www.opera.com/press/releases/2010/04/13/">sometimes</a> approves alternate browsers &#8212; only when they <a href="http://www.tuaw.com/2011/07/11/opera-mini-for-ios-updated-to-6-0-1/">use the built in Webkit. </a> I am confident that part of the approval process for any app that involves a browser component is ensuring that it doesn&#8217;t let users do &#8216;untoward&#8217; things like spoof referer headers or other parts of an http request.</p>
<p>The reasons for these restrictions are not just (or even mostly) about a consistent UI experience. They are about making sure websites that want to have DRM-like restrictions like the nytimes (or netflix, or hulu), have those restrictions be airtight on the iOS.  (These restrictions implemented by a <em>website</em> may or may not technically be &#8216;DRM&#8217;, under the DMCA etc. The actual implementation by the website <em>probably</em> is not, although it serves the same ends as DRM. The restrictions on the device itself or it&#8217;s built in software to try to keep you from an end-run around the website&#8217;s implementation probably would count as DRM, thus the LoC&#8217;s specific exemption for jailbreaking your phone).</p>
<p>The nytimes may or may not have yet implemented paywall protection that is impossible to get around on an iPhone.  But hulu already has. You can&#8217;t watch hulu on an iPhone for free, although you can on a desktop.  If the iPhone were a platform that gave users control, it would be easy to install a browser or browser plugin that hid from the hulu servers the fact that it was an iPhone.</p>
<p>But instead, the iPhone is a platform where users can only install software that Apple approves, and Apple&#8217;s policies and approval processes are in part designed to protect and enforce content provide restrictions.  Note that not all content owner technical restrictions simply enforce the law &#8212; <a href="http://arstechnica.com/tech-policy/news/2009/05/reminder-from-the-mpaa-drm-trumps-your-fair-use-rights.ars">DRM keeps users from doing things that would be legal, for fair use or other reasons, too. </a></p>
<p>A future where most people have a mobile device as their <em>main</em> or <em>only</em> web browsing computer seems quite plausible.  If the iOS &#8216;closed-shop&#8217; platform model becomes prevalent (as also seems quite plausible, as it&#8217;s been quite succesful &#8212; and I wouldn&#8217;t be shocked to see larger form factor non-mobile OSs adopt this model too, perhaps the Apple desktop app store is an exploratory shot) &#8212; <strong>This could be the end of the era where computer owners have the freedom to install whatever they want on their computers, and the beginning of an era where computer owners can only install what the platform vendors say they can install.  </strong>And their permission to install will be subject to their own business models and interests, and the business models and interests of their business partners.  This is not a welcome course.</p>
<p><em>(Note the paucity of open source software on the iOS app store &#8212; can anyone find me any examples?  I don&#8217;t think the app store rules actually prohibit open source, but the nature of the ecosystem discourages it or makes it less attractive to developers for several reasons. It&#8217;s pretty difficult to hack on a fork of an open source project for iOS, let alone distribute your mods to others.)</em></p>
<br />Filed under: <a href='http://bibwild.wordpress.com/category/general/'>General</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bibwild.wordpress.com/1961/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bibwild.wordpress.com/1961/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bibwild.wordpress.com/1961/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bibwild.wordpress.com/1961/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/bibwild.wordpress.com/1961/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bibwild.wordpress.com/1961/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/bibwild.wordpress.com/1961/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bibwild.wordpress.com/1961/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bibwild.wordpress.com/1961/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bibwild.wordpress.com/1961/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bibwild.wordpress.com/1961/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bibwild.wordpress.com/1961/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bibwild.wordpress.com/1961/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bibwild.wordpress.com/1961/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1961&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://bibwild.wordpress.com/2012/01/12/mobile-and-control/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jrochkind</media:title>
		</media:content>
	</item>
		<item>
		<title>Re-introducing Umlaut, Again</title>
		<link>http://bibwild.wordpress.com/2012/01/03/re-introducing-umlaut-again/</link>
		<comments>http://bibwild.wordpress.com/2012/01/03/re-introducing-umlaut-again/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 22:13:10 +0000</pubDate>
		<dc:creator>jrochkind</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://bibwild.wordpress.com/?p=1956</guid>
		<description><![CDATA[An alpha release of Umlaut 3.0 is now available. Umlaut is an &#8220;open source front-end for a link resolver&#8221;, or: Umlaut is a just-in-time aggregator of &#8220;last mile&#8221; specific citation services, taking input as OpenURL, and providing an HTML UI &#8230; <a href="http://bibwild.wordpress.com/2012/01/03/re-introducing-umlaut-again/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1956&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>An alpha release of Umlaut 3.0 is now available.</p>
<p>Umlaut is an &#8220;open source front-end for a link resolver&#8221;, or:</p>
<blockquote><p>Umlaut is a just-in-time aggregator of &#8220;last mile&#8221; specific citation services, taking input as OpenURL, and providing an HTML UI as well as an api suite for embedding Umlaut services in other applications.</p></blockquote>
<p>What the heck does this mean? <a href="https://github.com/team-umlaut/umlaut/wiki/What-is-Umlaut-anyway">Read more.</a></p>
<p>The 3.0 release of Umlaut will not add any new features, but instead modernizes Umlaut&#8217;s architecture to be based on Rails 3.1+ as an engine gem, and work on modern ruby versions. Lots of unsupported cruft was also removed from the codebase. (Umlaut actually began as a Rails 1.x application!).</p>
<p>Why this matters to you is that Umlaut should be easier to install and maintain than it ever was before. See <a href="https://github.com/team-umlaut/umlaut/wiki/Installation">Installation/Getting Started instructions. </a></p>
<p>This is still an alpha release at present. It likely has some not yet discovered bugs, missing features, or performance issues. But it should be much easier to work with than Umlaut 2.x, if you are looking to get started with Umlaut, definitely start with the 3.x alpha.  Alpha tester feedback very welcome, please let me know of any difficulties you have with it, suggestions, questions, etc.</p>
<p>Umlaut 3.x source code is available in the <a href="https://github.com/team-umlaut/umlaut/tree/umlaut3dev">umlaut3dev branch in the github project</a> (eventually it will move to master).</p>
<br />Filed under: <a href='http://bibwild.wordpress.com/category/general/'>General</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bibwild.wordpress.com/1956/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bibwild.wordpress.com/1956/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bibwild.wordpress.com/1956/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bibwild.wordpress.com/1956/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/bibwild.wordpress.com/1956/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bibwild.wordpress.com/1956/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/bibwild.wordpress.com/1956/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bibwild.wordpress.com/1956/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bibwild.wordpress.com/1956/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bibwild.wordpress.com/1956/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bibwild.wordpress.com/1956/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bibwild.wordpress.com/1956/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bibwild.wordpress.com/1956/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bibwild.wordpress.com/1956/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1956&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://bibwild.wordpress.com/2012/01/03/re-introducing-umlaut-again/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jrochkind</media:title>
		</media:content>
	</item>
		<item>
		<title>Why a shift to ebooks imperils libraries</title>
		<link>http://bibwild.wordpress.com/2011/12/25/why-a-shift-to-ebooks-imperils-libraries/</link>
		<comments>http://bibwild.wordpress.com/2011/12/25/why-a-shift-to-ebooks-imperils-libraries/#comments</comments>
		<pubDate>Sun, 25 Dec 2011 16:36:35 +0000</pubDate>
		<dc:creator>jrochkind</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://bibwild.wordpress.com/?p=1950</guid>
		<description><![CDATA[It isn&#8217;t because libraries can&#8217;t figure out, technically, how to loan out ebooks. It&#8217;s because publishers don&#8217;t want them to, and may be able to prevent it. A shift to ebooks has been predicted for a while, and seems to be &#8230; <a href="http://bibwild.wordpress.com/2011/12/25/why-a-shift-to-ebooks-imperils-libraries/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1950&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>It isn&#8217;t because libraries can&#8217;t figure out, technically, how to loan out ebooks. It&#8217;s because publishers don&#8217;t <em>want</em> them to, and may be able to prevent it.</p>
<p>A shift to ebooks has been predicted for a while, and seems to be happening. I&#8217;ve talked to many people who wonder why their public libraries don&#8217;t offer more ebooks they can download on their e-reader of choice, assuming it&#8217;s because the public libraries don&#8217;t want to, or are not technically competent to. The first is, i think, definitely no longer true &#8212; libraries want to. The second, technical competence, may be a barrier, but it&#8217;s not the prime one.</p>
<p>The prime barrier is that publishers by and large don&#8217;t <em>want</em> libraries to. I don&#8217;t think most library patrons realize the threat to libraries here &#8212; I think it&#8217;s high-time library organizations like the ALA start educating them. Most people like public libraries and want them to continue; a public that realizes they may be threatened will be more likely to support policy to make them do so, and that&#8217;s what&#8217;s needed.</p>
<p>With a print book, a library can buy a book and loan it to as many borrowers as they like, without any permission from the publisher at all. In the US, the right to do this is protected by the <a href="http://en.wikipedia.org/wiki/First-sale_doctrine">first sale doctrine. </a></p>
<p>That does not apply to ebooks. I do not have the right to buy an ebook and loan it out again. I need the publisher&#8217;s permission &#8212; I may also need enabling technology to make it possible, vs Digital Rights Management that actively seeks to prevent it (and the DMCA which makes it illegal to violate that DRM technology).  A publisher can charge dearly for that permission, or withhold it entirely. With a print book, a publisher might still be worried that being able to borrow for free from a library can hurt sales &#8212; but they can&#8217;t do anything about it. With an ebook, they can do something about it, the balance of powers has shifted tectonically in favor of publishers.</p>
<p>Here&#8217;s a recent new york times article about this battle between publishers and libraries: <a href="http://www.nytimes.com/2011/12/25/business/for-libraries-and-publishers-an-e-book-tug-of-war.html">Publishers vs. Libraries: An E-Book Tug of War</a></p>
<p>Here&#8217;s an account by <a href="http://code4lib.org/node/426">Patrick Berry of California State University Chico on the difficulties in running a kindle lending program. </a>  Patrick investigates the feasibility of loaning out actual physical kindles loaded with titles purchased by the library &#8212; this used to be somewhat feasible, but recently Amazon made technical changes that require a purchased title to be registered to a <em>particular</em> kindle device when purchased, and only readable on that device. Actually, to be fair, Amazon allows up to <em>six</em> devices to be registered for a title. But if a library wants to purchase more than six physical kindle devices, then a given title they purchase they can only load on six of them, unless they buy multiple copies. Note that this isn&#8217;t only six <em>at once</em> , it&#8217;s only six specific physical devices, pretty much ever.</p>
<p>What if you instead of loaning out actual physical kindles, a library wanted to loan out kindle titles for patrons to load on their own kindles?  Well, that same restriction makes it impossible for a library to simply buy the book normally at a normal rate and loan it out themselves directly to patrons (as libraries do with print books).  Now, you may have heard that<a href="http://overdrive.com/News/OverDrive-and-Amazon-launch-Kindle-compatibility-with-Library-eBooks"> Amazon recently announced a program with Overdrive to support library lending.</a> The details of this program are vague and don&#8217;t seem available on the open internet. It seems likely to me that not <em>every</em> title available for kindle is in the Overdrive library program, probably only titles that publishers opted in to. (Compare to ordinary print books, where a library can buy any book at all and lend it out).  Likewise, it seems likely that libraries <em>pay</em> more over the lifetime of use for a kindle Overdrive title than they would for a print title. I don&#8217;t know what the library pricing model is here, and would be very very curious if anyone does &#8212; does a library pay an up front &#8216;purchase&#8217; fee, is it more than the usual kindle purchase fee? Does the library pay a per-checkout fee as well?  (something a library does <em>not</em> do with a print book, and there&#8217;d be no way for a publisher to require it).</p>
<p>Libraries can offer ebooks, unlike print books, only at the sufferance of publishers, and publishers may charge whatever they like for this &#8216;privilege&#8217;. Publishers, not liking the idea of libraries much, are not providing that permission in some cases, and are providing pricing models in other cases which make it much more expensive for a library to offer an ebook than a print book.  If reader preferences continue to shift to ebooks as we expect, we may very well see the end of libraries as book lending institutions. (That&#8217;s of course not all a library does, and they may continue in other roles). <strong>Not </strong>because patrons don&#8217;t want to borrow ebooks from a library same as they did print ebooks, <span style="color:#000000;"><strong>not</strong> because libraries don&#8217;t want to loan ebooks or can&#8217;t figure out the technology, <strong>but</strong> because publishers simply don&#8217;t want it to happen, and our laws give them the right to prevent it. </span></p>
<br />Filed under: <a href='http://bibwild.wordpress.com/category/general/'>General</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bibwild.wordpress.com/1950/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bibwild.wordpress.com/1950/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bibwild.wordpress.com/1950/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bibwild.wordpress.com/1950/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/bibwild.wordpress.com/1950/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bibwild.wordpress.com/1950/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/bibwild.wordpress.com/1950/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bibwild.wordpress.com/1950/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bibwild.wordpress.com/1950/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bibwild.wordpress.com/1950/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bibwild.wordpress.com/1950/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bibwild.wordpress.com/1950/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bibwild.wordpress.com/1950/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bibwild.wordpress.com/1950/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1950&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://bibwild.wordpress.com/2011/12/25/why-a-shift-to-ebooks-imperils-libraries/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jrochkind</media:title>
		</media:content>
	</item>
		<item>
		<title>Overviews of commercial library discovery products</title>
		<link>http://bibwild.wordpress.com/2011/12/21/overviews-of-commercial-library-discovery-products/</link>
		<comments>http://bibwild.wordpress.com/2011/12/21/overviews-of-commercial-library-discovery-products/#comments</comments>
		<pubDate>Wed, 21 Dec 2011 16:03:58 +0000</pubDate>
		<dc:creator>jrochkind</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://bibwild.wordpress.com/?p=1942</guid>
		<description><![CDATA[Library Journal has a very useful article with case studies of four commercial library-sector &#8220;discovery interface&#8221; layers.  Four sections written by librarians at institutions implementing each of four products: EBSCO EDS (Amanda Clay Powers, Mississippi State University) OCLC WorldCat (Zinthia &#8230; <a href="http://bibwild.wordpress.com/2011/12/21/overviews-of-commercial-library-discovery-products/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1942&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Library Journal has a very useful article with case studies of four commercial library-sector &#8220;discovery interface&#8221; layers.  Four sections written by librarians at institutions implementing each of four products:</p>
<ul>
<li>EBSCO EDS (Amanda Clay Powers, Mississippi State University)</li>
<li>OCLC WorldCat (Zinthia C. Briceño-Rosales, Washington State University) [Haven't figured out if this is the WorldCat Local product, or simply the free-to-any-OCLC-member use of worldcat.org]</li>
<li> Ex Libris Primo (Rebecca Fernandez, Midwestern State University), and</li>
<li>Serial Solutions Summon (Ken Varnum, University of Michigan).</li>
</ul>
<p><a href="http://reviews.libraryjournal.com/2011/12/reference/discovering-what-works-librarians-compare-discovery-interface-experiences/">Discovering What Works: Librarians Compare Discovery Interface Experiences</a></p>
<p>A very useful overview of what&#8217;s out there, why institutions are choosing these products, and what their experiences are.</p>
<p>One negative critique I have is that, like many such articles, these are kind of short on people sharing the <em>negatives, </em>what didn&#8217;t work as expected, what they wished worked better, what they could have done differently.  Surely any product and any implementation process has some negatives too. I think people are still too reluctant to admit that not everything went perfectly (nothing ever does), that there were unexpected c consequences of choices made by the library (there always are) or to criticize their vendors in public (library customer/vendor relationships are kind of sado-masochistic).  But making informed decisions requires knowing upsides and downsides, things that worked and things that didn&#8217;t, and we provide tremendous value to our community when we share the full picture. Still, just sharing the experiences as they are in this article is still a great step, we need more of this.</p>
<p><em>Thanks to local colleague Agnes Flannery-Denner  for alerting me to this article. </em></p>
<p><strong>update: </strong>(15:33) Ken Chad on the Code4Lib listserv draws our attention to  <a href="http://helibtech.com/Discovery">The Higher Education Library Technology (HELibTech) wiki &#8216;Discovery&#8217; entry</a> with some actual compare and contrast between products. Although it seems to me to mostly just be marketting brochure text for the commercial products. Still useful to have em all in one place, I guess.</p>
<p>And Peter Murray tells about the <a href="https://sites.google.com/site/urd2comparison/home/comparison">Unified Resource Discovery Comparison chart</a> on Google Docs.</p>
<p>Neither of these resources look all that useful to me, honestly.</p>
<br />Filed under: <a href='http://bibwild.wordpress.com/category/general/'>General</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bibwild.wordpress.com/1942/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bibwild.wordpress.com/1942/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bibwild.wordpress.com/1942/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bibwild.wordpress.com/1942/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/bibwild.wordpress.com/1942/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bibwild.wordpress.com/1942/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/bibwild.wordpress.com/1942/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bibwild.wordpress.com/1942/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bibwild.wordpress.com/1942/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bibwild.wordpress.com/1942/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bibwild.wordpress.com/1942/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bibwild.wordpress.com/1942/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bibwild.wordpress.com/1942/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bibwild.wordpress.com/1942/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1942&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://bibwild.wordpress.com/2011/12/21/overviews-of-commercial-library-discovery-products/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jrochkind</media:title>
		</media:content>
	</item>
		<item>
		<title>Bad news on patent protection of the obvious</title>
		<link>http://bibwild.wordpress.com/2011/12/21/bad-news-on-patent-protection-of-the-obvious/</link>
		<comments>http://bibwild.wordpress.com/2011/12/21/bad-news-on-patent-protection-of-the-obvious/#comments</comments>
		<pubDate>Wed, 21 Dec 2011 13:58:19 +0000</pubDate>
		<dc:creator>jrochkind</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://bibwild.wordpress.com/?p=1939</guid>
		<description><![CDATA[&#8230;A federal agency ruled on Monday that a set of important features commonly found in smartphones are protected by an Apple patent, a decision that could force changes in how Google’s Android phones function&#8230;. &#8230;For example, the case decided Monday involves the technology that lets &#8230; <a href="http://bibwild.wordpress.com/2011/12/21/bad-news-on-patent-protection-of-the-obvious/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1939&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<blockquote><p>&#8230;A federal agency ruled on Monday that a set of important features commonly found in smartphones are protected by an <a title="More information about Apple Incorporated" href="http://topics.nytimes.com/top/news/business/companies/apple_computer_inc/index.html?inline=nyt-org">Apple</a> patent, a decision that could force changes in how <a title="More information about Google Inc" href="http://topics.nytimes.com/top/news/business/companies/google_inc/index.html?inline=nyt-org">Google</a>’s <a title="More articles about Android (Operating System)." href="http://topics.nytimes.com/top/reference/timestopics/subjects/a/android/index.html?inline=nyt-classifier">Android</a> phones function&#8230;.</p>
<p>&#8230;For example, the case decided Monday involves the technology that lets you tap your finger once on the touch screen to call a phone number that is written inside an e-mail or text message. It also involves the technology that allows you to schedule a calendar appointment, again with a single tap of the finger, for a date mentioned in an e-mail.</p></blockquote>
<p><a href="http://www.nytimes.com/2011/12/20/technology/apple-wins-partial-victory-on-patent-claim-over-android-features.html?ref=technology">http://www.nytimes.com/2011/12/20/technology/apple-wins-partial-victory-on-patent-claim-over-android-features.html?ref=technology</a></p>
<p>&#8220;Clicking&#8221; (tapping) on a phone number is a novel idea protected by an apple patent?</p>
<blockquote><p>&#8230;Apple applied for one of the patents at issue in the HTC case — for detecting phone numbers and other forms of data — in 1996, 11 years before the iPhone was released&#8230;.</p></blockquote>
<p>I wonder if Skype is currently paying Apple royalties for use of essentially the same idea in their browser plugin, or if the patent is somehow unique to mobile, or to &#8220;tap&#8221; instead of &#8220;click&#8221;.</p>
<p>The routine granting of patents for techniques that would be obvious to any software engineer confronted with a particular context of technological &#8216;affordances&#8217; is deeply harmful to software innovation, competition, and freedom.</p>
<br />Filed under: <a href='http://bibwild.wordpress.com/category/general/'>General</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bibwild.wordpress.com/1939/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bibwild.wordpress.com/1939/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bibwild.wordpress.com/1939/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bibwild.wordpress.com/1939/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/bibwild.wordpress.com/1939/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bibwild.wordpress.com/1939/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/bibwild.wordpress.com/1939/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bibwild.wordpress.com/1939/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bibwild.wordpress.com/1939/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bibwild.wordpress.com/1939/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bibwild.wordpress.com/1939/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bibwild.wordpress.com/1939/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bibwild.wordpress.com/1939/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bibwild.wordpress.com/1939/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1939&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://bibwild.wordpress.com/2011/12/21/bad-news-on-patent-protection-of-the-obvious/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jrochkind</media:title>
		</media:content>
	</item>
		<item>
		<title>Q: best practices for *simple* contributor IP/licensing management for open source?</title>
		<link>http://bibwild.wordpress.com/2011/12/14/practices-for-simple-contributor-management/</link>
		<comments>http://bibwild.wordpress.com/2011/12/14/practices-for-simple-contributor-management/#comments</comments>
		<pubDate>Wed, 14 Dec 2011 22:14:42 +0000</pubDate>
		<dc:creator>jrochkind</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://bibwild.wordpress.com/?p=1934</guid>
		<description><![CDATA[So, like many non-huge non-corporate-supported open source projects, many of the open source projects I contribute to go something like this (some of which I was original author, others not): Someone starts the project in an publicly accessible repo. If &#8230; <a href="http://bibwild.wordpress.com/2011/12/14/practices-for-simple-contributor-management/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1934&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>So, like many non-huge non-corporate-supported open source projects, many of the open source projects I contribute to go something like this (some of which I was original author, others not):</p>
<ul style="font-size:16px;line-height:24px;">
<li>Someone starts the project in an publicly accessible repo.</li>
<li>If she works for a company, in the best case she got permission with her employer (who may or may not own copyright to code she writes) to release it as open source.</li>
<li>She sticks some open source License file in the repo saying &#8220;copying Carrie Coder&#8221; and/or the the name of the employer.</li>
</ul>
<p style="font-size:16px;line-height:24px;">Okay, so far so good, but then:</p>
<ul>
<li>She adds someone else as a committer, who starts committing code. And/or accepts pull requests on github etc, committing code by other authors.</li>
<li>Never even thinks about licensing/intellectual property issues.</li>
</ul>
<p>What can go wrong?</p>
<ul>
<li> Well, the license file probably still says &#8216;copyright Carrie Coder&#8217; or &#8216;copyright Acme Inc&#8217;, even though the code by other authors has copyright held by <em>them</em> (or their employers). So right away something seems not all on the up and up.</li>
<li>One of those contributors can later be like &#8220;Wait, I didn&#8217;t mean to release that open source, and I own the copyright, you don&#8217;t have my permission to use it, take it out.&#8221;</li>
<li>Or worse, one of the contributors <em>employers</em> can assert they own the copyright and did not give permission for it to be released open source and you don&#8217;t have permission to use it (and neither does anyone else that&#8217;s copied or forked it from you).</li>
</ul>
<p><span style="font-size:small;"><span class="Apple-style-span" style="line-height:24px;">Heavy weight solutions</span></span></p>
<p>So there&#8217;s a really heavy-weight solution to this, like <a href="http://www.apache.org/licenses/icla.txt">Apache Foundation uses in their Contributor License Agreement</a>.  This is something people have to actually print out and sign and mail in. Some agreements like this actually transfer the copyright to some corporate entity, presumably so the project can easily re-license under a different license later. (I thought Apache did this, but apparently not).</p>
<p>This is kind of too much over-head for a simple non-corporate-sponsored open source project. Who&#8217;s going to receive all this mail, and where are they going to keep the contracts? There is no corporate entity to be granted a non-exclusive license to do anything. (And the hypothetical project isn&#8217;t nearly so important or popular to justify trying to get umbrella stewardship from Apache or the <a href="http://sfconservancy.org/overview/">Software Freedom Conservancy</a> or whatever.(If it were, the Software Freedom Conservancy is a good option, but still too much overhead for the dozens of different tiny-to-medium sized projects anyone may be involved in. )</p>
<p>Even so far as individuals, over the life of the project who the committers are may very well change, and not include the original author(s) anymore.</p>
<p>And you don&#8217;t want to make someone print out sign and wait for you to receive something before accepting their commits, that&#8217;s not internet-speed.</p>
<h2>Best practices for a simpler solution that&#8217;s not nothing?</h2>
<p>So doing it &#8216;right&#8217; with that heavy-weight solution is just way too much trouble, so most of us just keep ignoring it.</p>
<p><strong>But is there some lighter-weight better-than-nothing probably-good-enough approach?</strong>  <strong>I am curious if anyone can provide examples, ideally lawyer-vetted examples, of doing this much simpler. </strong></p>
<p>Most of my projects are MIT-style licensed, which already says &#8220;do whatever the heck you want with this code&#8221;, so I don&#8217;t really care about being able to re-license under a different license later (I don&#8217;t think I do? Or maybe even the MIT license would already allow anyone to do that). So I definitely don&#8217;t need  and can&#8217;t really can&#8217;t handle paper print-outs.</p>
<p>I&#8217;m imagining something where each contributor/accepted-pull-request-submitter basically just puts a digital file in the repo, once,  that says something like &#8220;All the code I&#8217;ve contributed to this repo in past or future, I have the legal ability to release under license X, and I have done so.&#8221; And then I guess in the License file, instead of saying &#8216;copyright Original Author&#8217;, it would be like &#8216;copyright by various contributors, see files in ./contributors to see who.&#8217;</p>
<p>Does something along those lines end up working legally, or is it worthless, no better than just continuing to ignore the problem, so you might as well just continue to ignore the problem?  Or if it is potentially workable, does anyone have examples of projects using such a system, ideally with some evidence some lawyer has said it&#8217;s worthwhile, including a lawyer-vetted digital contributor agreement (that is itself licensed such that someone else can re-use it, ha)?</p>
<p>Any ideas?</p>
<br />Filed under: <a href='http://bibwild.wordpress.com/category/general/'>General</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bibwild.wordpress.com/1934/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bibwild.wordpress.com/1934/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bibwild.wordpress.com/1934/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bibwild.wordpress.com/1934/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/bibwild.wordpress.com/1934/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bibwild.wordpress.com/1934/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/bibwild.wordpress.com/1934/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bibwild.wordpress.com/1934/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bibwild.wordpress.com/1934/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bibwild.wordpress.com/1934/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bibwild.wordpress.com/1934/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bibwild.wordpress.com/1934/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bibwild.wordpress.com/1934/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bibwild.wordpress.com/1934/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1934&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://bibwild.wordpress.com/2011/12/14/practices-for-simple-contributor-management/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jrochkind</media:title>
		</media:content>
	</item>
		<item>
		<title>JQuery-UI css and images, and Rails Asset Pipeline</title>
		<link>http://bibwild.wordpress.com/2011/12/08/jquery-ui-css-and-images-and-rails-asset-pipeline/</link>
		<comments>http://bibwild.wordpress.com/2011/12/08/jquery-ui-css-and-images-and-rails-asset-pipeline/#comments</comments>
		<pubDate>Thu, 08 Dec 2011 19:11:41 +0000</pubDate>
		<dc:creator>jrochkind</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://bibwild.wordpress.com/?p=1920</guid>
		<description><![CDATA[tl;dr version For Rails 3.1 (3.1.3 is the latest release as I write this). If you have JQuery-UI CSS generated by the theme roller, say for the &#8216;cupertino&#8217; theme. One option is exploding the contents a bit, put the `jquery-ui-1.8.16.custom.css` &#8230; <a href="http://bibwild.wordpress.com/2011/12/08/jquery-ui-css-and-images-and-rails-asset-pipeline/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1920&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h2>tl;dr version</h2>
<p>For Rails 3.1 (3.1.3 is the latest release as I write this).</p>
<p>If you have JQuery-UI CSS generated by the <a href="http://jqueryui.com/themeroller/">theme roller</a>, say for the &#8216;cupertino&#8217; theme. One option is exploding the contents a bit, put the <code>`jquery-ui-1.8.16.custom.css`</code> file <em>directly</em>  at ./app/assets/stylesheets/jquery-ui-1.8.16.custom.css, and put the corresponding jquery-ui theme ./images subdir <em>directly</em> at <code>`./app/assets/stylesheets/images.`</code>  (Or ./vendor/assets or ./lib/assets). Now just include the .css file in your application.css, &#8220; *= require jquery-ui-1.8.16.custom.css &#8220;.</p>
<p>If <em>instead</em> you really do want to leave the JQuery-UI theme source in it&#8217;s own subdir by itself, say at <code>`./app/assets/stylesheets/jquery-ui/cupertino`</code> (or ./vendor/assets or ./lib/assets), then you&#8217;ve got to add this to your config/application.rb, matching the file path you&#8217;ve chosen to put it at:</p>
<pre>initializer :after_append_asset_paths,
            :group =&gt; :all,
            :after =&gt; :append_assets_path do
   config.assets.paths.unshift Rails.root.join("app", "assets", "stylesheets", "jquery-ui", "cupertino").to_s
end</pre>
<p>Your JQuery-UI theme images will now work, both in standard development config, standard production, as well as other combinations of asset piepline configuration.  Works well as far as I can tell in Rails 3.1.3, probably will continue working in the future. (can put in ./vendor/assets or ./lib/assets  instead of ./app/assets, same thing).</p>
<p>For more info and a couple <em>other</em> options, read on.</p>
<h2>The problem</h2>
<p>The <a href="https://github.com/indirect/jquery-rails">jquery-rails gem</a>, which is added to a new app&#8217;s Gemfile by default in rails 3.1, comes with JS for JQuery-UI.  You can include JQuery-UI JS just by adding this to your application.js:</p>
<pre>//= require jquery-ui</pre>
<p>Okay, but what about the JQuery-UI theme, which is CSS and some images referenced by that CSS?  The jquery-rails README kind of unhelpfully suggests:</p>
<blockquote><p>In order to use the themed parts of jQuery UI, you will also need to supply your own theme CSS. See <a href="http://jqueryui.com/">jqueryui.com</a> for more information.</p></blockquote>
<p>Okay, but if you do this the most straightforward way, you&#8217;ll find out it doesn&#8217;t work. I download a theme, say for the theme &#8216;cupertino&#8217;, and I get a zipfile <code>`jquery-ui-1.8.16.custom.zip`</code>.  Inside there, is a ./css directory.</p>
<p>Okay, I take this ./css directory and actually rename it into my app, say at: <code>`./app/assets/stylesheets/jquery-ui`</code>.  (Can put it in ./vendor/assets too, or even ./lib/assets, all will have the same outcome).</p>
<p>So now inside my local <code>`./app/assets/stylesheets/jquery-ui`</code>, I&#8217;ve got <code>`./cupertino`</code>, <code>`./cupertino/jquery-ui-1.8.16.custom.css`</code>, and <code>`./cupertino/images`</code></p>
<p>So I go into my ./app/assets/application.css, and add:</p>
<pre>*= require jquery-ui/cupertino/jquery-ui-1.8.16.custom.css</pre>
<p>Start up my app, with some JQuery-UI code activated, and everything works fine in standard &#8216;development&#8217; mode configuration. But in &#8216;production&#8217; mode, with pre-compiled assets, none of the JQuery-UI theme images show up. (Which in some cases degrades usably but not as aesthetic, in other cases is a usability problem like lack of a &#8216;close&#8217; button on a dialog).</p>
<p>What happened? Well, when compiled under sprockets, the contents of jquery-ui-1.8.16.custom.css is actually combined into the application.css file, which lives at the <strong>URL</strong> (for an app mounted at host root URL): `<code>/assets/application.css</code>`.   But that JQuery-UI CSS contains relative URLs to image assets, of the form `<code>url(images/something.png)</code>`</p>
<p>And relative to `<code>/assets/application.css</code>`, that means `<code>/assets/images/something.png</code>`.  But sprockets <em>actually</em> compiled the images to <em>file path</em> `<code>./public/assets/jquery-ui/cupertino/images/something.png</code>`, where it&#8217;ll be at <em>url</em> `<code>/assets/jquery-ui/cupertino/images/something.png</code>`  Not the right place for the CSS.</p>
<p>If I look around on the web for solutions to this, you get a lot of conflicting and confusing answers, perhaps because they were written for different versions of the asset pipeline (inc. some pre-release versions).  I&#8217;m not even going to link you to the various reddits, stackoverflows, etc, because it&#8217;s just too confusing and depressing. The most popular one seems to involve making symbolic links in your source. Come on really? Symbolic links, that tend to go wrong if you don&#8217;t do things perfectly when zipping up your source or copying it to another place or on Windows? I figured there&#8217;s got to be a better way.</p>
<p>In fact, I&#8217;m going to give you not just one alternate/better way, but four (count them, one, two, three, <em>four</em>) alternate/better ways.  Well, that&#8217;s kind of a lie, I&#8217;ll give you <strong>two</strong> better way that actually work with the asset pipeline, and two more that don&#8217;t use the pipeline for jquery-ui theme, but you can still use in your app that otherwise uses the pipeline.  For typical cases, any of em could work, but weird cases (say, wanting to have more than one theme available at runtime) each has trade-offs.</p>
<h2>One way that works with the pipeline, take apart the subdir structure</h2>
<p>Just take the files out of the jquery-ui generated directory stucture, and  put `<code>jquery-ui-1.8.16.custom.css</code>` <em>directly </em> at ./app/assets/stylesheets/jquery-ui-1.8.16.custom.css, and put the corresponding jquery-ui theme ./images subdir _directly_ at `<code>./app/assets/stylesheets/images.</code>`</p>
<p>(Or put em in ./vendor/assets or ./lib/assets, will work identically in any of those. Maybe vendor is best, I dunno).</p>
<p>Now in your application.css, just</p>
<pre> *= require jquery-ui-1.8.16.custom.css</pre>
<p>Now the relative paths in the CSS will resolve correctly <em>both</em> with and without pre-compiled assets, as well as even with `<code>config.assets.debug = false</code>` in dev.</p>
<p>Great, that&#8217;s pretty simple. I have to admit I didn&#8217;t think of this until I had spent quite a bit of time figuring out the next way, which will work with whatever subdirectory structure you want. Hey, maybe you really want to keep the subdir structure to keep your jquery-ui theme stuff nicely segregated. Or maybe you just want to learn a bit more about how Rails and <a href="https://github.com/sstephenson/sprockets">Sprockets </a>work. Then read, on.</p>
<h2>Second way that works with the pipeline, whatever subdirs you want</h2>
<p>So maybe you really still want to keep your jquery-ui theme all nicely grouped together in a subdir,  `<code>./(app|vendor|lib)/assets/stylesheets/jquery-ui/themename</code>`.  Just cause it&#8217;s tidier, or becuase you need multiple themes installed in your source (although that latter gets trickier).</p>
<p>First I thought, okay, well, maybe we can just add `<code>./app/vendor/assets/stylesheets/themename</code>`  to config.assets.paths in application.rb, now we&#8217;re telling sprockets to treat that as a &#8216;base&#8217; dir, and compile the stuff (images in this case) in there directly to ./public/assets without the parent dirs, keeping the relative paths working.</p>
<p>Turns out I was on the right track, but that doesn&#8217;t work. Because  it turns out the <em>order</em> of paths matters to the Sprockets device that compiles assets. And Rails insists on adding ./(app|lib|vendor)/assets to the paths <em>before</em> anything you add yourself in config.assets.paths .  And Sprockets will then compile your stuff at <em>that</em> path, and when it sees a different subsequent path that also matches those same files, Sprockets is smart enough to know it already compiled that stuff from the previous path, and not compile it again.  So your addition to config.assets.paths of a <em>subdir</em> of one of the paths listed earlier essentially does nothing.</p>
<p>Turns out the place Rails insists on adding it&#8217;s own default paths <em>first</em> is in an <a href="https://github.com/rails/rails/blob/v3.1.3/railties/lib/rails/engine.rb#L542">append_assets_path initializer. </a>   (Yes, despite the name &#8220;append_&#8221;, it actually <em>prepends</em> em with Array#unshift. Maybe it used to append but was changed to prepend to fix some other desired behavior?). Okay, great, the Rails 3.x initializer framework let&#8217;s us hook in <em>right after</em> Rails does this, to put what <em>we</em> want first in config.assets.paths instead.</p>
<p>Say we have our jquery-ui theme at `<code>./vendor/assets/stylesheets/jquery-ui/cupertino</code>`.  Add that path to the <em>beginning</em> of config.assets.paths, even before the stuff Rails prepended, by putting this in your config/application.rb:</p>
<pre>initializer :after_append_asset_paths,
            :group =&gt; :all,
            :after =&gt; :append_assets_path do
   config.assets.paths.unshift Rails.root.join("vendor", "assets", "stylesheets", "jquery-ui", "cupertino").to_s
end</pre>
<p>This works, to get the theme css&#8217;s relative URLs to images working,  in default (as installed by Rails) development mode asset config. It works in default production mode asset config, with precompiled assets.  It even works in development mode but with `<code>config.assets.debug = false</code>`. Each of these setups winds up with different ways of serving assets and potentially different path relationships between assets, but this works in every combo I tried. (Some of them probably work because config.assets.paths, depending on assets config, is sometimes used to create <em>routing</em> to assets too).</p>
<p>Will this keep working in the future? I dunno, I&#8217;m not <em>technically</em> using any internal API or anything, but I doing something not documented or popular, and counting on internal implementation not changing <em>that</em> much, the :append_assets_path initiailizer remaining there and named the same and used in the same way, etc. Guess it depends on how much Rails changes, like usual.</p>
<h3>How the heck did I figure that out</h3>
<p>I was not previously familiar with the inner workings of Sprockets or the Rails 3.1 asset pipeline. Instead, figuring that out took me about 5 hours of iteratively doing a bunch of this stuff:</p>
<ul>
<li>Looking at source code for both Rails and Sprockets in like 6 open tabs of github source, trying to understand how they are interacting where.</li>
<li>Using github search function (wish it worked better), or grep&#8217;ing through checked out source to try and figure out where a particular method or module or class is defined. (Rails, why do you namespace classes in Rails source with ::Sprockets , fooling me into thinking I&#8217;d find em in Sprockets source? Couldn&#8217;t you have namespaced em Rails::Sprockets instead?)</li>
<li>Using ruby-debug to investigate live source, and put breakpoints at Rails or Sprockets source lines to investigate em there. One reason to investigate is to figure out what the heck class a given variable is (Rails.application.assets anyone?). Another trick I like to do is drop into debug, call #freeze on an object, continue, and then wait for the stacktrace to figure out exactly who/where tried to modify that object next. (It is a travesty that ruby 1.9.3 does not work with ruby-debug, a travesty I say)</li>
<li>Looking at the Rails <a href="http://guides.rubyonrails.org/configuring.html">config</a> and <a href="http://guides.rubyonrails.org/asset_pipeline.html">asset pipeline</a> guides to try and understand at least the big picture design.</li>
<li>Googling for hints from other people, or sometimes just hints as to what source file a particular method was actually defined in when I was having trouble finding it.</li>
<li>Wash, rinse, repeat, do these steps in a different order, go down blind alleys and realize that and backtrack in my investigation, etc.</li>
</ul>
<p>Rails 3.x is <em>really complicated</em> code. Composed of multiple independent decoupled modules which interact with each other in complicated ways, occasionally even monkey-patching each other. (And Sprockets, would it kill you to add some one-two liner rdoc-style comments above your methods and classes, even non-public ones, telling the reader what they do?)</p>
<p>On the other hand, 4-6 hours ain&#8217;t that much time for getting to the bottom of fairly complicated functionality. And the solution I arrived at is fairly tidy, Rails 3.x is designed/factored pretty nicely these days to support surgical interventions (thanks Rails for just modifying config.assets.path <em>once</em> in an initiailizer instead of hard-coding it into the places Rails.application.assets is init&#8217;d and routes are init&#8217;d), and the 3.x initializer chain system is pretty sweet. (But Rails can&#8217;t decide whether to use strings or symbols for initializer names, it uses both, but you need to match the form used originally for the initializer :after or :before stuff. Grr.)</p>
<h2>Third way, why host the theme yourself at all?</h2>
<p>If you are taking a stock JQuery-UI theme and not customizing it at all, did you know that the Google ajax/open source tools CDN hosts all the stock JQuery-UI themes? (Although it&#8217;s not documented well, they&#8217;re there).  Why host it yourself at all, just link to the Google CDN. Sure it&#8217;ll be one more browser request since you haven&#8217;t combined the jquery-ui CSS into your application.css with the pipeline, but just <em>one</em> more request, to the Google CDN which is presumably relatively reliable and high performance, to save you the trouble of dealing with this crap or hosting it yourself at all?</p>
<p>Put in your layout:</p>
<pre>&lt;%= stylesheet_link_tag "http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/themes/cupertino/jquery-ui.css" %&gt;</pre>
<p>Replace &#8216;cupertino&#8217; with whatever theme you want. Some legacy versions of themes also available, replace &#8220;1.8.16&#8243; with &#8220;1.7.2&#8243; for instance.</p>
<p>Or, do an import in your application.css instead:</p>
<pre>@import url(<a href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/themes/cupertino/jquery-ui.css">http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/themes/cupertino/jquery-ui.css</a>)</pre>
<p>It&#8217;ll still be an extra browser request, but it seems pleasant to keep all your CSS stuff, internal and external,  in your application.css, rather than splitting some of it out to the layout and then getting confused later.  CSS @import seems to be supported in all non-ancient browsers including IE6.</p>
<h2>Fourth way, host it but skip the asset pipeline</h2>
<p>Just cause you&#8217;re using the Rails 3.1 asset pipeline doesn&#8217;t mean you have to use it for <em>all</em> your assets. The <a href="http://guides.rubyonrails.org/asset_pipeline.html">Rails asset pipeline guide</a> even says:</p>
<blockquote><p>This is not to say that assets can (or should) no longer be placed in <tt>public</tt>; they still can be and will be served as static files by the application or web server. You would only use <tt>app/assets</tt> if you wish your files to undergo some pre-processing before they are served.</p></blockquote>
<p>While we don&#8217;t really want any pre-processing of the source itself, if we just put the assets into public we do give up a couple things. We&#8217;d give up combining the CSS itself into assets.css to save a browser request (no big deal to save a headache in this special case, sez me. I ain&#8217;t running netflix here.) And we&#8217;d give up the cache-busting fingerprinting (again, seems tolerable to me &#8212; you aren&#8217;t going to be changing your jquery-ui theme very often, when you do, just make the changed theme a new theme in a new directory location in ./public, seems okay to me for most cases).</p>
<p>Now, the rails asset pipeline guide says you <em>can</em> do this, but it ends up being a pain, because when you have the asset pipeline turned on, you don&#8217;t have any helper methods anymore to generate URLs to assets in ./public, all the helper methods assume they&#8217;ll want an asset-pipeline-controlled asset. (Unless there&#8217;s a helper method I can&#8217;t find somewhere? Come on Rails, if you&#8217;re going to tell us it&#8217;s an option, can&#8217;t you support us doing it?)</p>
<p>You could I suppose just write hard-coded literal URLs &#8212; but that breaks if you are deploying an app at a sub-dir of your webserver, as Rails supports, and as I like to be able to do sometimes.</p>
<p>Okay, so create your own helper method, here you go, stick it in a helper somewhere:</p>
<pre># Much like usual rails route helpers,
# whether you realized it or not, you can pass
# option :only_path =&gt; false to get a
# full URL instead of a
# relative path.
 def public_static_path(path, options = nil)
   root_path(options) + path
 end</pre>
<p>Now stick the jquery-UI theme at ./public/jquery-ui/cupertino, and in your layout:</p>
<pre>&lt;%= stylesheet_link_tag public_static_path("jquery-ui/cupertino/jquery-ui-1.8.16") %&gt;</pre>
<p>It&#8217;s not in the asset pipeline, but no problem.</p>
<p>What if you want to stick it in application.css with an &#8220;@import&#8221; instead? Make it into application.css.erb so we can use ERB to call out to a helper to generate the URL&#8230; Oops, again we run into the problem of having no way to generate the URL to the asset in public.  A helper method you add to your usual app helpers isn&#8217;t available in an erb asset. Yeah, there is a way to monkey-patch helpers into the asset context too, but I went down that path and it started getting more complicated there were a couple other tricks, so I just gave up. Oh well.</p>
<h2>The end</h2>
<p>The end. Any improvements, feedback, alternate methods, welcome. I wasn&#8217;t actually finding <em>any</em> of these suggestions on google myself (maybe i&#8217;m just a bad googler), so hopefully having em here now will make it easier for others trying to figure out what&#8217;s going on. Symbolic links, geez, you don&#8217;t have to do that.</p>
<br />Filed under: <a href='http://bibwild.wordpress.com/category/general/'>General</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bibwild.wordpress.com/1920/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bibwild.wordpress.com/1920/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bibwild.wordpress.com/1920/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bibwild.wordpress.com/1920/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/bibwild.wordpress.com/1920/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bibwild.wordpress.com/1920/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/bibwild.wordpress.com/1920/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bibwild.wordpress.com/1920/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bibwild.wordpress.com/1920/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bibwild.wordpress.com/1920/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bibwild.wordpress.com/1920/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bibwild.wordpress.com/1920/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bibwild.wordpress.com/1920/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bibwild.wordpress.com/1920/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1920&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://bibwild.wordpress.com/2011/12/08/jquery-ui-css-and-images-and-rails-asset-pipeline/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jrochkind</media:title>
		</media:content>
	</item>
		<item>
		<title>journo-hacking</title>
		<link>http://bibwild.wordpress.com/2011/11/29/journo-hacking/</link>
		<comments>http://bibwild.wordpress.com/2011/11/29/journo-hacking/#comments</comments>
		<pubDate>Wed, 30 Nov 2011 04:41:10 +0000</pubDate>
		<dc:creator>jrochkind</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://bibwild.wordpress.com/?p=1909</guid>
		<description><![CDATA[The center’s own records — kept in a restricted section of its Web site, but found by The New York Times in an unsecured archived version of the site&#8230; http://www.nytimes.com/2011/11/30/us/politics/gingrich-gave-push-to-clients-not-just-ideas.html &#160; The internet version of going through the garbage for &#8230; <a href="http://bibwild.wordpress.com/2011/11/29/journo-hacking/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1909&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<blockquote><p>The center’s own records — kept in a restricted section of its Web site, but found by The New York Times in an unsecured archived version of the site&#8230;</p></blockquote>
<p><a href="http://www.nytimes.com/2011/11/30/us/politics/gingrich-gave-push-to-clients-not-just-ideas.html">http://www.nytimes.com/2011/11/30/us/politics/gingrich-gave-push-to-clients-not-just-ideas.html</a></p>
<p>&nbsp;</p>
<p>The internet version of going through the garbage for unshredded papers?  Somehow it reminds me of wikileaks too, so many journalistic information sources these days are effectively disintermediated <em>information</em> sources, not even people. (Not to discount the heroic intermediation of Bradley Manning).</p>
<br />Filed under: <a href='http://bibwild.wordpress.com/category/general/'>General</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bibwild.wordpress.com/1909/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bibwild.wordpress.com/1909/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bibwild.wordpress.com/1909/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bibwild.wordpress.com/1909/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/bibwild.wordpress.com/1909/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bibwild.wordpress.com/1909/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/bibwild.wordpress.com/1909/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bibwild.wordpress.com/1909/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bibwild.wordpress.com/1909/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bibwild.wordpress.com/1909/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bibwild.wordpress.com/1909/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bibwild.wordpress.com/1909/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bibwild.wordpress.com/1909/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bibwild.wordpress.com/1909/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1909&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://bibwild.wordpress.com/2011/11/29/journo-hacking/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jrochkind</media:title>
		</media:content>
	</item>
		<item>
		<title>loosely coupled components, developer joy, and dependency hell</title>
		<link>http://bibwild.wordpress.com/2011/11/29/ruby-joy-hell-dependencies/</link>
		<comments>http://bibwild.wordpress.com/2011/11/29/ruby-joy-hell-dependencies/#comments</comments>
		<pubDate>Tue, 29 Nov 2011 18:03:19 +0000</pubDate>
		<dc:creator>jrochkind</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://bibwild.wordpress.com/?p=1904</guid>
		<description><![CDATA[The ruby open source community&#8217;s behavior makes two choices with interesting consequences: The ruby open source community tries very hard to never re-write what someone else has written, instead composing gems and applications out of smaller pieces of de-coupled re-usable &#8230; <a href="http://bibwild.wordpress.com/2011/11/29/ruby-joy-hell-dependencies/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1904&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>The ruby open source community&#8217;s behavior makes two choices with interesting consequences:</p>
<ol>
<li>The ruby open source community tries very hard to never re-write what someone else has written, instead composing gems and applications out of smaller pieces of de-coupled re-usable code. People try to share their code in composable decoupled pieces, and people try to write code using such pieces.</li>
<li>The ruby open source community strongly prefers innovation to stability, spending a lot more energy on improving things to be cooler, easier, faster, better &#8212; than on providing backwards compatibility or supporting old code.</li>
</ol>
<p>I think both of these are actually consequences of a couple other very related things:</p>
<ol>
<li>The ruby community is <em>very</em> volunteer-collaboration driven. Most code is not written by people being paid specifically to write <em>that</em> code.   Although lots of code is written by people who are using it for work they get paid for, relatively little code is written by people who have writing <em>that</em> code, as open source,  as an assigned task. (Compare to Java open source community).  Most ruby open source code is a labor of love (for the code, for the other developers you are sharing with).</li>
<li>The ruby community cares a lot about &#8216;developer joy&#8217;. Going back to <a href="http://whynotwiki.com/Ruby_/_About">matz&#8217;s original intention for rub</a>y: &#8220;Ruby is designed to make programming not only easy but also fun&#8221;.  But this is also related to the point above &#8212; a mostly volunteer developer community only happens when developing is fun, and the more fun something is, the more likely there will be sufficient volunteer developer capacity to accomplish it.</li>
</ol>
<p>Likewise, a mostly volunteer developer community kind of <em>needs</em> to develop based on loosely coupled small units developed by other people, to get anything done. We need to absolutely maximize our efficiency, because we don&#8217;t have armies of programmers getting paid to write what we need, we&#8217;ve got to take maximum advantage of what we&#8217;ve got.</p>
<p>But there&#8217;s a downside. Dependency hell.  When your product is built from dependencies on a bunch of things written by other people (and each of those has it&#8217;s <em>own</em> dependencies) &#8212; <em>and especially</em> when everything is constantly changing as people try to make things better, caring less about backwards compat and stability &#8212; it means things can be  constantly breaking.</p>
<p>After having spent a few years writing production ruby/rails code now, and still working at the same place where I wrote that code &#8212; I lately spend a <em>huge</em> amount of time <em>upgrading</em> my stuff to work with new versions of dependencies, or abandoning one now not-sufficiently-maintained dependency for another, etc.</p>
<p>Each <a href="http://bibwild.wordpress.com/2011/11/29/from-hpricot-to-nokogiri/">individual upgrade may not be that hard</a>, but they add up. It&#8217;s a huge portion of my time these days. And this is <strong>not</strong> a very joyful state, running on the treadmill just to stay in place instead of creating awesome new things. Ironically, optimizing for developer joy in the upstream dependencies (those developers don&#8217;t find it joyful to work on backwards-compat or refrain from releasing new ways of doing things because it&#8217;ll require people to change) &#8212; has made the joy of the downstream developer <em>using</em> all those dependencies very non-optimal.</p>
<p>Another interesting example is the way the recent Rails release had to <em>downgrade</em> sprockets to fix a regression. Rails too is built from a bunch of building blocks many developed by others (it always was to some extent, but Rails 3.0 pushed it even more in this direction). Which means those dependencies can easily break Rails too.  A <em>minor-version-level </em>release is <a href="http://semver.org/">supposed </a>to be strictly backwards compatible.  But, well, making it reliably so is actually <em>hard to do</em>, it takes time and effort, that isn&#8217;t as fun as adding cool new stuff, and takes developer resources that an all-volunteer project simply may not have.</p>
<p>So Rails ends up having to release a <a href="http://weblog.rubyonrails.org/2011/11/20/rails-3-1-3-has-been-released">3.1.3 release of Rails that requires sprockets 2.0.3 instead of allowing 2.1.0</a>, because <a href="https://github.com/sstephenson/sprockets/pull/247#issuecomment-2809034">neither the Rails developers nor the sprockets developer(s) have time to figure out what&#8217;s really going on</a>. (And it&#8217;s not very joyful work to do so!).  But someone&#8217;s probably going to have to do that eventually, Rails can&#8217;t stay at an old version of sprockets forever, because there will be bugfixes and improvements that Rails and<a href="https://github.com/sstephenson/sprockets/issues/238#issuecomment-2652244"> it&#8217;s users want</a> &#8212; or because Rails users will want to use a gem that has a dependency on a more recent version of (eg) sprockets.</p>
<p>There&#8217;s no magic answer to this issue that I know of. No &#8220;if only people would do this&#8221; or &#8220;if only we had this.&#8221;  Before bundler, there was a tooling gap. But bundler <em>greatly</em> improves things, giving you the right control over your dependencies when you&#8217;ve got a complicated dependency tree. But it doesn&#8217;t really solve the problem.  And I would <em>not</em> prefer if the ruby community went to another extreme of focusing on stability and maintenance and backwards compatibility at the expense of awesome code. Ideally for me, I guess, more open source ruby developers would start moderating more toward the stability/maintenance direction, which I think has started to happen a bit, as more mature and legacy ruby code is out there and the ruby community gets bigger.</p>
<p>In my own projects though, I&#8217;ve realized that assembling small re-useable de-coupled components is <em>not</em> always more efficient &#8212; whether the small pieces are developed by me or someone else.  Yeah, you saved some initial time not re-inventing the wheel, but that time can easily be lost debugging component interactions when something goes wrong, patching dependencies, arguing with developers of dependencies on whether the change you need to support your use is really the right one for the dependency, etc.  Sometimes it really is more efficient to build and maintain your own more tightly coupled wheel.</p>
<br />Filed under: <a href='http://bibwild.wordpress.com/category/general/'>General</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bibwild.wordpress.com/1904/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bibwild.wordpress.com/1904/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bibwild.wordpress.com/1904/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bibwild.wordpress.com/1904/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/bibwild.wordpress.com/1904/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bibwild.wordpress.com/1904/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/bibwild.wordpress.com/1904/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bibwild.wordpress.com/1904/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bibwild.wordpress.com/1904/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bibwild.wordpress.com/1904/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bibwild.wordpress.com/1904/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bibwild.wordpress.com/1904/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bibwild.wordpress.com/1904/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bibwild.wordpress.com/1904/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1904&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://bibwild.wordpress.com/2011/11/29/ruby-joy-hell-dependencies/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jrochkind</media:title>
		</media:content>
	</item>
		<item>
		<title>from Hpricot to nokogiri</title>
		<link>http://bibwild.wordpress.com/2011/11/29/from-hpricot-to-nokogiri/</link>
		<comments>http://bibwild.wordpress.com/2011/11/29/from-hpricot-to-nokogiri/#comments</comments>
		<pubDate>Tue, 29 Nov 2011 16:17:24 +0000</pubDate>
		<dc:creator>jrochkind</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://bibwild.wordpress.com/?p=1902</guid>
		<description><![CDATA[At one time Hpricot, originally by the famous _why, was the most widely-used post-REXML html/xml parsing solution in ruby.  These days nokogiri has eclipsed it (for various reasons), but I had some old code that was still using Hpricot (and some &#8230; <a href="http://bibwild.wordpress.com/2011/11/29/from-hpricot-to-nokogiri/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1902&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>At one time <a href="https://github.com/hpricot/hpricot">Hpricot</a>, originally by the famous _why, was the most widely-used <a href="http://enfranchisedmind.com/blog/posts/rexml-dynamic-typing-lose/">post-REXML</a> html/xml parsing solution in ruby.  These days <a href="https://github.com/tenderlove/nokogiri">nokogiri </a>has eclipsed it (for various reasons), but I had some old code that was still using Hpricot (and some people just starting out might &#8216;accidentally&#8217; use Hpricot still; you probably don&#8217;t want to, because&#8230;)</p>
<p>Until now. Hpricot conflicts with Rails 3.1 &#8212; both of them monkey patch a #<code>to_xs</code> method into String, but they have conflicting semantics/arrity. (This goes to show this is probably a bad technique for a gem to use, and we could consider them both at fault, but as the biggest gorilla in the match, I don&#8217;t expect Rails to blink and change, esp when hpricot isn&#8217;t so popular anymore anyway).</p>
<p>This manifests as a `ArgumentError: wrong number of arguments (1 for 0)` error when you have hpricot gem loaded in Rails 3.1, and you try to use Rails (XML) &#8216;builder&#8217; or call the #to_xml method on an ActiveRecord. (Hpricot redefined the #to_xs method differently than Rails expected it).</p>
<p>I wouldn&#8217;t necessarily call Hpricot &#8216;abandoned&#8217;, at the time of this writing it&#8217;s got a <a href="https://github.com/hpricot/hpricot/commits/master">regular commit history </a>, mostly nicksieger committing pull requests from outside developers.  However, there aren&#8217;t any comments from nicksieger or any other maintainers/committers on the <a href="https://github.com/hpricot/hpricot/issues/53">ticket for this particular #to_xs Rails 3.1 conflict issue</a>, filed two months ago.  It appears hpricot no longer has a developer community with the interest/capacity in dealing with this issue, anyhow.</p>
<h2>From Hpricot to Nokogiri</h2>
<p>So switching from Hpricot to Nokogiri is not too bad, Hpricot  is <em>mostly</em> api-compatible with nokogiri.</p>
<p>One difference that I ran into right away, and you might too, is how they handle xpaths from node objects.</p>
<pre> 
&lt;root&gt;
 &lt;parent&gt;
   &lt;child&gt;
     &lt;grandchild&gt;
     &lt;/grandchild&gt;
   &lt;/child&gt;

   &lt;child&gt;
   &lt;/child&gt;
  &lt;/parent&gt;

  &lt;parent&gt;
  &lt;/parent&gt;
&lt;/root&gt;

hp_parent = Hpricot::XML(xml).at("//parent")
nk_parent = Nokogiri::XML(xml).at("//parent")</pre>
<p>Now, if we do an xpath on the ruby object representing parent that begins with &#8220;/&#8221;, Hpricot interprets the xpath in a context where current node is considered root, but nokogiri still interprets the xpath in the context of the entire document, even though you&#8217;re calling it on a particular node.</p>
<pre>3 : hp_parent.at('/child')
==&gt; &lt;child&gt;

4 : nk_parent.at('/child')
==&gt; nil

5 : hp_parent.at('/root/parent')
==&gt; nil

6 : nk_parent.at('/root/parent')
==&gt; &lt;parent&gt;</pre>
<p>They&#8217;ll both behave the same, starting from current node, if you leave out the initial &#8216;/&#8217;.</p>
<pre>7 : hp_parent.at('child')
==&gt; &lt;child&gt;

8 : nk_parent.at('child')
==&gt; &lt;child&gt;</pre>
<p>You might think you could use &#8220;./child&#8221; too, xpath-style. You can in nokogiri, and it does the same thing. But Hpricot is broken with respect to &#8220;./&#8221; xpaths, no matter what comes after &#8220;./&#8221;, Hpricot will return the starting node.</p>
<pre>11 : hp_parent.at("./child")
==&gt; &lt;parent&gt;

12 : nk_parent.at("./child")
==&gt; &lt;child&gt;

13 : hp_parent.at("./child/grandchild")
==&gt; &lt;parent&gt;

14 : nk_parent.at("./child/grandchild")
==&gt; &lt;grandchild&gt;

15 : hp_parent.at("./child/wrong")
==&gt; &lt;parent&gt;

16 : nk_parent.at("./child/wrong")
==&gt; nil</pre>
<p><a href="https://gist.github.com/1405370">Here&#8217;s a little test script</a> I used to demonstrate all this, which also demonstrates a cool hacky technique to write such demonstration scripts which output the code and result.</p>
<h2>Special Hpricot xpath predicates</h2>
<p>Continuing to find things that break when switching from hpricot to nokogiri (there aren&#8217;t _exactly_ api compatible), I&#8217;ll try to continue documenting em.</p>
<p>Hpricot supports some custom things in Xpath, that nokogiri does not. See &#8220;Supported Predicates, but differently&#8221; on <a href="https://github.com/hpricot/hpricot/wiki/Supported-XPath-Expressions">https://github.com/hpricot/hpricot/wiki/Supported-XPath-Expressions</a> .</p>
<p>For instance, i was using the &#8220;:eq(n)&#8221; one. For that one at least, nokogiri seems to supports the standard xpath predicate just fine: &#8220;[n+1]&#8221; (hpricot&#8217;s custom one is 0-based, actual xpath is 1-based indexing)</p>
<br />Filed under: <a href='http://bibwild.wordpress.com/category/general/'>General</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bibwild.wordpress.com/1902/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bibwild.wordpress.com/1902/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bibwild.wordpress.com/1902/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bibwild.wordpress.com/1902/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/bibwild.wordpress.com/1902/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bibwild.wordpress.com/1902/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/bibwild.wordpress.com/1902/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bibwild.wordpress.com/1902/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bibwild.wordpress.com/1902/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bibwild.wordpress.com/1902/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bibwild.wordpress.com/1902/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bibwild.wordpress.com/1902/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bibwild.wordpress.com/1902/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bibwild.wordpress.com/1902/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1902&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://bibwild.wordpress.com/2011/11/29/from-hpricot-to-nokogiri/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jrochkind</media:title>
		</media:content>
	</item>
		<item>
		<title>writing good API&#8217;s</title>
		<link>http://bibwild.wordpress.com/2011/11/20/writing-good-apis/</link>
		<comments>http://bibwild.wordpress.com/2011/11/20/writing-good-apis/#comments</comments>
		<pubDate>Sun, 20 Nov 2011 18:43:09 +0000</pubDate>
		<dc:creator>jrochkind</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://bibwild.wordpress.com/?p=1895</guid>
		<description><![CDATA[Library vendor-provided software, as well as library-data-focused websites,  have started to offer API&#8217;s. But many of these API&#8217;s tend to, well, not be very good. Difficult to use, designed for specific pre-planned use cases instead of flexibly exposing functionality, sometimes &#8230; <a href="http://bibwild.wordpress.com/2011/11/20/writing-good-apis/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1895&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Library vendor-provided software, as well as library-data-focused websites,  have started to offer API&#8217;s. But many of these API&#8217;s tend to, well, not be very good. Difficult to use, designed for specific pre-planned use cases instead of flexibly exposing functionality, sometimes not behaving as documented, with poor support (try filing a support ticket with one of our content platform vendors regarding an API issue; count how many hours you have to spend to escalate your ticket to someone who has any idea what you&#8217;re talking about).</p>
<p>To be fair, designing a good API is hard (meaning &#8216;expensive&#8217; in developer/designer time if nothing else), and while being able to say you have an API seems to have become neccesary for marketting your product, it&#8217;s unclear how many customers will actually use that API, and whether having an actual good API will get you more business. Of course, there&#8217;s a chicken and egg thing here too; the better designed and supported an API is, the more likely it will be used.  But, like with many aspects of software development, if you really want a good API, you&#8217;ve got to have experienced capable people developing it &#8212; with input from potential users, but you can&#8217;t expect potential users/customers to design it for you, or expect you&#8217;ll wind up with something good if you just do exactly what a couple customers ask for.</p>
<p><a href="http://omgbloglol.com/post/12971574299/attention-api-provider-how-to-make-people-using-your">Anyhow, here&#8217;s a brief blog post with some principles of good API design. </a> Vendors serious about providing a good API would do well to think about these issues.</p>
<p>Interestingly, one of the examples in the article is from the library domain, I am curious what experience the blog author has working in this market &#8212; and I can guess what legacy back-end poor architecture leads to the particular issue he hints at, and makes it difficult to provide a good API.  From the provider&#8217;s point of view, it is definitely difficult to provide a good API on top of poorly architected software.</p>
<br />Filed under: <a href='http://bibwild.wordpress.com/category/general/'>General</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bibwild.wordpress.com/1895/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bibwild.wordpress.com/1895/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bibwild.wordpress.com/1895/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bibwild.wordpress.com/1895/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/bibwild.wordpress.com/1895/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bibwild.wordpress.com/1895/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/bibwild.wordpress.com/1895/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bibwild.wordpress.com/1895/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bibwild.wordpress.com/1895/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bibwild.wordpress.com/1895/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bibwild.wordpress.com/1895/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bibwild.wordpress.com/1895/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bibwild.wordpress.com/1895/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bibwild.wordpress.com/1895/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1895&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://bibwild.wordpress.com/2011/11/20/writing-good-apis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jrochkind</media:title>
		</media:content>
	</item>
		<item>
		<title>search Google Books by ISSN</title>
		<link>http://bibwild.wordpress.com/2011/11/15/search-google-books-by-issn/</link>
		<comments>http://bibwild.wordpress.com/2011/11/15/search-google-books-by-issn/#comments</comments>
		<pubDate>Tue, 15 Nov 2011 19:13:38 +0000</pubDate>
		<dc:creator>jrochkind</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://bibwild.wordpress.com/?p=1891</guid>
		<description><![CDATA[Turns out Google Books does support searching by ISSN, using ordinary fielded search syntax, although I don&#8217;t believe it&#8217;s documented anywhere. Mostly what you&#8217;ll find is digitized bound journals from libraries (that is, digitization of some volumes of the journal, &#8230; <a href="http://bibwild.wordpress.com/2011/11/15/search-google-books-by-issn/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1891&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Turns out Google Books does support searching by ISSN, using ordinary fielded search syntax, although I don&#8217;t believe it&#8217;s documented anywhere.</p>
<p>Mostly what you&#8217;ll find is digitized bound journals from libraries (that is, digitization of some volumes of the journal, probably not all of them, which may or may not have full text access).  Sometimes things that physically look like monographs but are published serially also get ISSNs, you might get some of those too, not sure. Has to be in GBS, and GBS has to have ISSN metadata for the record, not sure how often that happens.</p>
<p><a href="http://www.google.com/search?hl=en&amp;tbo=1&amp;tbm=bks&amp;q=issn%3A0008543X">http://www.google.com/search?hl=en&amp;tbo=1&amp;tbm=bks&amp;q=issn%3A0008543X</a></p>
<p>&nbsp;</p>
<p>with or without hyphen, both seem to work.</p>
<p><a href="http://www.google.com/search?hl=en&amp;tbo=1&amp;tbm=bks&amp;q=issn%3A0098-7484">http://www.google.com/search?hl=en&amp;tbo=1&amp;tbm=bks&amp;q=issn%3A0098-7484</a></p>
<p><a href="http://www.google.com/search?hl=en&amp;tbo=1&amp;tbm=bks&amp;q=issn%3A00987484">http://www.google.com/search?hl=en&amp;tbo=1&amp;tbm=bks&amp;q=issn%3A00987484</a></p>
<p>But don&#8217;t try to put phrase quotes around the value, that (oddly?) doesn&#8217;t work, with or without hyphen.</p>
<p><a href="http://www.google.com/search?hl=en&amp;tbo=1&amp;tbm=bks&amp;q=issn%3A%2200987484%22">http://www.google.com/search?hl=en&amp;tbo=1&amp;tbm=bks&amp;q=issn%3A&#8221;00987484&#8243;</a></p>
<p>&nbsp;</p>
<br />Filed under: <a href='http://bibwild.wordpress.com/category/general/'>General</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bibwild.wordpress.com/1891/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bibwild.wordpress.com/1891/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bibwild.wordpress.com/1891/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bibwild.wordpress.com/1891/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/bibwild.wordpress.com/1891/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bibwild.wordpress.com/1891/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/bibwild.wordpress.com/1891/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bibwild.wordpress.com/1891/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bibwild.wordpress.com/1891/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bibwild.wordpress.com/1891/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bibwild.wordpress.com/1891/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bibwild.wordpress.com/1891/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bibwild.wordpress.com/1891/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bibwild.wordpress.com/1891/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1891&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://bibwild.wordpress.com/2011/11/15/search-google-books-by-issn/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jrochkind</media:title>
		</media:content>
	</item>
		<item>
		<title>Multi-threaded use of Rails ActiveRecord 3.0-3.1</title>
		<link>http://bibwild.wordpress.com/2011/11/14/multi-threading-in-rails-activerecord-3-0-3-1/</link>
		<comments>http://bibwild.wordpress.com/2011/11/14/multi-threading-in-rails-activerecord-3-0-3-1/#comments</comments>
		<pubDate>Mon, 14 Nov 2011 19:31:38 +0000</pubDate>
		<dc:creator>jrochkind</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://bibwild.wordpress.com/?p=1881</guid>
		<description><![CDATA[An old post of mine on threading in Rails continues to get Google traffic, even though it was written about Rails 2.1 and is now terribly outdated. I&#8217;ve recently been updating the application that uses threading with ActiveRecord to 3.0 &#8230; <a href="http://bibwild.wordpress.com/2011/11/14/multi-threading-in-rails-activerecord-3-0-3-1/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1881&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>An <a href="http://bibwild.wordpress.com/2007/08/28/threading-in-rails/">old post</a> of mine on threading in Rails continues to get Google traffic, even though it was written about Rails 2.1 and is now terribly outdated.</p>
<p>I&#8217;ve recently been updating the application that uses threading with ActiveRecord to 3.0 or 3.1, so it&#8217;s time for an update.</p>
<p>The good news is that multi-threaded use of ActiveRecord is in many ways more supported and clearly documented; however, it&#8217;s still tricky writing for multi-threaded concurrency, and there are still some gotchas.  There isn&#8217;t a lot of general overview material on this on google, so I hope this post can be of value, I&#8217;ve tried to provide a general overview of various issues and gotchas.</p>
<p>When I say <em>&#8220;old rails&#8221; </em> I mean Rails/Active Record 2.1, before the introduction of the <a href="http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/ConnectionPool.html">ConnectionPool</a>.  When I say <em>&#8220;new&#8221;</em> or <em>&#8220;current&#8221;</em> Rails, I mean Rails 3.0 or 3.1  In fact, the ConnectionPool was introduced in Rails 2.2, so the general principles may apply starting then, however there have been <a href="https://github.com/rails/rails/commits/master/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb">continual tweaks to ConnectionPool</a> for bugs, robustness, and performance, so using Rails 3.0 or 3.1 is recommended.  Rails 3.2 does not yet exist at time of this writing, and <em>may</em> completely change the game yet again, if <a href="http://tenderlovemaking.com/2011/10/20/connection-management-in-activerecord/">Aaron tenderlove goes forward with his ideas for a major refactor</a>.</p>
<h2>My use case</h2>
<p>I have a Rails app. I do <em>not</em> want/need concurrent request handling. You can enable that with config.threadsafe!, which triggers config.allow_concurrency along with some other config values meant to make concurrency safer. But I&#8217;m not doing that, that&#8217;s not my interest, the usual Rails multi-process scaling model is fine for me.</p>
<p>What I do need though, is to kick off several threads which which will use ActiveRecord. I need to do this <em>within</em> a request-response loop, waiting on each of these threads with Thread#join before returning the response. I also want to kick off some threads that will happen in the &#8216;background&#8217; &#8212; kick off threads in a controller action method, and <em>not</em> wait on them with Thread#join before rendering response. Those &#8216;background&#8217; threads will store results in ActiveRecord, and my web pages poll with AJAX to get updated results from &#8216;background&#8217;.</p>
<p>These threads will be doing a bunch of HTTP calls to third-party servers, and also some ActiveRecord.  Each thread is unique code, each one is a different &#8216;plugin&#8217; for contacting external services via HTTP apis and storing the results in the database. The reason why I want threads here, is so when a thread is waiting on I/O (database, or more likely, a slow HTTP api), it can be scheduled out and another thread can do it&#8217;s thing. The ruby Global Interpreter Lock isn&#8217;t, in theory,  a problem for my case, I&#8217;m fine with a process sticking to a single CPU core, I just need a thread waiting on external HTTP api (or database) to not lock up that CPU core while waiting.</p>
<p>I do need relatively low &#8216;latency&#8217;, I need all these &#8216;foreground&#8217; async-ish tasks to start <em>immediately</em> and finish as fast as they can (sharing a CPU), and I need the &#8216;background&#8217; tasks to also start pretty darn quick. (That is one thing that makes various &#8216;background job&#8217; gems seem unsuitable. Another is that this is an app (soon to be Rails3 engine gem) that is used by third parties, and I&#8217;d really like to avoid requiring extra daemons to be started up other than typical rails app deployment).</p>
<p>So if your use case is at all like mine, this may be helpful to you. If your use case is very different than mine, a non-threaded solution may be better. If you want actual concurrent request handling, then that&#8217;s actually even a bit <em>more</em> complicated than what I&#8217;m describing here, although Rails theoretically supports it, I haven&#8217;t tried it.</p>
<p>My app is working. In fact, it was working even in Rails 2.1, but it works somewhat better in Rails 3. Here&#8217;s what I&#8217;ve discovered:</p>
<h2>Use MRI 1.9.x, not MRI 1.8.x</h2>
<p>MRI 1.8.x uses &#8220;green threads&#8221;, simulated threading entirely within the VM. While it sounds like an okay idea, experience (mine and others) show that ruby 1.8.x green threads behave poorly. Not only is thread-switching kind of expensive, but the threads do not share CPU very well, even with multiple threads waiting for CPU time, one thread could end up holding onto it for a couple seconds without switching out, in mysteriously unpredictable ways.</p>
<p>Ruby 1.9.x uses OS native threads, and the threads should behave more like you expect threads to.</p>
<p>Besides, ruby 1.9.x is the future, <a href="http://redmine.ruby-lang.org/issues/4996">1.8.7 will be end-of-lifed in the medium term</a>, <a href="http://osdir.com/ml/ruby-core/2011-07/msg00191.html">next major rails release will support only 1.9.x</a>, just use 1.9.x.</p>
<p>Yes, even with MRI ruby 1.9.x, there is still the ruby &#8220;global interpreter lock&#8221;, which prevents a single ruby process from taking advantage of multiple CPU cores simultaneously, even with threads.  However, I don&#8217;t think this means &#8220;<a href="http://www.igvita.com/2008/11/13/concurrency-is-a-myth-in-ruby/">concurrency is a myth</a>&#8221; &#8212; there are still many use cases that threading will work for. If a thread is waiting on I/O (an http request, a database call), despite the GIL, ruby should still be able to switch it out and another thread in, returning the first thread to the CPU when it&#8217;s I/O is ready. This is sufficient for my use case, and probably many use cases.  (Note &#8220;should&#8221;, see below on mysql vs mysql2).</p>
<p>jruby may be even better for threading, with possibly less overhead to thread creation and context switching <em>and</em> no GIL. For reasons not yet determined, i can&#8217;t get my app to run under jruby, but it&#8217;s definitely worth considering.</p>
<p>(The GIL does significantly lessen the attraction of using actual concurrent <em>request handling</em> in rails (<a href="http://guides.rubyonrails.org/configuring.html#rails-general-configuration">config.threadsafe!, config.allow_concurrency</a>), which is one of the reasons I don&#8217;t. The multi-process request-handling strategy typically used by rails applications is also quite sufficient for me, I have no problem with it. )</p>
<h2>Use &#8216;mysql2&#8242; adapter, never &#8216;mysql&#8217;</h2>
<p>It turns out the original &#8216;mysql&#8217; adapter would hold on to the ruby global interpreter lock (GIL) even when waiting for a database response. Even with the ruby GIL, in theory when one thread is waiting on a response from database, another thread ought to be switched in. However, the implementation of the &#8216;mysql&#8217; adapter prevented this, making multi-threaded use of ActiveRecord a lot let useful with mysql.</p>
<p>Fortunately, the &#8216;mysql2&#8242; adapter was written, fixing this problem. If planning on using concurrency with ActiveRecord and mysql, always use the &#8216;mysql2&#8242; adapter, never use the &#8216;mysql&#8217; adapter. &#8216;mysql2&#8242; is now the recommended &#8216;standard&#8217; in Rails, although it&#8217;s still called &#8216;mysql2&#8242;, and is a seperate adapter from &#8216;mysql2&#8242;.</p>
<p>If your database is not mysql, you might want to figure out if the ruby/rails database adapter is written in such a way to be concurrency friendly. It took a while for the community to catch on this was a problem with the mysql adapter code, could it still be a problem with other common adapters? I don&#8217;t really know. (It should <em>not</em> be a problem if you are using jruby with JDBC adapters).</p>
<p><a href="https://gist.github.com/1364397">Here is a little test script,</a> cribbed from slide 4 in <a href="http://www.slideshare.net/igrigorik/no-callbacks-no-threads-railsconf-2010">this presentation by Ilya Grigorik</a>. It reveals that &#8216;mysql&#8217; adapter indeed exhibits the behavior Grigork notes; however &#8216;mysql2&#8242; adapter (based on code from Grigorik, I believe), does not &#8212; even using &#8216;mysql2&#8242; adapter, however, we get a total elapsed real time of 2.1 seconds, which is quite a bit more than the 1-second-and-change one would expect.  <strong>Apparently there is still quite a bit of overhead here, </strong>perhaps from thread context switching, or ActiveRecord::ConnectionPool checkout mutex, or the implementation of &#8216;mysql2&#8242; itself,  or something else I am not guessing.<strong> So multi-threaded ActiveRecord database access still may not perform as well as you&#8217;d like. </strong>But it&#8217;s good enough for my purposes, and way better than the pathological &#8216;mysql&#8217; adapter.</p>
<p><em><strong>sqlite3?</strong></em> Probably not. As sqlite3 doesn&#8217;t support SQL &#8220;sleep&#8221; function, this brain-dead script couldn&#8217;t be used to test it, you&#8217;d need an actual slow SQL query I haven&#8217;t had time to set up an environment for.  However, googling leaves me very confused about sqlite3&#8242;s stance toward concurrency even without taking the ruby/rails adapter into account. It may depend on what options sqlite3 was compiled with (no idea what options &#8216;gem install sqlite3&#8242; uses), as well as exactly how the ruby/rails adapters are written. Trying to use multi-threaded ActiveRecord concurrency with sqlite3 is probably not a great idea.</p>
<h2>Pay attention to the ConnectionPool contract</h2>
<p>In all rails, threads can<em> not</em> share ActiveRecord Connection objects &#8212; or share the underlying network connection encapsulated by the Connection object. Each thread needs it&#8217;s own connection to the database.</p>
<p>In Rails 2.1, each thread would end up opening up a <em>new</em> network connection to the database (and you had to take some extreme measures to make sure that connection ended up getting closed when the thread was finished with it). That&#8217;s obviously not great for performance.  If you created lots of threads, you could also end up with a pretty huge number of open network connections to your database.</p>
<p>Current Rails introduces the <a href="http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/ConnectionPool.html">ConnectionPool </a>, which will pool open connections instead.  Even better, the ConnectionPool has a clearly documented &#8216;contract&#8217; for use. <a href="http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/ConnectionPool.html">Pay attention to it in the documentation</a>.</p>
<p>In ordinary Rails code, ActionPack kind of takes care of this all behind the scenes for you. But if you&#8217;re manually creating threads, you&#8217;ve got to think about when/how connections get checked out and checked back in to the ConnectionPool. Seriously, go read the documentation and consider the three methods/strategies it provides.</p>
<p>For manually creating threads in a use case resembling mine, the <a href="http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/ConnectionPool.html#method-i-with_connection">with_connection</a> method seems just right. Make sure all ActiveRecord database access is wrapped in a <em>with_connection</em> block; this will make sure a database connection gets checked out from the pool, then checked back in at end of with_connection block.</p>
<p>Note, the documentation is a bit confusing, but in fact you don&#8217;t really need to deal with the yielded connection directly, you can just do ordinary ActiveRecord actions inside the block:</p>
<pre>ActiveRecord::Base.connection_pool.with_connection do
   m = SomeModel.find(something)
   m.foo = "bar"
   m.save!
   etc
   # and at end of block, connection will be checked
   # back into pool.
end</pre>
<p>Great, not that hard to work with, this is a reasonable API.</p>
<p>Note also that, while the documentation doesn&#8217;t mention it, you <em>can</em> do <a href="http://coderrr.wordpress.com/2009/05/05/activerecords-with_connection-is-now-useful/">nested</a>  <em><a href="https://github.com/rails/rails/blob/c5af3a6759381fab760c89c1c1992255d8a9314e/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb#L182">with_connection </a></em>calls, and still only one connection will be used by the thread, without much extra overhead. This means that if you&#8217;re writing code in a context where you&#8217;re not sure if a parent scope already wrapped in with_connection or used some other means for checkout out a connection &#8212; you can still simply use #with_connection, and it&#8217;ll work fine either way.</p>
<h3>Trick #1: Avoiding accidentally using first strategy</h3>
<p>So you&#8217;ve chosen <a href="http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/ConnectionPool.html">ConnectionPool strategy 3</a>, using the with_connection method for all database activity in your thread.</p>
<p>But what happens if you accidentally execute some database-communicating ActiveRecord logic in a thread outside of a with_connection block? Maybe you just missed a place, but this is also very easy to do because of the way <a href="http://www.spritle.com/blogs/2011/03/17/eager-loading-and-lazy-loading-in-rails-activerecord/">ActiveRecord lazily loads association content</a> and does other kinds of database access &#8220;on demand.&#8221;</p>
<p>If you accidentally trigger some database access outside of a with_connection block, now you&#8217;re using method #1 instead. And a connection will be automatically checked out of the ConnectionPool for you &#8212; and it&#8217;ll never be checked in, unless you do something about it. You&#8217;ll quickly run out of connections.</p>
<p>It would be nice if you could tell ActiveRecord, perhaps on a per-thread basis, <em>not</em> to allow this kind of implicit connection checkout (strategy 1). Here&#8217;s <a href="https://gist.github.com/1364551">a <em>really hacky</em> monkey patch</a> to ActiveRecord to support that. With this monkey patch applied, call ActiveRecord::base.forbid_implicit_checkout_for_thread! from a thread, and if that thread later tries to access an active record connection without explicit checkout (#with_connection, or #checkout), an ImplicitConnectionForbiddenError will be raised.</p>
<p>I don&#8217;t trust this hack enough to use it in production  (I wrote it), but I use it in development/test just to try and find any accidental implicit checkouts. Apply monkey patch, call #forbid_implicit_checkout_for_thread! from each manually created thread, run your tests, you should get an ImplicitConnectionForbiddenError if you&#8217;re accidentally implicitly checking out a connection.</p>
<h3>Trick #2: Clean up any accidental checkouts just in case</h3>
<p>Just in case and out of paranoia, I periodically call:</p>
<pre>ActiveRecord::Base.connection_pool.clear_stale_cached_connections!</pre>
<p>This will look through the open database connection list, and clear any that were associated with Threads that are no longer alive. So if a thread accidentally does check out a connection without checking it in, this will clean it up.  clear_stale_cached_connections! is in theory a bit expensive, <a href="https://github.com/rails/rails/blob/c5af3a6759381fab760c89c1c1992255d8a9314e/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb#L232">as it needs to go through the complete list of threads in the VM to see which threads are still alive. </a> However, it&#8217;s better than leaking connections, and I haven&#8217;t found it to be a problem, there are probably much bigger performance bottlenecks to multi-threaded access to ActiveRecord that make this one a non-issue.</p>
<p>Note that in Rails 2.1, there was advice to call a method #verify_active_connections! to do that same thing. Do <em>not</em> <strong>not</strong> <em> not </em><strong>ever call verify_active_connections! in current Rails</strong>.  <a href="http://coderrr.wordpress.com/2009/01/08/activerecord-threading-issues-and-resolutions/">verify_active_connections! is <em>not</em> thread-safe in current rails. </a> I can tell you from experience that if you do call it while you have multi-threaded ActiveRecord use going on, you will get weird errors, including (for the sake of people Googling, let&#8217;s list em):</p>
<ul>
<li>Mysql2::Error: MySQL server has gone away</li>
<li>Mysql2::Error: Lost connection to MySQL server during query</li>
<li>ActiveRecord::StatementInvalid (Mysql2::Error: Malformed packet</li>
<li>threads and processes hanging in apparent deadlocks of some kind.</li>
<li>Occasionally an actual segmentation fault.</li>
</ul>
<p>I can&#8217;t think of any time you&#8217;d both want to call verify_active_connections! and it would actually be safe to call, I&#8217;m not sure why this method even exists. But perhaps there are use cases I am not thinking of; but they won&#8217;t be when any kind of multi-threaded ActiveRecord use is going on.</p>
<p>If you are seeing errors like this, but you aren&#8217;t using verify_active_connections!, then you&#8217;re probably doing <em>something</em> else that violates ActiveRecord::ConnectionPool&#8217;s contract in a way that two threads end up sharing the same connection (which again, AR is not designed to support).</p>
<p>If I understand things right, you <em>do not</em> want to call clear_active_connections! in an app that makes multi-threaded use of AR.</p>
<h2>Note on ConnectionPool size</h2>
<p>The default ConnectionPool size is 5. You can, however, set it to whatever you&#8217;d like with the &#8220;pool:&#8221; key in your connection dictionary in your database.yml.</p>
<p>You&#8217;ll almost certainly need a larger pool size than that, and may very well need a larger ConnectionPool than you expect. I did.</p>
<p>It <em>seems</em> like if we wrap all our ActiveRecord access in <em>with_connection, </em>we ought to be able to have a lot more active threads than we have connections in the pool.  Each thread will check out a connection just to do it&#8217;s work, and then check it back in.  If a thread needs to work and no connection is available, it&#8217;ll wait for one, and since each thread is just checking out a connection temporarily for a relatively quick database call, it should get a connection long before the <a href="https://github.com/rails/rails/blob/c5af3a6759381fab760c89c1c1992255d8a9314e/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb#L80">5 second timeout</a>.   If you don&#8217;t have quite enough connections, things may slow down with threads spending time waiting for connections, but I wouldn&#8217;t expect a ConnectionTimeoutError, unless you have like a couple orders of magnitude more active threads than connections in the pool.</p>
<p>However, that wasn&#8217;t my experience. With 10 connections in pool and only 20 active threads using ActiveRecord via with_connection, I was still getting ConnectionTimeoutErrors. Why? I am not sure.  Even in ruby 1.9.x, is ruby still terrible at thread context switching, or are ruby mutex&#8217;s used by ConnectionPool#checkout still crazy expensive?   Even following ConnectionPool&#8217;s contract, was I somehow creating a deadlock, which ought not to be possible?  Or is my code accidentally not following the contract correctly somehow?  I really have no idea.  But using 30 or 40 connections in my connection pool seems to be sufficient for 100 or more threads, but 10 connections is not for 20. Although take these exact numbers with a grain of salt, all I can say is you may need more connections than you expect.</p>
<h2>Note on errors raised in a thread</h2>
<p>This is not really ActiveRecord specific, but about ruby threads in general.</p>
<p>If a thread raises an exception, that thread will stop executing, and the exception will be &#8216;lost&#8217; &#8212; until/unless another thread waits on that aborted thread with Thread#join.  When Thread#join is called on a thread that raised an uncaught exception, the Thread#join directive will itself raise. The exception it raises will have the same class as the original exception, but it&#8217;s backtrace will be from the Thread#join call.</p>
<p>This is a bit annoying, you want that backtrace to debug the problem. With my hacky monkey patch for ImplicitConnectionForbiddenError  you really need the backtrace to fix the problem; and I usually want to see the backtrace for a ConnectionTimeoutError too.</p>
<p>To deal with that, I wrap all thread logic in a rescue, and use Thread-storage to store the exception, retrieving it in the &#8216;master&#8217; thread, like so:</p>
<pre>threads = []
1.upto.whatever do
  threads &lt;&lt; Thread.new do
    begin
      # whatever stuff
    rescue Exception =&gt; e
      Thread.current[:exception] = e
    end
  end
end 

threads.each do |thread|
   thread.join
   if thread[:exception]
     # log it somehow, or even re-raise it if you
     # really want, it's got it's original backtrace.
   end
end</pre>
<h2>config.cache_classes</h2>
<p>If you start threads that will keep going after a response is returned from a request-response loop, then you need to set &#8220;config.cache_classes = true&#8221;, even in development.   Rails development-mode class reloading will unload/reload all your reloadable classes at the end/beginning of every request-response loop.  But if you have code still working across request-response loop boundaries, that&#8217;s obviously a problem, a class will get unloaded while a thread is in the middle of trying to do stuff with instances of that class, bad.</p>
<p>So you need to give up on development-mode auto-reloading, and set `config.cache_classes = true` even in development.</p>
<p>If you are starting threads in an action, but waiting on them all with #join <em>before</em> returning the response, then it makes sense that you might be able to get away with `config.cache_classes = false` still, but I haven&#8217;t tried it.</p>
<p>None of the other concurrency-related config options that go along with config.threadsafe! <em>seem</em> to be required. Although I wouldn&#8217;t be surprised if there is an occasional edge case race condition involving autoloading with the <a href="http://guides.rubyonrails.org/configuring.html">default values</a> for config.dependency_loading and config.preload_frameworks.  But changing these to be &#8216;thread safe&#8217; means more significant changes to your app, so I&#8217;ve decided just to risk it. So far so good.</p>
<h2>thread.priority</h2>
<p>In MRI 1.8.7, I <a href="http://bibwild.wordpress.com/2009/02/11/rails-threading-nightmare/#comment-4791">found </a>that I needed to set Thread.priority on threads that were <em>not</em> the main Rails request-response thread to a priority less than default, or the actual request-response thread would not actually ever get scheduled for the CPU.  Theoretically, ruby 1.9.x (or jruby) with native threads should do a better job of thread scheduling, but I&#8217;ve left in my Thread.priority setters anyway, out of fear. :)</p>
<h2>Consider NOT using multi-threaded access to ActiveRecord</h2>
<p>So, you know, multi-threaded ActiveRecord use is a bit better and cleaner in current Rails than it was back in the Rails 2.1 days.</p>
<p>But it&#8217;s still kind of a pain; there are tricks and gotchas (not even counting the usual gotchas with <em>any</em> kind of concurrent programming, regardless of ActiveRecord), performance is somewhat unpredictable.</p>
<p>You probably want to consider other solutions than multi-threading.</p>
<p>The state of &#8220;async background job&#8221; processing options has gotten better than in the old days when <a href="http://backgroundrb.rubyforge.org/">BackgrounDRb </a>was the best option. <a href="https://github.com/tobi/delayed_job">delayed_job</a> seems to be a current popular choice, and is reportedly relatively easy to use and robust.  rabbitmq was recommended in comments on another thread-related blog post, but I&#8217;m not sure what the best easy to use ruby glue for it is.</p>
<p>For my use case, I&#8217;m not sure background task approach would work out so well &#8212; I need a large number of concurrent workers, such that either I&#8217;d need a huge number of worker processes, or I&#8217;d need my worker processes to deal with mutli-threading in ActiveRecord anyway. Plus I have an app (now an engine gem) that&#8217;s distributed to other end-users, and I&#8217;d like to avoid dependency on extra external daemons if possible. But it&#8217;s quite possible things would work much better and I could save myself trouble by using a background task solution instead of threads. If it&#8217;ll work for your use case, it&#8217;ll probably be a lot less headache than threading.</p>
<p>And the new hot thing is of course <a href="http://rubyeventmachine.com/">EventMachine</a>. I haven&#8217;t quite been able to wrap my head around how to use EventMachine for concurrency without totally re-writing my fairly large legacy app, which I don&#8217;t really want to use. But <a href="https://github.com/igrigorik/em-synchrony">em-syncrony</a> looks like perhaps it can be used to incorporate some event-machine based async operations in a Rails app that is otherwise fairly standard, without having to go crazy with callback-style code. lthough I still can&#8217;t quite wrap my head around how I&#8217;d use it in my architecture (in which third-party plugins need to be runnable in a concurrent context too).  I suspect that an em-syncrony/fiber-based solution would <em>perform</em> a lot better than multi-threaded AR use. But it might be just as tricky to work with, you&#8217;ve still got to deal with the AR ConnectionPool, which em-syncrony activerecord actually patches to be fiber-aware (so one connection per fiber, instead of per-thread).  It possibly could end up even more confusing, what with the extra abstraction to deal with.  But if you&#8217;re interested in being cutting edge and can figure out how to make EM or em-syncrony work for you, definitely consider it.</p>
<h2>The Future?</h2>
<p><a href="http://tenderlovemaking.com/2011/10/20/connection-management-in-activerecord/">So Aaron tenderlove Patterson has expressed interest in a fairly major re-architecture of connection management in AR, possibly for Rails 3.2.</a></p>
<p>Current ConnectionPool is kind of weird, it&#8217;s got some weird hacks in it, it&#8217;s kind of tricky to understand how to use it in a multi-threaded environment (although so much better than pre-connectionpool days), it&#8217;s hard to use with fibers instead of threads (although em-syncrony seems to <em><a href="https://github.com/igrigorik/em-synchrony/blob/master/lib/active_record/patches.rb">think</a></em> it&#8217;s solved that, I definitely haven&#8217;t tried it, and am unclear what assumptions it may make about your use patterns), it&#8217;s performance seems unpredictable (if that&#8217;s the fault of my code, then we could say it makes it hard to understand how to write performant multi-threaded AR code).</p>
<p>So in theory I&#8217;m pleased about Aaron&#8217;s interest in re-working it. But I&#8217;ve spent so much time at this point figuring out how to get things to work barely-good-enough with the current architecture, if there&#8217;s a new architecture I really hope it&#8217;s not <em>that</em> different, or if it is, that it has enough real significant improvement to justify the cost of reworking my app again.</p>
<h2>Acknowledge</h2>
<p>Thanks very much to the author of <a href="http://coderrr.wordpress.com/">coderr.wordpress.com</a>, who is almost the only person one can find on the net apparently interested in multi-threaded ActiveRecord access, for his useful blog posts and surgically targetted rails patches. He has a couple blog posts, somewhat difficult to find on google actually, which were incredibly helpful to me, and some of the only things I can find explaining what&#8217;s going on and how to deal with it.</p>
<p>And of course, the ActiveRecord source. Thanks to <a href="http://api.rubyonrails.org/">api.rubyonrails.com</a> for providing links directly to github for all documented methods. Without that, in the old days, it could be hard to even figure out what file a given method was implemented in; now with a click on a hyperlink, you&#8217;re looking at it (and can even use GitHub features to see how it&#8217;s changed over multiple Rails versions).  And thanks to GitHub for providing an html interface that makes source code a first class citizen on the web, so web pages <em>can</em> link to such a powerful and useable interface for looking at source code.   The ecology we&#8217;ve got based around github makes dealing with someone elses open source code so much easier than it used to be.</p>
<br />Filed under: <a href='http://bibwild.wordpress.com/category/general/'>General</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bibwild.wordpress.com/1881/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bibwild.wordpress.com/1881/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bibwild.wordpress.com/1881/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bibwild.wordpress.com/1881/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/bibwild.wordpress.com/1881/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bibwild.wordpress.com/1881/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/bibwild.wordpress.com/1881/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bibwild.wordpress.com/1881/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bibwild.wordpress.com/1881/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bibwild.wordpress.com/1881/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bibwild.wordpress.com/1881/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bibwild.wordpress.com/1881/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bibwild.wordpress.com/1881/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bibwild.wordpress.com/1881/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1881&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://bibwild.wordpress.com/2011/11/14/multi-threading-in-rails-activerecord-3-0-3-1/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jrochkind</media:title>
		</media:content>
	</item>
		<item>
		<title>kindle library lending: pricing model?</title>
		<link>http://bibwild.wordpress.com/2011/11/10/kindle-library-lending-pricing-model/</link>
		<comments>http://bibwild.wordpress.com/2011/11/10/kindle-library-lending-pricing-model/#comments</comments>
		<pubDate>Thu, 10 Nov 2011 05:48:05 +0000</pubDate>
		<dc:creator>jrochkind</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://bibwild.wordpress.com/?p=1869</guid>
		<description><![CDATA[Looks like perhaps Amazon recently started allowing libraries to &#8216;lend&#8217; kindle ebooks.  Does anyone know the pricing model to libraries? An important thing to realize about how the rise of ebooks effects libraries, is the legal difference between ebook or &#8230; <a href="http://bibwild.wordpress.com/2011/11/10/kindle-library-lending-pricing-model/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1869&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Looks like perhaps Amazon <a href="http://www.wired.com/epicenter/2011/09/how-to-check-out-library-books-for-kindle/">recently started allowing libraries to &#8216;lend&#8217; kindle ebooks. </a></p>
<p>Does anyone know the pricing model to libraries?</p>
<p>An important thing to realize about how the rise of ebooks effects libraries, is the legal difference between ebook or print books for library lending.</p>
<p>A print book, a library (or in fact anyone else) who purchases a copy has the <a href="http://en.wikipedia.org/wiki/First-sale_doctrine">right to lend it to anyone they like (or to resell it to anyone they like),</a> without any special permission from the copyright holder or vendor.   I know some publishers have a special higher &#8220;library price&#8221;; it&#8217;s never been entirely clear to me why libraries would pay this, pretty sure there&#8217;s no way to enforce it or prevent a library (or anyone else) from buying the ordinary retail copy at an ordinary retail price and lending.</p>
<p>That is generally not true of ebooks. Because of DRM; because of license agreements and the general model of &#8216;licensing&#8217; software rather than selling it; and because the fact that transfering an ebook to a new device neccesarily involves &#8216;making a copy&#8217; complicates the application of the &#8216;first sale doctrine&#8217;.  Note that Amazon only recently allowed libraries to lend ebooks under presumably a different pricing model than simply buying a single retail copy and lending it out to as many patrons as you want (one at a time).  For print books, no such &#8220;permission&#8221; is needed, you can simply do it.</p>
<h2>Readers and library patrons generally unaware of threat</h2>
<p>When I bring up this issue (not at my workplace, but among friends), many library patrons are unaware of it, and indeed somewhat hostile to even believing me. Perhaps assuming I&#8217;m simply being a luddite or hating on ebooks for aesthetic reasons, or some sort of judgement against those who prefer ebooks &#8212; this is <span style="color:#000000;"><strong>not</strong> the case, I&#8217;ve got nothing against ebooks as a technology. </span></p>
<p>But many patrons figure, after all, libraries have started to lend ebooks; patrons assume that the limited availability is simply the beginning of a technological adoption curve, and that libraries carry ebooks at all means that libraries will transition to ebooks along with their readers.</p>
<p>Patrons do not realize that libraries are probably paying a <strong>lot</strong> more per-use for ebooks than they did for print books <em>(I would be <strong>really</strong> interested in some actual data on this if anyone has it, for a particular provider or averaged accross providers common among public or academic libraries)</em>, and that it&#8217;s not at all clear that this will change, and if it does not, it could make a library transition to ebook lending entirely unfeasible.  Because libraries aren&#8217;t telling them, perhaps out of a desire to prove continued relevancy, libraries are trying to make it look like they will have no problem transitioning to ebooks.  The cost of this, however, is suppressing awareness of the threat to the actual viability of lending libraries in an ebook world &#8212; and therefore suppressing the potential of a demand for legal or marketplace changes to ensure lending library viability in an eobok world.  It may time to sound the alarm, instead.</p>
<p>(I know that <a href="http://ala.org/ala/newspresscenter/news/pr.cfm?id=6517">ALA expressed some concern</a> over a <em>particular</em> publishers ebook lending policy; but I&#8217;m somewhat surprised ALA hasn&#8217;t been sounding a more general alarm about the serious threat to the <em>right</em> <em>to lend</em> <em>at all</em>, in an ebook world.  Complaining about one particular publisher&#8217;s &#8216;policy&#8217; is to implicitly concede the fact that it&#8217;s up to the publisher&#8217;s discretion to make such &#8216;policies&#8217; giving us permission to lend at all, which they did not in a print book world. This is such a shift in the socio-economics of reading that we ought not to be conceding.)</p>
<p>While I do love traditional printed and bound books, I will emphasize yet again that I do <strong>not</strong>  neccesarily find the prospect of a transition in reader preferences to ebooks threatening, considered purely in terms of technology/medium. Changes in the technology of reading and information sharing have happened before and will continue to happen, it&#8217;s still (a kind of) reading and (a kind of) book.</p>
<p>What is more frightening is the differences in intellectual property rights and coresponding differences in how the marketplace works &#8212;  not just for libraries, but in general looking at a world where books must be individually purchased by each reader and can&#8217;t be shared or loaned among friends.  This is of course what copyright holders and publishers want; what&#8217;s a library but a pre-digital form of &#8216;file sharing&#8217;, after all?  But it&#8217;s actually rather terrifying to this (e)book  lover.</p>
<br />Filed under: <a href='http://bibwild.wordpress.com/category/general/'>General</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bibwild.wordpress.com/1869/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bibwild.wordpress.com/1869/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bibwild.wordpress.com/1869/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bibwild.wordpress.com/1869/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/bibwild.wordpress.com/1869/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bibwild.wordpress.com/1869/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/bibwild.wordpress.com/1869/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bibwild.wordpress.com/1869/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bibwild.wordpress.com/1869/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bibwild.wordpress.com/1869/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bibwild.wordpress.com/1869/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bibwild.wordpress.com/1869/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bibwild.wordpress.com/1869/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bibwild.wordpress.com/1869/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1869&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://bibwild.wordpress.com/2011/11/10/kindle-library-lending-pricing-model/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jrochkind</media:title>
		</media:content>
	</item>
		<item>
		<title>For software excellence</title>
		<link>http://bibwild.wordpress.com/2011/10/26/for-software-excellence/</link>
		<comments>http://bibwild.wordpress.com/2011/10/26/for-software-excellence/#comments</comments>
		<pubDate>Wed, 26 Oct 2011 14:43:20 +0000</pubDate>
		<dc:creator>jrochkind</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://bibwild.wordpress.com/?p=1862</guid>
		<description><![CDATA[Check out this column, &#8220;Top Ten Idea Killers in Software Development&#8221; by Navneeth Mandavilli.  on the IEEE web site. &#8221;Killer&#8221; there means &#8220;will kill your software&#8221;, not &#8220;great&#8221;, ha. I think it does apply to any library that does any in-house &#8230; <a href="http://bibwild.wordpress.com/2011/10/26/for-software-excellence/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1862&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Check out this column, <a href="http://www.computer.org/portal/web/buildyourcareer/Nosce-te-Ipsum/-/blogs/top-ten-idea-killers-in-software-development">&#8220;Top Ten Idea Killers in Software Development&#8221; by Navneeth Mandavilli. </a> on the IEEE web site. &#8221;Killer&#8221; there means &#8220;will kill your software&#8221;, not &#8220;great&#8221;, ha.</p>
<p>I think it does apply to any library that does any in-house software development at all (even little tiny widgets and integration mash-ups): It is our job as professional writers of software to <em>write good software &#8212; </em>or to do the best we can (I, like everyone else, look at software I wrote three years ago and think, god, how could I have written such crap? I suspect this happens to even the best programmers; if it doesn&#8217;t happen to a programmer, it&#8217;s probably because they in fact aren&#8217;t very good and never improve!)</p>
<p>It&#8217;s our job to write good software &#8212; maintainable, well-architected, properly designed software &#8212; because it serves the interests of the organizations we work for. A library essentially is an IT organization these days, software is incredibly important to it &#8212; if you write terrible unmaintainable software, the organization <em>will</em> pay for it down the line, this &#8216;<a href="http://en.wikipedia.org/wiki/Technical_debt">technical debt</a>&#8216; will have to be paid. Either in huge amounts of development time to fix what you didn&#8217;t do right, or in having a really crappy software environment for our users that never gets fixed. I know we&#8217;re all familiar with both phenomenon.</p>
<p>(Yes, this also means that if a library is doing <em>any </em>in-house programming, and many many are these days, it is terribly short-sighted of them if they don&#8217;t hire professional programmers, or get training for the non-technical staff that &#8216;just fell into it&#8217; &#8212; the cost is worth it, do it right or don&#8217;t do it).</p>
<p>Anyhow, here&#8217;s some of the ideas Mandavilli identifies as (in my interpretation) barriers to excellent software. I&#8217;ve highlighted the ones I know will be familiar to <em>anyone</em> that writes software in a library environment.</p>
<ul>
<li>&#8220;<strong>There isn&#8217;t enough time to do it right.&#8221;</strong></li>
<li><strong>&#8220;<strong>Management has not prioritized it</strong>&#8221; </strong>In our context, this might be &#8220;the committee&#8221;, or &#8220;the reference librarians&#8221;, not management. Mandavilli says &#8220;what exactly hasn&#8217;t management prioritized &#8212; making a good product?&#8221;<strong><br />
</strong></li>
<li>&#8220;<strong>No one is asking for it</strong>&#8221; Yes, we have to be user-centered, and in the library world we&#8217;re still trying to do that, but being user-centered isn&#8217;t just doing whatever people explicitly ask for and nothing else. Mandavilli says &#8220;This reminds me of Henry Ford&#8217;s wry comment &#8220;If I’d asked people what they wanted, they would have said &#8216;a faster horse&#8217;.&#8221;   Yes, this applies to reference librarians too.</li>
<li>&#8220;<strong>We have to have consensus</strong>&#8221; Mandavilli says &#8221;Someone has spent years studying, learning and working in a specific field, and to not defer to that person for the final decision is to waste all that expertise, not to mention deliver a bad product, demoralize the expert, adopt the safest and most timid way and most insidious of all,<em>diffuse accountability</em>&#8230;. A group decision is a way to duck responsibility for the outcome. &#8216;We all decided together&#8217; is a way of saying &#8216;No one is responsible&#8217;&#8221;.  jrochkind says: Oh boy, sound familiar? I suppose it&#8217;s somewhat comforting to learn this disease is not unique to library organizations.</li>
</ul>
<p>Read the <a href="http://www.computer.org/portal/web/buildyourcareer/Nosce-te-Ipsum/-/blogs/top-ten-idea-killers-in-software-development">original article,</a> there are some more in there.</p>
<p>And if you write software in a library, commit to software excellence. Commit to <em>fighting</em> for software excellence against the other forces in our organization (and in our heads) that work against it, to convincing managers and committees that software excellence matters, and that to get it you have to give the software experts responsibility and authority to do it (as well as sufficient resources to support the desired outcome). No matter whether you learned programming in school or on the job, commit to continuously improving your craft by looking at others code, by reading, by taking some courses if needed, by peer-reviewing your peers code and getting your code peer reviewed (by a peer at another institution if you don&#8217;t have one at your organization) and by reflecting and evaluating on your own code.</p>
<p><strong>Do it right or don&#8217;t do it.  </strong>If you can&#8217;t afford to do it right, you can&#8217;t afford to do it at all, doing it also crappy is something we can not afford. Now, it&#8217;s true that there is an opposing danger of over-engineering and micro-tweaking and never getting anything done.  Finding the balance is perhaps something that only comes from experienced developer intuition.  But I think libraries tend to err on the side of &#8216;crappy&#8217;, for various reasons.  If you&#8217;re a programmer at a library, it&#8217;s your job to develop that intuition and experience, not to settle for crappy.</p>
<br />Filed under: <a href='http://bibwild.wordpress.com/category/general/'>General</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bibwild.wordpress.com/1862/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bibwild.wordpress.com/1862/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bibwild.wordpress.com/1862/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bibwild.wordpress.com/1862/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/bibwild.wordpress.com/1862/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bibwild.wordpress.com/1862/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/bibwild.wordpress.com/1862/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bibwild.wordpress.com/1862/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bibwild.wordpress.com/1862/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bibwild.wordpress.com/1862/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bibwild.wordpress.com/1862/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bibwild.wordpress.com/1862/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bibwild.wordpress.com/1862/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bibwild.wordpress.com/1862/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1862&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://bibwild.wordpress.com/2011/10/26/for-software-excellence/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jrochkind</media:title>
		</media:content>
	</item>
		<item>
		<title>Google removes plus (+) operator</title>
		<link>http://bibwild.wordpress.com/2011/10/25/google-removes-plus-operator/</link>
		<comments>http://bibwild.wordpress.com/2011/10/25/google-removes-plus-operator/#comments</comments>
		<pubDate>Wed, 26 Oct 2011 02:12:13 +0000</pubDate>
		<dc:creator>jrochkind</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://bibwild.wordpress.com/?p=1855</guid>
		<description><![CDATA[The &#8220;+&#8221; operator used to mean &#8220;required&#8221; to Google, I think. But it also meant &#8220;and exactly that word is required, not an alternate form.&#8221; I think? Maybe it always was just a synonym for double quotes, and never meant &#8230; <a href="http://bibwild.wordpress.com/2011/10/25/google-removes-plus-operator/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1855&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>The &#8220;+&#8221; operator used to mean &#8220;required&#8221; to Google, I think. But it also meant &#8220;and exactly that word is required, not an alternate form.&#8221; I think? Maybe it always was just a synonym for double quotes, and never meant &#8216;required&#8217;? Or maybe double quotes mean &#8216;required&#8217; too?</p>
<p><a href="http://www.google.com/support/forum/p/Web%20Search/thread?tid=151ef6cf0a761b74&amp;hl=en">At any rate, the plus operator is gone now.</a></p>
<p>I&#8217;m not entirely sure that the quotes will actually insist on the quoted word being present in the page?  Can anyone find a counter-example?</p>
<p>I had actually noticed a while ago that the google advanced search page had stopped providing any fields that resulted in &#8220;+&#8221;, and was suggesting double quotes for &#8220;exactly this form of word&#8221; (not variants), rather than &#8220;phrase&#8221;.   Exactly what given operators (and bare searches) do has continually evolved over time, and isn&#8217;t always documented or reflected in the &#8220;search tips&#8221; page or &#8220;advanced search&#8221; screen.</p>
<p>But let&#8217;s take a look in the Internet Archive to see if we can document the evolution.  Sadly, we can&#8217;t look at what a live google search at various historic points did. Nor can we look at what an &#8216;advanced search&#8217; page actually did &#8212; the advanced search page has used different implementations at different times to convert your entry into a google search (un-mediated form submit to google search; javascript;  an intermediate redirection), but most of them aren&#8217;t amenable to interpretation from what&#8217;s in the Archive.</p>
<p>But we can look at the &#8216;search tips&#8217; page, and the &#8216;advanced search&#8217; screen itself when needed.  Let&#8217;s take a look at a snapshot from October (or as close as we can get) from each year from 2004 to now.</p>
<h2>Google search tips over the years</h2>
<p><a href="http://web.archive.org/web/20041017053307/http://www.google.com/help/refinesearch.html">In 2004</a>, &#8220;+&#8221; is recommended to force inclusion of &#8220;common words&#8221; that would otherwise be excluded. But &#8220;another method for doing this is conducting a phrase search, which simply means putting quotation marks around 2 or more words. &#8221;  Note, &#8220;2 or more words&#8221;.</p>
<p><a href="http://web.archive.org/web/20051013085625/http://www.google.com/help/refinesearch.html">In 2005</a>, &#8220;+&#8221; is still recommended to force inclusion of &#8216;common&#8217; words and phrase search is for the moment not mentioned at all in the narrative. But the screen shot of the multi-box advanced search page shows an &#8216;exact phrase&#8217; box.</p>
<p><a href="http://web.archive.org/web/20051013085625/http://www.google.com/help/refinesearch.html">In 2006, </a> and <a href="http://web.archive.org/web/20071013023545/http://www.google.com/help/refinesearch.html">2007</a>, largely the same.</p>
<p><a href="http://web.archive.org/web/20080925035223/http://www.google.com/support/bin/static.py?page=searchguides.html&amp;ctx=advanced&amp;hl=en">In 2008</a>, the entry box that used to say &#8220;exact phrase&#8221; now says &#8220;exact wording or phrase&#8221;, hinting that perhaps around here was the change where double quotes could be used on a single term to avoid alternate forms, as well as a multi-word phrase.  The &#8220;+&#8221; search guidance still talks about how &#8220;Google ignores common words and characters&#8221;, and the &#8220;+&#8221; can be used to search on em anyhow.</p>
<p><a href="http://web.archive.org/web/20091026220153/http://www.google.com/support/websearch/bin/answer.py?hl=en&amp;answer=136861">In 2009</a>,  the search hints page has moved to a new URL, with new layout.   The &#8220;+&#8221; is now described differently: No more mention of Google normally ignoring common words (around then is perhaps when they started indexing even common words?), the &#8220;+&#8221; is now described as excluding variant forms:  &#8221;sometimes Google helps out a little too much and gives you a synonym when you don&#8217;t really want it. By attaching a <strong>+</strong> immediately before a word&#8230;.you are telling Google to match that word precisely as you typed it.&#8221;   The phrase search is again described narratively &#8220;the exact words in that exact order without any change&#8221;, hinting at both the phrase and &#8220;non-variant form&#8221; functions.  In 2009, we don&#8217;t have a screenshot of the advanced search page itself, so let&#8217;s check out the <a href="http://web.archive.org/web/20091018134721/http://www.google.com/advanced_search">cached version</a>:  yep, still got &#8216;exact word or phrase&#8217; text box, which presumably results in double quotes.</p>
<p><a href="http://web.archive.org/web/20101104081714/http://www.google.com/support/websearch/bin/answer.py?answer=136861">2010</a>, almost exactly the same, although the URL of the page is at help/refinesearch.html now. (Google&#8217;s 3xx redirects at the time the Archive crawled, and the Archive&#8217;s smarts in following them at crawl time and retrieval time, keeps us on track). And yeah, <a href="http://web.archive.org/web/20100829230901/http://www.google.com/advanced_search">2010 advanced search page</a> still has &#8216;exact word or phrase&#8217; box.</p>
<p>And it seems to stay that way until June 2011, the last crawl Archive seems to have at present.</p>
<p>Until <a href="http://www.google.com/support/websearch/bin/answer.py?hl=en&amp;answer=136861&amp;rd=1">present day</a>, when the page is also much the same except no longer instructs on &#8220;+&#8221;, and has a search tip in upper right telling you to use double quotes instead.</p>
<h2>So you wanna make a word mandatory, do you?</h2>
<p>Interesting.  Many of us know that &#8220;+&#8221; used to result in &#8220;insist on this word or phrase being in the page&#8221;, since Google has (at most times, including up to present) sometimes showed you pages (even high up in your results) without including every term you entered. But the Google &#8216;search hints&#8217; has actually <strong>never</strong> described it that way &#8212; it&#8217;s described it as either forcing search for common words otherwise not searched (no longer applicable, as Google currently indexes all words and even some punctuation), or as turning off synonyms (which a double-quoted single term has probably also done for some time).</p>
<p>It&#8217;s unclear to me if any functionality still exists to &#8220;insist&#8221;/require a word &#8212; I&#8217;m not sure I trust that double quotes do it.</p>
<p><em>(In other news, Wow, is the Internet Archive awesome, and their UX refresh a year or so ago so helpful for doing this kind of research). </em></p>
<br />Filed under: <a href='http://bibwild.wordpress.com/category/general/'>General</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bibwild.wordpress.com/1855/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bibwild.wordpress.com/1855/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bibwild.wordpress.com/1855/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bibwild.wordpress.com/1855/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/bibwild.wordpress.com/1855/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bibwild.wordpress.com/1855/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/bibwild.wordpress.com/1855/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bibwild.wordpress.com/1855/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bibwild.wordpress.com/1855/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bibwild.wordpress.com/1855/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bibwild.wordpress.com/1855/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bibwild.wordpress.com/1855/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bibwild.wordpress.com/1855/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bibwild.wordpress.com/1855/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1855&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://bibwild.wordpress.com/2011/10/25/google-removes-plus-operator/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jrochkind</media:title>
		</media:content>
	</item>
		<item>
		<title>Amazon Product Advertising API requires AssociateTag now</title>
		<link>http://bibwild.wordpress.com/2011/10/18/amazon-product-advertising-api-requires-associatetag-now/</link>
		<comments>http://bibwild.wordpress.com/2011/10/18/amazon-product-advertising-api-requires-associatetag-now/#comments</comments>
		<pubDate>Tue, 18 Oct 2011 18:54:45 +0000</pubDate>
		<dc:creator>jrochkind</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://bibwild.wordpress.com/?p=1851</guid>
		<description><![CDATA[According to this announcement, the Amazon Product Advertising API will change October 25 2011, to require sending an Associate Tag with every request. In the past, they&#8217;ve sent out mass email sometimes when this API changes to all registered users, &#8230; <a href="http://bibwild.wordpress.com/2011/10/18/amazon-product-advertising-api-requires-associatetag-now/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1851&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>According to <a href="https://affiliate-program.amazon.com/gp/advertising/api/detail/api-changes.html">this announcement</a>, the Amazon Product Advertising API will change October 25 2011, to require sending an Associate Tag with every request.</p>
<p>In the past, they&#8217;ve sent out mass email sometimes when this API changes to all registered users, but this time I only found out about it because, my application just started erroring. Like just now, within the past couple hours, I think. Even though it&#8217;s only October 18, not October 25.</p>
<p>So be warned!</p>
<p>Okay then, guess I better get an Affiliate ID.  This is a bit annoying, because I certainly don&#8217;t want to receive any money from an Affiliate ID &#8212; this use is at work at an academic library, I couldn&#8217;t take any money myself, and it&#8217;s really not worth the beaurocracy to figure out how to have this money go to library, when it probably won&#8217;t be very much money, and we don&#8217;t really <em>want</em> a profit motive to send things to Amazon. We just want to use the Amazon API to get details on books and Amazon availability.</p>
<p>But okay then!</p>
<p>I don&#8217;t <em>think</em> any of the other API changes will effect me, although I&#8217;m a bit worried about &#8220;Selected ItemAttributes that are not relevant to the broader product advertising use case will be deprecated&#8221;, not sure if that even applies to my use case, but if it does, and means that some data that I use will be going away (cover image? Citation metadata?), that would be inconvenient.</p>
<br />Filed under: <a href='http://bibwild.wordpress.com/category/general/'>General</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/bibwild.wordpress.com/1851/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bibwild.wordpress.com/1851/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/bibwild.wordpress.com/1851/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bibwild.wordpress.com/1851/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/bibwild.wordpress.com/1851/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bibwild.wordpress.com/1851/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/bibwild.wordpress.com/1851/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bibwild.wordpress.com/1851/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/bibwild.wordpress.com/1851/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bibwild.wordpress.com/1851/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/bibwild.wordpress.com/1851/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bibwild.wordpress.com/1851/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/bibwild.wordpress.com/1851/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bibwild.wordpress.com/1851/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=bibwild.wordpress.com&amp;blog=835412&amp;post=1851&amp;subd=bibwild&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://bibwild.wordpress.com/2011/10/18/amazon-product-advertising-api-requires-associatetag-now/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jrochkind</media:title>
		</media:content>
	</item>
	</channel>
</rss>
