<?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"
	>

<channel>
	<title>Graceful Exits &#187; quickies</title>
	<atom:link href="http://www.jpstacey.info/blog/category/quickies/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.jpstacey.info/blog</link>
	<description>Garbage collection, in a very real sense</description>
	<pubDate>Thu, 17 Jul 2008 19:08:52 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>Firefox/Sage bookmarks to Google Reader import</title>
		<link>http://www.jpstacey.info/blog/2008/07/17/firefoxsage-bookmarks-to-google-reader-import/</link>
		<comments>http://www.jpstacey.info/blog/2008/07/17/firefoxsage-bookmarks-to-google-reader-import/#comments</comments>
		<pubDate>Thu, 17 Jul 2008 19:04:54 +0000</pubDate>
		<dc:creator>jps</dc:creator>
		
		<category><![CDATA[formats]]></category>

		<category><![CDATA[import/export]]></category>

		<category><![CDATA[projects]]></category>

		<category><![CDATA[quickies]]></category>

		<category><![CDATA[bookmarks]]></category>

		<category><![CDATA[DTD]]></category>

		<category><![CDATA[export]]></category>

		<category><![CDATA[firefox]]></category>

		<category><![CDATA[google]]></category>

		<category><![CDATA[import]]></category>

		<category><![CDATA[opml]]></category>

		<category><![CDATA[reader]]></category>

		<category><![CDATA[sage]]></category>

		<category><![CDATA[standard]]></category>

		<category><![CDATA[transform]]></category>

		<category><![CDATA[xml]]></category>

		<category><![CDATA[xslt]]></category>

		<guid isPermaLink="false">http://www.jpstacey.info/blog/?p=186</guid>
		<description><![CDATA[When OPML is OPML but it isn't OPML]]></description>
			<content:encoded><![CDATA[<p>Want to migrate your RSS bookmarks from Firefox (or its RSS-reading addon, Sage) to Google Reader? I did, just now.</p>
<p>Christopher Hinze has written a great <a href="https://addons.mozilla.org/en-US/firefox/addon/2625" >Firefox addon that exports bookmarks to OPML 1.0</a>. Unfortunately, OPML is a bit of an <a href="http://www.opml.org/spec1" >anything-goes specification</a>. So although Hinze&#8217;s plugin produces valid OPML, it isn&#8217;t the same sort of valid OPML that Google Reader expects. Google Reader, in fact, gags and chokes on Hinze&#8217;s OPML, and refuses to import it.</p>
<p>The main problem is that the &lt;outline/&gt; element, the basic hierarchical building block for OPML, <a href="http://www.opml.org/spec1#limits" >will take <em>any attributes</em></a>. What does that mean in practice? Well, here&#8217;s what Hinze&#8217;s export produces:</p>
<blockquote class="code"><p>
&lt;outline text=&#8221;Coding&#8221;><br />
&nbsp;&nbsp;&lt;outline type=&#8221;link&#8221; text=&#8221;Joel on Software&#8221; url=&#8221;http://www.joelonsoftware.com/rss.xml&#8221;   /><br />
&lt;/outline>
</p></blockquote>
<p>and here&#8217;s the result of Google Reader exporting its own store of RSS bookmarks:</p>
<blockquote class="code"><p>
&lt;outline title=&#8221;Coding&#8221; text=&#8221;Coding&#8221;><br />
&nbsp;&nbsp;&lt;outline text=&#8221;drupal.org - Community plumbing&#8221;<br />
&nbsp;&nbsp;&nbsp;&nbsp;title=&#8221;drupal.org - Community plumbing&#8221; type=&#8221;rss&#8221;<br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlUrl=&#8221;http://drupal.org/node/feed&#8221; htmlUrl=&#8221;http://drupal.org&#8221;/><br />
&lt;/outline>
</p></blockquote>
<p>To a computer, these are fundamentally two different data formats: the URLs are stored in different attributes, and there are attributes on each that either have different values or are not present on the other. Someone did a <a href="http://static.userland.com/gems/radiodiscuss/opmlDtd.txt" >DTD for OPML</a>: looking at those two apparently analogous fragments above you have to ask yourself why they bothered.</p>
<p>Help is at hand, though. This sort of problem is bread and butter to XSLT, and <a href="/applications/google/ff2gr_opml.xsl" >here&#8217;s an XSL transform for converting Firefox OPML to Google Reader OPML</a>. If you have <code>xsltproc</code> installed on your system, you would type:</p>
<blockquote class="code"><p>
xsltproc http://www.jpstacey.info/applications/google/ff2gr_opml.xsl bookmarks.opml > fixed_bookmarks.opml
</p></blockquote>
<p>Or download the XSLT&#8212;it&#8217;s released under GPL2&#8212;and run it locally, changing that URL there to a local file location.</p>
<p>One thing to note: the XSLT will remove an outline wrapped around your bookmarks with title &#8220;Sage Feeds&#8221; (case-sensitive). So you can export that branch of your bookmarks, and the XSLT will strip the wrapper off and you <em>won&#8217;t</em> import a load of bookmarks tagged &#8220;Sage Feeds&#8221;. If you don&#8217;t like this behaviour then either rename your Sage bookmark container, or learn XSLT: it won&#8217;t kill you.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jpstacey.info/blog/2008/07/17/firefoxsage-bookmarks-to-google-reader-import/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Hardy Heron and the Dell Precision M4300</title>
		<link>http://www.jpstacey.info/blog/2008/07/16/hardy-heron-and-the-dell-precision-m4300/</link>
		<comments>http://www.jpstacey.info/blog/2008/07/16/hardy-heron-and-the-dell-precision-m4300/#comments</comments>
		<pubDate>Wed, 16 Jul 2008 19:16:10 +0000</pubDate>
		<dc:creator>jps</dc:creator>
		
		<category><![CDATA[hardware]]></category>

		<category><![CDATA[projects]]></category>

		<category><![CDATA[quickies]]></category>

		<category><![CDATA[software]]></category>

		<category><![CDATA[alsa]]></category>

		<category><![CDATA[dell]]></category>

		<category><![CDATA[display]]></category>

		<category><![CDATA[hardy]]></category>

		<category><![CDATA[heron]]></category>

		<category><![CDATA[install]]></category>

		<category><![CDATA[laptop]]></category>

		<category><![CDATA[linux]]></category>

		<category><![CDATA[m4300]]></category>

		<category><![CDATA[nvidia]]></category>

		<category><![CDATA[precision]]></category>

		<category><![CDATA[sound]]></category>

		<category><![CDATA[ubuntu]]></category>

		<category><![CDATA[upgrade]]></category>

		<guid isPermaLink="false">http://www.jpstacey.info/blog/?p=184</guid>
		<description><![CDATA[Summary: it just works.]]></description>
			<content:encoded><![CDATA[<p>In brief: the problems discussed <a href="http://www.jpstacey.info/blog/2008/01/07/the-full-sensory-experience-of-linux-on-a-dell-m4300-sound-vision-and-tinfoil-hat-microwaves/" >here</a> and <a href="http://www.jpstacey.info/blog/2007/08/28/laptop-and-linux-the-fixes-for-a-dell-precision-m4300/" >here</a> go away under the most recent <a href="http://www.ubuntu.com/" >Ubuntu</a> release, Hardy Heron, which I can generally recommend.</p>
<p>Alsa seems stable and graphics support is present from installation onwards. Enabling fancier 3D compiz effects requires the nvidia-glx-new package; compiz spots this, however and prompts for installation. All very smooth. Wireless works; my VoIP headset works; but I haven&#8217;t yet tested Bluetooth.</p>
<p>The only problem was in upgrading from Gutsy: my previous peregrinations had rendered my hybrid distribution shafted and incapable of upgrade. This isn&#8217;t a problem, though, if one has installed the /home directory (and in my case the /music one too) on a separate partition: the Ubuntu Live CD will blat the root partition with Heron, but leave the other partitions alone if you so require. Don&#8217;t resize any of your partitions during installation, though, or you&#8217;ll lose everything. Everything!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jpstacey.info/blog/2008/07/16/hardy-heron-and-the-dell-precision-m4300/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The Mashup Song</title>
		<link>http://www.jpstacey.info/blog/2008/07/09/the-mashup-song/</link>
		<comments>http://www.jpstacey.info/blog/2008/07/09/the-mashup-song/#comments</comments>
		<pubDate>Wed, 09 Jul 2008 11:45:26 +0000</pubDate>
		<dc:creator>jps</dc:creator>
		
		<category><![CDATA[hacking]]></category>

		<category><![CDATA[law]]></category>

		<category><![CDATA[network]]></category>

		<category><![CDATA[non-programming]]></category>

		<category><![CDATA[quickies]]></category>

		<category><![CDATA[bonny]]></category>

		<category><![CDATA[filk]]></category>

		<category><![CDATA[legal]]></category>

		<category><![CDATA[mashup]]></category>

		<category><![CDATA[song]]></category>

		<guid isPermaLink="false">http://www.jpstacey.info/blog/?p=181</guid>
		<description><![CDATA[I am Richard Stallman for the Web 2.0 Generation. Fear me. I mean, pity me.]]></description>
			<content:encoded><![CDATA[<p>Inspired by the title of <a href="http://yro.slashdot.org/yro/08/07/08/1245204.shtml" >the relevant Slashdot article</a>, to the tune of <cite>My Bonny</cite>:</p>
<blockquote><p>
Your mashup is probably legal.<br />
Your mashup is probably sound.<br />
Your mashup is probably legal,<br />
So pass all that data around!</p>
<p>Stuff here<br />
Stuff there<br />
And something mashed up in between (be-tween!)<br />
Stuff here<br />
Stuff there<br />
And something mashed up in between</p>
<p>Your mashup is probably legal;<br />
You could monetize it as well!<br />
But though I contend it&#8217;s all legal,<br />
Remember I-A-N-A-L!</p>
<p>[<i>Repeat chorus</i>]
</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.jpstacey.info/blog/2008/07/09/the-mashup-song/feed/</wfw:commentRss>
		</item>
		<item>
		<title>OpenTech 2008 was a blast</title>
		<link>http://www.jpstacey.info/blog/2008/07/06/opentech-2008-was-a-blast/</link>
		<comments>http://www.jpstacey.info/blog/2008/07/06/opentech-2008-was-a-blast/#comments</comments>
		<pubDate>Sun, 06 Jul 2008 19:19:20 +0000</pubDate>
		<dc:creator>jps</dc:creator>
		
		<category><![CDATA[conferences]]></category>

		<category><![CDATA[quickies]]></category>

		<category><![CDATA[lowcost]]></category>

		<category><![CDATA[notcon]]></category>

		<category><![CDATA[opentech]]></category>

		<category><![CDATA[opentech2008]]></category>

		<category><![CDATA[speakers]]></category>

		<category><![CDATA[success]]></category>

		<category><![CDATA[unconference]]></category>

		<guid isPermaLink="false">http://www.jpstacey.info/blog/?p=178</guid>
		<description><![CDATA[I went to OT2008; I came back. I did not die, and nor did I dance. It was great fun, but more details to follow.]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been back from <a href="http://www.ukuug.org/events/opentech2008/" >OpenTech 2008</a> for a day now, but what with popping by the Cowley Road carnival haven&#8217;t had a chance to produce a coherent post about it. Suffice it to say, though, that it was a great experience: thanks to all the organizers for such a fantastic event, and for little or no entrance fee. The cheap ULU student bar was also a treat at the end of a hard day&#8217;s, um, conferencering.</p>
<p>The session I comp&egrave;red went reasonably well: I can&#8217;t say my elegant prose exactly sparkled, and I occasionally found myself getting into the subjects being discussed so much that I forgot to flash the &#8220;X minutes left&#8221; warning signs. With that in mind, thanks are due to speakers Ben, Steven, Roo and Nick for both their talks and their patience. Hopefully there&#8217;ll be some area for speakers to upload their slides etc. soon, so I can link their names through to it when that happens.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jpstacey.info/blog/2008/07/06/opentech-2008-was-a-blast/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Embracing minimalism</title>
		<link>http://www.jpstacey.info/blog/2008/06/30/embracing-minimalism/</link>
		<comments>http://www.jpstacey.info/blog/2008/06/30/embracing-minimalism/#comments</comments>
		<pubDate>Mon, 30 Jun 2008 12:47:34 +0000</pubDate>
		<dc:creator>jps</dc:creator>
		
		<category><![CDATA[design]]></category>

		<category><![CDATA[news]]></category>

		<category><![CDATA[projects]]></category>

		<category><![CDATA[quickies]]></category>

		<category><![CDATA[software]]></category>

		<category><![CDATA[alpha]]></category>

		<category><![CDATA[minimalism]]></category>

		<category><![CDATA[pilgrim]]></category>

		<category><![CDATA[straightedge]]></category>

		<category><![CDATA[theme]]></category>

		<category><![CDATA[tomayko]]></category>

		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.jpstacey.info/blog/?p=170</guid>
		<description><![CDATA[Graceful Exits goes straight-edge with Straight Edge, a minimalist theme written by yours truly.]]></description>
			<content:encoded><![CDATA[<p>After re-reading <a href="http://www.jpstacey.info/blog/2008/06/22/rss-feeds-keep-them-well-hidden/" >my earlier post</a>, which was in general agreement with Pilgrim and Tomayko&#8217;s minimalism, I decided to practise what I had preached and write a minimalist theme implementing some of the applications of the principles of minimalism. </p>
<p>It&#8217;s called Straight Edge, and I&#8217;ve switched to it today. Once I&#8217;ve finished alpha-testing it I&#8217;ll write more about it, and offer it for download if anyone&#8217;s interested.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jpstacey.info/blog/2008/06/30/embracing-minimalism/feed/</wfw:commentRss>
		</item>
		<item>
		<title>logging.debug(&#8221;if only I&#8217;d known&#8221;)</title>
		<link>http://www.jpstacey.info/blog/2008/05/22/loggingdebugif-only-id-known/</link>
		<comments>http://www.jpstacey.info/blog/2008/05/22/loggingdebugif-only-id-known/#comments</comments>
		<pubDate>Thu, 22 May 2008 20:36:43 +0000</pubDate>
		<dc:creator>jps</dc:creator>
		
		<category><![CDATA[quickies]]></category>

		<category><![CDATA[debugging]]></category>

		<category><![CDATA[django]]></category>

		<category><![CDATA[googlejuice]]></category>

		<category><![CDATA[logging]]></category>

		<category><![CDATA[simon]]></category>

		<category><![CDATA[willison]]></category>

		<guid isPermaLink="false">http://www.jpstacey.info/blog/2008/05/22/loggingdebugif-only-id-known/</guid>
		<description><![CDATA[logging.debug("if only I'd known") logging.debug("if only I'd known") /* is there any way to turn this off? */ logging.debug("if only I'd known") ....]]></description>
			<content:encoded><![CDATA[<p>I wish Simon Willison had <a href="http://simonwillison.net/2008/May/22/debugging/" >written about Django logging and debugging</a> earlier than today. That way I wouldn&#8217;t have used the slightly daft solution I describe in the comments.</p>
<p>Of course, <em>much</em> earlier than today, and he&#8217;d have had to have written it before giving the talk that it was based on, which might sound a bit demanding on my part. But hey! I don&#8217;t make the rules.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jpstacey.info/blog/2008/05/22/loggingdebugif-only-id-known/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Human discourse will never be the same again</title>
		<link>http://www.jpstacey.info/blog/2008/05/16/human-discourse-will-never-be-the-same-again/</link>
		<comments>http://www.jpstacey.info/blog/2008/05/16/human-discourse-will-never-be-the-same-again/#comments</comments>
		<pubDate>Fri, 16 May 2008 18:04:45 +0000</pubDate>
		<dc:creator>jps</dc:creator>
		
		<category><![CDATA[network]]></category>

		<category><![CDATA[quickies]]></category>

		<category><![CDATA[software]]></category>

		<category><![CDATA[jokes]]></category>

		<category><![CDATA[saas]]></category>

		<category><![CDATA[sound]]></category>

		<category><![CDATA[web2.0]]></category>

		<guid isPermaLink="false">http://www.jpstacey.info/blog/2008/05/16/human-discourse-will-never-be-the-same-again/</guid>
		<description><![CDATA["This blogpost has made me feel something I haven't felt in years!"
"What's that?"
"My pulse!"]]></description>
			<content:encoded><![CDATA[<p>Software as a service finally comes of age, with the web&#8217;s new-found ability to pipe the <a href="http://www.sadtrombone.com/">sad trombone</a> and <a href="http://www.instantrimshot.com/">instant rimshot</a> directly into your office or home (via <a href="http://www.b3ta.com/newsletter/issue328/">b3ta</a>).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jpstacey.info/blog/2008/05/16/human-discourse-will-never-be-the-same-again/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Compiling languages down to Javascript</title>
		<link>http://www.jpstacey.info/blog/2008/05/12/compiling-languages-down-to-javascript/</link>
		<comments>http://www.jpstacey.info/blog/2008/05/12/compiling-languages-down-to-javascript/#comments</comments>
		<pubDate>Mon, 12 May 2008 14:39:46 +0000</pubDate>
		<dc:creator>jps</dc:creator>
		
		<category><![CDATA[futurology]]></category>

		<category><![CDATA[paradigms]]></category>

		<category><![CDATA[quickies]]></category>

		<category><![CDATA[software]]></category>

		<category><![CDATA[browser]]></category>

		<category><![CDATA[convergence]]></category>

		<category><![CDATA[ide]]></category>

		<category><![CDATA[java]]></category>

		<category><![CDATA[javascript]]></category>

		<category><![CDATA[virtual]]></category>

		<category><![CDATA[vm]]></category>

		<guid isPermaLink="false">http://www.jpstacey.info/blog/2008/05/12/compiling-languages-down-to-javascript/</guid>
		<description><![CDATA[A hundred years from now, all code will look both similar and different.]]></description>
			<content:encoded><![CDATA[<p>If it&#8217;s really the case that <a href="/blog/2008/05/11/emacs-as-an-anagram-of-ecma-s/">browsers, virtual machines and IDEs will one day converge</a>, then the first steps would be to <a href="http://ejohn.org/blog/running-java-in-javascript/">run Java, Ruby and other languages in a browser using Javascript</a>. (Hat tip to <a href="http://gagravarr.livejournal.com/">Nick</a> for the timely links.)</p>
<p>[Edit: <a href="http://codespeak.net/pypy/dist/pypy/doc/js/whatis.html">run Python using Javascript</a> too.]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jpstacey.info/blog/2008/05/12/compiling-languages-down-to-javascript/feed/</wfw:commentRss>
		</item>
		<item>
		<title>With apologies to Hanlon</title>
		<link>http://www.jpstacey.info/blog/2008/04/07/with-apologies-to-hanlon/</link>
		<comments>http://www.jpstacey.info/blog/2008/04/07/with-apologies-to-hanlon/#comments</comments>
		<pubDate>Mon, 07 Apr 2008 20:28:01 +0000</pubDate>
		<dc:creator>jps</dc:creator>
		
		<category><![CDATA[culture]]></category>

		<category><![CDATA[quickies]]></category>

		<category><![CDATA[hanlon]]></category>

		<category><![CDATA[law]]></category>

		<category><![CDATA[malware]]></category>

		<category><![CDATA[stupidware]]></category>

		<guid isPermaLink="false">http://www.jpstacey.info/blog/2008/04/07/with-apologies-to-hanlon/</guid>
		<description><![CDATA[&#8220;Never attribute to malware that which can be adequately explained by stupidware.&#8221;
]]></description>
			<content:encoded><![CDATA[<p>&#8220;Never attribute to malware that which can be adequately explained by stupidware.&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jpstacey.info/blog/2008/04/07/with-apologies-to-hanlon/feed/</wfw:commentRss>
		</item>
		<item>
		<title>How to see Last.fm from the other side of the room with LastJS</title>
		<link>http://www.jpstacey.info/blog/2008/03/02/how-to-see-lastfm-from-the-other-side-of-the-room-with-lastjs/</link>
		<comments>http://www.jpstacey.info/blog/2008/03/02/how-to-see-lastfm-from-the-other-side-of-the-room-with-lastjs/#comments</comments>
		<pubDate>Sun, 02 Mar 2008 14:16:00 +0000</pubDate>
		<dc:creator>jps</dc:creator>
		
		<category><![CDATA[hacking]]></category>

		<category><![CDATA[projects]]></category>

		<category><![CDATA[quickies]]></category>

		<category><![CDATA[software]]></category>

		<category><![CDATA[accessibility]]></category>

		<category><![CDATA[bookmarklet]]></category>

		<category><![CDATA[interface]]></category>

		<category><![CDATA[javascript]]></category>

		<category><![CDATA[jquery]]></category>

		<category><![CDATA[lastfm]]></category>

		<category><![CDATA[lastjs]]></category>

		<guid isPermaLink="false">http://www.jpstacey.info/blog/2008/03/02/how-to-see-lastfm-from-the-other-side-of-the-room-with-lastjs/</guid>
		<description><![CDATA[Back from a rather physical near-week of team building with work, I&#8217;ve been listening to Last.fm today to recuperate and nurse my tired muscles. But with the music playing on our crusty, trusty old purple iMac in one corner, and me in the other reading, drinking tea or otherwise recuperating, how can I tell at [...]]]></description>
			<content:encoded><![CDATA[<p>Back from a rather physical near-week of team building with work, I&#8217;ve been listening to Last.fm today to recuperate and nurse my tired muscles. But with the music playing on our crusty, trusty old purple iMac in one corner, and me in the other reading, drinking tea or otherwise recuperating, how can I tell at a glance what the current artist is?</p>
<p>Last.fm&#8217;s web interface isn&#8217;t optimized for the sort of &#8220;media station&#8221; use we put it to, and their downloadable widget won&#8217;t work on the antiquated version of OSX that I&#8217;ve just about managed to squeeze onto dear old Purpurea. So today I&#8217;ve spent some time writing a bookmarklet to allow me (and you, dear reader) to hook into Last.fm and its Flash player&#8217;s behaviour, to update a larger-view popup window with the necessary information.</p>
<p>Here&#8217;s the bookmarklet&#8212;which with attention to catchy names I&#8217;ve called LastJS&#8212;with spaces added for legibility:</p>
<blockquote class="code"><p>
javascript:void(function(){<br />
&nbsp;&nbsp;var&nbsp;s1=document.createElement(&#8217;script&#8217;);<br />
&nbsp;&nbsp;var&nbsp;s2=document.createElement(&#8217;script&#8217;);<br />
&nbsp;&nbsp;s1.src=&#8217;http://www.jpstacey.info/applications/lastjs/jquery.js&#8217;;<br />
&nbsp;&nbsp;s2.src=&#8217;http://www.jpstacey.info/applications/lastjs/last.js&#8217;;</p>
<p>&nbsp;&nbsp;var&nbsp;h=document.getElementsByTagName(&#8217;head&#8217;)[0];<br />
&nbsp;&nbsp;h.appendChild(s1);<br />
&nbsp;&nbsp;h.appendChild(s2);<br />
}())
</p>
</blockquote>
<p>(As the above suggests, the bulk of the code is at <a href="http://www.jpstacey.info/applications/lastjs/last.js">http://www.jpstacey.info/applications/lastjs/last.js</a>.)</p>
<p>And here&#8217;s what you need to do to use it:</p>
<ol>
<li>Add this link to your browser favourites (IE7) or bookmarks (everyone else): <a href="//www.jpstacey.info/applications/lastjs/last.js';var%20h=document.getElementsByTagName('head')[0];h.appendChild(s1);h.appendChild(s2);}())">LastJS bookmarklet</a>.</li>
<li>While on a Last.FM &#8220;now playing&#8221; page e.g. <a href="http://www.last.fm/listen/artist/Hold%2520Steady/similarartists">for The Hold Steady</a>, click the bookmarklet.</li>
<li>This will pull an instance of jQuery and LastJS off my own server, and add a &#8220;click for big&#8221; link under the title.</li>
<li>Click on the link. A new window will open, containing the artist information (track information is a bit obfuscated until the Flash player loads the next track).</li>
<li>Wait. As the track changes, the new window will update with the new track information.</li>
<li>The text is purposefully large yet not too large. If you&#8217;ve got a big monitor you can make it even bigger by increasing the base font size in your browser. To do this in Firefox press CTRL-+ (or Apple-+); I think it&#8217;s something similar in IE7.</li>
</ol>
<p>Feel free to poke around at the code, and distribute it (under GPL, for what it&#8217;s worth: I tried looking into precisely which variant I wanted but my knees started to ache). Here are some of the problems it has to solve:</p>
<ol>
<li>Last.fm uses Prototype, and so needs jQuery to restore the <code>$</code> variable using <code>jQuery.noConflict()</code>.</li>
<li>Events in the Flash player trigger functions in the <code>window</code> scope: by putting a new method in for a given event handler you can hook into Flash events. Care has to be taken, though, not to wrap and re-wrap too often&#8212;the bookmarklet might after all be re-clicked&#8212;or you might provoke a recursion warning.</li>
<li>Popup blockers mean that you can&#8217;t always guarantee the window will exist, and the code has to check accordingly.</li>
<li>Firefox seems to blank the contents of the popup window shortly after it&#8217;s opened, so any writing of text to it has to be delayed, lest it be lost by this clear-out.</li>
</ol>
<p>All probably needs work, but feel free to have a play. It doesn&#8217;t circumvent any DRM or anything, of course, but I&#8217;ve no idea whether it invalidates terms of use, so <i>caveat fructor</i>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jpstacey.info/blog/2008/03/02/how-to-see-lastfm-from-the-other-side-of-the-room-with-lastjs/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
