<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>hyperstruct</title>
	
	<link>http://hyperstruct.net</link>
	<description>{do flatlanders dream of n-dimensional shapes?}</description>
	<lastBuildDate>Sat, 05 Mar 2011 15:30:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/hyperstruct" /><feedburner:info uri="hyperstruct" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>hyperstruct</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>The Mozilla Add-Ons Workshop in Florence</title>
		<link>http://feedproxy.google.com/~r/hyperstruct/~3/2klk04KVmxU/</link>
		<comments>http://hyperstruct.net/2009/06/30/the-mozilla-addons-workshop-in-florence/#comments</comments>
		<pubDate>Tue, 30 Jun 2009 18:48:00 +0000</pubDate>
		<dc:creator>bard</dc:creator>
				<category><![CDATA[Mozilla]]></category>

		<guid isPermaLink="false">http://hyperstruct.net/2009630the-mozilla-addons-workshop-in-florence/</guid>
		<description><![CDATA[<p>(<strong>Note</strong>: this post is also available in <strong>Italian</strong> <a href="http://xulit.org/blogs/bard/2009/6/30/il-mozilla-addons-workshop-2009-di-firenze">on xulit.org</a>)</p>

<p>
Picture a Mozilla geek
<a href="http://www.flickr.com/photos/28959625@N04/3669366988/in/set-72157620687485672/">standing
on the shoulders of another</a> to reach
an electric outlet in the ceiling, then expecting to be returned to
firm floor and instead being shuttled elsewhere to the reason of "one
more outlet to gooooo!".
</p]]></description>
			<content:encoded><![CDATA[<p>(<strong>Note</strong>: this post is also available in <strong>Italian</strong> <a href="http://xulit.org/blogs/bard/2009/6/30/il-mozilla-addons-workshop-2009-di-firenze">on xulit.org</a>)</p>
<p>Picture a Mozilla geek <a href="http://www.flickr.com/photos/28959625@N04/3669366988/in/set-72157620687485672/">standing on the shoulders of another</a> to reach an electric outlet in the ceiling, then expecting to be returned to firm floor and instead being shuttled elsewhere to the reason of &#8220;one more outlet to gooooo!&#8221;.</p>
<p><!--break--></p>
<p style="text-align: center;"><a href="http://www.flickr.com/photos/28959625@N04/3669369760/in/set-72157620687485672/"><img class="aligncenter" src="http://farm3.static.flickr.com/2472/3669369760_c044a869c4.jpg?v=0" alt="" width="500" height="333" /></a>(Photo credits: <a href="http://www.flickr.com/photos/28959625@N04/">William</a>. Complete photoset <a href="http://www.flickr.com/photos/28959625@N04/sets/72157620687485672/">here</a>.)</p>
<p>Picture the chatty <em>signora</em> who serves drinks and panini at the bar, getting asked tens of chairs first, then an old knife to be used as a screwdriver <a href="http://www.flickr.com/photos/28959625@N04/3669366428/in/set-72157620687485672/">to assemble fans</a> (no, not the human variety), then rags to clean above said chairs retrieved from the basement from above said geeks. Picture her respond with more lively chatter instead of increasing threats to kick us out.</p>
<p>Picture two guys who never gave a presentation together bantering/negotiating on stage, much to the audience&#8217;s amusement, which slides to skip to make time for an unplanned but <a href="http://people.mozilla.com/~prouget/demos/">ubercool</a> presentation.  (Of course I was right most of the time but Luca was tougher. <img src='http://hyperstruct.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> )</p>
<p>You might think by now that the <a href="https://wiki.mozilla.org/MAOW:2009:Firenze">Mozilla Add-On Workshop</a> had more than a bit of adventure in it, but <em>our men in Florence</em> Giacomo and Iacopo (from <a href="http://www.mozillaitalia.it">Mozilla Italia</a>) as well as the <em>headquarter agents</em> Paul and William (from <a href="http://www.mozilla-europe.org">Mozilla Europe</a>) plowed through every obstacle and got us safely to the heart of the workshop: an introductory talk on Firefox extension development, a hands-on tutorial, and a short finale on the tricks of the trade.</p>
<p>Despite many rough edges and a wealth of non-obvious material to cover (we went from zero to a Twitter-search extension to interactive development in less than three hours), almost fifty people gave us full attention and support, which is a testament to the rising interest on the subject in this country (or to the seldom sung quality of Italian patience (or both)).</p>
<p>Courseware is available: <a href="http://ubik.cc/maow09-firenze/slides/">slides</a>, <a href="http://ubik.cc/maow09-firenze/addon-examples/">incremental examples on building an extension</a>, <a href="http://ubik.cc/maow09-firenze/js-examples">samples of “unusual” (if you&#8217;ve only done web development so far) JavaScript</a>.</p>
<p>If you were there and your questions went unasked or unanswered because of time or because you couldn&#8217;t hang out afterwards; or you want us to keep you in the loop about this Fall&#8217;s initiatives; or you just want to say hi, feel free to get in touch with  <a href="http://xulit.org/chi-siamo">us</a> or leave a comment here or on the <a href="http://xulit.org/blogs/bard/2009/6/30/il-mozilla-addons-workshop-2009-di-firenze">Italian version of this post</a>.</p>
<p>Happy extension hacking!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/hyperstruct?a=2klk04KVmxU:3Zj-wKKKR60:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/hyperstruct?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=2klk04KVmxU:3Zj-wKKKR60:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=2klk04KVmxU:3Zj-wKKKR60:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=2klk04KVmxU:3Zj-wKKKR60:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/hyperstruct?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=2klk04KVmxU:3Zj-wKKKR60:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=2klk04KVmxU:3Zj-wKKKR60:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=2klk04KVmxU:3Zj-wKKKR60:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=2klk04KVmxU:3Zj-wKKKR60:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=2klk04KVmxU:3Zj-wKKKR60:-BTjWOF_DHI"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=2klk04KVmxU:3Zj-wKKKR60:-BTjWOF_DHI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/hyperstruct/~4/2klk04KVmxU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://hyperstruct.net/2009/06/30/the-mozilla-addons-workshop-in-florence/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://hyperstruct.net/2009/06/30/the-mozilla-addons-workshop-in-florence/</feedburner:origLink></item>
		<item>
		<title>Gecko in Emacs (sort of)</title>
		<link>http://feedproxy.google.com/~r/hyperstruct/~3/Dn1DUOR_uuQ/</link>
		<comments>http://hyperstruct.net/2009/04/22/gecko-in-emacs-sort-of/#comments</comments>
		<pubDate>Wed, 22 Apr 2009 18:48:31 +0000</pubDate>
		<dc:creator>bard</dc:creator>
				<category><![CDATA[Emacs]]></category>
		<category><![CDATA[Mozilla]]></category>

		<guid isPermaLink="false">http://hyperstruct.net/2009422gecko-in-emacs-sort-of/</guid>
		<description><![CDATA[<p>After providing a <a href="http://wiki.github.com/bard/mozrepl">Lisp-like facility for interactive development</a> to
Firefox, it was only fair for the cute panda to return the
favor and lend some rendering power to <a href="http://edward.oconnor.cx/2006/03/quality-without-a-name">Emacs</a>.</p>

<p>  Four lines of Lisp,
 <a href="http://hyperstruct.net/2009/2/5/turning-firefox-into-a-screenshot-server-with-mozrepl">a little hack</a> and a function theft from <a href="http://emacs-w3m.namazu.org/">w3m.el</a> later, something
pops up in an Emacs buffer...
</p]]></description>
			<content:encoded><![CDATA[<p>After providing a <a href="http://wiki.github.com/bard/mozrepl">Lisp-like facility for interactive development</a> to Firefox, it was only fair for the cute panda to return the favor and lend some rendering power to <a href="http://edward.oconnor.cx/2006/03/quality-without-a-name">Emacs</a>.</p>
<p>Four lines of Lisp,   <a href="http://hyperstruct.net/2009/2/5/turning-firefox-into-a-screenshot-server-with-mozrepl">a little hack</a> and a function theft from <a href="http://emacs-w3m.namazu.org/">w3m.el</a> later, something pops up in an Emacs buffer&#8230;</p>
<p style="text-align: center;"><a href="http://hyperstruct.net/wp-uploads/geckomacs.png"><a href="http://hyperstruct.net/wp-uploads/geckomacs.png"><img class="aligncenter size-medium wp-image-201" title="Geckomacs" src="http://hyperstruct.net/wp-uploads/geckomacs-400x224.png" alt="" width="400" height="224" /></a><br />
</a></p>
<p><!--break--></p>
<p>It is, of course, just a proof of concept.  No, I don&#8217;t have the time to develop it further.  Yes, I&#8217;ll treat you to several rounds of Belgian beer if you do.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/hyperstruct?a=Dn1DUOR_uuQ:PrUpVWYwZTQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/hyperstruct?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=Dn1DUOR_uuQ:PrUpVWYwZTQ:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=Dn1DUOR_uuQ:PrUpVWYwZTQ:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=Dn1DUOR_uuQ:PrUpVWYwZTQ:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/hyperstruct?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=Dn1DUOR_uuQ:PrUpVWYwZTQ:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=Dn1DUOR_uuQ:PrUpVWYwZTQ:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=Dn1DUOR_uuQ:PrUpVWYwZTQ:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=Dn1DUOR_uuQ:PrUpVWYwZTQ:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=Dn1DUOR_uuQ:PrUpVWYwZTQ:-BTjWOF_DHI"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=Dn1DUOR_uuQ:PrUpVWYwZTQ:-BTjWOF_DHI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/hyperstruct/~4/Dn1DUOR_uuQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://hyperstruct.net/2009/04/22/gecko-in-emacs-sort-of/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://hyperstruct.net/2009/04/22/gecko-in-emacs-sort-of/</feedburner:origLink></item>
		<item>
		<title>Emacs, Guile, JavaScript, oh my!</title>
		<link>http://feedproxy.google.com/~r/hyperstruct/~3/d3xjFKLHrBI/</link>
		<comments>http://hyperstruct.net/2009/02/23/emacs-guile-javascript-oh-my/#comments</comments>
		<pubDate>Mon, 23 Feb 2009 21:31:13 +0000</pubDate>
		<dc:creator>bard</dc:creator>
				<category><![CDATA[Emacs]]></category>

		<guid isPermaLink="false">http://hyperstruct.net/2009223emacs-guile-javascript-oh-my/</guid>
		<description><![CDATA[<cite>Let's create <a href="http://en.wikipedia.org/wiki/Parrot_virtual_machine#Languages">Parrot</a> (but this time for real).</cite>

Crazy?

<cite>Let's have ECMAScript as the first language to program it.</cite>

Crazier?

<cite>Let's have Emacs as the first application to run on it.</cite>

Insanity?

Andy Wingo <a href="http://wingolog.org/archives/2009/02/22/ecmascript-for-guile">doesn't think so</a>.

Can't wait!]]></description>
			<content:encoded><![CDATA[<blockquote><p>Let&#8217;s create <a href="http://en.wikipedia.org/wiki/Parrot_virtual_machine#Languages">Parrot</a> (but this time for real).</p></blockquote>
<p>Crazy?</p>
<blockquote><p>Let&#8217;s have ECMAScript as the first language to program it.</p></blockquote>
<p>Crazier?</p>
<blockquote><p>Let&#8217;s have Emacs as the first application to run on it.</p></blockquote>
<p>Insanity?</p>
<p>Andy Wingo <a href="http://wingolog.org/archives/2009/02/22/ecmascript-for-guile">doesn&#8217;t think so</a>.</p>
<p>Can&#8217;t wait!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/hyperstruct?a=d3xjFKLHrBI:a7y6UUxaWq8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/hyperstruct?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=d3xjFKLHrBI:a7y6UUxaWq8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=d3xjFKLHrBI:a7y6UUxaWq8:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=d3xjFKLHrBI:a7y6UUxaWq8:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/hyperstruct?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=d3xjFKLHrBI:a7y6UUxaWq8:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=d3xjFKLHrBI:a7y6UUxaWq8:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=d3xjFKLHrBI:a7y6UUxaWq8:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=d3xjFKLHrBI:a7y6UUxaWq8:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=d3xjFKLHrBI:a7y6UUxaWq8:-BTjWOF_DHI"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=d3xjFKLHrBI:a7y6UUxaWq8:-BTjWOF_DHI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/hyperstruct/~4/d3xjFKLHrBI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://hyperstruct.net/2009/02/23/emacs-guile-javascript-oh-my/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://hyperstruct.net/2009/02/23/emacs-guile-javascript-oh-my/</feedburner:origLink></item>
		<item>
		<title>Turning Firefox into a screenshot server with MozRepl</title>
		<link>http://feedproxy.google.com/~r/hyperstruct/~3/DZz2E5qCcDk/</link>
		<comments>http://hyperstruct.net/2009/02/05/turning-firefox-into-a-screenshot-server-with-mozrepl/#comments</comments>
		<pubDate>Thu, 05 Feb 2009 09:02:49 +0000</pubDate>
		<dc:creator>bard</dc:creator>
				<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Releases]]></category>

		<guid isPermaLink="false">http://hyperstruct.net/200925turning-firefox-into-a-screenshot-server-with-mozrepl/</guid>
		<description><![CDATA[<p>
In October I introduced <a href="http://hyperstruct.net/2008/10/12/metabrowsing-custom-interactors-for-mozrepl">custom interactors</a> and someone <a href="http://hyperstruct.net/2008/10/12/metabrowsing-custom-interactors-for-mozrepl#comment-679">asked</a> what can be done with them other than application inspection.
</p>

<p><a href="http://github.com/bard/mozrepl/wikis/interactor-screenshot-server">Here</a>'s a practical application that turns Firefox into a screenshot server.  It lets you request e.g. <code>http://localhost:4242/screenshot/http://en.wikipedia.org</code> and receive a PNG screenshot of Wikipedia homepage. (Instructions to run it are at the bottom.)</p>

<p>Features and things to note:</p]]></description>
			<content:encoded><![CDATA[<p>In October I introduced <a href="http://hyperstruct.net/2008/10/12/metabrowsing-custom-interactors-for-mozrepl">custom interactors</a> and someone <a href="http://hyperstruct.net/2008/10/12/metabrowsing-custom-interactors-for-mozrepl#comment-679">asked</a> what can be done with them other than application inspection.</p>
<p><a href="http://github.com/bard/mozrepl/wikis/interactor-screenshot-server">Here</a>&#8216;s a practical application that turns Firefox into a screenshot server.  It lets you request e.g. <code>http://localhost:4242/screenshot/http://en.wikipedia.org</code> and receive a PNG screenshot of Wikipedia homepage. (Instructions to run it are at the bottom.)</p>
<p>Features and things to note:</p>
<p><!--break--></p>
<ul>
<li>Every page is loaded in a new tab, meaning that multiple screenshots can be requested concurrently.</li>
<li>You can have MozRepl listen to outside requests and thus have the server run on a machine (or machines) other than the one requesting screenshots.</li>
<li>Adding <code>.../pdf/http://en.wikipedia.org</code>, <code>.../postscript/http://en.wikipedia.org</code>, <code>.../getmail/http://mail.google.com?user=foo&amp;password=bar</code>, and so on, shouldn&#8217;t be too hard.</li>
</ul>
<p>This is no finished product but it should give a hint of the possibilities.  Known issues: since it takes the screenshot upon DOM load event, pages that use the same event to build sizeable portions of the document (such as iGoogle) might turn out incomplete or just white. Also, Firefox 3.1 seems to hang when the same browser instance is both the requester and the receiver of the screenshot (ok, not the most useful scenario, but still).</p>
<p>To try it:</p>
<ol>
<li><a href="http://github.com/bard/mozrepl/wikis/home">Get MozRepl</a>, whether devel or stable branch doesn&#8217;t matter.</li>
<li>Copy the <a href="http://wiki.github.com/bard/mozrepl/interactor-screenshot-server">source of the screenshot server</a> to a file (e.g. <code>/home/foo/mozrepl-init.js</code>)</li>
<li>In about:config, set <code>extensions.mozrepl.initUrl</code> to the URL of that file, e.g. <code>file:///home/foo/mozrepl-init.js</code>. (This file gets read whenever a new MozRepl session is started.)</li>
<li>In about:config, also set <code>extensions.mozrepl.defaultInteractor</code> to “screenshot”.</li>
<li>Select <code>Tools → MozRepl → Start</code> from the menu to start MozRepl.</li>
<li>Point wget (or curl, or another browser) to Firefox with:
<pre><code> $ wget http://localhost:4242/screenshot/http://en.wikipedia.org </code></pre>
</li>
</ol>
<p><strong>Update 2009-06-16:</strong> <a href="http://adamhooper.com/blog">Adam</a> has an <a href="http://github.com/adamh/html_to_png_server/">HTML-to-PNG server</a> with an improved version of the interactor.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/hyperstruct?a=DZz2E5qCcDk:VIkh8xycaDo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/hyperstruct?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=DZz2E5qCcDk:VIkh8xycaDo:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=DZz2E5qCcDk:VIkh8xycaDo:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=DZz2E5qCcDk:VIkh8xycaDo:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/hyperstruct?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=DZz2E5qCcDk:VIkh8xycaDo:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=DZz2E5qCcDk:VIkh8xycaDo:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=DZz2E5qCcDk:VIkh8xycaDo:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=DZz2E5qCcDk:VIkh8xycaDo:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=DZz2E5qCcDk:VIkh8xycaDo:-BTjWOF_DHI"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=DZz2E5qCcDk:VIkh8xycaDo:-BTjWOF_DHI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/hyperstruct/~4/DZz2E5qCcDk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://hyperstruct.net/2009/02/05/turning-firefox-into-a-screenshot-server-with-mozrepl/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://hyperstruct.net/2009/02/05/turning-firefox-into-a-screenshot-server-with-mozrepl/</feedburner:origLink></item>
		<item>
		<title>Seven things you may want to ignore^W^W^W^Wmay not know about me</title>
		<link>http://feedproxy.google.com/~r/hyperstruct/~3/bWR7LkdWATk/</link>
		<comments>http://hyperstruct.net/2009/02/04/seven-things-you-may-want-to-ignorewwwwmay-not-know-about-me/#comments</comments>
		<pubDate>Wed, 04 Feb 2009 16:15:06 +0000</pubDate>
		<dc:creator>bard</dc:creator>
				<category><![CDATA[Other]]></category>

		<guid isPermaLink="false">http://hyperstruct.net/200924seven-things-you-may-want-to-ignorewwwwmay-not-know-about-me/</guid>
		<description><![CDATA[<p>
I tried to pretend I didn't notice but when <a href="http://dafizilla.wordpress.com/2009/01/15/7-things-you-may-or-may-not-know-about-me/">tag</a>
<a href="http://sonnypiers.net/blog/index.php?post/2009/01/16/7-things-you-may-not-know-about-me">count</a>
<a href="http://andreaswuest.blogspot.com/2009/01/7-things.html">reached</a>
<a href="http://www.thebrainmachine.org/2009/01/27/sette-cose-sette/">four</a> it became difficult.  So here's my
&#8220;seven facts&#8221;.  But first, the Rules:
</p>

<ul>
<li>Link to your original tagger(s) and list these rules in your post.</li>
<li>Share seven facts about yourself in the post.</li>
<li>Tag seven people at the end of your post by leaving their names and the links to their blogs.</li>
<li>Let them know they've been tagged.</li>
</ul>

<p>
That said...
</p]]></description>
			<content:encoded><![CDATA[<p> I tried to pretend I didn&#8217;t notice but when <a href="http://dafizilla.wordpress.com/2009/01/15/7-things-you-may-or-may-not-know-about-me/">tag</a>  <a href="http://sonnypiers.net/blog/index.php?post/2009/01/16/7-things-you-may-not-know-about-me">count</a> <a href="http://andreaswuest.blogspot.com/2009/01/7-things.html">reached</a> <a href="http://www.thebrainmachine.org/2009/01/27/sette-cose-sette/">four</a> it became difficult.  So here&#8217;s my &ldquo;seven facts&rdquo;.  But first, the Rules: </p>
<ul>
<li>Link to your original tagger(s) and list these rules in your post.</li>
<li>Share seven facts about yourself in the post.</li>
<li>Tag seven people at the end of your post by leaving their names and the links to their blogs.</li>
<li>Let them know they&#8217;ve been tagged.</li>
</ul>
<p> That said&#8230; </p>
<p><!--break--></p>
<ol>
<li>I&#8217;m not fanatic about optimizing code but I&#8217;ll shave every gram I can out of my baggage.  Current target is a single 6kg (down from 8kg) carry-on bag for trips of indefinite time.</li>
<li>I hate being woken up by the alarm at 10:00 and love being woken up by sunlight at 5:00.</li>
<li>I&#8217;ve been a computer geek for two thirds of my life but a programmer for &ldquo;just&rdquo; one.  What got me started on programming was building harps.  (Yeah, the musical thingies.)  You can go with paper calculations when making a violin (four strings) or a guitar (six), but mis-designing half a hundred strings in a harp means either a floppy sound or a very loud one&#8230; when the instrument implodes. Sometimes you <em>really</em> want a computer to help out.</li>
<li>I sleep on a tatami mat and walk barefoot whenever I can.  For some reason <a href="http://images.google.com/images?hl=en&#038;q=shoe&#038;btnG=Search+Images&#038;gbv=2">small</a> <a href="http://images.google.com/images?gbv=2&#038;hl=en&#038;q=chair&#038;btnG=Search+Images">disconnections</a> from the ground bother me much more than <a href="http://images.google.com/images?gbv=2&#038;hl=en&#038;q=freeclimbing&#038;btnG=Search+Images">serious ones</a>.</li>
<li>I&#8217;m one of the six Italians who rarely drink coffee and don&#8217;t care about soccer.</li>
<li>I know <a href="http://www.improvwisdom.com/chapter.pdf">a better answer than 42</a>.</li>
<li>I don&#8217;t like the N-things meme because I&#8217;m always at a loss when I get to the nth-thing.</li>
</ol>
<p> And here are my victims: </p>
<ol>
<li><a href="http://www.donhopkins.com/drupal/">Don</a>, because he invited John Gilmore for a talk on the day I was leaving for a vacation, and this is my way of punishing him.</li>
<li><a href="http://stpeter.im/">Peter</a>, because he&#8217;s proof that being a superstar <em>and</em> an incredibly nice guy is possible.</li>
<li><a href="http://rfobic.blogspot.com/">Irakli</a>, because it&#8217;s like looking back in time.</li>
<li><a href="http://light-tech.blogspot.com/">Simone</a>, who knows the art of making people feel welcome.</li>
<li><a href="http://paolodona.com/">Paolo</a>, because I haven&#8217;t spoken to him  in ages.</li>
<li><a href="http://x-pilotteam.ya.ru/">Oleg</a>, because people like him is the best that can happen to an open source community.</li>
<li><a href="http://lukego.livejournal.com/">Luke</a>, because he has no clue how much of an influence he is (if I end up trying unicycling, you know whose fault it is).</li>
</ol>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/hyperstruct?a=bWR7LkdWATk:HtkQe3MPkQQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/hyperstruct?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=bWR7LkdWATk:HtkQe3MPkQQ:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=bWR7LkdWATk:HtkQe3MPkQQ:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=bWR7LkdWATk:HtkQe3MPkQQ:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/hyperstruct?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=bWR7LkdWATk:HtkQe3MPkQQ:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=bWR7LkdWATk:HtkQe3MPkQQ:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=bWR7LkdWATk:HtkQe3MPkQQ:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=bWR7LkdWATk:HtkQe3MPkQQ:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=bWR7LkdWATk:HtkQe3MPkQQ:-BTjWOF_DHI"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=bWR7LkdWATk:HtkQe3MPkQQ:-BTjWOF_DHI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/hyperstruct/~4/bWR7LkdWATk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://hyperstruct.net/2009/02/04/seven-things-you-may-want-to-ignorewwwwmay-not-know-about-me/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://hyperstruct.net/2009/02/04/seven-things-you-may-want-to-ignorewwwwmay-not-know-about-me/</feedburner:origLink></item>
		<item>
		<title>FOSDEM countdown</title>
		<link>http://feedproxy.google.com/~r/hyperstruct/~3/Xqu9BTK8Zx0/</link>
		<comments>http://hyperstruct.net/2009/02/04/fosdem-countdown/#comments</comments>
		<pubDate>Tue, 03 Feb 2009 23:32:56 +0000</pubDate>
		<dc:creator>bard</dc:creator>
				<category><![CDATA[Other]]></category>
		<category><![CDATA[fosdem]]></category>
		<category><![CDATA[fosdem2009]]></category>

		<guid isPermaLink="false">http://hyperstruct.net/200924fosdem-countdown/</guid>
		<description><![CDATA[<p>Only three days left before <a href="http://www.fosdem.org/2009/">FOSDEM</a>!</p>

<p>If you, dear Reader, who have stoically endured my writing so far, are coming to the event, please leave a comment or <a href="http://hyperstruct.net/about">send a mail</a>, I'd certainly like to meet you for some important <a href="http://www.fosdem.org/2009/beeralgorithm">algorithm implementation</a>.</p]]></description>
			<content:encoded><![CDATA[<p>Only three days left before <a href="http://www.fosdem.org/2009/">FOSDEM</a>!</p>
<p>If you, dear Reader, who have stoically endured my writing so far, are coming to the event, please leave a comment or <a href="http://hyperstruct.net/about">send a mail</a>, I&#8217;d certainly like to meet you for some important <a href="http://www.fosdem.org/2009/beeralgorithm">algorithm implementation</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/hyperstruct?a=Xqu9BTK8Zx0:LH-cJQtBJpo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/hyperstruct?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=Xqu9BTK8Zx0:LH-cJQtBJpo:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=Xqu9BTK8Zx0:LH-cJQtBJpo:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=Xqu9BTK8Zx0:LH-cJQtBJpo:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/hyperstruct?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=Xqu9BTK8Zx0:LH-cJQtBJpo:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=Xqu9BTK8Zx0:LH-cJQtBJpo:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=Xqu9BTK8Zx0:LH-cJQtBJpo:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=Xqu9BTK8Zx0:LH-cJQtBJpo:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=Xqu9BTK8Zx0:LH-cJQtBJpo:-BTjWOF_DHI"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=Xqu9BTK8Zx0:LH-cJQtBJpo:-BTjWOF_DHI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/hyperstruct/~4/Xqu9BTK8Zx0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://hyperstruct.net/2009/02/04/fosdem-countdown/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://hyperstruct.net/2009/02/04/fosdem-countdown/</feedburner:origLink></item>
		<item>
		<title>Metabrowsing! (Or, custom interactors for MozRepl)</title>
		<link>http://feedproxy.google.com/~r/hyperstruct/~3/HrdFMcO_LhM/</link>
		<comments>http://hyperstruct.net/2008/10/12/metabrowsing-custom-interactors-for-mozrepl/#comments</comments>
		<pubDate>Sun, 12 Oct 2008 18:36:40 +0000</pubDate>
		<dc:creator>bard</dc:creator>
				<category><![CDATA[Documentation]]></category>
		<category><![CDATA[Mozilla]]></category>

		<guid isPermaLink="false">http://hyperstruct.net/metabrowsing-custom-interactors-for-mozrepl/</guid>
		<description><![CDATA[<p>
First guy: "So how would an object inspector look like in MozRepl?"
</p>

<p>
(Flashback: MozRepl is an interactive shell for Firefox and other
Mozilla apps.  You connect to Firefox with telnet or similar, type some
JavaScript code, and it gets executed on the fly.)
</p]]></description>
			<content:encoded><![CDATA[<p>First guy: &#8220;So how would an object inspector look like in MozRepl?&#8221;</p>
<p>(Flashback: MozRepl is an interactive shell for Firefox and other Mozilla apps.  You connect to Firefox with telnet or similar, type some JavaScript code, and it gets executed on the fly.)</p>
<p><!--break--></p>
<p style="text-align: center;"><a href="http://hyperstruct.net/wp-uploads/mozrepl_javascript.png"><img class="aligncenter size-medium wp-image-205" title="MozRepl JavaScript Interactor" src="http://hyperstruct.net/wp-uploads/mozrepl_javascript-400x252.png" alt="" width="400" height="252" /></a></p>
<p>I patiently explained how a command line inspector would look like.  More or less like:</p>
<p style="text-align: center;"><a href="http://hyperstruct.net/wp-uploads/mozrepl_inspect.png"><img class="aligncenter size-medium wp-image-206" title="MozRepl Inspect Interactor" src="http://hyperstruct.net/wp-uploads/mozrepl_inspect-400x252.png" alt="" width="400" height="252" /></a></p>
<p>First guy: &#8220;Well, and how do you get this in MozRepl?&#8221;</p>
<p>I (im)pantietly explained that there was no inspector yet.</p>
<p>First guy: &#8220;Why not?&#8221;</p>
<p>I (im)patiently&#8230;</p>
<p>Second guy, out of nowhere: &#8220;Yeah, why not?&#8221;</p>
<p>You know that you&#8217;re in trouble when even the nicest guy in the place teams up to nag you.</p>
<p>Then I spent some time <em>not</em> to write an inspector, but to make it possible (and easy) for third parties to write new interaction modes for MozRepl, so that the onus of writing the damn inspector would be on the above guys. <img src='http://hyperstruct.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  (The best thing you can do with challenges isn&#8217;t winning them, it&#8217;s turning them upside down.)</p>
<p>However things quickly got fancier while I explored, because the same request/response pattern interactive interpreters are built around is common to a lot of applications.  Object inspectors, sure. Even <a href="http://en.wikipedia.org/wiki/Interactive_fiction">text adventures</a> (&#8220;You&#8217;re in a dimly-lit browser, surrounded by menacing angled brackets and curly braces&#8221;).</p>
<p><em>But also HTTP</em>.</p>
<p>One custom interactor later, there it was: Firefox understanding HTTP and browsing itself. <img src='http://hyperstruct.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a rel="attachment wp-att-207" href="http://hyperstruct.net/2008/10/12/metabrowsing-custom-interactors-for-mozrepl/mozrepl_http-inspect/"><img class="aligncenter size-medium wp-image-207" title="MozRepl HTTP-Inspect Interactor" src="http://hyperstruct.net/wp-uploads/mozrepl_http-inspect-400x252.png" alt="" width="400" height="252" /></a></p>
<p>Where to go from here?  Once there&#8217;s a halfway decent implementation of HTTP (hint: mine isn&#8217;t), you may be able to drive Firefox with XML-RPC, JSON-RPC, REST-style manipulation of resources, and who knows what else.  (Oh, yeah, I guess server-side long-timers in the audience will know what-else very well.)</p>
<p>Support is available in the new <a href="http://repo.hyperstruct.net/mozrepl/devel">stand-alone MozRepl package</a>.  To try out the http-inspect mode, just go to about:config and set the &#8220;extensions.mozrepl.defaultInteractor&#8221; pref to &#8220;http-inspect&#8221;, then point the browser to <a href="http://localhost:4242">http://localhost:4242</a>.  Documentation on how to write custom interactors is on the <a href="http://github.com/bard/mozrepl/wikis/custom-interactors">wiki</a>.</p>
<p>Credits to <a href="http://www.sergimansilla.com/blog/">Sergi</a> for coming up with the &#8220;metabrowsing&#8221; title!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/hyperstruct?a=HrdFMcO_LhM:DAdLexd-5wQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/hyperstruct?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=HrdFMcO_LhM:DAdLexd-5wQ:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=HrdFMcO_LhM:DAdLexd-5wQ:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=HrdFMcO_LhM:DAdLexd-5wQ:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/hyperstruct?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=HrdFMcO_LhM:DAdLexd-5wQ:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=HrdFMcO_LhM:DAdLexd-5wQ:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=HrdFMcO_LhM:DAdLexd-5wQ:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=HrdFMcO_LhM:DAdLexd-5wQ:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=HrdFMcO_LhM:DAdLexd-5wQ:-BTjWOF_DHI"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=HrdFMcO_LhM:DAdLexd-5wQ:-BTjWOF_DHI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/hyperstruct/~4/HrdFMcO_LhM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://hyperstruct.net/2008/10/12/metabrowsing-custom-interactors-for-mozrepl/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://hyperstruct.net/2008/10/12/metabrowsing-custom-interactors-for-mozrepl/</feedburner:origLink></item>
		<item>
		<title>seethrough, a simple XML/XHTML templating system for… JavaScript, this</title>
		<link>http://feedproxy.google.com/~r/hyperstruct/~3/tnUa7cqBWr4/</link>
		<comments>http://hyperstruct.net/2008/09/21/seethrough-a-simple-xmlxhtml-templating-system-for-javascript-this-time/#comments</comments>
		<pubDate>Sun, 21 Sep 2008 12:13:18 +0000</pubDate>
		<dc:creator>bard</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Releases]]></category>

		<guid isPermaLink="false">http://hyperstruct.net/2008921seethrough-a-simple-xmlxhtml-templating-system-for-javascript-this-time/</guid>
		<description><![CDATA[Still following the philosophy of “<a href="http://hyperstruct.net/2008/8/10/purplebridge/">what the hell are you still doing on my disk</a>”, I released <a href="http://github.com/bard/seethrough_js">seethrough for JavaScript</a>, a port of the XML/XHTML template engine I wrote for Erlang <a href="http://hyperstruct.net/2007/1/7/seethrough-a-simple-xml-xhtml-templating-system-for-erlang/">some time ago</a>.
]]></description>
			<content:encoded><![CDATA[<p>Still following the philosophy of “<a href="http://hyperstruct.net/2008/8/10/purplebridge/">what the hell are you still doing on my disk</a>”, I released <a href="http://github.com/bard/seethrough_js">seethrough for JavaScript</a>, a port of the XML/XHTML template engine I wrote for Erlang <a href="http://hyperstruct.net/2007/1/7/seethrough-a-simple-xml-xhtml-templating-system-for-erlang/">some time ago</a>.</p>
<p>It&#8217;s based on E4X, it&#8217;s extensible, and works in Spidermonkey 1.8 and Rhino 1.7.  Rough docs are <a href="http://github.com/bard/seethrough_js/wikis/home">here</a>. Enjoy!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/hyperstruct?a=tnUa7cqBWr4:jg3rGioINks:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/hyperstruct?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=tnUa7cqBWr4:jg3rGioINks:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=tnUa7cqBWr4:jg3rGioINks:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=tnUa7cqBWr4:jg3rGioINks:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/hyperstruct?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=tnUa7cqBWr4:jg3rGioINks:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=tnUa7cqBWr4:jg3rGioINks:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=tnUa7cqBWr4:jg3rGioINks:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=tnUa7cqBWr4:jg3rGioINks:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=tnUa7cqBWr4:jg3rGioINks:-BTjWOF_DHI"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=tnUa7cqBWr4:jg3rGioINks:-BTjWOF_DHI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/hyperstruct/~4/tnUa7cqBWr4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://hyperstruct.net/2008/09/21/seethrough-a-simple-xmlxhtml-templating-system-for-javascript-this-time/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://hyperstruct.net/2008/09/21/seethrough-a-simple-xmlxhtml-templating-system-for-javascript-this-time/</feedburner:origLink></item>
		<item>
		<title>Purplebridge</title>
		<link>http://feedproxy.google.com/~r/hyperstruct/~3/r0_yD5UAZHY/</link>
		<comments>http://hyperstruct.net/2008/08/10/purplebridge/#comments</comments>
		<pubDate>Sun, 10 Aug 2008 21:21:19 +0000</pubDate>
		<dc:creator>bard</dc:creator>
				<category><![CDATA[Jabber]]></category>
		<category><![CDATA[Releases]]></category>

		<guid isPermaLink="false">http://hyperstruct.net/2008810purplebridge/</guid>
		<description><![CDATA[After writing it in a couple of afternoons and letting it wait for attention (alas, in vain) for months, I decided to release <a href="http://github.com/bard/purplebridge/wikis/home">purplebridge</a> so that others may play with it.  Quoting from the wiki:

<cite>
purplebridge is a GUI-less client for IM networks based on <a href="http://developer.pidgin.im/wiki/WhatIsLibpurple">libpurple</a> that disguises as a local XMPP server. Once ready, an XMPP client will be able to launch it, connect to it, and through it reach the foreign networks supported by libpurple.
</cite>

The <a href="http://github.com/bard/purplebridge/wikis/home">wiki</a> has more information about status and rationale]]></description>
			<content:encoded><![CDATA[<p>After writing it in a couple of afternoons and letting it wait for attention (alas, in vain) for months, I decided to release <a href="http://github.com/bard/purplebridge/wikis/home">purplebridge</a> so that others may play with it.  Quoting from the wiki:</p>
<blockquote><p>purplebridge is a GUI-less client for IM networks based on <a href="http://developer.pidgin.im/wiki/WhatIsLibpurple">libpurple</a> that disguises as a local XMPP server. Once ready, an XMPP client will be able to launch it, connect to it, and through it reach the foreign networks supported by libpurple.</p></blockquote>
<p>The <a href="http://github.com/bard/purplebridge/wikis/home">wiki</a> has more information about status and rationale.</p>
<p><!--break--></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/hyperstruct?a=r0_yD5UAZHY:RUBzRwmhNjQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/hyperstruct?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=r0_yD5UAZHY:RUBzRwmhNjQ:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=r0_yD5UAZHY:RUBzRwmhNjQ:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=r0_yD5UAZHY:RUBzRwmhNjQ:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/hyperstruct?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=r0_yD5UAZHY:RUBzRwmhNjQ:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=r0_yD5UAZHY:RUBzRwmhNjQ:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=r0_yD5UAZHY:RUBzRwmhNjQ:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=r0_yD5UAZHY:RUBzRwmhNjQ:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=r0_yD5UAZHY:RUBzRwmhNjQ:-BTjWOF_DHI"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=r0_yD5UAZHY:RUBzRwmhNjQ:-BTjWOF_DHI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/hyperstruct/~4/r0_yD5UAZHY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://hyperstruct.net/2008/08/10/purplebridge/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://hyperstruct.net/2008/08/10/purplebridge/</feedburner:origLink></item>
		<item>
		<title>Synchronous invocation in JavaScript, part 4: error handling</title>
		<link>http://feedproxy.google.com/~r/hyperstruct/~3/JfDSrWRKsqE/</link>
		<comments>http://hyperstruct.net/2008/05/27/synchronous-invocation-in-javascript-part-4-error-handling/#comments</comments>
		<pubDate>Tue, 27 May 2008 10:20:50 +0000</pubDate>
		<dc:creator>bard</dc:creator>
				<category><![CDATA[Documentation]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://hyperstruct.net/2008517synchronous-invocation-in-javascript-part-4-error-handling/</guid>
		<description><![CDATA[<p><a href="http://hyperstruct.net/2008/5/17/synchronous-invocation-in-javascript-part-3-returning-values">Last time</a> we saw how to transfer results of
computations from pseudo-blocking calls back into the main
process.  What happens <del>if</del> when something goes wrong, though?</p>

<p>In the (real) synchronous world, error conditions used to
travel on the same road as return values:</p]]></description>
			<content:encoded><![CDATA[<p><a href="http://hyperstruct.net/2008/5/27/synchronous-invocation-in-javascript-part-3-returning-values">Last time</a> we saw how to transfer results of computations from pseudo-blocking calls back into the main process.  What happens <del>if</del> when something goes wrong, though?</p>
<p>In the (real) synchronous world, error conditions used to travel on the same road as return values:</p>
<pre><code>
    char *foo;
    foo = doSomething();
    if (foo == NULL) {
        error("can't get foo");
        exit(1);
    } else {
        doSomethingElseWith(foo);
    }
</code>
</pre>
<p>Then someone realized that error handling and the real task would better not be intertwined, or the general sense of the latter might become less and less clear.  After all, errors were, er, the exception, not the rule, and might best be handled in a parallel world that veery now and then resurfaced, but not in the middle of nice-looking, expressive code.</p>
<pre><code>
    try {
        var foo = doSomething();
        doSomethingElseWith(foo);
    } catch(e if e == NoFooException) {
        error("can't get foo");
    }
</code>
</pre>
<p>Normally, asynchronous code in JavaScript puts us back in the first scenario, although we don&#8217;t get the result/error through a return value but as a function argument:</p>
<pre><code>
    var req = new XMLHttpRequest();
    req.open('GET', url, true);
    req.onreadystatechange = function(event) {
        if(req.readyState == 4) {
            if(req.status != 200)
                error('Something went wrong!');
            else
                doSomethingWith(req);
        }
    };
    req.send(null);
</code>
</pre>
<p>Turning it into pseudo-synchronous makes things only a bit better. The error comes through a return value and we deal with errors exactly as in the first scenario:</p>
<pre><code>
    function getUrl(url) {
        return function(driver) {
            var req = new XMLHttpRequest();
            req.open('GET', url, true);
            req.onreadystatechange = function(event) {
                if(req.readyState == 4)
                    driver(req);
            };
            req.send(null);
        }
    }

    var driver = proc(function() {
        dump("Retrieving URL...\n");
        var req = yield(getUrl('http://hyperstruct.net'));
        if(req.status != 200)
            dump('error!');
        else
            dump(req.responseText + '\n');
    });

    driver();
<code>
</code></code></pre>
<p>What we want, though, is to make use of the exception “channel”, for the reasons given above: separating description of the task from description of what to do when something goes wrong.</p>
<p>It takes some extra load in the process definition that hopefully isn&#8217;t <em>too</em> hard on the eyes:</p>
<pre><code>
    var driver = proc(function() {
        try {
            var result = check(yield(
                errorProneFunction()
            ));
            dump('Success! ' + result);
        } catch(e) {
            dump('Something went wrong <img src='http://hyperstruct.net/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' />  ' + e);
        }
    });

    driver();
</code>
</pre>
<p>Implementation of <code>check()</code> and changes to the process driver are trivial:</p>
<pre><code>
    function check(obj) {
        if(obj instanceof Error)
            throw obj;
        else
            return obj;
    }

    function proc(processDef) {
        var process = processDef();

        function driver(value) {
            try {
                var pseudoBlockingCall = process.send(value);

                try {
                    pseudoBlockingCall(driver);
                } catch(e) {
                    driver(e)
                }
            } catch(e if e == StopIteration) {

            }

        }

        return driver;
    }
</code>
</pre>
<ul>
<li>The inner <code>try...catch</code> inside the process driver catches exceptions thrown from pseudo-blocking functions, and passes them back to the process as if they were values, so they will be returned to the caller of the pseudo-blocking function.</li>
<li><code>check()</code> receives <code>yield()</code>&#8216;s return value. If it&#8217;s an exception, it <code>throw()</code>s it (thereby sending it across the usual exception channel), otherwise just returns the untouched vaule.</li>
<li>An extra <code>try...catch</code> in the process driver lets it ignore the <code>StopIteration</code> exception—we won&#8217;t go into that here.</li>
</ul>
<p>The example below, relying on the revised implementation of <code>proc()</code>, shows that exceptions thrown synchronously in a pseudo-blocking call can be caught and exposed within the process:</p>
<pre><code>
    function errorProneFunction() {
        return function(driver) {
            throw new Error('Something went wrong!');
            driver('Some other value for correct computation');
        }
    }

    var driver = proc(function() {
        try {
            var result = check(yield(
                errorProneFunction()
            ));
            dump('Success! ' + result);
        } catch(e) {
            dump('Error. <img src='http://hyperstruct.net/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' />  ' + e);
        }
    });

    driver();
</code>
</pre>
<p>Exceptions can be thrown by the asynchronous part of pseudo-blocking call, too: just pass them as argument to <code>driver()</code> where you&#8217;d normally pass the result of the computation:</p>
<pre><code>
    function getUrl(url) {
        return function(driver) {
            var req = new XMLHttpRequest();
            req.open('GET', url, true);
            req.onreadystatechange = function(event) {
                if(req.readyState == 4) {
                    if(req.status != 200)
                        driver(new Error('Non-success HTTP status!'));
                    else
                        driver(req.responseText);
                }
            };
            req.send(null);
        }
    }
<code>
</code></code></pre>
<p>Articles in this series:</p>
<ol>
<li>Part 1: <a href="/2008/5/27/synchronous-invocation-in-javascript-part-1-problem-and-basic-solution">Problem and basic solution</a></li>
<li>Part 2: <a href="/2008/5/27/synchronous-invocation-in-javascript-part-2-dissecting-the-process-driver">Execution dissected</a></li>
<li>Part 3: <a href="/2008/5/27/synchronous-invocation-in-javascript-part-3-returning-values">Returning values</a></li>
<li>Part 4: <a href="/2008/5/27/synchronous-invocation-in-javascript-part-4-error-handling">Error handling</a></li>
</ol>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/hyperstruct?a=JfDSrWRKsqE:SIE5VASm9GE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/hyperstruct?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=JfDSrWRKsqE:SIE5VASm9GE:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=JfDSrWRKsqE:SIE5VASm9GE:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=JfDSrWRKsqE:SIE5VASm9GE:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/hyperstruct?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=JfDSrWRKsqE:SIE5VASm9GE:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=JfDSrWRKsqE:SIE5VASm9GE:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=JfDSrWRKsqE:SIE5VASm9GE:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=JfDSrWRKsqE:SIE5VASm9GE:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/hyperstruct?a=JfDSrWRKsqE:SIE5VASm9GE:-BTjWOF_DHI"><img src="http://feeds.feedburner.com/~ff/hyperstruct?i=JfDSrWRKsqE:SIE5VASm9GE:-BTjWOF_DHI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/hyperstruct/~4/JfDSrWRKsqE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://hyperstruct.net/2008/05/27/synchronous-invocation-in-javascript-part-4-error-handling/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://hyperstruct.net/2008/05/27/synchronous-invocation-in-javascript-part-4-error-handling/</feedburner:origLink></item>
	</channel>
</rss>
