<?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>cemerick</title>
	<atom:link href="http://cemerick.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://cemerick.com</link>
	<description>Against all odds.</description>
	<lastBuildDate>Sat, 11 Feb 2012 14:58:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='cemerick.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>cemerick</title>
		<link>http://cemerick.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://cemerick.com/osd.xml" title="cemerick" />
	<atom:link rel='hub' href='http://cemerick.com/?pushpress=hub'/>
		<item>
		<title>Episode 0.0.4: Antoni Batchelli and Hugo Duncan at Clojure Conj 2011</title>
		<link>http://cemerick.com/2012/02/03/797/</link>
		<comments>http://cemerick.com/2012/02/03/797/#comments</comments>
		<pubDate>Fri, 03 Feb 2012 19:47:26 +0000</pubDate>
		<dc:creator>Chas Emerick</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://mostlylazy.wordpress.com/?p=67</guid>
		<description><![CDATA[Reblogged from Mostly λazy…a Clojure podcast: Recorded November 12th, 2011, third in a series of conversations from Clojure Conj 2011. I caught up with Hugo Duncan and Antoni Batchelli (everyone calls him Toni ;-) during one of the lunch breaks &#8230; <a href="http://cemerick.com/2012/02/03/797/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cemerick.com&amp;blog=14971344&amp;post=797&amp;subd=chasemerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div class="reblog-post">
<p class="reblog-from"><img alt='' src='http://1.gravatar.com/avatar/b8ee952abb6620c1c93b3acb46cd391c?s=25&amp;d=identicon&amp;r=R' class='avatar avatar-25' height='25' width='25' /> <a href="http://mostlylazy.com/2012/02/03/episode-0-0-4-antoni-batchelli-and-hugo-duncan-at-clojure-conj-2011/">Reblogged from Mostly λazy…a Clojure podcast:</a></p>
<p dir='auto'>
Recorded November 12th, 2011, third in a series of conversations from Clojure Conj 2011. I caught up with Hugo Duncan and Antoni Batchelli (everyone calls him Toni ;-) during one of the lunch breaks at the Conj.  These guys have been on a tear with Pallet, an open source Clojure project that Hugo started in early 2010 to shave one of the hairiest yaks around, the automation of provisioning and management of computing infrastructure.  The result is a tool and library that provides a classically Clojure &hellip;
</p>
</div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chasemerick.wordpress.com/797/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chasemerick.wordpress.com/797/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chasemerick.wordpress.com/797/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chasemerick.wordpress.com/797/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/chasemerick.wordpress.com/797/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chasemerick.wordpress.com/797/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chasemerick.wordpress.com/797/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/chasemerick.wordpress.com/797/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chasemerick.wordpress.com/797/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chasemerick.wordpress.com/797/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chasemerick.wordpress.com/797/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chasemerick.wordpress.com/797/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chasemerick.wordpress.com/797/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chasemerick.wordpress.com/797/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cemerick.com&amp;blog=14971344&amp;post=797&amp;subd=chasemerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://cemerick.com/2012/02/03/797/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b8ee952abb6620c1c93b3acb46cd391c?s=96&#38;d=identicon&#38;r=R" medium="image">
			<media:title type="html">cemerick</media:title>
		</media:content>

		<media:content url="http://1.gravatar.com/avatar/b8ee952abb6620c1c93b3acb46cd391c?s=25&#38;d=identicon&#38;r=R" medium="image" />
	</item>
		<item>
		<title>Introducing: Mostly λazy (a Clojure podcast)</title>
		<link>http://cemerick.com/2011/11/08/introducing-mostly-%ce%bbazy-a-clojure-podcast/</link>
		<comments>http://cemerick.com/2011/11/08/introducing-mostly-%ce%bbazy-a-clojure-podcast/#comments</comments>
		<pubDate>Tue, 08 Nov 2011 15:23:33 +0000</pubDate>
		<dc:creator>Chas Emerick</dc:creator>
				<category><![CDATA[Clojure]]></category>

		<guid isPermaLink="false">http://cemerick.com/?p=775</guid>
		<description><![CDATA[As some of you may know already, I&#8217;ve started a Clojure podcast called Mostly λazy.  The first episode is in the can and has been published.  There are RSS feeds for your readers and podcatchers there for the taking, and &#8230; <a href="http://cemerick.com/2011/11/08/introducing-mostly-%ce%bbazy-a-clojure-podcast/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cemerick.com&amp;blog=14971344&amp;post=775&amp;subd=chasemerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>As some of you may know already, I&#8217;ve started a Clojure podcast called <a href="http://mostlylazy.com">Mostly λazy</a>.  <a href="http://mostlylazy.com/2011/11/08/episode-0-0-1-sean-corfield-clojure-contrib-and-real-world-clojure/">The first episode</a> is in the can and has been published.  There are RSS feeds for your readers and podcatchers there for the taking, and I&#8217;ll be working on getting the feed into iTunes shortly.</p>
<p>The <a href="http://mostlylazy.com/2011/11/03/coming-soon/">initial announcement post</a> for Mostly λazy drew a lot of <em>really</em> good ideas and suggestions, many of which I&#8217;ll be stealing. :-D I&#8217;m really glad that a lot of people find the concept of a Clojure podcast appealing; whilst I&#8217;m fundamentally doing this to enjoy myself, it&#8217;s nice to know that there will be at least a dozen or so people listening… ;-)</p>
<p>I&#8217;ll be at Clojure Conj 2011 this week, and will likely capture a bunch of conversations with people there.  That should provide me with a decent backlog of material that I can trickle out through the rest of the year, perhaps mixed in with some shorter segments based on the aforementioned suggestions.  In any case, I hope anyone who does listen finds the experience entertaining and engaging.</p>
<p>By the way, this is likely the first and last post I&#8217;ll make here about <a href="http://mostlylazy.com">Mostly λazy</a>. It has its own site/blog, so you should go subscribe there if you want to see more Clojure podcast news in the future.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chasemerick.wordpress.com/775/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chasemerick.wordpress.com/775/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chasemerick.wordpress.com/775/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chasemerick.wordpress.com/775/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/chasemerick.wordpress.com/775/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chasemerick.wordpress.com/775/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chasemerick.wordpress.com/775/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/chasemerick.wordpress.com/775/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chasemerick.wordpress.com/775/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chasemerick.wordpress.com/775/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chasemerick.wordpress.com/775/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chasemerick.wordpress.com/775/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chasemerick.wordpress.com/775/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chasemerick.wordpress.com/775/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cemerick.com&amp;blog=14971344&amp;post=775&amp;subd=chasemerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://cemerick.com/2011/11/08/introducing-mostly-%ce%bbazy-a-clojure-podcast/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b8ee952abb6620c1c93b3acb46cd391c?s=96&#38;d=identicon&#38;r=R" medium="image">
			<media:title type="html">cemerick</media:title>
		</media:content>
	</item>
		<item>
		<title>Ambrose has received his Clojure &#8220;scholarship&#8221;, thanks to you.</title>
		<link>http://cemerick.com/2011/11/08/ambrose-has-received-his-clojure-scholarship-thanks-to-you/</link>
		<comments>http://cemerick.com/2011/11/08/ambrose-has-received-his-clojure-scholarship-thanks-to-you/#comments</comments>
		<pubDate>Tue, 08 Nov 2011 06:40:02 +0000</pubDate>
		<dc:creator>Chas Emerick</dc:creator>
				<category><![CDATA[Clojure]]></category>

		<guid isPermaLink="false">http://cemerick.com/?p=766</guid>
		<description><![CDATA[The eve of Clojure Conj 2011 is upon us, so I feel compelled get off my butt and finally close the loop on this one. Per usual, you, the Clojure community, have come through.  Ambrose Bonnaire-Sergeant will be attending the &#8230; <a href="http://cemerick.com/2011/11/08/ambrose-has-received-his-clojure-scholarship-thanks-to-you/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cemerick.com&amp;blog=14971344&amp;post=766&amp;subd=chasemerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>The eve of <a href="http://clojure-conj.org">Clojure Conj 2011</a> is upon us, so I feel compelled get off my butt and finally close the loop on this one.</p>
<p><a href="http://cemerick.com/2010/09/10/anthony-simpson-will-receive-his-clojure-scholarship-thanks-to-you/">Per usual</a>, you, the Clojure community, have come through.  <a href="https://twitter.com/#%21/ambrosebs">Ambrose Bonnaire-Sergeant</a> will be attending the Conj and giving <a href="http://clojure-conj.org/schedule#bonnaire-sergeant">an introductory talk on logic programming</a>, only made possible after $3,000 was raised through donations <a href="http://cemerick.com/2011/09/20/2011-clojure-scholarship-help-send-ambrose-to-the-conj/">solicited via this blog</a> and various pestering on Twitter, IRC, and the Clojure mailing list.</p>
<p>(As was mentioned from the start, the Conj organizers do provide a travel stipend, even a generous one for international speakers, but the costs of getting to North Carolina from Western Australia are far beyond that budget.  Thus the need for a fundraiser.)</p>
<p>Finally, I will soon be notifying the winners of the free copies of <a href="http://clojurebook.com">Clojure Programming</a> from O&#8217;Reilly (signed by myself and hopefully my coauthors as well, <a href="http://briancarper.net/">Brian Carper</a> and <a href="http://clj-me.cgrand.net/">Christophe Grand</a>) privately by email.  Your extraordinary generosity is a big part of how this effort was able to succeed.</p>
<h2>Thank you!</h2>
<p>To those that donated, thank you very, very much.  Your assistance is not taken for granted:</p>
<ul>
<li>Anonymous x 3</li>
<li>Sam Aaron</li>
<li>Harold Ancell</li>
<li>Craig Andera</li>
<li>Justin Balthrop</li>
<li>Carlos Barboza</li>
<li>James Christopher Bare</li>
<li>Meikel Brandmeyer</li>
<li>David Cabana</li>
<li>Brian Cooley</li>
<li>Aaron Crow</li>
<li>Paul deGrandis</li>
<li>Manuel Angel Rivas Diaz</li>
<li>Alan Dipert</li>
<li>Cameron Dorrat</li>
<li>Kevin Downey</li>
<li>Jim Duey</li>
<li>Holger Durer</li>
<li>Antoni Batchelli Estrada</li>
<li>John Fingerhut</li>
<li>Louis Franco</li>
<li>Joseph Gallo</li>
<li>Baishampayan Ghose</li>
<li>Stephen Gilardi</li>
<li>Juan Manuel Gimeno</li>
<li>Christophe Grand</li>
<li>Anthony Grimes</li>
<li>Philip Hagelberg</li>
<li>Mark Henderson</li>
<li>Richard Hickey</li>
<li>William Hidden</li>
<li>Daniel Jomphe</li>
<li>Geoffrey Knauth</li>
<li>Vinod Kurup</li>
<li>David Liebke</li>
<li>Kent Mabee</li>
<li>Christopher Maier</li>
<li>Durgesh Mankekar</li>
<li>Roberto Mannai</li>
<li>Roberto Mannai</li>
<li>Nathan Marz</li>
<li>Carin Meier</li>
<li>Dave Newton</li>
<li>David Nolen</li>
<li>Mark Nutter</li>
<li>Alexey Ott</li>
<li>Donald Parish</li>
<li>Laurent Petit</li>
<li>Michael Ravits</li>
<li>Volker Schlecht</li>
<li>Ryan Senior</li>
<li>Patrick Shields</li>
<li>Stuart Sierra</li>
<li>Luo Tian</li>
<li>Benny Tsai</li>
<li>Moritz Ulrich</li>
<li>Craig Worrall</li>
<li>Koji Yusa</li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chasemerick.wordpress.com/766/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chasemerick.wordpress.com/766/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chasemerick.wordpress.com/766/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chasemerick.wordpress.com/766/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/chasemerick.wordpress.com/766/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chasemerick.wordpress.com/766/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chasemerick.wordpress.com/766/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/chasemerick.wordpress.com/766/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chasemerick.wordpress.com/766/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chasemerick.wordpress.com/766/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chasemerick.wordpress.com/766/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chasemerick.wordpress.com/766/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chasemerick.wordpress.com/766/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chasemerick.wordpress.com/766/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cemerick.com&amp;blog=14971344&amp;post=766&amp;subd=chasemerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://cemerick.com/2011/11/08/ambrose-has-received-his-clojure-scholarship-thanks-to-you/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b8ee952abb6620c1c93b3acb46cd391c?s=96&#38;d=identicon&#38;r=R" medium="image">
			<media:title type="html">cemerick</media:title>
		</media:content>
	</item>
		<item>
		<title>Enabling rich(er) interactions in the Clojure REPL</title>
		<link>http://cemerick.com/2011/10/26/enabling-richer-interactions-in-the-clojure-repl/</link>
		<comments>http://cemerick.com/2011/10/26/enabling-richer-interactions-in-the-clojure-repl/#comments</comments>
		<pubDate>Wed, 26 Oct 2011 19:16:29 +0000</pubDate>
		<dc:creator>Chas Emerick</dc:creator>
				<category><![CDATA[Clojure]]></category>
		<category><![CDATA[lisp]]></category>

		<guid isPermaLink="false">http://cemerick.com/?p=756</guid>
		<description><![CDATA[I love the Clojure REPL.  I&#8217;ve never been more productive in any other environment.  In particular, I happen to like the REPL and general development experience provided by Counterclockwise, the Eclipse Clojure plugin. That said, the Clojure REPL is far &#8230; <a href="http://cemerick.com/2011/10/26/enabling-richer-interactions-in-the-clojure-repl/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cemerick.com&amp;blog=14971344&amp;post=756&amp;subd=chasemerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I love the Clojure REPL.  I&#8217;ve never been more productive in any other environment.  In particular, I happen to like the REPL and general development experience provided by <a href="http://code.google.com/p/counterclockwise/">Counterclockwise</a>, the Eclipse Clojure plugin.</p>
<p>That said, the Clojure REPL is far from perfect.  A long time ago, I banged out <a href="/ideal-clojure-development-environment/">this page describing what my ideal Clojure development environment would look like</a>.  Much of what&#8217;s there is still an accurate reflection of my ideal end-state, and much of it is now available in Counterclockwise.  But, some things remain unfulfilled.</p>
<p>Like, when you are working with image data.  I do, all the time.  I&#8217;m parsing documents, producing rasterizations of them, performing all sorts of transformations and analysis on them, often in the REPL. Yet, I end up needing to have other tools around to do the simplest of things…like, oh, to <em>look at an image</em>.  Other fancier things should be possible, but let&#8217;s start with that and see where we end up.</p>
<p>This corresponds with this bullet in the aforementioned description of an ideal Clojure environment:</p>
<blockquote>
<ul>
<li>Configurable pretty-printing of output
<ul>
<li>This also means being able to “print” non-textual data, such as having images drawn inline into the REPL if so desired, etc.</li>
<li>See <a href="http://re-factor.blogspot.com/2010/09/visual-repl.html">Factor’s REPL</a> for an example</li>
</ul>
</li>
</ul>
</blockquote>
<p>So, I implemented opt-in &#8220;rich content&#8221; Clojure REPL interactions in <a href="http://github.com/clojure/tools.nrepl">nREPL</a> (a <em>tool-agnostic</em> network Clojure REPL server &amp; client implementation), with a first spike of client support for such &#8220;rich content&#8221; in Counterclockwise.  The result is something that I think can be the basis for breaking a lot of new ground in how we use the [Clojure] REPL.</p>
<p>Video demo follows, with some discussion of the implementation and ways clients can add their own response types and such dynamically (<a href="http://vimeo.com/31151430">direct link for HD video</a>):</p>
<p><iframe src="http://player.vimeo.com/video/31151430" width="640" height="400" frameborder="0" webkitAllowFullScreen allowFullScreen></iframe></p>
<p>The code for this is currently on <a href="https://github.com/clojure/tools.nrepl">nREPL HEAD</a> (the SNAPSHOT coordinates are <code>[org.clojure/tools.nrepl "0.0.6-SNAPSHOT"]</code>), and <a href="https://github.com/cemerick/ccw/tree/repl-ui">this branch</a> of Counterclockwise (which, along with a couple of refinements, will hopefully be rolled into the next release). It&#8217;s all bleeding-edge stuff, so I&#8217;m sure there&#8217;ll be lots of change to come, but it&#8217;s a start.</p>
<p>Go poke and prod at my approach, let me know what you think — and, hey, it&#8217;d be awesome if someone knocked out rich content REPL  support for another tool, be it <a href="https://github.com/icylisper/jark/">jark</a> (which already uses nREPL), <a href="https://bitbucket.org/kotarak/vimclojure/">vimclojure</a>, <a href="http://www.enclojure.org/">Enclojure</a> (both of which are planned to use nREPL eventually AFAIK?), or others.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chasemerick.wordpress.com/756/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chasemerick.wordpress.com/756/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chasemerick.wordpress.com/756/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chasemerick.wordpress.com/756/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/chasemerick.wordpress.com/756/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chasemerick.wordpress.com/756/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chasemerick.wordpress.com/756/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/chasemerick.wordpress.com/756/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chasemerick.wordpress.com/756/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chasemerick.wordpress.com/756/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chasemerick.wordpress.com/756/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chasemerick.wordpress.com/756/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chasemerick.wordpress.com/756/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chasemerick.wordpress.com/756/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cemerick.com&amp;blog=14971344&amp;post=756&amp;subd=chasemerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://cemerick.com/2011/10/26/enabling-richer-interactions-in-the-clojure-repl/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b8ee952abb6620c1c93b3acb46cd391c?s=96&#38;d=identicon&#38;r=R" medium="image">
			<media:title type="html">cemerick</media:title>
		</media:content>
	</item>
		<item>
		<title>À la carte configuration in Clojure APIs</title>
		<link>http://cemerick.com/2011/10/17/a-la-carte-configuration-in-clojure-apis/</link>
		<comments>http://cemerick.com/2011/10/17/a-la-carte-configuration-in-clojure-apis/#comments</comments>
		<pubDate>Mon, 17 Oct 2011 16:06:49 +0000</pubDate>
		<dc:creator>Chas Emerick</dc:creator>
				<category><![CDATA[Clojure]]></category>

		<guid isPermaLink="false">http://cemerick.com/?p=743</guid>
		<description><![CDATA[There are two dominant configuration patterns in Clojure libraries. The first is where configuration is provided explicitly via the first argument; here, in Rummage, accessing Amazon&#8217;s SimpleDB: The other is where the configuration is defined implicitly, usually using binding and &#8230; <a href="http://cemerick.com/2011/10/17/a-la-carte-configuration-in-clojure-apis/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cemerick.com&amp;blog=14971344&amp;post=743&amp;subd=chasemerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>There are two dominant configuration patterns in Clojure libraries. The first is where configuration is provided explicitly via the first argument; here, in <a href="http://github.com/cemerick/rummage">Rummage</a>, accessing Amazon&#8217;s SimpleDB:</p>
<p><pre class="brush: clojure;">
(require '[cemerick.rummage :as sdb])
(def config (sdb/create-client &quot;aws id&quot; &quot;aws secret-key&quot;))
(put-attrs config &quot;demo&quot;
  {::sdb/id &quot;foo&quot; :name &quot;value&quot; :key #{50 60 65}})
</pre></p>
<p>The other is where the configuration is defined implicitly, usually using <code>binding</code> and dynamic scope (and sometimes via a <code>set!</code>-style setter for REPL usage convenience); here, in <a href="http://github.com/ashafa/clutch">Clutch</a>, accessing CouchDB:</p>
<p><pre class="brush: clojure;">
(require '[com.ashafa.clutch :as clutch])
(clutch/with-db &quot;localhost&quot;
  (clutch/put-document {:a 5 :b 6} :id &quot;foo&quot;))
</pre></p>
<p>The latter is arguably more common, especially in database libraries; in addition to Clutch, you can see the dynamic pattern in play in <a href="https://github.com/clojure/java.jdbc">java.jdbc</a>&#8216;s <code>with-connection</code> and <a href="https://github.com/aboekhoff/congomongo">congomongo</a>&#8216;s <code>with-mongo.</code></p>
<p>From the perspective of a user (they are us!), I sometimes prefer dynamic scope to avoid verbosity, yet I often like to be explicit about configuration (and therefore, usually the target of my code&#8217;s activity) at other times, especially when dynamic scope isn&#8217;t appropriate or downright dangerous.  My preferences vacillate depending on what I&#8217;m doing, where I&#8217;m doing it, and what tools I&#8217;m using.  In any case, each library that requires configuration almost always requires that you work with it the way its author intended, so I am left with no joy half the time.</p>
<p>As an author of and contributor to such libraries (including the two mentioned above), perhaps I&#8217;m in a position to resolve this dilemma.</p>
<h2>Irreconcilable differences</h2>
<p>Consider any function that needs to make use of configuration, be it a session, a database connection, etc.  As we&#8217;ve seen, there seem to be only two implementation strategies: either take the configuration as an explicit argument, or assume the configuration has been bound dynamically elsewhere (as e.g. <code>with-db</code> does in the Clutch example above):</p>
<p><pre class="brush: clojure;">
(defn explicit-save
  [config data]
  ...do something with `data` in/at/with thing described by `config`...)

(def *config* nil)
(defn dynamic-save
  [data]
  ...do something with `data` in/at/with thing described by `*config*`...)
</pre></p>
<p>There is no way to unifying these two idioms. The only option is to manually provide additional arities of every single function in my API, delegating as necessary when it is suspected that dynamic scope is being used:</p>
<p><pre class="brush: clojure;">
(def *config* nil)
(defn broken-save
  ([data] (broken-save *config* data))
  ([config data]
    ...do something with `data` in/at/with thing described by `config`...)))
</pre></p>
<p>In my opinion, this is a no-go from an implementor&#8217;s perspective: each additional library function implies extra maintenance for each additional arity, or the prospect of rigging up an alternative <code>defn</code> macro that adds the additional arity &#8220;automatically&#8221;…which doesn&#8217;t work if the API is to support rest or keyword args anywhere.</p>
<p>Not one to be disheartened, I&#8217;ve been working on an alternative that is either a proper solution, or a hack potentially even more ill-conceived than said <code>defn</code> macro.</p>
<h2>Tasty brew: <code>ns-publics</code> + <code>binding</code> + <code>partial</code></h2>
<p>First, let&#8217;s implement our library as simply as possible, which means working with explicit arguments everywhere (you can build dynamic scope on top of simple functions, but it&#8217;s damn hard to make functions that depend on dynamic scope appear to do otherwise):</p>
<p><pre class="brush: clojure;">
(defn save
  [config data]
  ...do something with `data` in/at/with thing described by `config`...)
</pre></p>
<p>Now, let&#8217;s think about what <code>*config*</code> really represents in prior examples: it&#8217;s an implicit indication of the scope of an operation.  We can get a similar effect using partial, which returns a new function that will use the provided arguments as the first arguments to the original function; using it, we can call (a derivative of) our <code>save</code> function with a single argument (our data), making the configuration &#8220;implicit&#8221; again:</p>
<p><pre class="brush: clojure;">
((partial save {:some :configuration})
 {:some :data})
</pre></p>
<p>That&#8217;s hardly a syntactic improvement over explicitly passing our configuration value explicitly.  However, what if we had a <code>with-config</code> macro that performed this partial evaluation for us, supplying the configuration value to each of our library&#8217;s functions so that, within the <code>with-config</code> macro&#8217;s scope, each of those functions could be called <em>sans</em> configuration?  Well, we have macros and a reified dynamic environment, so let&#8217;s have at it:</p>
<p><pre class="brush: clojure;">
(def public-api (vals (ns-publics *ns*)))

(defmacro with-config
  [config &amp; body]
  `(with-bindings (into {} (for [var @#'your.library.ns/public-api]
                           [var (partial @var config)]))
     ~@body))
</pre></p>
<p>Explanation is surely in order.  First, we need define our public API; this is just a seq of the public vars in our library&#8217;s namespace (which need to be dynamic since we&#8217;re going to be rebinding all of them; make sure to use <code>^:dynamic</code> metadata on them if you&#8217;re using Clojure 1.3.0+).</p>
<p>(It seems sane to me that this seq should be filtered based on other metadata to ensure that only those functions that take configuration as their first argument are included.  An example of this is below.)</p>
<p>Second, all our <code>with-config</code> macro does is set up a dynamic scope, binding to each of our library&#8217;s vars new functions with the provided configuration partially applied.  Within that scope, we can omit any further reference to the configuration value, even though the foundational implementations of our library&#8217;s functions require explicit configuration.</p>
<p>Here&#8217;s a complete example (which requires Clojure 1.3.0 because of the <code>^:</code> metadata notation — porting to Clojure 1.2.0 is simple enough, and left as an exercise):</p>
<p><pre class="brush: clojure;">
(ns example)
(defn ^:api ^:dynamic save
  [config data]
  (println (format &quot;Saved %s with %s&quot; data config)))

(def public-api (-&amp;gt;&amp;gt; (ns-publics *ns*)
                  vals
                  (filter (comp :api meta))
                  doall))
(defmacro with-config
  [config &amp; body]
  `(with-bindings (into {} (for [var @#'example/public-api]
                             [var (partial @var ~config)]))
     ~@body))
</pre></p>
<p>The <code>save</code> function takes configuration explicitly; also, I&#8217;ve added <code>^:api</code> to its var&#8217;s metadata so our <code>public-api</code> seq of vars can be filtered of vars that shouldn&#8217;t be affected by <code>with-config</code>&#8216;s dynamic scope.  Now our library can support both explicit and dynamic specification of configuration, yet we never really thought at all about the dynamic case when implementing the library:</p>
<p><pre class="brush: clojure;">
=&gt; (save {:some :config} {:a 5 :b 6})
Saved {:a 5, :b 6} with {:some :config}
nil
=&gt; (with-config {:some :config}
     (save {:a 5 :b 6}))
Saved {:a 5, :b 6} with {:some :config}
nil
</pre></p>
<h2>Fin?</h2>
<p>I love the flexibility this approach affords the user (usually me!), with, in relative terms, minor effort on the part of the library author.  I&#8217;m enough of a fan of it that I&#8217;m using it in Clutch (hopefully to be released soon as part of <a href="https://github.com/ashafa/clutch/tree/0.3.0">v0.3.0</a>).</p>
<p>However, I should say that I&#8217;m not yet entirely at ease:</p>
<ol>
<li>If your implementation of one public API function calls another, and the vars of both are being rebound by <code>with-config</code>(or its equivalent), then that intra-library function call is going to route through the var and get the function that already has the configuration value partially applied.My solution to this at the moment is to (ack!) use <a href="https://github.com/ashafa/clutch/blob/0.3.0/src/com/ashafa/clutch.clj#L55">a defn-wrapping macro</a> to define each public function in Clutch that pushes each definition into a closure containing all of the already-defined functions.  This keeps intra-library calls from getting mixed up in the dynamic scope that Clutch&#8217;s version of with-config might set up.</li>
<li>Except for the results from one (likely errant) REPL session, I believe that self-calls never route back through the var named in function position.  However, if there is any case where that&#8217;s not true (i.e. if self-calls <em>do</em> route through the named var), then self-calls would have the same problem (but not the same — or any — solution) as (1).</li>
<li>Using something like <code>with-config</code>, you&#8217;re looking at N partial invocations, N function instantiations, and N dynamic bindings for your library with N public functions, versus 0, 0, and 1 for dynamic configuration APIs that bind a single <code>*config*</code> var.  Insofar as all of the libraries that use this pattern that I know of are database and/or IO-related, this &#8220;overhead&#8221; can likely be discounted.  In any case, if you don&#8217;t want any overhead, <code>with-config</code> gives you the option of no dynamic scope at all.</li>
</ol>
<p>If you have any comments, warnings, or rants about how this is evil, do share.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chasemerick.wordpress.com/743/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chasemerick.wordpress.com/743/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chasemerick.wordpress.com/743/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chasemerick.wordpress.com/743/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/chasemerick.wordpress.com/743/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chasemerick.wordpress.com/743/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chasemerick.wordpress.com/743/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/chasemerick.wordpress.com/743/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chasemerick.wordpress.com/743/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chasemerick.wordpress.com/743/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chasemerick.wordpress.com/743/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chasemerick.wordpress.com/743/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chasemerick.wordpress.com/743/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chasemerick.wordpress.com/743/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cemerick.com&amp;blog=14971344&amp;post=743&amp;subd=chasemerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://cemerick.com/2011/10/17/a-la-carte-configuration-in-clojure-apis/feed/</wfw:commentRss>
		<slash:comments>26</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b8ee952abb6620c1c93b3acb46cd391c?s=96&#38;d=identicon&#38;r=R" medium="image">
			<media:title type="html">cemerick</media:title>
		</media:content>
	</item>
		<item>
		<title>Writing CouchDB Views using ClojureScript</title>
		<link>http://cemerick.com/2011/10/11/writing-couchdb-views-using-clojurescript/</link>
		<comments>http://cemerick.com/2011/10/11/writing-couchdb-views-using-clojurescript/#comments</comments>
		<pubDate>Tue, 11 Oct 2011 14:39:44 +0000</pubDate>
		<dc:creator>Chas Emerick</dc:creator>
				<category><![CDATA[Clojure]]></category>
		<category><![CDATA[couchdb]]></category>

		<guid isPermaLink="false">http://cemerick.com/?p=729</guid>
		<description><![CDATA[While I was in San Fransisco for JavaOne, I was lucky enough to be invited to speak at the Bay Area Clojure User Group (thanks, Sean and Toni!).  It was a great time, and gave me the kick in the &#8230; <a href="http://cemerick.com/2011/10/11/writing-couchdb-views-using-clojurescript/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cemerick.com&amp;blog=14971344&amp;post=729&amp;subd=chasemerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>While I was in San Fransisco for JavaOne, I was lucky enough to be invited to speak at the <a href="www.meetup.com/The-Bay-Area-Clojure-User-Group/events/19783251/">Bay Area Clojure User Group</a> (thanks, <a href="http://corfield.org/blog/">Sean</a> and <a href="https://twitter.com/#!/tbatchelli">Toni</a>!).  It was a great time, and gave me the kick in the pants I needed to finish hacking away at my first project involving <a href="https://github.com/clojure/clojurescript">ClojureScript</a>: using it to write view functions for <a href="http://couchdb.apache.org">CouchDB</a>.</p>
<p>The result is <a href="https://github.com/cemerick/clutch-clojurescript/">clutch-clojurescript</a>, which naturally builds on top of the <a href="http://github.com/ashafa/clutch">Clutch</a> library that I&#8217;ve collaborated on with <a href="https://twitter.com/#!/ashafa">Tunde Ashafa</a> for some time now.</p>
<p>My motivations for doing this were manifold:</p>
<ol>
<li>I quite enjoy using CouchDB, as its model and general philosophy meshes very naturally with my (and my tools&#8217;) disposition and the data I work with most often.</li>
<li>The operational hassle associated with maintaining a Clojure view server (which Clutch provides) configuration alongside my CouchDB installs was always a hassle.</li>
<li>I&#8217;ve been wanting to do more and more with <a href="https://cloudant.com">Cloudant</a>, but a Clojure view server is just not an option with a hosted database-as-a-service like that.</li>
<li>I can&#8217;t stand writing JavaScript.  Give me the reach of JavaScript, but with sane abstractions, homoiconicity (macros!), and data structures that aren&#8217;t braindead? Sign me up.</li>
</ol>
<p>Feel free to go check out <a href="https://github.com/cemerick/clutch-clojurescript/">clutch-clojurescript</a>: beat on it some, and let me know if it breaks on you.  I would eventually like to fold it into Clutch proper.  Beware some limitations though — repeated here from the README in part to draw attention to them:</p>
<ul>
<li>ClojureScript is not yet available as a proper library. This forces me to include some <em>binary</em> version of it in this git repo (a hefty 8.3MB!…which includes various google JavaScript UI bits that I’d hope would be broken out eventually), and bundle the necessary bits into the clutch-clojurescript jar. I would very much like to roll clutch-clojurescript’s functionality into Clutch proper, but I’ll not do so until the latter can rely upon a ClojureScript dependency.</li>
<li>ClojureScript / Google Closure produces a <em>very </em>large code footprint, even for the simplest of view functions. This is apparently an item of active development in ClojureScript.
<p>In any case, the code size of a view function string should have little to no impact on runtime performance of that view. The only penalty to be paid should be in view server initialization, which should be relatively infrequent. Further, the vast majority of view runtime is dominated by IO and actual document processing, not the loading of a handful of JavaScript functions.</li>
<li>To my surprise (and shock/horror), the version of <a href="https://developer.mozilla.org/en/SpiderMonkey">Spidermonkey</a> that is used by CouchDB (and Couchbase Single, and Cloudant) does not treat regular expression literals properly — they work fine as arguments, e.g. <code>string.match(/foo/)</code>, but e.g. <code>/foo/.exec("string")</code> fails.  Using the <code>RegExp()</code> function with a string argument *does* work.  This was reported a long time ago, but has had little attention (<a href="https://issues.apache.org/jira/browse/COUCHDB-577">though I&#8217;m trying to stir it up a bit</a>).
<p>I&#8217;m hoping to get to the bottom of this sooner or later, but I wonder if it&#8217;d be worthwhile to change the ClojureScript reader to emit <code>(js/RegExp "foo")</code> calls instead of <code>/foo/</code> literals (and hope that gClosure doesn&#8217;t optimize the former into the latter)?  After all, there&#8217;s lots of CouchDB deployments out there with apparently broken spidermonkey installs/configurations, and likely lots of other apps/servers/environments in similarly dire straits.</li>
</ul>
<p>Finally, here are the slides from my talk at the BACUG (<a href="http://chasemerick.files.wordpress.com/2011/10/couchdb-clojurescript-views.pdf">download/view PDF</a>):</p>
<iframe src='http://www.slideshare.net/slideshow/embed_code/9638786' width='640' height='525'></iframe>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chasemerick.wordpress.com/729/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chasemerick.wordpress.com/729/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chasemerick.wordpress.com/729/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chasemerick.wordpress.com/729/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/chasemerick.wordpress.com/729/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chasemerick.wordpress.com/729/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chasemerick.wordpress.com/729/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/chasemerick.wordpress.com/729/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chasemerick.wordpress.com/729/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chasemerick.wordpress.com/729/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chasemerick.wordpress.com/729/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chasemerick.wordpress.com/729/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chasemerick.wordpress.com/729/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chasemerick.wordpress.com/729/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cemerick.com&amp;blog=14971344&amp;post=729&amp;subd=chasemerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://cemerick.com/2011/10/11/writing-couchdb-views-using-clojurescript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b8ee952abb6620c1c93b3acb46cd391c?s=96&#38;d=identicon&#38;r=R" medium="image">
			<media:title type="html">cemerick</media:title>
		</media:content>
	</item>
		<item>
		<title>2011 Clojure Scholarship: Help send Ambrose to the Conj!</title>
		<link>http://cemerick.com/2011/09/20/2011-clojure-scholarship-help-send-ambrose-to-the-conj/</link>
		<comments>http://cemerick.com/2011/09/20/2011-clojure-scholarship-help-send-ambrose-to-the-conj/#comments</comments>
		<pubDate>Tue, 20 Sep 2011 13:34:51 +0000</pubDate>
		<dc:creator>Chas Emerick</dc:creator>
				<category><![CDATA[Clojure]]></category>

		<guid isPermaLink="false">http://cemerick.com/?p=679</guid>
		<description><![CDATA[Update 2011-11-08T01:41  We did it! Details and acknowledgements for all who donated now here! About a year ago, I had the distinct privilege of having a front-row seat when the generosity of the Clojure community (and others!) helped Anthony Grimes &#8230; <a href="http://cemerick.com/2011/09/20/2011-clojure-scholarship-help-send-ambrose-to-the-conj/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cemerick.com&amp;blog=14971344&amp;post=679&amp;subd=chasemerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<blockquote><p><strong>Update 2011-11-08T01:41  </strong>We did it! Details and acknowledgements for all who donated now <a title="Ambrose has received his Clojure “scholarship”, thanks to you." href="http://cemerick.com/2011/11/08/ambrose-has-received-his-clojure-scholarship-thanks-to-you/">here</a>!</p></blockquote>
<p>About a year ago, I had the distinct privilege of having a front-row seat when <a title="A Clojure “Scholarship”: Let’s send Raynes to the Conj!" href="http://cemerick.com/2010/09/10/a-clojure-scholarship-lets-send-raynes-to-the-conj/">the generosity of the Clojure community (and others!) helped Anthony Grimes (aka Raynes) attend the 2010 Clojure Conj</a>.  Witnessing the success of that process made me certain that I would attempt to coordinate another &#8220;scholarship&#8221; fundraising drive for this year&#8217;s Clojure Conj.</p>
<p>Like Anthony last year, I wanted to help someone that:</p>
<ol>
<li>had already contributed significantly to the Clojure community,</li>
<li>clearly has great potential, but</li>
<li>without some financial assistance, would not be able to attend the Conj and benefit from the meeting-of-the-minds that such conferences uniquely enable.</li>
</ol>
<p><a href="http://chasemerick.files.wordpress.com/2011/09/ambrose-headshot.jpg"><img class="alignright size-full wp-image-705" title="Ambrose headshot" src="http://chasemerick.files.wordpress.com/2011/09/ambrose-headshot.jpg?w=640" alt=""   /></a>Over the summer, it became clear to me that <a href="https://twitter.com/#%21/ambrosebs">Ambrose Bonnaire-Sergeant</a> was that someone.  A computer science undergraduate at the <a href="http://www.uwa.edu.au/">University of Western Australia</a> in Perth, Ambrose has distinguished himself in the Clojure community this year.</p>
<p>His introduction to many was PragPub magazine publishing his <a href="http://pragprog.com/magazines/2011-07/growing-a-dsl-with-clojure"><em>Growing a DSL with Clojure</em></a> article in July.  In the article, Ambrose led us through the building of a simplified shell-scripting DSL in Clojure modeled on the open source <a href="https://github.com/pallet/stevedore">stevedore</a> library that he&#8217;s contributed to.  More recently, Ambrose has been busy hacking away at significant contributions to the <a href="https://github.com/clojure/core.logic">core.logic</a> (logic programming) and <a href="https://github.com/clojure/core.match">core.match</a> (optimized pattern matching and predicate dispatch) libraries led by David Nolen, producing content like his <a href="https://github.com/frenchy64/Logic-Starter">Logic-Starter documentation project</a> that provides a compelling logic programming primer using core.logic as the raw materials, and helping out with <a href="https://github.com/icylisper/jark">jark</a> tooling.  Finally, his has been a consistently helpful voice on the <a href="http://groups.google.com/group/clojure">main Clojure mailing list</a>.</p>
<p>Now, getting Ambrose to the Conj is going to be somewhat more challenging than last year&#8217;s effort: he&#8217;s in Australia after all, which makes both the travel and lodging expenses quite steep.  To make matters even more interesting, flights from Perth to Raleigh/Durham seem to fluctuate in price significantly — from $2,500 to $3,500, depending on when and where I check them.</p>
<p>Thankfully, Ambrose did submit a talk proposal to the Conj — an <a href="http://clojure-conj.org/schedule#bonnaire-sergeant"><em>Introduction to Logic Programming with Clojure</em></a> — which was accepted!  This means that the Conj organizers will be picking up his lodging during the conference, as well as generously providing $1,000 to help defray Ambrose&#8217;s travel expenses.  Thus, we (only?) need to raise enough to cover the remainder of his flight, as well as two extra hotel nights (so he can recuperate from jet lag enough to deliver his talk without experiencing a sudden bout of narcolepsy!).</p>
<p>To be safe, I am therefore setting the fundraising goal to $3,000.  As long as the gods of airline pricing are not against us, this will safely cover the remainder of Ambrose&#8217;s expenses, allow him to attend the Conj, and allow you to enjoy his sure-to-be-enlightening introductory logic programming talk.  Even moreso than last year, it’s a sizable sum; but, again, I think this is a worthy cause, and I suspect the Clojure community will rise to meet the challenge.</p>
<p>(If any funds remain, they will be used to provide discounted admission to the Conj for other students.)</p>
<p>I’ve set up a PayPal donation button below, along with a progress bar.  Some FYIs:</p>
<ul>
<li>I&#8217;m just reusing <a href="http://snowtide.com">Snowtide</a>&#8216;s PayPal account for this; so, you&#8217;ll be seeing its logo through the checkout process and &#8220;snowtide&#8221; on your credit card statement.</li>
<li>I’ll be <strong>manually</strong> updating the progress bar, so don’t expect to see it go up immediately after donating!</li>
<li>I’ll shut down the donation button once we hit the $3,000 target.</li>
<li>I’ll add your name to this page as thanks, <em>unless you notify me otherwise</em>, either (preferably) in the comments associated with your PayPal transaction or by <a href="mailto:cemerick@snowtide.com">email</a>/<a href="http://twitter.com/cemerick">twitter</a>/irc.</li>
</ul>
<p>Finally, as an added incentive: at the end of the fundraiser, the three people with the largest donations will each receive a copy of my forthcoming Clojure book, <a href="http://clojurebook.com"><em>Clojure Programming</em> from O&#8217;Reilly</a>, signed by me (and probably my co-conspirators as well, <a href="http://clj-me.cgrand.net/">Christophe Grand</a> and <a href="http://briancarper.net/">Brian Carper</a>).</p>
<p>If you have any questions at all, leave a comment here, or don’t hesitate to contact me if it your question involves confidential details (payment issues, etc).</p>
<p><img src="http://chart.apis.google.com/chart?chf=a,s,000000A5|bg,s,FFFFFF|c,s,E0DFDF&amp;chxl=0:|%24500|%241%2C000|%241%2C500|%242%2C000|%242%2C500&amp;chxp=0,500,1000,1500,2000,2500&amp;chxr=0,0,3000&amp;chxs=0,676767,12.5,0,lt,1B1B1B&amp;chxtc=0,5&amp;chxt=x&amp;chbh=a&amp;chs=360x60&amp;cht=bhs&amp;chco=4D89F9&amp;chds=0,3000&amp;chd=t:3000&amp;chg=0,-1&amp;chma=10,20&amp;chtt=Help+send+Ambrose+to+the+Clojure+Conj!&amp;chts=242323,13.5" alt="" width="360" height="60" /></p>
<h2><strong>We did it!</strong></h2>
<p>Details and acknowledgements for all who donated now <a title="Ambrose has received his Clojure “scholarship”, thanks to you." href="http://cemerick.com/2011/11/08/ambrose-has-received-his-clojure-scholarship-thanks-to-you/">here</a>!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chasemerick.wordpress.com/679/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chasemerick.wordpress.com/679/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chasemerick.wordpress.com/679/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chasemerick.wordpress.com/679/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/chasemerick.wordpress.com/679/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chasemerick.wordpress.com/679/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chasemerick.wordpress.com/679/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/chasemerick.wordpress.com/679/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chasemerick.wordpress.com/679/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chasemerick.wordpress.com/679/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chasemerick.wordpress.com/679/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chasemerick.wordpress.com/679/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chasemerick.wordpress.com/679/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chasemerick.wordpress.com/679/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cemerick.com&amp;blog=14971344&amp;post=679&amp;subd=chasemerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://cemerick.com/2011/09/20/2011-clojure-scholarship-help-send-ambrose-to-the-conj/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b8ee952abb6620c1c93b3acb46cd391c?s=96&#38;d=identicon&#38;r=R" medium="image">
			<media:title type="html">cemerick</media:title>
		</media:content>

		<media:content url="http://chasemerick.files.wordpress.com/2011/09/ambrose-headshot.jpg" medium="image">
			<media:title type="html">Ambrose headshot</media:title>
		</media:content>

		<media:content url="http://chart.apis.google.com/chart?chf=a,s,000000A5&#124;bg,s,FFFFFF&#124;c,s,E0DFDF&#38;chxl=0:&#124;%24500&#124;%241%2C000&#124;%241%2C500&#124;%242%2C000&#124;%242%2C500&#38;chxp=0,500,1000,1500,2000,2500&#38;chxr=0,0,3000&#38;chxs=0,676767,12.5,0,lt,1B1B1B&#38;chxtc=0,5&#38;chxt=x&#38;chbh=a&#38;chs=360x60&#38;cht=bhs&#38;chco=4D89F9&#38;chds=0,3000&#38;chd=t:3000&#38;chg=0,-1&#38;chma=10,20&#38;chtt=Help+send+Ambrose+to+the+Clojure+Conj!&#38;chts=242323,13.5" medium="image" />
	</item>
		<item>
		<title>McCarthy on the W3C</title>
		<link>http://cemerick.com/2011/09/01/mccarthy-on-the-w3c/</link>
		<comments>http://cemerick.com/2011/09/01/mccarthy-on-the-w3c/#comments</comments>
		<pubDate>Thu, 01 Sep 2011 17:03:31 +0000</pubDate>
		<dc:creator>Chas Emerick</dc:creator>
				<category><![CDATA[Asides]]></category>
		<category><![CDATA[lisp]]></category>

		<guid isPermaLink="false">http://cemerick.com/?p=664</guid>
		<description><![CDATA[I happened to listen to John McCarthy&#8217;s keynote at OOPSLA 2007.  There are some real gems in there for those interested in the history of Lisp, though I admit that I mostly blanked out through the exposition of his Elephant &#8230; <a href="http://cemerick.com/2011/09/01/mccarthy-on-the-w3c/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cemerick.com&amp;blog=14971344&amp;post=664&amp;subd=chasemerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I happened to listen to <a href="http://www.oopsla.org/oopsla2007/index.php?page=podcasts/">John McCarthy&#8217;s keynote at OOPSLA 2007</a>.  There are some real gems in there for those interested in the history of Lisp, though I admit that I mostly blanked out through the exposition of his <a href="http://www-formal.stanford.edu/jmc/elephant/elephant.html">Elephant programming language</a> — probably not something amenable to a purely audio delivery, at least for me.</p>
<p>Anyway, he delivers a great zinger at the end, a tangential response to a question about the aims of Semantic Web technologies as they relate to his work on Elephant:</p>
<blockquote><p>When w3c decided to not use [s-expressions], but intead imitate SGML [for HTML], that showed a certain capacity to make mistakes — which, probably, they haven&#8217;t lost.</p></blockquote>
<p>Nice.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chasemerick.wordpress.com/664/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chasemerick.wordpress.com/664/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chasemerick.wordpress.com/664/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chasemerick.wordpress.com/664/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/chasemerick.wordpress.com/664/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chasemerick.wordpress.com/664/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chasemerick.wordpress.com/664/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/chasemerick.wordpress.com/664/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chasemerick.wordpress.com/664/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chasemerick.wordpress.com/664/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chasemerick.wordpress.com/664/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chasemerick.wordpress.com/664/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chasemerick.wordpress.com/664/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chasemerick.wordpress.com/664/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cemerick.com&amp;blog=14971344&amp;post=664&amp;subd=chasemerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://cemerick.com/2011/09/01/mccarthy-on-the-w3c/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b8ee952abb6620c1c93b3acb46cd391c?s=96&#38;d=identicon&#38;r=R" medium="image">
			<media:title type="html">cemerick</media:title>
		</media:content>
	</item>
		<item>
		<title>Clojure で適切な型定義を選択するためのフローチャート</title>
		<link>http://cemerick.com/2011/08/09/flowchart-for-choosing-the-right-clojure-type-definition-form-jp-translation/</link>
		<comments>http://cemerick.com/2011/08/09/flowchart-for-choosing-the-right-clojure-type-definition-form-jp-translation/#comments</comments>
		<pubDate>Tue, 09 Aug 2011 15:15:45 +0000</pubDate>
		<dc:creator>Chas Emerick</dc:creator>
				<category><![CDATA[Clojure]]></category>

		<guid isPermaLink="false">http://cemerick.com/?p=643</guid>
		<description><![CDATA[A few weeks ago, I put together a flowchart to help choose the right type-definition form in Clojure in various circumstances. Afterwards, OGINO Masanori contacted me, offering to produce a Japanese translation of the flowchart.  The result looks great…thank you, &#8230; <a href="http://cemerick.com/2011/08/09/flowchart-for-choosing-the-right-clojure-type-definition-form-jp-translation/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cemerick.com&amp;blog=14971344&amp;post=643&amp;subd=chasemerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>A few weeks ago, I put together <a title="Flowchart for choosing the right Clojure type definition form" href="http://cemerick.com/2011/07/05/flowchart-for-choosing-the-right-clojure-type-definition-form/">a flowchart to help choose the right type-definition form in Clojure</a> in various circumstances.</p>
<p style="text-align:left;">Afterwards, <a href="http://twitter.com/omasanori">OGINO Masanori</a> contacted me, offering to produce a Japanese translation of the flowchart.  The result looks great…thank you, Masanori!  We both hope it is useful to all Japanese Clojure programmers:</p>
<p style="text-align:left;"><a href="http://chasemerick.files.wordpress.com/2011/08/choosing-type.png"><img class="size-full wp-image-644 aligncenter" title="Clojure で適切な型定義を選択するためのフローチャート" src="http://chasemerick.files.wordpress.com/2011/08/choosing-type.png?w=640&#038;h=904" alt="Clojure で適切な型定義を選択するためのフローチャート" width="640" height="904" /></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chasemerick.wordpress.com/643/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chasemerick.wordpress.com/643/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chasemerick.wordpress.com/643/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chasemerick.wordpress.com/643/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/chasemerick.wordpress.com/643/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chasemerick.wordpress.com/643/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chasemerick.wordpress.com/643/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/chasemerick.wordpress.com/643/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chasemerick.wordpress.com/643/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chasemerick.wordpress.com/643/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chasemerick.wordpress.com/643/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chasemerick.wordpress.com/643/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chasemerick.wordpress.com/643/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chasemerick.wordpress.com/643/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cemerick.com&amp;blog=14971344&amp;post=643&amp;subd=chasemerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://cemerick.com/2011/08/09/flowchart-for-choosing-the-right-clojure-type-definition-form-jp-translation/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b8ee952abb6620c1c93b3acb46cd391c?s=96&#38;d=identicon&#38;r=R" medium="image">
			<media:title type="html">cemerick</media:title>
		</media:content>

		<media:content url="http://chasemerick.files.wordpress.com/2011/08/choosing-type.png" medium="image">
			<media:title type="html">Clojure で適切な型定義を選択するためのフローチャート</media:title>
		</media:content>
	</item>
		<item>
		<title>At what point does S3 break?</title>
		<link>http://cemerick.com/2011/07/20/at-what-point-does-s3-break/</link>
		<comments>http://cemerick.com/2011/07/20/at-what-point-does-s3-break/#comments</comments>
		<pubDate>Wed, 20 Jul 2011 13:24:41 +0000</pubDate>
		<dc:creator>Chas Emerick</dc:creator>
				<category><![CDATA[Amazon Web Services]]></category>

		<guid isPermaLink="false">http://cemerick.com/?p=640</guid>
		<description><![CDATA[AWS&#8217; Jeff Barr announced yesterday that their S3 service: holds more than 449 billion objects and processes up to 290,000 requests per second for them at peak times I&#8217;m a very happy user of S3 and much of the rest &#8230; <a href="http://cemerick.com/2011/07/20/at-what-point-does-s3-break/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cemerick.com&amp;blog=14971344&amp;post=640&amp;subd=chasemerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>AWS&#8217; Jeff Barr <a href="http://aws.typepad.com/aws/2011/07/amazon-s3-more-than-449-billion-objects.html">announced yesterday</a> that their S3 service:</p>
<blockquote><p>holds more than 449 billion objects and processes up to 290,000 requests per second for them at peak times</p></blockquote>
<p>I&#8217;m a very happy user of S3 and much of the rest of AWS, but seeing figures like this forces me into risk-assessment mode: at what point does S3 (or similar services) break?</p>
<p>Yes, S3 has had outages (2008 was a <a href="http://www.zdnet.com/blog/btl/amazon-explains-its-s3-outage/8010">bad</a> <a href="http://gigaom.com/2008/07/20/amazon-s3-outage-july-2008/">year</a>), but these were fundamentally minor.  In the scheme of things, the equivalent of someone tripping over the rack&#8217;s power cord.</p>
<p>What I&#8217;m wondering about is, where does S3 et al. start hitting fundamental limits that amp problems up from <em>oops</em> to <em>ohhh shit</em>?</p>
<p>S3 is presumably the largest system of its kind ever; it&#8217;s not clear to me that anyone would really know what its failure modes, thresholds, or weak links might be as it continues to grow. Anything from a breakdown in the <a href="http://arstechnica.com/old/content/2007/10/amazon-reveals-its-distributed-storage-dynamo.ars">Dynamo architecture</a> to hard infrastructure limits to failures in operations and management strike me as plausible. What will we see first: data loss, increases in latency, repeated catastrophic outages, or &#8220;other&#8221;?</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chasemerick.wordpress.com/640/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chasemerick.wordpress.com/640/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chasemerick.wordpress.com/640/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chasemerick.wordpress.com/640/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/chasemerick.wordpress.com/640/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chasemerick.wordpress.com/640/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chasemerick.wordpress.com/640/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/chasemerick.wordpress.com/640/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chasemerick.wordpress.com/640/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chasemerick.wordpress.com/640/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chasemerick.wordpress.com/640/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chasemerick.wordpress.com/640/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chasemerick.wordpress.com/640/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chasemerick.wordpress.com/640/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cemerick.com&amp;blog=14971344&amp;post=640&amp;subd=chasemerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://cemerick.com/2011/07/20/at-what-point-does-s3-break/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b8ee952abb6620c1c93b3acb46cd391c?s=96&#38;d=identicon&#38;r=R" medium="image">
			<media:title type="html">cemerick</media:title>
		</media:content>
	</item>
	</channel>
</rss>
